love-ui 1.2.12 → 1.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (988) hide show
  1. package/dist/index.js +8 -7
  2. package/dist/mcp-server.js +1 -1
  3. package/package.json +3 -2
  4. package/packages/loveui-skills/SKILL.md +99 -0
  5. package/packages/loveui-skills/agents/openai.yaml +11 -0
  6. package/packages/loveui-skills/references/design-directions.md +60 -0
  7. package/packages/loveui-skills/references/mcp-catalog-workflow.md +68 -0
  8. package/packages/loveui-skills/references/page-blueprints.md +76 -0
  9. package/packages/loveui-skills/references/quality-gates.md +51 -0
  10. package/public/r/accordion-controlled.json +1 -1
  11. package/public/r/accordion-demo.json +1 -1
  12. package/public/r/accordion-multiple.json +1 -1
  13. package/public/r/accordion-single.json +1 -1
  14. package/public/r/alert-demo.json +1 -1
  15. package/public/r/alert-dialog-demo.json +1 -1
  16. package/public/r/alert-error.json +1 -1
  17. package/public/r/alert-info.json +1 -1
  18. package/public/r/alert-success.json +1 -1
  19. package/public/r/alert-warning.json +1 -1
  20. package/public/r/alert-with-icon-action.json +1 -1
  21. package/public/r/alert-with-icon.json +1 -1
  22. package/public/r/announcement-tagless.json +1 -1
  23. package/public/r/announcement-themes.json +1 -1
  24. package/public/r/announcement.json +1 -1
  25. package/public/r/autocomplete-async.json +1 -1
  26. package/public/r/autocomplete-autohighlight.json +1 -1
  27. package/public/r/autocomplete-demo.json +1 -1
  28. package/public/r/autocomplete-disabled.json +1 -1
  29. package/public/r/autocomplete-form.json +1 -1
  30. package/public/r/autocomplete-grouped.json +1 -1
  31. package/public/r/autocomplete-inline.json +1 -1
  32. package/public/r/autocomplete-lg.json +1 -1
  33. package/public/r/autocomplete-limit.json +1 -1
  34. package/public/r/autocomplete-sm.json +1 -1
  35. package/public/r/autocomplete-with-clear.json +1 -1
  36. package/public/r/autocomplete-with-label.json +1 -1
  37. package/public/r/autocomplete-with-trigger-clear.json +1 -1
  38. package/public/r/avatar-demo.json +1 -1
  39. package/public/r/avatar-fallback.json +1 -1
  40. package/public/r/avatar-group.json +1 -1
  41. package/public/r/avatar-radius.json +1 -1
  42. package/public/r/avatar-size.json +1 -1
  43. package/public/r/avatar-stack-hover.json +1 -1
  44. package/public/r/avatar-stack.json +1 -1
  45. package/public/r/badge-demo.json +1 -1
  46. package/public/r/badge-destructive.json +1 -1
  47. package/public/r/badge-error.json +1 -1
  48. package/public/r/badge-info.json +1 -1
  49. package/public/r/badge-lg.json +1 -1
  50. package/public/r/badge-outline.json +1 -1
  51. package/public/r/badge-secondary.json +1 -1
  52. package/public/r/badge-sm.json +1 -1
  53. package/public/r/badge-success.json +1 -1
  54. package/public/r/badge-warning.json +1 -1
  55. package/public/r/badge-with-icon.json +1 -1
  56. package/public/r/badge-with-link.json +1 -1
  57. package/public/r/banner-inset.json +1 -1
  58. package/public/r/banner-themes.json +1 -1
  59. package/public/r/banner.json +1 -1
  60. package/public/r/bookmarks.json +206 -0
  61. package/public/r/breadcrumb-custom-separator.json +1 -1
  62. package/public/r/breadcrumb-demo.json +1 -1
  63. package/public/r/button-demo.json +1 -1
  64. package/public/r/button-destructive-outline.json +1 -1
  65. package/public/r/button-destructive.json +1 -1
  66. package/public/r/button-disabled.json +1 -1
  67. package/public/r/button-ghost.json +1 -1
  68. package/public/r/button-lg.json +1 -1
  69. package/public/r/button-link.json +1 -1
  70. package/public/r/button-loading.json +1 -1
  71. package/public/r/button-outline.json +1 -1
  72. package/public/r/button-secondary.json +1 -1
  73. package/public/r/button-sm.json +1 -1
  74. package/public/r/button-with-icon.json +1 -1
  75. package/public/r/button-with-link.json +1 -1
  76. package/public/r/button-xl.json +1 -1
  77. package/public/r/button-xs.json +1 -1
  78. package/public/r/calendar-headless.json +1 -1
  79. package/public/r/calendar-rac.json +16 -0
  80. package/public/r/calendar.json +1 -1
  81. package/public/r/card-demo.json +1 -1
  82. package/public/r/chart.json +15 -0
  83. package/public/r/checkbox-card.json +1 -1
  84. package/public/r/checkbox-demo.json +1 -1
  85. package/public/r/checkbox-disabled.json +1 -1
  86. package/public/r/checkbox-form.json +1 -1
  87. package/public/r/checkbox-group-demo.json +1 -1
  88. package/public/r/checkbox-group-disabled.json +1 -1
  89. package/public/r/checkbox-group-form.json +1 -1
  90. package/public/r/checkbox-group-nested-parent.json +1 -1
  91. package/public/r/checkbox-group-parent.json +1 -1
  92. package/public/r/checkbox-tree.json +12 -0
  93. package/public/r/checkbox-with-description.json +1 -1
  94. package/public/r/choicebox-inline.json +1 -1
  95. package/public/r/choicebox.json +1 -1
  96. package/public/r/codebase.json +1 -1
  97. package/public/r/collaborative-canvas.json +1 -1
  98. package/public/r/collapsible-demo.json +1 -1
  99. package/public/r/combobox-autohighlight.json +1 -1
  100. package/public/r/combobox-controlled.json +1 -1
  101. package/public/r/combobox-create-new.json +1 -1
  102. package/public/r/combobox-demo.json +1 -1
  103. package/public/r/combobox-disabled.json +1 -1
  104. package/public/r/combobox-fixed-width.json +1 -1
  105. package/public/r/combobox-form.json +1 -1
  106. package/public/r/combobox-grouped.json +1 -1
  107. package/public/r/combobox-lg.json +1 -1
  108. package/public/r/combobox-multiple-form.json +1 -1
  109. package/public/r/combobox-multiple.json +1 -1
  110. package/public/r/combobox-sm.json +1 -1
  111. package/public/r/combobox-with-clear.json +1 -1
  112. package/public/r/combobox-with-inner-input.json +1 -1
  113. package/public/r/combobox-with-label.json +1 -1
  114. package/public/r/command.json +18 -0
  115. package/public/r/comp-01.json +22 -0
  116. package/public/r/comp-02.json +23 -0
  117. package/public/r/comp-03.json +23 -0
  118. package/public/r/comp-04.json +23 -0
  119. package/public/r/comp-05.json +22 -0
  120. package/public/r/comp-06.json +23 -0
  121. package/public/r/comp-07.json +22 -0
  122. package/public/r/comp-08.json +23 -0
  123. package/public/r/comp-09.json +22 -0
  124. package/public/r/comp-10.json +22 -0
  125. package/public/r/comp-100.json +23 -0
  126. package/public/r/comp-101.json +23 -0
  127. package/public/r/comp-102.json +23 -0
  128. package/public/r/comp-103.json +23 -0
  129. package/public/r/comp-104.json +23 -0
  130. package/public/r/comp-105.json +23 -0
  131. package/public/r/comp-106.json +22 -0
  132. package/public/r/comp-107.json +22 -0
  133. package/public/r/comp-108.json +23 -0
  134. package/public/r/comp-109.json +22 -0
  135. package/public/r/comp-11.json +22 -0
  136. package/public/r/comp-110.json +22 -0
  137. package/public/r/comp-111.json +21 -0
  138. package/public/r/comp-112.json +21 -0
  139. package/public/r/comp-113.json +22 -0
  140. package/public/r/comp-114.json +23 -0
  141. package/public/r/comp-115.json +22 -0
  142. package/public/r/comp-116.json +22 -0
  143. package/public/r/comp-117.json +23 -0
  144. package/public/r/comp-118.json +23 -0
  145. package/public/r/comp-119.json +27 -0
  146. package/public/r/comp-12.json +22 -0
  147. package/public/r/comp-120.json +27 -0
  148. package/public/r/comp-121.json +27 -0
  149. package/public/r/comp-122.json +27 -0
  150. package/public/r/comp-123.json +22 -0
  151. package/public/r/comp-124.json +22 -0
  152. package/public/r/comp-125.json +31 -0
  153. package/public/r/comp-126.json +31 -0
  154. package/public/r/comp-127.json +21 -0
  155. package/public/r/comp-128.json +21 -0
  156. package/public/r/comp-129.json +24 -0
  157. package/public/r/comp-13.json +22 -0
  158. package/public/r/comp-130.json +23 -0
  159. package/public/r/comp-131.json +23 -0
  160. package/public/r/comp-132.json +23 -0
  161. package/public/r/comp-133.json +23 -0
  162. package/public/r/comp-134.json +23 -0
  163. package/public/r/comp-135.json +24 -0
  164. package/public/r/comp-136.json +23 -0
  165. package/public/r/comp-137.json +23 -0
  166. package/public/r/comp-138.json +25 -0
  167. package/public/r/comp-139.json +23 -0
  168. package/public/r/comp-14.json +22 -0
  169. package/public/r/comp-140.json +23 -0
  170. package/public/r/comp-141.json +23 -0
  171. package/public/r/comp-142.json +25 -0
  172. package/public/r/comp-143.json +23 -0
  173. package/public/r/comp-144.json +24 -0
  174. package/public/r/comp-145.json +24 -0
  175. package/public/r/comp-146.json +24 -0
  176. package/public/r/comp-147.json +24 -0
  177. package/public/r/comp-148.json +25 -0
  178. package/public/r/comp-149.json +24 -0
  179. package/public/r/comp-15.json +22 -0
  180. package/public/r/comp-150.json +21 -0
  181. package/public/r/comp-151.json +23 -0
  182. package/public/r/comp-152.json +23 -0
  183. package/public/r/comp-153.json +23 -0
  184. package/public/r/comp-154.json +23 -0
  185. package/public/r/comp-155.json +23 -0
  186. package/public/r/comp-156.json +25 -0
  187. package/public/r/comp-157.json +27 -0
  188. package/public/r/comp-158.json +24 -0
  189. package/public/r/comp-159.json +24 -0
  190. package/public/r/comp-16.json +22 -0
  191. package/public/r/comp-160.json +24 -0
  192. package/public/r/comp-161.json +24 -0
  193. package/public/r/comp-162.json +24 -0
  194. package/public/r/comp-163.json +28 -0
  195. package/public/r/comp-164.json +24 -0
  196. package/public/r/comp-165.json +24 -0
  197. package/public/r/comp-166.json +25 -0
  198. package/public/r/comp-167.json +24 -0
  199. package/public/r/comp-168.json +24 -0
  200. package/public/r/comp-169.json +23 -0
  201. package/public/r/comp-17.json +25 -0
  202. package/public/r/comp-170.json +25 -0
  203. package/public/r/comp-171.json +28 -0
  204. package/public/r/comp-172.json +23 -0
  205. package/public/r/comp-173.json +23 -0
  206. package/public/r/comp-174.json +23 -0
  207. package/public/r/comp-175.json +23 -0
  208. package/public/r/comp-176.json +23 -0
  209. package/public/r/comp-177.json +23 -0
  210. package/public/r/comp-178.json +23 -0
  211. package/public/r/comp-179.json +24 -0
  212. package/public/r/comp-18.json +25 -0
  213. package/public/r/comp-180.json +23 -0
  214. package/public/r/comp-181.json +25 -0
  215. package/public/r/comp-182.json +24 -0
  216. package/public/r/comp-183.json +25 -0
  217. package/public/r/comp-184.json +25 -0
  218. package/public/r/comp-185.json +24 -0
  219. package/public/r/comp-186.json +25 -0
  220. package/public/r/comp-187.json +25 -0
  221. package/public/r/comp-188.json +25 -0
  222. package/public/r/comp-189.json +23 -0
  223. package/public/r/comp-19.json +23 -0
  224. package/public/r/comp-190.json +23 -0
  225. package/public/r/comp-191.json +24 -0
  226. package/public/r/comp-192.json +23 -0
  227. package/public/r/comp-193.json +23 -0
  228. package/public/r/comp-194.json +24 -0
  229. package/public/r/comp-195.json +23 -0
  230. package/public/r/comp-196.json +24 -0
  231. package/public/r/comp-197.json +23 -0
  232. package/public/r/comp-198.json +23 -0
  233. package/public/r/comp-199.json +23 -0
  234. package/public/r/comp-20.json +23 -0
  235. package/public/r/comp-200.json +25 -0
  236. package/public/r/comp-201.json +22 -0
  237. package/public/r/comp-202.json +22 -0
  238. package/public/r/comp-203.json +23 -0
  239. package/public/r/comp-204.json +23 -0
  240. package/public/r/comp-205.json +23 -0
  241. package/public/r/comp-206.json +24 -0
  242. package/public/r/comp-207.json +23 -0
  243. package/public/r/comp-208.json +23 -0
  244. package/public/r/comp-209.json +23 -0
  245. package/public/r/comp-21.json +23 -0
  246. package/public/r/comp-210.json +24 -0
  247. package/public/r/comp-211.json +24 -0
  248. package/public/r/comp-212.json +23 -0
  249. package/public/r/comp-213.json +23 -0
  250. package/public/r/comp-214.json +23 -0
  251. package/public/r/comp-215.json +24 -0
  252. package/public/r/comp-216.json +22 -0
  253. package/public/r/comp-217.json +22 -0
  254. package/public/r/comp-218.json +25 -0
  255. package/public/r/comp-219.json +23 -0
  256. package/public/r/comp-22.json +23 -0
  257. package/public/r/comp-220.json +24 -0
  258. package/public/r/comp-221.json +23 -0
  259. package/public/r/comp-222.json +26 -0
  260. package/public/r/comp-223.json +26 -0
  261. package/public/r/comp-224.json +23 -0
  262. package/public/r/comp-225.json +24 -0
  263. package/public/r/comp-226.json +26 -0
  264. package/public/r/comp-227.json +26 -0
  265. package/public/r/comp-228.json +26 -0
  266. package/public/r/comp-229.json +30 -0
  267. package/public/r/comp-23.json +24 -0
  268. package/public/r/comp-230.json +30 -0
  269. package/public/r/comp-231.json +32 -0
  270. package/public/r/comp-232.json +31 -0
  271. package/public/r/comp-233.json +30 -0
  272. package/public/r/comp-234.json +28 -0
  273. package/public/r/comp-235.json +28 -0
  274. package/public/r/comp-236.json +24 -0
  275. package/public/r/comp-237.json +26 -0
  276. package/public/r/comp-238.json +26 -0
  277. package/public/r/comp-239.json +26 -0
  278. package/public/r/comp-24.json +23 -0
  279. package/public/r/comp-240.json +23 -0
  280. package/public/r/comp-241.json +24 -0
  281. package/public/r/comp-242.json +23 -0
  282. package/public/r/comp-243.json +23 -0
  283. package/public/r/comp-244.json +23 -0
  284. package/public/r/comp-245.json +23 -0
  285. package/public/r/comp-246.json +23 -0
  286. package/public/r/comp-247.json +23 -0
  287. package/public/r/comp-248.json +23 -0
  288. package/public/r/comp-249.json +24 -0
  289. package/public/r/comp-25.json +24 -0
  290. package/public/r/comp-250.json +25 -0
  291. package/public/r/comp-251.json +25 -0
  292. package/public/r/comp-252.json +25 -0
  293. package/public/r/comp-253.json +25 -0
  294. package/public/r/comp-254.json +35 -0
  295. package/public/r/comp-255.json +30 -0
  296. package/public/r/comp-256.json +25 -0
  297. package/public/r/comp-257.json +25 -0
  298. package/public/r/comp-258.json +32 -0
  299. package/public/r/comp-259.json +26 -0
  300. package/public/r/comp-26.json +24 -0
  301. package/public/r/comp-260.json +26 -0
  302. package/public/r/comp-261.json +24 -0
  303. package/public/r/comp-262.json +31 -0
  304. package/public/r/comp-263.json +25 -0
  305. package/public/r/comp-264.json +33 -0
  306. package/public/r/comp-265.json +32 -0
  307. package/public/r/comp-266.json +24 -0
  308. package/public/r/comp-267.json +19 -0
  309. package/public/r/comp-268.json +19 -0
  310. package/public/r/comp-269.json +19 -0
  311. package/public/r/comp-27.json +24 -0
  312. package/public/r/comp-270.json +19 -0
  313. package/public/r/comp-271.json +19 -0
  314. package/public/r/comp-272.json +19 -0
  315. package/public/r/comp-273.json +19 -0
  316. package/public/r/comp-274.json +19 -0
  317. package/public/r/comp-275.json +19 -0
  318. package/public/r/comp-276.json +19 -0
  319. package/public/r/comp-277.json +21 -0
  320. package/public/r/comp-278.json +21 -0
  321. package/public/r/comp-279.json +23 -0
  322. package/public/r/comp-28.json +24 -0
  323. package/public/r/comp-280.json +23 -0
  324. package/public/r/comp-281.json +23 -0
  325. package/public/r/comp-282.json +23 -0
  326. package/public/r/comp-283.json +23 -0
  327. package/public/r/comp-284.json +23 -0
  328. package/public/r/comp-285.json +23 -0
  329. package/public/r/comp-286.json +23 -0
  330. package/public/r/comp-287.json +24 -0
  331. package/public/r/comp-288.json +23 -0
  332. package/public/r/comp-289.json +24 -0
  333. package/public/r/comp-29.json +24 -0
  334. package/public/r/comp-290.json +24 -0
  335. package/public/r/comp-291.json +24 -0
  336. package/public/r/comp-292.json +24 -0
  337. package/public/r/comp-293.json +26 -0
  338. package/public/r/comp-294.json +24 -0
  339. package/public/r/comp-295.json +23 -0
  340. package/public/r/comp-296.json +23 -0
  341. package/public/r/comp-297.json +30 -0
  342. package/public/r/comp-298.json +26 -0
  343. package/public/r/comp-299.json +28 -0
  344. package/public/r/comp-30.json +23 -0
  345. package/public/r/comp-300.json +29 -0
  346. package/public/r/comp-301.json +24 -0
  347. package/public/r/comp-302.json +18 -0
  348. package/public/r/comp-303.json +18 -0
  349. package/public/r/comp-304.json +18 -0
  350. package/public/r/comp-305.json +21 -0
  351. package/public/r/comp-306.json +21 -0
  352. package/public/r/comp-307.json +21 -0
  353. package/public/r/comp-308.json +21 -0
  354. package/public/r/comp-309.json +21 -0
  355. package/public/r/comp-31.json +21 -0
  356. package/public/r/comp-310.json +23 -0
  357. package/public/r/comp-311.json +20 -0
  358. package/public/r/comp-312.json +21 -0
  359. package/public/r/comp-313.json +26 -0
  360. package/public/r/comp-314.json +26 -0
  361. package/public/r/comp-315.json +24 -0
  362. package/public/r/comp-316.json +25 -0
  363. package/public/r/comp-317.json +24 -0
  364. package/public/r/comp-318.json +24 -0
  365. package/public/r/comp-319.json +24 -0
  366. package/public/r/comp-32.json +21 -0
  367. package/public/r/comp-320.json +27 -0
  368. package/public/r/comp-321.json +28 -0
  369. package/public/r/comp-322.json +27 -0
  370. package/public/r/comp-323.json +30 -0
  371. package/public/r/comp-324.json +28 -0
  372. package/public/r/comp-325.json +29 -0
  373. package/public/r/comp-326.json +30 -0
  374. package/public/r/comp-327.json +30 -0
  375. package/public/r/comp-328.json +37 -0
  376. package/public/r/comp-329.json +38 -0
  377. package/public/r/comp-33.json +18 -0
  378. package/public/r/comp-330.json +27 -0
  379. package/public/r/comp-331.json +42 -0
  380. package/public/r/comp-332.json +25 -0
  381. package/public/r/comp-333.json +29 -0
  382. package/public/r/comp-334.json +22 -0
  383. package/public/r/comp-335.json +22 -0
  384. package/public/r/comp-336.json +22 -0
  385. package/public/r/comp-337.json +22 -0
  386. package/public/r/comp-338.json +22 -0
  387. package/public/r/comp-339.json +22 -0
  388. package/public/r/comp-34.json +27 -0
  389. package/public/r/comp-340.json +22 -0
  390. package/public/r/comp-341.json +22 -0
  391. package/public/r/comp-342.json +22 -0
  392. package/public/r/comp-343.json +22 -0
  393. package/public/r/comp-344.json +22 -0
  394. package/public/r/comp-345.json +22 -0
  395. package/public/r/comp-346.json +22 -0
  396. package/public/r/comp-347.json +22 -0
  397. package/public/r/comp-348.json +22 -0
  398. package/public/r/comp-349.json +22 -0
  399. package/public/r/comp-35.json +27 -0
  400. package/public/r/comp-350.json +22 -0
  401. package/public/r/comp-351.json +22 -0
  402. package/public/r/comp-352.json +24 -0
  403. package/public/r/comp-353.json +24 -0
  404. package/public/r/comp-354.json +23 -0
  405. package/public/r/comp-355.json +23 -0
  406. package/public/r/comp-356.json +23 -0
  407. package/public/r/comp-357.json +23 -0
  408. package/public/r/comp-358.json +23 -0
  409. package/public/r/comp-359.json +24 -0
  410. package/public/r/comp-36.json +26 -0
  411. package/public/r/comp-360.json +25 -0
  412. package/public/r/comp-361.json +23 -0
  413. package/public/r/comp-362.json +24 -0
  414. package/public/r/comp-363.json +27 -0
  415. package/public/r/comp-364.json +26 -0
  416. package/public/r/comp-365.json +24 -0
  417. package/public/r/comp-366.json +23 -0
  418. package/public/r/comp-367.json +23 -0
  419. package/public/r/comp-368.json +23 -0
  420. package/public/r/comp-369.json +23 -0
  421. package/public/r/comp-37.json +23 -0
  422. package/public/r/comp-370.json +23 -0
  423. package/public/r/comp-371.json +24 -0
  424. package/public/r/comp-372.json +24 -0
  425. package/public/r/comp-373.json +25 -0
  426. package/public/r/comp-374.json +26 -0
  427. package/public/r/comp-375.json +25 -0
  428. package/public/r/comp-376.json +26 -0
  429. package/public/r/comp-377.json +27 -0
  430. package/public/r/comp-378.json +24 -0
  431. package/public/r/comp-379.json +24 -0
  432. package/public/r/comp-38.json +23 -0
  433. package/public/r/comp-380.json +24 -0
  434. package/public/r/comp-381.json +26 -0
  435. package/public/r/comp-382.json +25 -0
  436. package/public/r/comp-383.json +26 -0
  437. package/public/r/comp-384.json +24 -0
  438. package/public/r/comp-385.json +24 -0
  439. package/public/r/comp-386.json +24 -0
  440. package/public/r/comp-387.json +28 -0
  441. package/public/r/comp-388.json +26 -0
  442. package/public/r/comp-389.json +24 -0
  443. package/public/r/comp-39.json +23 -0
  444. package/public/r/comp-390.json +23 -0
  445. package/public/r/comp-391.json +23 -0
  446. package/public/r/comp-392.json +23 -0
  447. package/public/r/comp-393.json +23 -0
  448. package/public/r/comp-394.json +24 -0
  449. package/public/r/comp-395.json +24 -0
  450. package/public/r/comp-396.json +24 -0
  451. package/public/r/comp-397.json +25 -0
  452. package/public/r/comp-398.json +26 -0
  453. package/public/r/comp-399.json +26 -0
  454. package/public/r/comp-40.json +23 -0
  455. package/public/r/comp-400.json +20 -0
  456. package/public/r/comp-401.json +19 -0
  457. package/public/r/comp-402.json +19 -0
  458. package/public/r/comp-403.json +19 -0
  459. package/public/r/comp-404.json +19 -0
  460. package/public/r/comp-405.json +19 -0
  461. package/public/r/comp-406.json +19 -0
  462. package/public/r/comp-407.json +19 -0
  463. package/public/r/comp-408.json +19 -0
  464. package/public/r/comp-409.json +22 -0
  465. package/public/r/comp-41.json +29 -0
  466. package/public/r/comp-410.json +22 -0
  467. package/public/r/comp-411.json +22 -0
  468. package/public/r/comp-412.json +19 -0
  469. package/public/r/comp-413.json +22 -0
  470. package/public/r/comp-414.json +22 -0
  471. package/public/r/comp-415.json +22 -0
  472. package/public/r/comp-416.json +23 -0
  473. package/public/r/comp-417.json +22 -0
  474. package/public/r/comp-418.json +23 -0
  475. package/public/r/comp-419.json +23 -0
  476. package/public/r/comp-42.json +30 -0
  477. package/public/r/comp-420.json +23 -0
  478. package/public/r/comp-421.json +23 -0
  479. package/public/r/comp-422.json +23 -0
  480. package/public/r/comp-423.json +24 -0
  481. package/public/r/comp-424.json +22 -0
  482. package/public/r/comp-425.json +23 -0
  483. package/public/r/comp-426.json +23 -0
  484. package/public/r/comp-427.json +23 -0
  485. package/public/r/comp-428.json +23 -0
  486. package/public/r/comp-429.json +23 -0
  487. package/public/r/comp-43.json +32 -0
  488. package/public/r/comp-430.json +23 -0
  489. package/public/r/comp-431.json +23 -0
  490. package/public/r/comp-432.json +23 -0
  491. package/public/r/comp-433.json +24 -0
  492. package/public/r/comp-434.json +24 -0
  493. package/public/r/comp-435.json +24 -0
  494. package/public/r/comp-436.json +24 -0
  495. package/public/r/comp-437.json +25 -0
  496. package/public/r/comp-438.json +23 -0
  497. package/public/r/comp-439.json +24 -0
  498. package/public/r/comp-44.json +25 -0
  499. package/public/r/comp-440.json +25 -0
  500. package/public/r/comp-441.json +25 -0
  501. package/public/r/comp-442.json +24 -0
  502. package/public/r/comp-443.json +24 -0
  503. package/public/r/comp-444.json +24 -0
  504. package/public/r/comp-445.json +24 -0
  505. package/public/r/comp-446.json +24 -0
  506. package/public/r/comp-447.json +25 -0
  507. package/public/r/comp-448.json +23 -0
  508. package/public/r/comp-449.json +23 -0
  509. package/public/r/comp-45.json +25 -0
  510. package/public/r/comp-450.json +23 -0
  511. package/public/r/comp-451.json +23 -0
  512. package/public/r/comp-452.json +23 -0
  513. package/public/r/comp-453.json +25 -0
  514. package/public/r/comp-454.json +22 -0
  515. package/public/r/comp-455.json +22 -0
  516. package/public/r/comp-456.json +22 -0
  517. package/public/r/comp-457.json +21 -0
  518. package/public/r/comp-458.json +22 -0
  519. package/public/r/comp-459.json +26 -0
  520. package/public/r/comp-46.json +26 -0
  521. package/public/r/comp-460.json +26 -0
  522. package/public/r/comp-461.json +27 -0
  523. package/public/r/comp-462.json +27 -0
  524. package/public/r/comp-463.json +30 -0
  525. package/public/r/comp-464.json +29 -0
  526. package/public/r/comp-465.json +29 -0
  527. package/public/r/comp-466.json +21 -0
  528. package/public/r/comp-467.json +23 -0
  529. package/public/r/comp-468.json +21 -0
  530. package/public/r/comp-469.json +21 -0
  531. package/public/r/comp-47.json +32 -0
  532. package/public/r/comp-470.json +21 -0
  533. package/public/r/comp-471.json +21 -0
  534. package/public/r/comp-472.json +23 -0
  535. package/public/r/comp-473.json +24 -0
  536. package/public/r/comp-474.json +22 -0
  537. package/public/r/comp-475.json +22 -0
  538. package/public/r/comp-476.json +21 -0
  539. package/public/r/comp-477.json +31 -0
  540. package/public/r/comp-478.json +36 -0
  541. package/public/r/comp-479.json +28 -0
  542. package/public/r/comp-48.json +32 -0
  543. package/public/r/comp-480.json +30 -0
  544. package/public/r/comp-481.json +34 -0
  545. package/public/r/comp-482.json +33 -0
  546. package/public/r/comp-483.json +37 -0
  547. package/public/r/comp-484.json +41 -0
  548. package/public/r/comp-485.json +43 -0
  549. package/public/r/comp-486.json +23 -0
  550. package/public/r/comp-487.json +26 -0
  551. package/public/r/comp-488.json +27 -0
  552. package/public/r/comp-489.json +28 -0
  553. package/public/r/comp-49.json +32 -0
  554. package/public/r/comp-490.json +23 -0
  555. package/public/r/comp-491.json +24 -0
  556. package/public/r/comp-492.json +25 -0
  557. package/public/r/comp-493.json +23 -0
  558. package/public/r/comp-494.json +23 -0
  559. package/public/r/comp-495.json +24 -0
  560. package/public/r/comp-496.json +23 -0
  561. package/public/r/comp-497.json +24 -0
  562. package/public/r/comp-498.json +24 -0
  563. package/public/r/comp-499.json +24 -0
  564. package/public/r/comp-50.json +32 -0
  565. package/public/r/comp-500.json +25 -0
  566. package/public/r/comp-501.json +25 -0
  567. package/public/r/comp-502.json +26 -0
  568. package/public/r/comp-503.json +27 -0
  569. package/public/r/comp-504.json +28 -0
  570. package/public/r/comp-505.json +28 -0
  571. package/public/r/comp-506.json +26 -0
  572. package/public/r/comp-507.json +27 -0
  573. package/public/r/comp-508.json +25 -0
  574. package/public/r/comp-509.json +25 -0
  575. package/public/r/comp-51.json +23 -0
  576. package/public/r/comp-510.json +24 -0
  577. package/public/r/comp-511.json +27 -0
  578. package/public/r/comp-512.json +27 -0
  579. package/public/r/comp-513.json +21 -0
  580. package/public/r/comp-514.json +21 -0
  581. package/public/r/comp-515.json +21 -0
  582. package/public/r/comp-516.json +22 -0
  583. package/public/r/comp-517.json +22 -0
  584. package/public/r/comp-518.json +21 -0
  585. package/public/r/comp-519.json +21 -0
  586. package/public/r/comp-52.json +23 -0
  587. package/public/r/comp-520.json +22 -0
  588. package/public/r/comp-521.json +22 -0
  589. package/public/r/comp-522.json +21 -0
  590. package/public/r/comp-523.json +21 -0
  591. package/public/r/comp-524.json +21 -0
  592. package/public/r/comp-525.json +21 -0
  593. package/public/r/comp-526.json +22 -0
  594. package/public/r/comp-527.json +23 -0
  595. package/public/r/comp-528.json +22 -0
  596. package/public/r/comp-529.json +22 -0
  597. package/public/r/comp-53.json +24 -0
  598. package/public/r/comp-530.json +22 -0
  599. package/public/r/comp-531.json +22 -0
  600. package/public/r/comp-532.json +22 -0
  601. package/public/r/comp-533.json +22 -0
  602. package/public/r/comp-534.json +22 -0
  603. package/public/r/comp-535.json +22 -0
  604. package/public/r/comp-536.json +22 -0
  605. package/public/r/comp-537.json +22 -0
  606. package/public/r/comp-538.json +22 -0
  607. package/public/r/comp-539.json +22 -0
  608. package/public/r/comp-54.json +26 -0
  609. package/public/r/comp-540.json +21 -0
  610. package/public/r/comp-541.json +21 -0
  611. package/public/r/comp-542.json +124 -0
  612. package/public/r/comp-543.json +29 -0
  613. package/public/r/comp-544.json +26 -0
  614. package/public/r/comp-545.json +29 -0
  615. package/public/r/comp-546.json +29 -0
  616. package/public/r/comp-547.json +29 -0
  617. package/public/r/comp-548.json +29 -0
  618. package/public/r/comp-549.json +29 -0
  619. package/public/r/comp-55.json +27 -0
  620. package/public/r/comp-550.json +29 -0
  621. package/public/r/comp-551.json +30 -0
  622. package/public/r/comp-552.json +29 -0
  623. package/public/r/comp-553.json +29 -0
  624. package/public/r/comp-554.json +36 -0
  625. package/public/r/comp-555.json +23 -0
  626. package/public/r/comp-556.json +23 -0
  627. package/public/r/comp-557.json +23 -0
  628. package/public/r/comp-558.json +23 -0
  629. package/public/r/comp-559.json +23 -0
  630. package/public/r/comp-56.json +26 -0
  631. package/public/r/comp-560.json +23 -0
  632. package/public/r/comp-561.json +25 -0
  633. package/public/r/comp-562.json +23 -0
  634. package/public/r/comp-563.json +23 -0
  635. package/public/r/comp-564.json +24 -0
  636. package/public/r/comp-565.json +20 -0
  637. package/public/r/comp-566.json +20 -0
  638. package/public/r/comp-567.json +20 -0
  639. package/public/r/comp-568.json +20 -0
  640. package/public/r/comp-569.json +20 -0
  641. package/public/r/comp-57.json +26 -0
  642. package/public/r/comp-570.json +20 -0
  643. package/public/r/comp-571.json +23 -0
  644. package/public/r/comp-572.json +23 -0
  645. package/public/r/comp-573.json +20 -0
  646. package/public/r/comp-574.json +22 -0
  647. package/public/r/comp-575.json +20 -0
  648. package/public/r/comp-576.json +21 -0
  649. package/public/r/comp-577.json +23 -0
  650. package/public/r/comp-578.json +28 -0
  651. package/public/r/comp-579.json +28 -0
  652. package/public/r/comp-58.json +25 -0
  653. package/public/r/comp-580.json +29 -0
  654. package/public/r/comp-581.json +45 -0
  655. package/public/r/comp-582.json +42 -0
  656. package/public/r/comp-583.json +41 -0
  657. package/public/r/comp-584.json +41 -0
  658. package/public/r/comp-585.json +41 -0
  659. package/public/r/comp-586.json +34 -0
  660. package/public/r/comp-587.json +29 -0
  661. package/public/r/comp-588.json +33 -0
  662. package/public/r/comp-589.json +37 -0
  663. package/public/r/comp-59.json +22 -0
  664. package/public/r/comp-590.json +40 -0
  665. package/public/r/comp-591.json +29 -0
  666. package/public/r/comp-592.json +41 -0
  667. package/public/r/comp-593.json +36 -0
  668. package/public/r/comp-594.json +33 -0
  669. package/public/r/comp-595.json +22 -0
  670. package/public/r/comp-596.json +26 -0
  671. package/public/r/comp-597.json +22 -0
  672. package/public/r/comp-598.json +22 -0
  673. package/public/r/comp-599.json +22 -0
  674. package/public/r/comp-60.json +23 -0
  675. package/public/r/comp-600.json +17 -0
  676. package/public/r/comp-601.json +20 -0
  677. package/public/r/comp-602.json +17 -0
  678. package/public/r/comp-603.json +20 -0
  679. package/public/r/comp-604.json +17 -0
  680. package/public/r/comp-605.json +17 -0
  681. package/public/r/comp-606.json +20 -0
  682. package/public/r/comp-607.json +20 -0
  683. package/public/r/comp-608.json +20 -0
  684. package/public/r/comp-609.json +20 -0
  685. package/public/r/comp-61.json +23 -0
  686. package/public/r/comp-610.json +23 -0
  687. package/public/r/comp-611.json +23 -0
  688. package/public/r/comp-612.json +17 -0
  689. package/public/r/comp-613.json +20 -0
  690. package/public/r/comp-614.json +17 -0
  691. package/public/r/comp-615.json +26 -0
  692. package/public/r/comp-616.json +26 -0
  693. package/public/r/comp-617.json +26 -0
  694. package/public/r/comp-62.json +23 -0
  695. package/public/r/comp-63.json +22 -0
  696. package/public/r/comp-64.json +23 -0
  697. package/public/r/comp-65.json +22 -0
  698. package/public/r/comp-66.json +22 -0
  699. package/public/r/comp-67.json +23 -0
  700. package/public/r/comp-68.json +24 -0
  701. package/public/r/comp-69.json +24 -0
  702. package/public/r/comp-70.json +24 -0
  703. package/public/r/comp-71.json +22 -0
  704. package/public/r/comp-72.json +21 -0
  705. package/public/r/comp-73.json +18 -0
  706. package/public/r/comp-74.json +27 -0
  707. package/public/r/comp-75.json +22 -0
  708. package/public/r/comp-76.json +23 -0
  709. package/public/r/comp-77.json +22 -0
  710. package/public/r/comp-78.json +21 -0
  711. package/public/r/comp-79.json +22 -0
  712. package/public/r/comp-80.json +21 -0
  713. package/public/r/comp-81.json +21 -0
  714. package/public/r/comp-82.json +22 -0
  715. package/public/r/comp-83.json +21 -0
  716. package/public/r/comp-84.json +21 -0
  717. package/public/r/comp-85.json +22 -0
  718. package/public/r/comp-86.json +22 -0
  719. package/public/r/comp-87.json +21 -0
  720. package/public/r/comp-88.json +22 -0
  721. package/public/r/comp-89.json +21 -0
  722. package/public/r/comp-90.json +22 -0
  723. package/public/r/comp-91.json +22 -0
  724. package/public/r/comp-92.json +22 -0
  725. package/public/r/comp-93.json +22 -0
  726. package/public/r/comp-94.json +24 -0
  727. package/public/r/comp-95.json +26 -0
  728. package/public/r/comp-96.json +21 -0
  729. package/public/r/comp-97.json +21 -0
  730. package/public/r/comp-98.json +22 -0
  731. package/public/r/comp-99.json +23 -0
  732. package/public/r/comparison-event-handlers.json +1 -1
  733. package/public/r/comparison-hover.json +1 -1
  734. package/public/r/comparison.json +1 -1
  735. package/public/r/context-menu.json +16 -0
  736. package/public/r/contribution-graph-custom-footer.json +1 -1
  737. package/public/r/credit-card-apple.json +1 -1
  738. package/public/r/credit-card-back.json +1 -1
  739. package/public/r/credit-card.json +1 -1
  740. package/public/r/cropper.json +15 -0
  741. package/public/r/cursor-color.json +1 -1
  742. package/public/r/cursor-message.json +1 -1
  743. package/public/r/cursor-name-message.json +1 -1
  744. package/public/r/cursor-name.json +1 -1
  745. package/public/r/cursor.json +1 -1
  746. package/public/r/dashboard-1.json +263 -0
  747. package/public/r/dashboard-2.json +264 -0
  748. package/public/r/dashboard-3.json +225 -0
  749. package/public/r/datefield-rac.json +15 -0
  750. package/public/r/deck-controlled.json +1 -1
  751. package/public/r/deck-product-cards.json +1 -1
  752. package/public/r/deck.json +1 -1
  753. package/public/r/dialog-close-confirmation.json +1 -1
  754. package/public/r/dialog-demo.json +1 -1
  755. package/public/r/dialog-from-menu.json +1 -1
  756. package/public/r/dialog-nested.json +1 -1
  757. package/public/r/dialog-stack-controlled.json +1 -1
  758. package/public/r/dialog-stack-navigation.json +1 -1
  759. package/public/r/dialog-stack-six.json +1 -1
  760. package/public/r/dialog-stack.json +1 -1
  761. package/public/r/dropdown-menu.json +15 -0
  762. package/public/r/dropzone-custom-empty-state.json +1 -1
  763. package/public/r/dropzone-image-preview.json +1 -1
  764. package/public/r/editor.json +1 -1
  765. package/public/r/emails.json +243 -0
  766. package/public/r/empty-demo.json +1 -1
  767. package/public/r/example-app-calendar.json +323 -0
  768. package/public/r/field-2.json +19 -0
  769. package/public/r/field-autocomplete.json +1 -1
  770. package/public/r/field-checkbox-group.json +1 -1
  771. package/public/r/field-checkbox.json +1 -1
  772. package/public/r/field-combobox-multiple.json +1 -1
  773. package/public/r/field-combobox.json +1 -1
  774. package/public/r/field-complete-form.json +1 -1
  775. package/public/r/field-demo.json +1 -1
  776. package/public/r/field-disabled.json +1 -1
  777. package/public/r/field-error.json +1 -1
  778. package/public/r/field-number-field.json +1 -1
  779. package/public/r/field-radio.json +1 -1
  780. package/public/r/field-required.json +1 -1
  781. package/public/r/field-select.json +1 -1
  782. package/public/r/field-slider.json +1 -1
  783. package/public/r/field-switch.json +1 -1
  784. package/public/r/field-textarea.json +1 -1
  785. package/public/r/field-validity.json +1 -1
  786. package/public/r/fieldset-demo.json +1 -1
  787. package/public/r/files.json +195 -0
  788. package/public/r/form-demo.json +1 -1
  789. package/public/r/form-zod.json +1 -1
  790. package/public/r/form.json +1 -1
  791. package/public/r/frame-demo.json +1 -1
  792. package/public/r/gantt-lanes.json +1 -1
  793. package/public/r/gantt-no-sidebar.json +1 -1
  794. package/public/r/gantt-read-only.json +1 -1
  795. package/public/r/gantt.json +1 -1
  796. package/public/r/glimpse-custom.json +1 -1
  797. package/public/r/glimpse.json +1 -1
  798. package/public/r/gooey-toast-demo.json +1 -1
  799. package/public/r/gooey-toast-promise.json +1 -1
  800. package/public/r/gooey-toast-states.json +1 -1
  801. package/public/r/gooey-toast-with-button.json +1 -1
  802. package/public/r/group-demo.json +1 -1
  803. package/public/r/group-with-input.json +1 -1
  804. package/public/r/hero.json +1 -1
  805. package/public/r/hover-card.json +15 -0
  806. package/public/r/image-crop-circular.json +1 -1
  807. package/public/r/image-crop-custom.json +1 -1
  808. package/public/r/image-crop.json +1 -1
  809. package/public/r/image-zoom-background.json +1 -1
  810. package/public/r/image-zoom-margin.json +1 -1
  811. package/public/r/image-zoom.json +1 -1
  812. package/public/r/input-demo.json +1 -1
  813. package/public/r/input-disabled.json +1 -1
  814. package/public/r/input-file.json +1 -1
  815. package/public/r/input-group.json +20 -0
  816. package/public/r/input-lg.json +1 -1
  817. package/public/r/input-sm.json +1 -1
  818. package/public/r/input-with-button.json +1 -1
  819. package/public/r/input-with-label.json +1 -1
  820. package/public/r/kanban-simple.json +1 -1
  821. package/public/r/kanban.json +1 -1
  822. package/public/r/kbd.json +12 -0
  823. package/public/r/leads.json +271 -0
  824. package/public/r/list-simple.json +1 -1
  825. package/public/r/list.json +1 -1
  826. package/public/r/maps.json +188 -0
  827. package/public/r/menu-checkbox.json +1 -1
  828. package/public/r/menu-close-on-click.json +1 -1
  829. package/public/r/menu-demo.json +1 -1
  830. package/public/r/menu-group-labels.json +1 -1
  831. package/public/r/menu-hover.json +1 -1
  832. package/public/r/menu-link.json +1 -1
  833. package/public/r/menu-nested.json +1 -1
  834. package/public/r/menu-radio-group.json +1 -1
  835. package/public/r/meter-demo.json +1 -1
  836. package/public/r/meter-with-formatted-value.json +1 -1
  837. package/public/r/meter-with-range.json +1 -1
  838. package/public/r/mini-calendar-controlled.json +1 -1
  839. package/public/r/multiselect.json +15 -0
  840. package/public/r/navigation-menu.json +12 -0
  841. package/public/r/number-field-form.json +1 -1
  842. package/public/r/number-field-with-label.json +1 -1
  843. package/public/r/number-field-with-scrub.json +1 -1
  844. package/public/r/number-field-with-step.json +1 -1
  845. package/public/r/pill-avatar-group.json +1 -1
  846. package/public/r/pill-delta.json +1 -1
  847. package/public/r/pill-icon.json +1 -1
  848. package/public/r/pill-indicator.json +1 -1
  849. package/public/r/pill-status.json +1 -1
  850. package/public/r/pill.json +1 -1
  851. package/public/r/popover-demo.json +1 -1
  852. package/public/r/popover-with-close.json +1 -1
  853. package/public/r/preview-card-demo.json +1 -1
  854. package/public/r/pricing.json +1 -1
  855. package/public/r/progress-with-formatted-value.json +1 -1
  856. package/public/r/progress-with-label-value.json +1 -1
  857. package/public/r/radio-group-card.json +1 -1
  858. package/public/r/radio-group-demo.json +1 -1
  859. package/public/r/radio-group-disabled.json +1 -1
  860. package/public/r/radio-group-form.json +1 -1
  861. package/public/r/radio-group-with-description.json +1 -1
  862. package/public/r/reel-custom.json +1 -1
  863. package/public/r/reel-images.json +1 -1
  864. package/public/r/reel-minimal.json +1 -1
  865. package/public/r/reel.json +1 -1
  866. package/public/r/registry.json +18217 -0
  867. package/public/r/relative-time-controlled.json +1 -1
  868. package/public/r/relative-time-format-date.json +1 -1
  869. package/public/r/relative-time-format-time.json +1 -1
  870. package/public/r/relative-time.json +1 -1
  871. package/public/r/rentals.json +187 -0
  872. package/public/r/roadmap.json +1 -1
  873. package/public/r/sandbox-no-file-explorer.json +1 -1
  874. package/public/r/sandbox.json +1 -1
  875. package/public/r/scroll-area-both.json +1 -1
  876. package/public/r/scroll-area-demo.json +1 -1
  877. package/public/r/scroll-area-horizontal.json +1 -1
  878. package/public/r/select-demo.json +1 -1
  879. package/public/r/select-disabled.json +1 -1
  880. package/public/r/select-form.json +1 -1
  881. package/public/r/select-lg.json +1 -1
  882. package/public/r/select-native.json +12 -0
  883. package/public/r/select-sm.json +1 -1
  884. package/public/r/select-with-groups.json +1 -1
  885. package/public/r/select-without-alignment.json +1 -1
  886. package/public/r/select.json +1 -1
  887. package/public/r/separator-demo.json +1 -1
  888. package/public/r/sheet-demo.json +1 -1
  889. package/public/r/sheet-position.json +1 -1
  890. package/public/r/sidebar-nav.json +22 -0
  891. package/public/r/skeleton-demo.json +1 -1
  892. package/public/r/skeleton.json +1 -1
  893. package/public/r/slider-form.json +1 -1
  894. package/public/r/slider-with-label-value.json +1 -1
  895. package/public/r/sonner.json +16 -0
  896. package/public/r/stats-card.json +22 -0
  897. package/public/r/status-custom.json +1 -1
  898. package/public/r/stepper.json +15 -0
  899. package/public/r/stories-images.json +1 -1
  900. package/public/r/switch-card.json +1 -1
  901. package/public/r/switch-demo.json +1 -1
  902. package/public/r/switch-disabled.json +1 -1
  903. package/public/r/switch-form.json +1 -1
  904. package/public/r/switch-with-description.json +1 -1
  905. package/public/r/table-demo.json +1 -1
  906. package/public/r/table-framed.json +1 -1
  907. package/public/r/table-simple.json +1 -1
  908. package/public/r/table.json +1 -1
  909. package/public/r/tabs-demo.json +1 -1
  910. package/public/r/tabs-underline-vertical.json +1 -1
  911. package/public/r/tabs-underline.json +1 -1
  912. package/public/r/tabs-vertical.json +1 -1
  913. package/public/r/tags-create.json +1 -1
  914. package/public/r/tags-filter.json +1 -1
  915. package/public/r/tags.json +1 -1
  916. package/public/r/template-auth-eight.json +28 -0
  917. package/public/r/template-auth-five.json +28 -0
  918. package/public/r/template-auth-four.json +29 -0
  919. package/public/r/template-auth-nine.json +28 -0
  920. package/public/r/template-auth-one.json +49 -0
  921. package/public/r/template-auth-seven.json +29 -0
  922. package/public/r/template-auth-six.json +28 -0
  923. package/public/r/template-auth-three.json +49 -0
  924. package/public/r/template-auth-two.json +44 -0
  925. package/public/r/template-hero-eight.json +83 -0
  926. package/public/r/template-hero-eleven.json +29 -0
  927. package/public/r/template-hero-five.json +35 -0
  928. package/public/r/template-hero-four.json +35 -0
  929. package/public/r/template-hero-fourteen.json +101 -0
  930. package/public/r/template-hero-nine.json +74 -0
  931. package/public/r/template-hero-one.json +90 -0
  932. package/public/r/template-hero-seven.json +83 -0
  933. package/public/r/template-hero-six.json +83 -0
  934. package/public/r/template-hero-ten.json +77 -0
  935. package/public/r/template-hero-thirteen.json +101 -0
  936. package/public/r/template-hero-three.json +35 -0
  937. package/public/r/template-hero-twelve.json +30 -0
  938. package/public/r/template-hero-two.json +96 -0
  939. package/public/r/template-logo-cloud-five.json +68 -0
  940. package/public/r/template-logo-cloud-four.json +71 -0
  941. package/public/r/template-logo-cloud-one.json +89 -0
  942. package/public/r/template-logo-cloud-three.json +71 -0
  943. package/public/r/template-logo-cloud-two.json +74 -0
  944. package/public/r/textarea-demo.json +1 -1
  945. package/public/r/textarea-disabled.json +1 -1
  946. package/public/r/textarea-form.json +1 -1
  947. package/public/r/textarea-lg.json +1 -1
  948. package/public/r/textarea-sm.json +1 -1
  949. package/public/r/textarea-with-label.json +1 -1
  950. package/public/r/ticker-inline.json +1 -1
  951. package/public/r/timeline.json +15 -0
  952. package/public/r/toast-demo.json +1 -1
  953. package/public/r/toast-heights.json +1 -1
  954. package/public/r/toast-loading.json +1 -1
  955. package/public/r/toast-promise.json +1 -1
  956. package/public/r/toast-with-action.json +1 -1
  957. package/public/r/toast-with-status.json +1 -1
  958. package/public/r/toggle-demo.json +1 -1
  959. package/public/r/toggle-disabled.json +1 -1
  960. package/public/r/toggle-group-demo.json +1 -1
  961. package/public/r/toggle-group-disabled.json +1 -1
  962. package/public/r/toggle-group-lg.json +1 -1
  963. package/public/r/toggle-group-multiple.json +1 -1
  964. package/public/r/toggle-group-outline-with-separator.json +1 -1
  965. package/public/r/toggle-group-outline.json +1 -1
  966. package/public/r/toggle-group-sm.json +1 -1
  967. package/public/r/toggle-group-with-disabled-item.json +1 -1
  968. package/public/r/toggle-icon-group.json +1 -1
  969. package/public/r/toggle-lg.json +1 -1
  970. package/public/r/toggle-outline.json +1 -1
  971. package/public/r/toggle-sm.json +1 -1
  972. package/public/r/toggle-with-icon.json +1 -1
  973. package/public/r/toolbar-demo.json +1 -1
  974. package/public/r/tooltip-demo.json +1 -1
  975. package/public/r/tooltip-grouped.json +1 -1
  976. package/public/r/tree-controlled.json +1 -1
  977. package/public/r/tree-custom-icons.json +1 -1
  978. package/public/r/tree-no-lines.json +1 -1
  979. package/public/r/tree-simple.json +1 -1
  980. package/public/r/tree.json +1 -1
  981. package/public/r/typography.json +1 -1
  982. package/public/r/ui.json +5 -0
  983. package/public/r/use-character-limit.json +12 -0
  984. package/public/r/use-file-upload.json +12 -0
  985. package/public/r/use-pagination.json +12 -0
  986. package/public/r/use-slider-with-input.json +12 -0
  987. package/public/r/use-toast.json +12 -0
  988. package/public/r/utils.json +16 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-569",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/components/comp-569.tsx",
11
+ "content": "\"use client\"\n\nimport React, { useState } from \"react\"\nimport {\n createOnDropHandler,\n dragAndDropFeature,\n hotkeysCoreFeature,\n keyboardDragAndDropFeature,\n selectionFeature,\n syncDataLoaderFeature,\n} from \"@headless-tree/core\"\nimport { AssistiveTreeDescription, useTree } from \"@headless-tree/react\"\nimport { FolderIcon, FolderOpenIcon } from \"lucide-react\"\n\nimport {\n Tree,\n TreeDragLine,\n TreeItem,\n TreeItemLabel,\n} from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\nconst initialItems: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nexport default function Component() {\n const [items, setItems] = useState(initialItems)\n\n const tree = useTree<Item>({\n initialState: {\n expandedItems: [\"engineering\", \"frontend\", \"design-system\"],\n selectedItems: [\"components\"],\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n canReorder: true,\n onDrop: createOnDropHandler((parentItem, newChildrenIds) => {\n setItems((prevItems) => ({\n ...prevItems,\n [parentItem.getId()]: {\n ...prevItems[parentItem.getId()],\n children: newChildrenIds,\n },\n }))\n }),\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n selectionFeature,\n hotkeysCoreFeature,\n dragAndDropFeature,\n keyboardDragAndDropFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:first:grow\">\n <Tree indent={indent} tree={tree}>\n <AssistiveTreeDescription tree={tree} />\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item}>\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() &&\n (item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ))}\n {item.getItemName()}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n <TreeDragLine />\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with multi-select and drag and drop ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
12
+ "type": "registry:component"
13
+ }
14
+ ],
15
+ "meta": {
16
+ "tags": [
17
+ "tree"
18
+ ]
19
+ }
20
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-57",
4
+ "type": "registry:component",
5
+ "dependencies": [
6
+ "emblor"
7
+ ],
8
+ "registryDependencies": [
9
+ "https://loveui.dev/building-blocks/r/label.json"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "registry/default/components/comp-57.tsx",
14
+ "content": "\"use client\"\n\nimport { useId, useState } from \"react\"\nimport { Tag, TagInput } from \"emblor\"\n\nimport { Label } from \"@/registry/building-blocks/default/ui/label\"\n\nconst tags = [\n {\n id: \"1\",\n text: \"Red\",\n },\n]\n\nexport default function Component() {\n const id = useId()\n const [exampleTags, setExampleTags] = useState<Tag[]>(tags)\n const [activeTagIndex, setActiveTagIndex] = useState<number | null>(null)\n\n return (\n <div className=\"*:not-first:mt-2\">\n <Label htmlFor={id}>Input with inner tags</Label>\n <TagInput\n id={id}\n tags={exampleTags}\n setTags={(newTags) => {\n setExampleTags(newTags)\n }}\n placeholder=\"Add a tag\"\n styleClasses={{\n inlineTagsContainer:\n \"border-input rounded-md bg-background shadow-xs transition-[color,box-shadow] focus-within:border-ring outline-none focus-within:ring-[3px] focus-within:ring-ring/50 p-1 gap-1\",\n input: \"w-full min-w-[80px] shadow-none px-2 h-7\",\n tag: {\n body: \"h-7 relative bg-background border border-input hover:bg-background rounded-md font-medium text-xs ps-2 pe-7\",\n closeButton:\n \"absolute -inset-y-px -end-px p-0 rounded-e-md flex size-7 transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] text-muted-foreground/80 hover:text-foreground\",\n },\n }}\n activeTagIndex={activeTagIndex}\n setActiveTagIndex={setActiveTagIndex}\n />\n <p\n className=\"mt-2 text-xs text-muted-foreground\"\n role=\"region\"\n aria-live=\"polite\"\n >\n Built with{\" \"}\n <a\n className=\"underline hover:text-foreground\"\n href=\"https://github.com/JaleelB/emblor\"\n target=\"_blank\"\n rel=\"noopener nofollow\"\n >\n emblor\n </a>\n </p>\n </div>\n )\n}\n",
15
+ "type": "registry:component"
16
+ }
17
+ ],
18
+ "meta": {
19
+ "tags": [
20
+ "input",
21
+ "label",
22
+ "tag",
23
+ "emblor"
24
+ ]
25
+ }
26
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-570",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/components/comp-570.tsx",
11
+ "content": "\"use client\"\n\nimport React, { useState } from \"react\"\nimport {\n hotkeysCoreFeature,\n renamingFeature,\n selectionFeature,\n syncDataLoaderFeature,\n} from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\nimport { FileIcon, FolderIcon, FolderOpenIcon } from \"lucide-react\"\n\nimport { Input } from \"@/registry/building-blocks/default/ui/input\"\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\n// Initial data\nconst initialItems: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nexport default function Component() {\n const [items, setItems] = useState(initialItems)\n\n const tree = useTree<Item>({\n initialState: {\n expandedItems: [\"engineering\", \"frontend\", \"design-system\"],\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n onRename: (item, newName) => {\n // Update the item name in our state\n const itemId = item.getId()\n setItems((prevItems) => ({\n ...prevItems,\n [itemId]: {\n ...prevItems[itemId],\n name: newName,\n },\n }))\n },\n features: [\n syncDataLoaderFeature,\n hotkeysCoreFeature,\n renamingFeature,\n selectionFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:first:grow\">\n <Tree indent={indent} tree={tree}>\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item}>\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() ? (\n item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n )\n ) : (\n <FileIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n )}\n {item.isRenaming() ? (\n <Input\n {...item.getRenameInputProps()}\n autoFocus\n className=\"-my-0.5 h-6 px-1\"\n />\n ) : (\n item.getItemName()\n )}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with renaming (press F2 to rename) ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
12
+ "type": "registry:component"
13
+ }
14
+ ],
15
+ "meta": {
16
+ "tags": [
17
+ "tree"
18
+ ]
19
+ }
20
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-571",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json",
7
+ "https://loveui.dev/building-blocks/r/input.json"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/components/comp-571.tsx",
12
+ "content": "\"use client\"\n\nimport React, { useState } from \"react\"\nimport {\n expandAllFeature,\n hotkeysCoreFeature,\n searchFeature,\n selectionFeature,\n syncDataLoaderFeature,\n TreeState,\n} from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\nimport { FolderIcon, FolderOpenIcon, SearchIcon } from \"lucide-react\"\n\nimport { Input } from \"@/registry/building-blocks/default/ui/input\"\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\nconst items: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nexport default function Component() {\n // Store the initial expanded items to reset when search is cleared\n const initialExpandedItems = [\"engineering\", \"frontend\", \"design-system\"]\n const [state, setState] = useState<Partial<TreeState<Item>>>({})\n\n const tree = useTree<Item>({\n state,\n setState,\n initialState: {\n expandedItems: initialExpandedItems,\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n hotkeysCoreFeature,\n selectionFeature,\n searchFeature,\n expandAllFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:nth-2:grow\">\n <div className=\"relative\">\n <Input\n className=\"peer ps-9\"\n {...{\n ...tree.getSearchInputElementProps(),\n onChange: (e) => {\n // First call the original onChange handler from getSearchInputElementProps\n const originalProps = tree.getSearchInputElementProps()\n if (originalProps.onChange) {\n originalProps.onChange(e)\n }\n\n // Then handle our custom logic\n const value = e.target.value\n\n if (value.length > 0) {\n // If input has at least one character, expand all items\n tree.expandAll()\n } else {\n // If input is cleared, reset to initial expanded state\n setState((prevState) => {\n return {\n ...prevState,\n expandedItems: initialExpandedItems,\n }\n })\n }\n },\n }}\n type=\"search\"\n placeholder=\"Quick search...\"\n />\n <div className=\"pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center ps-3 text-muted-foreground/80 peer-disabled:opacity-50\">\n <SearchIcon className=\"size-4\" aria-hidden=\"true\" />\n </div>\n </div>\n\n <Tree indent={indent} tree={tree}>\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item}>\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() &&\n (item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ))}\n {item.getItemName()}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with search highlight ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
13
+ "type": "registry:component"
14
+ }
15
+ ],
16
+ "meta": {
17
+ "tags": [
18
+ "tree",
19
+ "filter",
20
+ "search"
21
+ ]
22
+ }
23
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-572",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json",
7
+ "https://loveui.dev/building-blocks/r/input.json"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/components/comp-572.tsx",
12
+ "content": "\"use client\"\n\nimport React, { useEffect, useRef, useState } from \"react\"\nimport {\n expandAllFeature,\n hotkeysCoreFeature,\n searchFeature,\n selectionFeature,\n syncDataLoaderFeature,\n TreeState,\n} from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\nimport {\n CircleXIcon,\n FilterIcon,\n FolderIcon,\n FolderOpenIcon,\n} from \"lucide-react\"\n\nimport { Input } from \"@/registry/building-blocks/default/ui/input\"\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\nconst items: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nexport default function Component() {\n // Store the initial expanded items to reset when search is cleared\n const initialExpandedItems = [\"engineering\", \"frontend\", \"design-system\"]\n const [state, setState] = useState<Partial<TreeState<Item>>>({})\n const [searchValue, setSearchValue] = useState(\"\")\n const inputRef = useRef<HTMLInputElement>(null)\n\n const tree = useTree<Item>({\n state,\n setState,\n initialState: {\n expandedItems: initialExpandedItems,\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n hotkeysCoreFeature,\n selectionFeature,\n searchFeature,\n expandAllFeature,\n ],\n })\n\n // Handle clearing the search\n const handleClearSearch = () => {\n setSearchValue(\"\")\n\n // Manually trigger the tree's search onChange with an empty value\n // to ensure item.isMatchingSearch() is correctly updated.\n const searchProps = tree.getSearchInputElementProps()\n if (searchProps.onChange) {\n const syntheticEvent = {\n target: { value: \"\" },\n } as React.ChangeEvent<HTMLInputElement> // Cast to the expected event type\n searchProps.onChange(syntheticEvent)\n }\n\n // Reset tree state to initial expanded items\n setState((prevState) => ({\n ...prevState,\n expandedItems: initialExpandedItems,\n }))\n\n // Clear custom filtered items\n setFilteredItems([])\n\n if (inputRef.current) {\n inputRef.current.focus()\n // Also clear the internal search input\n inputRef.current.value = \"\"\n }\n }\n\n // Keep track of filtered items separately from the tree's internal search state\n const [filteredItems, setFilteredItems] = useState<string[]>([])\n\n // This function determines if an item should be visible based on our custom filtering\n const shouldShowItem = (itemId: string) => {\n if (!searchValue || searchValue.length === 0) return true\n return filteredItems.includes(itemId)\n }\n\n // Update filtered items when search value changes\n useEffect(() => {\n if (!searchValue || searchValue.length === 0) {\n setFilteredItems([])\n return\n }\n\n // Get all items\n const allItems = tree.getItems()\n\n // First, find direct matches\n const directMatches = allItems\n .filter((item) => {\n const name = item.getItemName().toLowerCase()\n return name.includes(searchValue.toLowerCase())\n })\n .map((item) => item.getId())\n\n // Then, find all parent IDs of matching items\n const parentIds = new Set<string>()\n directMatches.forEach((matchId) => {\n let item = tree.getItems().find((i) => i.getId() === matchId)\n while (item?.getParent && item.getParent()) {\n const parent = item.getParent()\n if (parent) {\n parentIds.add(parent.getId())\n item = parent\n } else {\n break\n }\n }\n })\n\n // Find all children of matching items\n const childrenIds = new Set<string>()\n directMatches.forEach((matchId) => {\n const item = tree.getItems().find((i) => i.getId() === matchId)\n if (item && item.isFolder()) {\n // Get all descendants recursively\n const getDescendants = (itemId: string) => {\n const children = items[itemId]?.children || []\n children.forEach((childId) => {\n childrenIds.add(childId)\n if (items[childId]?.children?.length) {\n getDescendants(childId)\n }\n })\n }\n\n getDescendants(item.getId())\n }\n })\n\n // Combine direct matches, parents, and children\n setFilteredItems([\n ...directMatches,\n ...Array.from(parentIds),\n ...Array.from(childrenIds),\n ])\n\n // Keep all folders expanded during search to ensure all matches are visible\n // Store current expanded state first\n const currentExpandedItems = tree.getState().expandedItems || []\n\n // Get all folder IDs that need to be expanded to show matches\n const folderIdsToExpand = allItems\n .filter((item) => item.isFolder())\n .map((item) => item.getId())\n\n // Update expanded items in the tree state\n setState((prevState) => ({\n ...prevState,\n expandedItems: [\n ...new Set([...currentExpandedItems, ...folderIdsToExpand]),\n ],\n }))\n }, [searchValue, tree])\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:nth-2:grow\">\n <div className=\"relative\">\n <Input\n ref={inputRef}\n className=\"peer ps-9\"\n value={searchValue}\n onChange={(e) => {\n const value = e.target.value\n setSearchValue(value)\n\n // Apply the search to the tree's internal state as well\n const searchProps = tree.getSearchInputElementProps()\n if (searchProps.onChange) {\n searchProps.onChange(e)\n }\n\n if (value.length > 0) {\n // If input has at least one character, expand all items\n tree.expandAll()\n } else {\n // If input is cleared, reset to initial expanded state\n setState((prevState) => ({\n ...prevState,\n expandedItems: initialExpandedItems,\n }))\n setFilteredItems([])\n }\n }}\n // Prevent the internal search from being cleared on blur\n onBlur={(e) => {\n // Prevent default blur behavior\n e.preventDefault()\n\n // Re-apply the search to ensure it stays active\n if (searchValue && searchValue.length > 0) {\n const searchProps = tree.getSearchInputElementProps()\n if (searchProps.onChange) {\n const syntheticEvent = {\n target: { value: searchValue },\n } as React.ChangeEvent<HTMLInputElement>\n searchProps.onChange(syntheticEvent)\n }\n }\n }}\n type=\"search\"\n placeholder=\"Filter items...\"\n />\n <div className=\"pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center ps-3 text-muted-foreground/80 peer-disabled:opacity-50\">\n <FilterIcon className=\"size-4\" aria-hidden=\"true\" />\n </div>\n {searchValue && (\n <button\n className=\"absolute inset-y-0 end-0 flex h-full w-9 items-center justify-center rounded-e-md text-muted-foreground/80 transition-[color,box-shadow] outline-none hover:text-foreground focus:z-10 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Clear search\"\n onClick={handleClearSearch}\n >\n <CircleXIcon className=\"size-4\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n <Tree indent={indent} tree={tree}>\n {searchValue && filteredItems.length === 0 ? (\n <p className=\"px-3 py-4 text-center text-sm\">\n No items found for \"{searchValue}\"\n </p>\n ) : (\n tree.getItems().map((item) => {\n const isVisible = shouldShowItem(item.getId())\n\n return (\n <TreeItem\n key={item.getId()}\n item={item}\n data-visible={isVisible || !searchValue}\n className=\"data-[visible=false]:hidden\"\n >\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() &&\n (item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ))}\n {item.getItemName()}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })\n )}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with filtering ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
13
+ "type": "registry:component"
14
+ }
15
+ ],
16
+ "meta": {
17
+ "tags": [
18
+ "tree",
19
+ "filter",
20
+ "search"
21
+ ]
22
+ }
23
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-573",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/components/comp-573.tsx",
11
+ "content": "\"use client\"\n\nimport React from \"react\"\nimport {\n FeatureImplementation,\n hotkeysCoreFeature,\n selectionFeature,\n syncDataLoaderFeature,\n} from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\nimport { FolderIcon, FolderOpenIcon } from \"lucide-react\"\n\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\nconst items: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nconst doubleClickExpandFeature: FeatureImplementation = {\n itemInstance: {\n getProps: ({ tree, item, prev }) => ({\n ...prev?.(),\n onDoubleClick: (e: React.MouseEvent) => {\n item.primaryAction()\n\n if (!item.isFolder()) {\n return\n }\n\n if (item.isExpanded()) {\n item.collapse()\n } else {\n item.expand()\n }\n },\n onClick: (e: React.MouseEvent) => {\n if (e.shiftKey) {\n item.selectUpTo(e.ctrlKey || e.metaKey)\n } else if (e.ctrlKey || e.metaKey) {\n item.toggleSelect()\n } else {\n tree.setSelectedItems([item.getItemMeta().itemId])\n }\n\n item.setFocused()\n },\n }),\n },\n}\n\nexport default function Component() {\n const tree = useTree<Item>({\n initialState: {\n expandedItems: [\"engineering\", \"frontend\", \"design-system\"],\n selectedItems: [\"components\"],\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n selectionFeature,\n hotkeysCoreFeature,\n doubleClickExpandFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:first:grow\">\n <Tree indent={indent} tree={tree}>\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item}>\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() &&\n (item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ))}\n {item.getItemName()}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with items expandable on double click ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
12
+ "type": "registry:component"
13
+ }
14
+ ],
15
+ "meta": {
16
+ "tags": [
17
+ "tree"
18
+ ]
19
+ }
20
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-574",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json",
7
+ "https://loveui.dev/building-blocks/r/button.json"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/components/comp-574.tsx",
12
+ "content": "\"use client\"\n\nimport React from \"react\"\nimport {\n expandAllFeature,\n hotkeysCoreFeature,\n selectionFeature,\n syncDataLoaderFeature,\n} from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\nimport {\n FolderIcon,\n FolderOpenIcon,\n ListCollapseIcon,\n ListTreeIcon,\n} from \"lucide-react\"\n\nimport { Button } from \"@/registry/building-blocks/default/ui/button\"\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n}\n\nconst items: Record<string, Item> = {\n company: {\n name: \"Company\",\n children: [\"engineering\", \"marketing\", \"operations\"],\n },\n engineering: {\n name: \"Engineering\",\n children: [\"frontend\", \"backend\", \"platform-team\"],\n },\n frontend: { name: \"Frontend\", children: [\"design-system\", \"web-platform\"] },\n \"design-system\": {\n name: \"Design System\",\n children: [\"components\", \"tokens\", \"guidelines\"],\n },\n components: { name: \"Components\" },\n tokens: { name: \"Tokens\" },\n guidelines: { name: \"Guidelines\" },\n \"web-platform\": { name: \"Web Platform\" },\n backend: { name: \"Backend\", children: [\"apis\", \"infrastructure\"] },\n apis: { name: \"APIs\" },\n infrastructure: { name: \"Infrastructure\" },\n \"platform-team\": { name: \"Platform Team\" },\n marketing: { name: \"Marketing\", children: [\"content\", \"seo\"] },\n content: { name: \"Content\" },\n seo: { name: \"SEO\" },\n operations: { name: \"Operations\", children: [\"hr\", \"finance\"] },\n hr: { name: \"HR\" },\n finance: { name: \"Finance\" },\n}\n\nconst indent = 20\n\nexport default function Component() {\n const tree = useTree<Item>({\n initialState: {\n expandedItems: [\"engineering\", \"frontend\", \"design-system\"],\n selectedItems: [\"components\"],\n },\n indent,\n rootItemId: \"company\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n selectionFeature,\n hotkeysCoreFeature,\n expandAllFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:nth-2:grow\">\n <div className=\"flex items-center gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => tree.expandAll()}>\n <ListTreeIcon\n className=\"-ms-1 opacity-60\"\n size={16}\n aria-hidden=\"true\"\n />\n Expand all\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={tree.collapseAll}>\n <ListCollapseIcon\n className=\"-ms-1 opacity-60\"\n size={16}\n aria-hidden=\"true\"\n />\n Collapse all\n </Button>\n </div>\n\n <Tree indent={indent} tree={tree}>\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item}>\n <TreeItemLabel>\n <span className=\"flex items-center gap-2\">\n {item.isFolder() &&\n (item.isExpanded() ? (\n <FolderOpenIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ) : (\n <FolderIcon className=\"pointer-events-none size-4 text-muted-foreground\" />\n ))}\n {item.getItemName()}\n {item.isFolder() && (\n <span className=\"-ms-1 text-muted-foreground\">\n {`(${item.getChildren().length})`}\n </span>\n )}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Tree with expand/collapse all buttons ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com/\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
13
+ "type": "registry:component"
14
+ }
15
+ ],
16
+ "meta": {
17
+ "tags": [
18
+ "tree",
19
+ "button"
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-575",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/components/comp-575.tsx",
11
+ "content": "\"use client\"\n\nimport React, { useState } from \"react\"\nimport {\n createOnDropHandler,\n dragAndDropFeature,\n hotkeysCoreFeature,\n keyboardDragAndDropFeature,\n selectionFeature,\n syncDataLoaderFeature,\n} from \"@headless-tree/core\"\nimport { AssistiveTreeDescription, useTree } from \"@headless-tree/react\"\nimport {\n RiBracesLine,\n RiCodeSSlashLine,\n RiFileLine,\n RiFileTextLine,\n RiImageLine,\n RiReactjsLine,\n} from \"@remixicon/react\"\n\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n children?: string[]\n fileExtension?: string\n}\n\nconst initialItems: Record<string, Item> = {\n app: {\n name: \"app\",\n children: [\"app/layout.tsx\", \"app/page.tsx\", \"app/(dashboard)\", \"app/api\"],\n },\n \"app/layout.tsx\": { name: \"layout.tsx\", fileExtension: \"tsx\" },\n \"app/page.tsx\": { name: \"page.tsx\", fileExtension: \"tsx\" },\n \"app/(dashboard)\": {\n name: \"(dashboard)\",\n children: [\"app/(dashboard)/dashboard\"],\n },\n \"app/(dashboard)/dashboard\": {\n name: \"dashboard\",\n children: [\"app/(dashboard)/dashboard/page.tsx\"],\n },\n \"app/(dashboard)/dashboard/page.tsx\": {\n name: \"page.tsx\",\n fileExtension: \"tsx\",\n },\n \"app/api\": { name: \"api\", children: [\"app/api/hello\"] },\n \"app/api/hello\": { name: \"hello\", children: [\"app/api/hello/route.ts\"] },\n \"app/api/hello/route.ts\": { name: \"route.ts\", fileExtension: \"ts\" },\n components: {\n name: \"components\",\n children: [\"components/button.tsx\", \"components/card.tsx\"],\n },\n \"components/button.tsx\": { name: \"button.tsx\", fileExtension: \"tsx\" },\n \"components/card.tsx\": { name: \"card.tsx\", fileExtension: \"tsx\" },\n lib: { name: \"lib\", children: [\"lib/utils.ts\"] },\n \"lib/utils.ts\": { name: \"utils.ts\", fileExtension: \"ts\" },\n public: {\n name: \"public\",\n children: [\"public/favicon.ico\", \"public/vercel.svg\"],\n },\n \"public/favicon.ico\": { name: \"favicon.ico\", fileExtension: \"ico\" },\n \"public/vercel.svg\": { name: \"vercel.svg\", fileExtension: \"svg\" },\n \"package.json\": { name: \"package.json\", fileExtension: \"json\" },\n \"tailwind.config.ts\": { name: \"tailwind.config.ts\", fileExtension: \"ts\" },\n \"tsconfig.json\": { name: \"tsconfig.json\", fileExtension: \"json\" },\n \"next.config.mjs\": { name: \"next.config.mjs\", fileExtension: \"mjs\" },\n \"README.md\": { name: \"README.md\", fileExtension: \"md\" },\n root: {\n name: \"Project Root\",\n children: [\n \"app\",\n \"components\",\n \"lib\",\n \"public\",\n \"package.json\",\n \"tailwind.config.ts\",\n \"tsconfig.json\",\n \"next.config.mjs\",\n \"README.md\",\n ],\n },\n}\n\n// Helper function to get icon based on file extension\nfunction getFileIcon(extension: string | undefined, className: string) {\n switch (extension) {\n case \"tsx\":\n case \"jsx\":\n return <RiReactjsLine className={className} />\n case \"ts\":\n case \"js\":\n case \"mjs\":\n return <RiCodeSSlashLine className={className} />\n case \"json\":\n return <RiBracesLine className={className} />\n case \"svg\":\n case \"ico\":\n case \"png\":\n case \"jpg\":\n return <RiImageLine className={className} />\n case \"md\":\n return <RiFileTextLine className={className} />\n default:\n return <RiFileLine className={className} />\n }\n}\n\nconst indent = 20\n\nexport default function Component() {\n const [items, setItems] = useState(initialItems)\n\n const tree = useTree<Item>({\n initialState: {\n expandedItems: [\"app\", \"app/(dashboard)\", \"app/(dashboard)/dashboard\"],\n selectedItems: [\"components\"],\n },\n indent,\n rootItemId: \"root\",\n getItemName: (item) => item.getItemData()?.name ?? \"Unknown\",\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n canReorder: false,\n onDrop: createOnDropHandler((parentItem, newChildrenIds) => {\n setItems((prevItems) => {\n // Sort the children alphabetically\n const sortedChildren = [...newChildrenIds].sort((a, b) => {\n const itemA = prevItems[a]\n const itemB = prevItems[b]\n\n // First sort folders before files\n const isAFolder = (itemA?.children?.length ?? 0) > 0\n const isBFolder = (itemB?.children?.length ?? 0) > 0\n\n if (isAFolder && !isBFolder) return -1\n if (!isAFolder && isBFolder) return 1\n\n // Then sort alphabetically by name\n return (itemA?.name ?? \"\").localeCompare(itemB?.name ?? \"\")\n })\n\n return {\n ...prevItems,\n [parentItem.getId()]: {\n ...prevItems[parentItem.getId()],\n children: sortedChildren,\n },\n }\n })\n }),\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId]?.children ?? [],\n },\n features: [\n syncDataLoaderFeature,\n selectionFeature,\n hotkeysCoreFeature,\n dragAndDropFeature,\n keyboardDragAndDropFeature,\n ],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:first:grow\">\n <div>\n <Tree\n className=\"relative before:absolute before:inset-0 before:-ms-1 before:bg-[repeating-linear-gradient(to_right,transparent_0,transparent_calc(var(--tree-indent)-1px),var(--border)_calc(var(--tree-indent)-1px),var(--border)_calc(var(--tree-indent)))]\"\n indent={indent}\n tree={tree}\n >\n <AssistiveTreeDescription tree={tree} />\n {tree.getItems().map((item) => {\n return (\n <TreeItem key={item.getId()} item={item} className=\"pb-0!\">\n <TreeItemLabel className=\"rounded-none py-1\">\n <span className=\"flex items-center gap-2\">\n {!item.isFolder() &&\n getFileIcon(\n item.getItemData()?.fileExtension,\n \"text-muted-foreground pointer-events-none size-4\"\n )}\n {item.getItemName()}\n </span>\n </TreeItemLabel>\n </TreeItem>\n )\n })}\n </Tree>\n </div>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n File editor with drag and drop ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
12
+ "type": "registry:component"
13
+ }
14
+ ],
15
+ "meta": {
16
+ "tags": [
17
+ "tree"
18
+ ]
19
+ }
20
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-576",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/tree.json"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/components/comp-576.tsx",
11
+ "content": "\"use client\"\n\nimport React from \"react\"\nimport { hotkeysCoreFeature, syncDataLoaderFeature } from \"@headless-tree/core\"\nimport { useTree } from \"@headless-tree/react\"\n\nimport { Tree, TreeItem, TreeItemLabel } from \"@/registry/building-blocks/default/ui/tree\"\n\ninterface Item {\n name: string\n href?: string\n children?: string[]\n current?: boolean\n}\n\nconst items: Record<string, Item> = {\n main: { name: \"Documentation\", children: [\"guides\", \"api\", \"resources\"] },\n guides: { name: \"User Guides\", children: [\"getting-started\", \"advanced\"] },\n \"getting-started\": {\n name: \"Getting Started\",\n children: [\"installation\", \"setup\"],\n },\n installation: { name: \"Installation\", href: \"#\", current: true },\n setup: { name: \"Configuration\", href: \"#\" },\n advanced: { name: \"Advanced Usage\", href: \"#\" },\n api: { name: \"API Reference\", children: [\"endpoints\", \"models\"] },\n endpoints: { name: \"Endpoints\", href: \"#\" },\n models: { name: \"Data Models\", href: \"#\" },\n resources: { name: \"Resources\", children: [\"examples\", \"faq\"] },\n examples: { name: \"Code Examples\", href: \"#\" },\n faq: { name: \"FAQ\", href: \"#\" },\n}\n\nconst indent = 20\n\n// Find the path from root to the current item\nfunction findPathToCurrent(\n items: Record<string, Item>,\n rootId: string\n): string[] {\n const path: string[] = []\n\n function findPath(itemId: string): boolean {\n const item = items[itemId]\n if (!item) return false\n\n // If this is the current item, we found the path\n if (item.current) {\n path.unshift(itemId)\n return true\n }\n\n // If this item has children, search them\n if (item.children?.length) {\n for (const childId of item.children) {\n if (findPath(childId)) {\n // If we found the path in this branch, add this item to the path\n path.unshift(itemId)\n return true\n }\n }\n }\n\n return false\n }\n\n findPath(rootId)\n return path\n}\n\n// Get all parent IDs that need to be expanded\nconst pathToCurrent = findPathToCurrent(items, \"main\")\n// Remove the current item from the path if it's a leaf node\nconst expandedItems = pathToCurrent.filter((id) => items[id].children?.length)\n\nexport default function Component() {\n const tree = useTree<Item>({\n initialState: {\n expandedItems,\n },\n indent,\n rootItemId: \"main\",\n getItemName: (item) => item.getItemData().name,\n isItemFolder: (item) => (item.getItemData()?.children?.length ?? 0) > 0,\n dataLoader: {\n getItem: (itemId) => items[itemId],\n getChildren: (itemId) => items[itemId].children ?? [],\n },\n features: [syncDataLoaderFeature, hotkeysCoreFeature],\n })\n\n return (\n <div className=\"flex h-full flex-col gap-2 *:first:grow\">\n <Tree indent={indent} tree={tree}>\n {tree.getItems().map((item) => {\n return (\n <TreeItem\n key={item.getId()}\n item={item}\n asChild={!!item.getItemData()?.href}\n >\n {item.getItemData()?.href ? (\n <a\n href={item.getItemData().href}\n data-current={item.getItemData().current}\n >\n <TreeItemLabel className=\"in-data-[current=true]:bg-accent in-data-[current=true]:text-accent-foreground\" />\n </a>\n ) : (\n <TreeItemLabel />\n )}\n </TreeItem>\n )\n })}\n </Tree>\n\n <p\n aria-live=\"polite\"\n role=\"region\"\n className=\"mt-2 text-xs text-muted-foreground\"\n >\n Menu navigation tree ∙{\" \"}\n <a\n href=\"https://headless-tree.lukasbach.com\"\n className=\"underline hover:text-foreground\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n API\n </a>\n </p>\n </div>\n )\n}\n",
12
+ "type": "registry:component"
13
+ }
14
+ ],
15
+ "meta": {
16
+ "tags": [
17
+ "tree",
18
+ "menu"
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-577",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/button.json",
7
+ "https://loveui.dev/building-blocks/r/navigation-menu.json",
8
+ "https://loveui.dev/building-blocks/r/popover.json"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "registry/default/components/comp-577.tsx",
13
+ "content": "import Logo from \"@/registry/building-blocks/default/components/navbar-components/logo\"\nimport { Button } from \"@/registry/building-blocks/default/ui/button\"\nimport {\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n} from \"@/registry/building-blocks/default/ui/navigation-menu\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/building-blocks/default/ui/popover\"\n\n// Navigation links array to be used in both desktop and mobile menus\nconst navigationLinks = [\n { href: \"#\", label: \"Home\", active: true },\n { href: \"#\", label: \"Features\" },\n { href: \"#\", label: \"Pricing\" },\n { href: \"#\", label: \"About\" },\n]\n\nexport default function Component() {\n return (\n <header className=\"border-b px-4 md:px-6\">\n <div className=\"flex h-16 items-center justify-between gap-4\">\n {/* Left side */}\n <div className=\"flex items-center gap-2\">\n {/* Mobile menu trigger */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n className=\"group size-8 md:hidden\"\n variant=\"ghost\"\n size=\"icon\"\n >\n <svg\n className=\"pointer-events-none\"\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 12L20 12\"\n className=\"origin-center -translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-x-0 group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[315deg]\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.8)] group-aria-expanded:rotate-45\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[135deg]\"\n />\n </svg>\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1 md:hidden\">\n <NavigationMenu className=\"max-w-none *:w-full\">\n <NavigationMenuList className=\"flex-col items-start gap-0 md:gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index} className=\"w-full\">\n <NavigationMenuLink\n href={link.href}\n className=\"py-1.5\"\n active={link.active}\n >\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </PopoverContent>\n </Popover>\n {/* Main nav */}\n <div className=\"flex items-center gap-6\">\n <a href=\"#\" className=\"text-primary hover:text-primary/90\">\n <Logo />\n </a>\n {/* Navigation menu */}\n <NavigationMenu className=\"max-md:hidden\">\n <NavigationMenuList className=\"gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index}>\n <NavigationMenuLink\n active={link.active}\n href={link.href}\n className=\"py-1.5 font-medium text-muted-foreground hover:text-primary\"\n >\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </div>\n </div>\n {/* Right side */}\n <div className=\"flex items-center gap-2\">\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Sign In</a>\n </Button>\n <Button asChild size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Get Started</a>\n </Button>\n </div>\n </div>\n </header>\n )\n}\n",
14
+ "type": "registry:component"
15
+ }
16
+ ],
17
+ "meta": {
18
+ "tags": [
19
+ "navbar, navigation"
20
+ ],
21
+ "colSpan": 3
22
+ }
23
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-578",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/button.json",
7
+ "https://loveui.dev/building-blocks/r/navigation-menu.json",
8
+ "https://loveui.dev/building-blocks/r/popover.json"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "registry/default/components/comp-578.tsx",
13
+ "content": "import { BookOpenIcon, InfoIcon, LifeBuoyIcon } from \"lucide-react\"\n\nimport Logo from \"@/registry/building-blocks/default/components/navbar-components/logo\"\nimport { cn } from \"@/registry/building-blocks/default/lib/utils\"\nimport { Button } from \"@/registry/building-blocks/default/ui/button\"\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n} from \"@/registry/building-blocks/default/ui/navigation-menu\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/building-blocks/default/ui/popover\"\n\n// Navigation links array to be used in both desktop and mobile menus\nconst navigationLinks = [\n { href: \"#\", label: \"Home\" },\n {\n label: \"Features\",\n submenu: true,\n type: \"description\",\n items: [\n {\n href: \"#\",\n label: \"Components\",\n description: \"Browse all components in the library.\",\n },\n {\n href: \"#\",\n label: \"Documentation\",\n description: \"Learn how to use the library.\",\n },\n {\n href: \"#\",\n label: \"Templates\",\n description: \"Pre-built layouts for common use cases.\",\n },\n ],\n },\n {\n label: \"Pricing\",\n submenu: true,\n type: \"simple\",\n items: [\n { href: \"#\", label: \"Product A\" },\n { href: \"#\", label: \"Product B\" },\n { href: \"#\", label: \"Product C\" },\n { href: \"#\", label: \"Product D\" },\n ],\n },\n {\n label: \"About\",\n submenu: true,\n type: \"icon\",\n items: [\n { href: \"#\", label: \"Getting Started\", icon: \"BookOpenIcon\" },\n { href: \"#\", label: \"Tutorials\", icon: \"LifeBuoyIcon\" },\n { href: \"#\", label: \"About Us\", icon: \"InfoIcon\" },\n ],\n },\n]\n\nexport default function Component() {\n return (\n <header className=\"border-b px-4 md:px-6\">\n <div className=\"flex h-16 items-center justify-between gap-4\">\n {/* Left side */}\n <div className=\"flex items-center gap-2\">\n {/* Mobile menu trigger */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n className=\"group size-8 md:hidden\"\n variant=\"ghost\"\n size=\"icon\"\n >\n <svg\n className=\"pointer-events-none\"\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 12L20 12\"\n className=\"origin-center -translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-x-0 group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[315deg]\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.8)] group-aria-expanded:rotate-45\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[135deg]\"\n />\n </svg>\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 p-1 md:hidden\">\n <NavigationMenu className=\"max-w-none *:w-full\">\n <NavigationMenuList className=\"flex-col items-start gap-0 md:gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index} className=\"w-full\">\n {link.submenu ? (\n <>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n {link.label}\n </div>\n <ul>\n {link.items.map((item, itemIndex) => (\n <li key={itemIndex}>\n <NavigationMenuLink\n href={item.href}\n className=\"py-1.5\"\n >\n {item.label}\n </NavigationMenuLink>\n </li>\n ))}\n </ul>\n </>\n ) : (\n <NavigationMenuLink href={link.href} className=\"py-1.5\">\n {link.label}\n </NavigationMenuLink>\n )}\n {/* Add separator between different types of items */}\n {index < navigationLinks.length - 1 &&\n // Show separator if:\n // 1. One is submenu and one is simple link OR\n // 2. Both are submenus but with different types\n ((!link.submenu &&\n navigationLinks[index + 1].submenu) ||\n (link.submenu &&\n !navigationLinks[index + 1].submenu) ||\n (link.submenu &&\n navigationLinks[index + 1].submenu &&\n link.type !== navigationLinks[index + 1].type)) && (\n <div\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className=\"-mx-1 my-1 h-px w-full bg-border\"\n />\n )}\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </PopoverContent>\n </Popover>\n {/* Main nav */}\n <div className=\"flex items-center gap-6\">\n <a href=\"#\" className=\"text-primary hover:text-primary/90\">\n <Logo />\n </a>\n {/* Navigation menu */}\n <NavigationMenu viewport={false} className=\"max-md:hidden\">\n <NavigationMenuList className=\"gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index}>\n {link.submenu ? (\n <>\n <NavigationMenuTrigger className=\"bg-transparent px-2 py-1.5 font-medium text-muted-foreground hover:text-primary *:[svg]:-me-0.5 *:[svg]:size-3.5\">\n {link.label}\n </NavigationMenuTrigger>\n <NavigationMenuContent className=\"z-50 p-1 data-[motion=from-end]:slide-in-from-right-16! data-[motion=from-start]:slide-in-from-left-16! data-[motion=to-end]:slide-out-to-right-16! data-[motion=to-start]:slide-out-to-left-16!\">\n <ul\n className={cn(\n link.type === \"description\"\n ? \"min-w-64\"\n : \"min-w-48\"\n )}\n >\n {link.items.map((item, itemIndex) => (\n <li key={itemIndex}>\n <NavigationMenuLink\n href={item.href}\n className=\"py-1.5\"\n >\n {/* Display icon if present */}\n {link.type === \"icon\" && \"icon\" in item && (\n <div className=\"flex items-center gap-2\">\n {item.icon === \"BookOpenIcon\" && (\n <BookOpenIcon\n size={16}\n className=\"text-foreground opacity-60\"\n aria-hidden=\"true\"\n />\n )}\n {item.icon === \"LifeBuoyIcon\" && (\n <LifeBuoyIcon\n size={16}\n className=\"text-foreground opacity-60\"\n aria-hidden=\"true\"\n />\n )}\n {item.icon === \"InfoIcon\" && (\n <InfoIcon\n size={16}\n className=\"text-foreground opacity-60\"\n aria-hidden=\"true\"\n />\n )}\n <span>{item.label}</span>\n </div>\n )}\n\n {/* Display label with description if present */}\n {link.type === \"description\" &&\n \"description\" in item ? (\n <div className=\"space-y-1\">\n <div className=\"font-medium\">\n {item.label}\n </div>\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {item.description}\n </p>\n </div>\n ) : (\n // Display simple label if not icon or description type\n !link.type ||\n (link.type !== \"icon\" &&\n link.type !== \"description\" && (\n <span>{item.label}</span>\n ))\n )}\n </NavigationMenuLink>\n </li>\n ))}\n </ul>\n </NavigationMenuContent>\n </>\n ) : (\n <NavigationMenuLink\n href={link.href}\n className=\"py-1.5 font-medium text-muted-foreground hover:text-primary\"\n >\n {link.label}\n </NavigationMenuLink>\n )}\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </div>\n </div>\n {/* Right side */}\n <div className=\"flex items-center gap-2\">\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Sign In</a>\n </Button>\n <Button asChild size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Get Started</a>\n </Button>\n </div>\n </div>\n </header>\n )\n}\n",
14
+ "type": "registry:component"
15
+ },
16
+ {
17
+ "path": "registry/default/components/navbar-components/logo.tsx",
18
+ "content": "export default function Logo() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"33\"\n height=\"33\"\n fill=\"currentColor\"\n >\n <path d=\"M20.46 1.766 17.303.923l-2.66 9.896-2.403-8.934-3.157.843 2.595 9.652-6.464-6.442-2.311 2.304 7.09 7.066-8.83-2.358-.846 3.146 9.648 2.577a6.516 6.516 0 0 1-.169-1.478c0-3.598 2.927-6.515 6.537-6.515s6.537 2.917 6.537 6.515c0 .505-.057.997-.167 1.468l8.768 2.342.846-3.147-9.686-2.586 8.83-2.358-.845-3.147-9.686 2.587 6.464-6.442-2.311-2.304-6.992 6.969 2.369-8.81Z\" />\n <path d=\"M22.695 18.7a6.495 6.495 0 0 1-1.626 2.986l6.352 6.33 2.31-2.303-7.036-7.013ZM21.005 21.752a6.538 6.538 0 0 1-2.922 1.722l2.312 8.596 3.157-.843-2.547-9.475ZM17.965 23.505a6.569 6.569 0 0 1-1.632.205 6.566 6.566 0 0 1-1.743-.235l-2.314 8.605 3.157.843 2.532-9.418ZM14.478 23.444a6.54 6.54 0 0 1-2.87-1.747l-6.367 6.346 2.31 2.303 6.927-6.902ZM11.555 21.64a6.492 6.492 0 0 1-1.585-2.948L1.173 21.04l.846 3.146 9.536-2.546Z\" />\n </svg>\n )\n}\n",
19
+ "type": "registry:component"
20
+ }
21
+ ],
22
+ "meta": {
23
+ "tags": [
24
+ "navbar, navigation"
25
+ ],
26
+ "colSpan": 3
27
+ }
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-579",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/button.json",
7
+ "https://loveui.dev/building-blocks/r/navigation-menu.json",
8
+ "https://loveui.dev/building-blocks/r/popover.json"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "registry/default/components/comp-579.tsx",
13
+ "content": "import Logo from \"@/registry/building-blocks/default/components/navbar-components/logo\"\nimport { Button } from \"@/registry/building-blocks/default/ui/button\"\nimport {\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n} from \"@/registry/building-blocks/default/ui/navigation-menu\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/building-blocks/default/ui/popover\"\n\n// Navigation links array to be used in both desktop and mobile menus\nconst navigationLinks = [\n { href: \"#\", label: \"Home\", active: true },\n { href: \"#\", label: \"Features\" },\n { href: \"#\", label: \"Pricing\" },\n { href: \"#\", label: \"About\" },\n]\n\nexport default function Component() {\n return (\n <header className=\"border-b px-4 md:px-6\">\n <div className=\"flex h-16 justify-between gap-4\">\n {/* Left side */}\n <div className=\"flex gap-2\">\n <div className=\"flex items-center md:hidden\">\n {/* Mobile menu trigger */}\n <Popover>\n <PopoverTrigger asChild>\n <Button className=\"group size-8\" variant=\"ghost\" size=\"icon\">\n <svg\n className=\"pointer-events-none\"\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 12L20 12\"\n className=\"origin-center -translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-x-0 group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[315deg]\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.8)] group-aria-expanded:rotate-45\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[135deg]\"\n />\n </svg>\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1 md:hidden\">\n <NavigationMenu className=\"max-w-none *:w-full\">\n <NavigationMenuList className=\"flex-col items-start gap-0 md:gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index} className=\"w-full\">\n <NavigationMenuLink\n href={link.href}\n className=\"py-1.5\"\n active={link.active}\n >\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </PopoverContent>\n </Popover>\n </div>\n {/* Main nav */}\n <div className=\"flex items-center gap-6\">\n <a href=\"#\" className=\"text-primary hover:text-primary/90\">\n <Logo />\n </a>\n {/* Navigation menu */}\n <NavigationMenu className=\"h-full *:h-full max-md:hidden\">\n <NavigationMenuList className=\"h-full gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index} className=\"h-full\">\n <NavigationMenuLink\n active={link.active}\n href={link.href}\n className=\"h-full justify-center rounded-none border-y-2 border-transparent border-b-primary py-1.5 font-medium text-muted-foreground hover:border-b-primary hover:bg-transparent hover:text-primary data-[active]:border-b-primary data-[active]:bg-transparent!\"\n >\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </div>\n </div>\n {/* Right side */}\n <div className=\"flex items-center gap-2\">\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Sign In</a>\n </Button>\n <Button asChild size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Get Started</a>\n </Button>\n </div>\n </div>\n </header>\n )\n}\n",
14
+ "type": "registry:component"
15
+ },
16
+ {
17
+ "path": "registry/default/components/navbar-components/logo.tsx",
18
+ "content": "export default function Logo() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"33\"\n height=\"33\"\n fill=\"currentColor\"\n >\n <path d=\"M20.46 1.766 17.303.923l-2.66 9.896-2.403-8.934-3.157.843 2.595 9.652-6.464-6.442-2.311 2.304 7.09 7.066-8.83-2.358-.846 3.146 9.648 2.577a6.516 6.516 0 0 1-.169-1.478c0-3.598 2.927-6.515 6.537-6.515s6.537 2.917 6.537 6.515c0 .505-.057.997-.167 1.468l8.768 2.342.846-3.147-9.686-2.586 8.83-2.358-.845-3.147-9.686 2.587 6.464-6.442-2.311-2.304-6.992 6.969 2.369-8.81Z\" />\n <path d=\"M22.695 18.7a6.495 6.495 0 0 1-1.626 2.986l6.352 6.33 2.31-2.303-7.036-7.013ZM21.005 21.752a6.538 6.538 0 0 1-2.922 1.722l2.312 8.596 3.157-.843-2.547-9.475ZM17.965 23.505a6.569 6.569 0 0 1-1.632.205 6.566 6.566 0 0 1-1.743-.235l-2.314 8.605 3.157.843 2.532-9.418ZM14.478 23.444a6.54 6.54 0 0 1-2.87-1.747l-6.367 6.346 2.31 2.303 6.927-6.902ZM11.555 21.64a6.492 6.492 0 0 1-1.585-2.948L1.173 21.04l.846 3.146 9.536-2.546Z\" />\n </svg>\n )\n}\n",
19
+ "type": "registry:component"
20
+ }
21
+ ],
22
+ "meta": {
23
+ "tags": [
24
+ "navbar, navigation"
25
+ ],
26
+ "colSpan": 3
27
+ }
28
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-58",
4
+ "type": "registry:component",
5
+ "dependencies": [
6
+ "input-otp"
7
+ ],
8
+ "registryDependencies": [
9
+ "https://loveui.dev/building-blocks/r/label.json"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "registry/default/components/comp-58.tsx",
14
+ "content": "\"use client\"\n\nimport { useId } from \"react\"\nimport { OTPInput, SlotProps } from \"input-otp\"\n\nimport { cn } from \"@/registry/building-blocks/default/lib/utils\"\nimport { Label } from \"@/registry/building-blocks/default/ui/label\"\n\nexport default function Component() {\n const id = useId()\n return (\n <div className=\"*:not-first:mt-2\">\n <Label htmlFor={id}>OTP input (spaced)</Label>\n <OTPInput\n id={id}\n containerClassName=\"flex items-center gap-3 has-disabled:opacity-50\"\n maxLength={4}\n render={({ slots }) => (\n <div className=\"flex gap-2\">\n {slots.map((slot, idx) => (\n <Slot key={idx} {...slot} />\n ))}\n </div>\n )}\n />\n <p\n className=\"mt-2 text-xs text-muted-foreground\"\n role=\"region\"\n aria-live=\"polite\"\n >\n Built with{\" \"}\n <a\n className=\"underline hover:text-foreground\"\n href=\"https://github.com/guilhermerodz/input-otp\"\n target=\"_blank\"\n rel=\"noopener nofollow\"\n >\n Input OTP\n </a>\n </p>\n </div>\n )\n}\n\nfunction Slot(props: SlotProps) {\n return (\n <div\n className={cn(\n \"flex size-9 items-center justify-center rounded-md border border-input bg-background font-medium text-foreground shadow-xs transition-[color,box-shadow]\",\n { \"z-10 border-ring ring-[3px] ring-ring/50\": props.isActive }\n )}\n >\n {props.char !== null && <div>{props.char}</div>}\n </div>\n )\n}\n",
15
+ "type": "registry:component"
16
+ }
17
+ ],
18
+ "meta": {
19
+ "tags": [
20
+ "input",
21
+ "label",
22
+ "otp"
23
+ ]
24
+ }
25
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "comp-580",
4
+ "type": "registry:component",
5
+ "registryDependencies": [
6
+ "https://loveui.dev/building-blocks/r/button.json",
7
+ "https://loveui.dev/building-blocks/r/navigation-menu.json",
8
+ "https://loveui.dev/building-blocks/r/popover.json",
9
+ "https://loveui.dev/building-blocks/r/input.json"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "registry/default/components/comp-580.tsx",
14
+ "content": "import { useId } from \"react\"\nimport { SearchIcon } from \"lucide-react\"\n\nimport Logo from \"@/registry/building-blocks/default/components/navbar-components/logo\"\nimport { Button } from \"@/registry/building-blocks/default/ui/button\"\nimport { Input } from \"@/registry/building-blocks/default/ui/input\"\nimport {\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n} from \"@/registry/building-blocks/default/ui/navigation-menu\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/building-blocks/default/ui/popover\"\n\n// Navigation links array to be used in both desktop and mobile menus\nconst navigationLinks = [\n { href: \"#\", label: \"Products\" },\n { href: \"#\", label: \"Categories\" },\n { href: \"#\", label: \"Deals\" },\n]\n\nexport default function Component() {\n const id = useId()\n\n return (\n <header className=\"border-b px-4 md:px-6\">\n <div className=\"flex h-16 items-center justify-between gap-4\">\n {/* Left side */}\n <div className=\"flex flex-1 items-center gap-2\">\n {/* Mobile menu trigger */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n className=\"group size-8 md:hidden\"\n variant=\"ghost\"\n size=\"icon\"\n >\n <svg\n className=\"pointer-events-none\"\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4 12L20 12\"\n className=\"origin-center -translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-x-0 group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[315deg]\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.8)] group-aria-expanded:rotate-45\"\n />\n <path\n d=\"M4 12H20\"\n className=\"origin-center translate-y-[7px] transition-all duration-300 ease-[cubic-bezier(.5,.85,.25,1.1)] group-aria-expanded:translate-y-0 group-aria-expanded:rotate-[135deg]\"\n />\n </svg>\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1 md:hidden\">\n <NavigationMenu className=\"max-w-none *:w-full\">\n <NavigationMenuList className=\"flex-col items-start gap-0 md:gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index} className=\"w-full\">\n <NavigationMenuLink href={link.href} className=\"py-1.5\">\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n <NavigationMenuItem\n className=\"w-full\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\n <div\n role=\"separator\"\n aria-orientation=\"horizontal\"\n className=\"-mx-1 my-1 h-px bg-border\"\n ></div>\n </NavigationMenuItem>\n <NavigationMenuItem className=\"w-full\">\n <NavigationMenuLink href=\"#\" className=\"py-1.5\">\n Sign In\n </NavigationMenuLink>\n </NavigationMenuItem>\n <NavigationMenuItem className=\"w-full\">\n <Button\n asChild\n size=\"sm\"\n className=\"mt-0.5 w-full text-left text-sm\"\n >\n <span className=\"flex items-baseline gap-2\">\n Cart\n <span className=\"text-xs text-primary-foreground/60\">\n 2\n </span>\n </span>\n </Button>\n </NavigationMenuItem>\n </NavigationMenuList>\n </NavigationMenu>\n </PopoverContent>\n </Popover>\n {/* Main nav */}\n <div className=\"flex flex-1 items-center gap-6 max-md:justify-between\">\n <a href=\"#\" className=\"text-primary hover:text-primary/90\">\n <Logo />\n </a>\n {/* Navigation menu */}\n <NavigationMenu className=\"max-md:hidden\">\n <NavigationMenuList className=\"gap-2\">\n {navigationLinks.map((link, index) => (\n <NavigationMenuItem key={index}>\n <NavigationMenuLink\n href={link.href}\n className=\"py-1.5 font-medium text-muted-foreground hover:text-primary\"\n >\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n {/* Search form */}\n <div className=\"relative\">\n <Input\n id={id}\n className=\"peer h-8 ps-8 pe-2\"\n placeholder=\"Search...\"\n type=\"search\"\n />\n <div className=\"pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center ps-2 text-muted-foreground/80 peer-disabled:opacity-50\">\n <SearchIcon size={16} />\n </div>\n </div>\n </div>\n </div>\n {/* Right side */}\n <div className=\"flex items-center gap-2 max-md:hidden\">\n <Button asChild variant=\"ghost\" size=\"sm\" className=\"text-sm\">\n <a href=\"#\">Sign In</a>\n </Button>\n <Button asChild size=\"sm\" className=\"text-sm\">\n <a href=\"#\">\n <span className=\"flex items-baseline gap-2\">\n Cart\n <span className=\"text-xs text-primary-foreground/60\">2</span>\n </span>\n </a>\n </Button>\n </div>\n </div>\n </header>\n )\n}\n",
15
+ "type": "registry:component"
16
+ },
17
+ {
18
+ "path": "registry/default/components/navbar-components/logo.tsx",
19
+ "content": "export default function Logo() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"33\"\n height=\"33\"\n fill=\"currentColor\"\n >\n <path d=\"M20.46 1.766 17.303.923l-2.66 9.896-2.403-8.934-3.157.843 2.595 9.652-6.464-6.442-2.311 2.304 7.09 7.066-8.83-2.358-.846 3.146 9.648 2.577a6.516 6.516 0 0 1-.169-1.478c0-3.598 2.927-6.515 6.537-6.515s6.537 2.917 6.537 6.515c0 .505-.057.997-.167 1.468l8.768 2.342.846-3.147-9.686-2.586 8.83-2.358-.845-3.147-9.686 2.587 6.464-6.442-2.311-2.304-6.992 6.969 2.369-8.81Z\" />\n <path d=\"M22.695 18.7a6.495 6.495 0 0 1-1.626 2.986l6.352 6.33 2.31-2.303-7.036-7.013ZM21.005 21.752a6.538 6.538 0 0 1-2.922 1.722l2.312 8.596 3.157-.843-2.547-9.475ZM17.965 23.505a6.569 6.569 0 0 1-1.632.205 6.566 6.566 0 0 1-1.743-.235l-2.314 8.605 3.157.843 2.532-9.418ZM14.478 23.444a6.54 6.54 0 0 1-2.87-1.747l-6.367 6.346 2.31 2.303 6.927-6.902ZM11.555 21.64a6.492 6.492 0 0 1-1.585-2.948L1.173 21.04l.846 3.146 9.536-2.546Z\" />\n </svg>\n )\n}\n",
20
+ "type": "registry:component"
21
+ }
22
+ ],
23
+ "meta": {
24
+ "tags": [
25
+ "navbar, navigation"
26
+ ],
27
+ "colSpan": 3
28
+ }
29
+ }