love-ui 1.2.15 → 1.2.18

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 (464) hide show
  1. package/README.md +14 -6
  2. package/dist/index.js +149 -0
  3. package/dist/mcp-server.js +2 -0
  4. package/package.json +28 -4
  5. package/registry/__index__.tsx +73 -0
  6. package/registry/default/blocks/404-1/app/page.tsx +5 -0
  7. package/registry/default/blocks/404-1/components/full-width-divider.tsx +33 -0
  8. package/registry/default/blocks/404-1/components/not-found.tsx +51 -0
  9. package/registry/default/blocks/404-2/app/page.tsx +5 -0
  10. package/registry/default/blocks/404-2/components/not-found.tsx +44 -0
  11. package/registry/default/blocks/auth1/app/page.tsx +5 -0
  12. package/registry/default/blocks/auth1/components/auth-page.tsx +66 -0
  13. package/registry/default/blocks/auth1/components/icons/github-icon.tsx +10 -0
  14. package/registry/default/blocks/auth1/components/icons/google-icon.tsx +14 -0
  15. package/registry/default/blocks/auth1/components/logo.tsx +88 -0
  16. package/registry/default/blocks/auth1/components/particles.tsx +321 -0
  17. package/registry/default/blocks/auth2/app/page.tsx +5 -0
  18. package/registry/default/blocks/auth2/components/auth.tsx +87 -0
  19. package/registry/default/blocks/auth2/components/icons/github-icon.tsx +10 -0
  20. package/registry/default/blocks/auth2/components/icons/google-icon.tsx +14 -0
  21. package/registry/default/blocks/auth2/components/ui/auth-divider.tsx +16 -0
  22. package/registry/default/blocks/auth2/components/ui/decor-icon.tsx +45 -0
  23. package/registry/default/blocks/auth3/app/page.tsx +5 -0
  24. package/registry/default/blocks/auth3/components/auth-page.tsx +84 -0
  25. package/registry/default/blocks/auth3/components/icons/github-icon.tsx +10 -0
  26. package/registry/default/blocks/auth3/components/icons/google-icon.tsx +14 -0
  27. package/registry/default/blocks/auth3/components/logo.tsx +88 -0
  28. package/registry/default/blocks/auth3/components/ui/auth-divider.tsx +16 -0
  29. package/registry/default/blocks/auth3/components/ui/decor-icon.tsx +45 -0
  30. package/registry/default/blocks/blogs1/app/page.tsx +5 -0
  31. package/registry/default/blocks/blogs1/components/blogs.tsx +97 -0
  32. package/registry/default/blocks/blogs1/components/full-width-divider.tsx +33 -0
  33. package/registry/default/blocks/blogs2/app/page.tsx +5 -0
  34. package/registry/default/blocks/blogs2/components/blogs.tsx +158 -0
  35. package/registry/default/blocks/blogs2/components/full-width-divider.tsx +33 -0
  36. package/registry/default/blocks/blogs2/components/grid-filler.tsx +74 -0
  37. package/registry/default/blocks/blogs3/app/page.tsx +5 -0
  38. package/registry/default/blocks/blogs3/components/aspect-ratio.tsx +22 -0
  39. package/registry/default/blocks/blogs3/components/blogs.tsx +224 -0
  40. package/registry/default/blocks/blogs3/components/full-width-divider.tsx +33 -0
  41. package/registry/default/blocks/blogs3/components/lazy-image.tsx +94 -0
  42. package/registry/default/blocks/contact1/app/page.tsx +9 -0
  43. package/registry/default/blocks/contact1/components/contact.tsx +65 -0
  44. package/registry/default/blocks/contact1/components/full-width-divider.tsx +33 -0
  45. package/registry/default/blocks/contact2/app/page.tsx +9 -0
  46. package/registry/default/blocks/contact2/components/contact.tsx +74 -0
  47. package/registry/default/blocks/contact2/components/full-width-divider.tsx +33 -0
  48. package/registry/default/blocks/contact2/components/icons/x-icon.tsx +12 -0
  49. package/registry/default/blocks/contact3/app/page.tsx +9 -0
  50. package/registry/default/blocks/contact3/components/contact.tsx +152 -0
  51. package/registry/default/blocks/contact3/components/full-width-divider.tsx +33 -0
  52. package/registry/default/blocks/contact3/components/icons/github-icon.tsx +10 -0
  53. package/registry/default/blocks/contact3/components/icons/x-icon.tsx +12 -0
  54. package/registry/default/blocks/contact4/app/page.tsx +9 -0
  55. package/registry/default/blocks/contact4/components/contact.tsx +120 -0
  56. package/registry/default/blocks/contact5/app/page.tsx +9 -0
  57. package/registry/default/blocks/contact5/components/contact.tsx +119 -0
  58. package/registry/default/blocks/contact5/components/decor-icon.tsx +45 -0
  59. package/registry/default/blocks/cta-1/app/page.tsx +9 -0
  60. package/registry/default/blocks/cta-1/components/cta.tsx +20 -0
  61. package/registry/default/blocks/cta-1/components/full-width-divider.tsx +33 -0
  62. package/registry/default/blocks/cta-2/app/page.tsx +9 -0
  63. package/registry/default/blocks/cta-2/components/cta.tsx +27 -0
  64. package/registry/default/blocks/cta-2/components/full-width-divider.tsx +33 -0
  65. package/registry/default/blocks/cta-3/app/page.tsx +9 -0
  66. package/registry/default/blocks/cta-3/components/cta.tsx +35 -0
  67. package/registry/default/blocks/cta-3/components/decor-icon.tsx +45 -0
  68. package/registry/default/blocks/cta-4/app/page.tsx +9 -0
  69. package/registry/default/blocks/cta-4/components/cta.tsx +28 -0
  70. package/registry/default/blocks/cta-5/app/page.tsx +9 -0
  71. package/registry/default/blocks/cta-5/components/cta.tsx +72 -0
  72. package/registry/default/blocks/cta-5/components/full-width-divider.tsx +33 -0
  73. package/registry/default/blocks/faq-1/app/page.tsx +9 -0
  74. package/registry/default/blocks/faq-1/components/faq.tsx +86 -0
  75. package/registry/default/blocks/faq-2/app/page.tsx +9 -0
  76. package/registry/default/blocks/faq-2/components/faq.tsx +93 -0
  77. package/registry/default/blocks/faq-3/app/page.tsx +9 -0
  78. package/registry/default/blocks/faq-3/components/decor-icon.tsx +45 -0
  79. package/registry/default/blocks/faq-3/components/faq.tsx +110 -0
  80. package/registry/default/blocks/faq-4/app/page.tsx +9 -0
  81. package/registry/default/blocks/faq-4/components/faq.tsx +181 -0
  82. package/registry/default/blocks/faq-5/app/page.tsx +9 -0
  83. package/registry/default/blocks/faq-5/components/faq.tsx +211 -0
  84. package/registry/default/blocks/faq-5/components/full-width-divider.tsx +33 -0
  85. package/registry/default/blocks/features1/app/page.tsx +9 -0
  86. package/registry/default/blocks/features1/components/feature-section.tsx +73 -0
  87. package/registry/default/blocks/features2/app/page.tsx +9 -0
  88. package/registry/default/blocks/features2/components/decor-icon.tsx +45 -0
  89. package/registry/default/blocks/features2/components/feature-section.tsx +97 -0
  90. package/registry/default/blocks/features3/app/page.tsx +9 -0
  91. package/registry/default/blocks/features3/components/feature-section.tsx +93 -0
  92. package/registry/default/blocks/features3/components/full-width-divider.tsx +21 -0
  93. package/registry/default/blocks/features4/app/page.tsx +9 -0
  94. package/registry/default/blocks/features4/components/decor-icon.tsx +45 -0
  95. package/registry/default/blocks/features4/components/feature-section.tsx +114 -0
  96. package/registry/default/blocks/features5/app/page.tsx +9 -0
  97. package/registry/default/blocks/features5/components/feature-section.tsx +115 -0
  98. package/registry/default/blocks/features5/components/grid-pattern.tsx +70 -0
  99. package/registry/default/blocks/features6/app/page.tsx +9 -0
  100. package/registry/default/blocks/features6/components/cobe-globe.tsx +86 -0
  101. package/registry/default/blocks/features6/components/feature-section.tsx +309 -0
  102. package/registry/default/blocks/footer1/app/page.tsx +9 -0
  103. package/registry/default/blocks/footer1/components/footer.tsx +85 -0
  104. package/registry/default/blocks/footer1/components/icons/github-icon.tsx +10 -0
  105. package/registry/default/blocks/footer1/components/icons/x-icon.tsx +12 -0
  106. package/registry/default/blocks/footer1/components/logo.tsx +88 -0
  107. package/registry/default/blocks/footer2/app/page.tsx +9 -0
  108. package/registry/default/blocks/footer2/components/footer.tsx +139 -0
  109. package/registry/default/blocks/footer2/components/full-width-divider.tsx +21 -0
  110. package/registry/default/blocks/footer2/components/icons/github-icon.tsx +10 -0
  111. package/registry/default/blocks/footer2/components/icons/instagram-icon.tsx +12 -0
  112. package/registry/default/blocks/footer2/components/icons/x-icon.tsx +12 -0
  113. package/registry/default/blocks/footer2/components/logo.tsx +88 -0
  114. package/registry/default/blocks/footer3/app/page.tsx +9 -0
  115. package/registry/default/blocks/footer3/components/footer.tsx +155 -0
  116. package/registry/default/blocks/footer3/components/icons/github-icon.tsx +10 -0
  117. package/registry/default/blocks/footer3/components/icons/instagram-icon.tsx +12 -0
  118. package/registry/default/blocks/footer3/components/icons/linkedin-icon.tsx +12 -0
  119. package/registry/default/blocks/footer3/components/icons/x-icon.tsx +12 -0
  120. package/registry/default/blocks/footer3/components/logo.tsx +88 -0
  121. package/registry/default/blocks/footer4/app/page.tsx +9 -0
  122. package/registry/default/blocks/footer4/components/footer.tsx +137 -0
  123. package/registry/default/blocks/footer4/components/icons/github-icon.tsx +10 -0
  124. package/registry/default/blocks/footer4/components/icons/instagram-icon.tsx +12 -0
  125. package/registry/default/blocks/footer4/components/icons/linkedin-icon.tsx +12 -0
  126. package/registry/default/blocks/footer4/components/icons/x-icon.tsx +12 -0
  127. package/registry/default/blocks/footer4/components/logo.tsx +88 -0
  128. package/registry/default/blocks/footer5/app/page.tsx +9 -0
  129. package/registry/default/blocks/footer5/components/footer.tsx +152 -0
  130. package/registry/default/blocks/footer5/components/icons/apple-icon.tsx +18 -0
  131. package/registry/default/blocks/footer5/components/icons/facebook-icon.tsx +12 -0
  132. package/registry/default/blocks/footer5/components/icons/google-play-icon.tsx +10 -0
  133. package/registry/default/blocks/footer5/components/icons/instagram-icon.tsx +12 -0
  134. package/registry/default/blocks/footer5/components/icons/linkedin-icon.tsx +12 -0
  135. package/registry/default/blocks/footer5/components/icons/x-icon.tsx +12 -0
  136. package/registry/default/blocks/footer5/components/logo.tsx +88 -0
  137. package/registry/default/blocks/footer6/app/page.tsx +16 -0
  138. package/registry/default/blocks/footer6/components/footer.tsx +220 -0
  139. package/registry/default/blocks/footer6/components/icons/apple-icon.tsx +18 -0
  140. package/registry/default/blocks/footer6/components/icons/facebook-icon.tsx +12 -0
  141. package/registry/default/blocks/footer6/components/icons/github-icon.tsx +10 -0
  142. package/registry/default/blocks/footer6/components/icons/google-play-icon.tsx +10 -0
  143. package/registry/default/blocks/footer6/components/icons/instagram-icon.tsx +12 -0
  144. package/registry/default/blocks/footer6/components/icons/linkedin-icon.tsx +12 -0
  145. package/registry/default/blocks/footer6/components/icons/x-icon.tsx +12 -0
  146. package/registry/default/blocks/footer6/components/logo.tsx +88 -0
  147. package/registry/default/blocks/header1/app/page.tsx +12 -0
  148. package/registry/default/blocks/header1/components/demo-layout.tsx +33 -0
  149. package/registry/default/blocks/header1/components/header.tsx +58 -0
  150. package/registry/default/blocks/header1/components/logo.tsx +88 -0
  151. package/registry/default/blocks/header1/components/mobile-nav.tsx +61 -0
  152. package/registry/default/blocks/header1/components/ui/portal.tsx +27 -0
  153. package/registry/default/blocks/header1/hooks/use-scroll.ts +54 -0
  154. package/registry/default/blocks/header2/app/page.tsx +11 -0
  155. package/registry/default/blocks/header2/components/demo-layout.tsx +33 -0
  156. package/registry/default/blocks/header2/components/header.tsx +70 -0
  157. package/registry/default/blocks/header2/components/logo.tsx +88 -0
  158. package/registry/default/blocks/header2/components/mobile-nav.tsx +61 -0
  159. package/registry/default/blocks/header2/components/ui/portal.tsx +27 -0
  160. package/registry/default/blocks/header2/hooks/use-scroll.ts +54 -0
  161. package/registry/default/blocks/header3/app/page.tsx +11 -0
  162. package/registry/default/blocks/header3/components/demo-layout.tsx +33 -0
  163. package/registry/default/blocks/header3/components/desktop-nav.tsx +70 -0
  164. package/registry/default/blocks/header3/components/header.tsx +41 -0
  165. package/registry/default/blocks/header3/components/logo.tsx +88 -0
  166. package/registry/default/blocks/header3/components/mobile-nav.tsx +88 -0
  167. package/registry/default/blocks/header3/components/nav-links.tsx +132 -0
  168. package/registry/default/blocks/header3/components/sheard.tsx +41 -0
  169. package/registry/default/blocks/header3/components/ui/navigation-menu.tsx +171 -0
  170. package/registry/default/blocks/header3/components/ui/portal.tsx +27 -0
  171. package/registry/default/blocks/header3/hooks/use-scroll.ts +54 -0
  172. package/registry/default/blocks/hero1/app/page.tsx +15 -0
  173. package/registry/default/blocks/hero1/components/header.tsx +70 -0
  174. package/registry/default/blocks/hero1/components/hero.tsx +80 -0
  175. package/registry/default/blocks/hero1/components/infinite-slider.tsx +109 -0
  176. package/registry/default/blocks/hero1/components/logo-cloud.tsx +69 -0
  177. package/registry/default/blocks/hero1/components/logo.tsx +88 -0
  178. package/registry/default/blocks/hero1/components/logos/claude-wordmark.svg +1 -0
  179. package/registry/default/blocks/hero1/components/logos/clerk-wordmark.svg +1 -0
  180. package/registry/default/blocks/hero1/components/logos/github-wordmark.svg +6 -0
  181. package/registry/default/blocks/hero1/components/logos/nvidia-wordmark.svg +1 -0
  182. package/registry/default/blocks/hero1/components/logos/openai-wordmark.svg +1 -0
  183. package/registry/default/blocks/hero1/components/logos/supabase-wordmark.svg +23 -0
  184. package/registry/default/blocks/hero1/components/logos/turso-wordmark.svg +1 -0
  185. package/registry/default/blocks/hero1/components/logos/vercel-wordmark.svg +1 -0
  186. package/registry/default/blocks/hero1/components/logos-section.tsx +14 -0
  187. package/registry/default/blocks/hero1/components/mobile-nav.tsx +61 -0
  188. package/registry/default/blocks/hero1/components/ui/portal.tsx +27 -0
  189. package/registry/default/blocks/hero1/hooks/use-scroll.ts +54 -0
  190. package/registry/default/blocks/hero2/app/page.tsx +23 -0
  191. package/registry/default/blocks/hero2/components/decor-icon.tsx +45 -0
  192. package/registry/default/blocks/hero2/components/full-width-divider.tsx +21 -0
  193. package/registry/default/blocks/hero2/components/header.tsx +70 -0
  194. package/registry/default/blocks/hero2/components/hero.tsx +104 -0
  195. package/registry/default/blocks/hero2/components/infinite-slider.tsx +109 -0
  196. package/registry/default/blocks/hero2/components/logo-cloud.tsx +120 -0
  197. package/registry/default/blocks/hero2/components/logo.tsx +88 -0
  198. package/registry/default/blocks/hero2/components/logos/claude-wordmark.svg +1 -0
  199. package/registry/default/blocks/hero2/components/logos/clerk-wordmark.svg +1 -0
  200. package/registry/default/blocks/hero2/components/logos/github-wordmark.svg +6 -0
  201. package/registry/default/blocks/hero2/components/logos/nvidia-wordmark.svg +1 -0
  202. package/registry/default/blocks/hero2/components/logos/openai-wordmark.svg +1 -0
  203. package/registry/default/blocks/hero2/components/logos/supabase-wordmark.svg +23 -0
  204. package/registry/default/blocks/hero2/components/logos/turso-wordmark.svg +1 -0
  205. package/registry/default/blocks/hero2/components/logos/vercel-wordmark.svg +1 -0
  206. package/registry/default/blocks/hero2/components/logos-section.tsx +23 -0
  207. package/registry/default/blocks/hero2/components/mobile-nav.tsx +61 -0
  208. package/registry/default/blocks/hero2/components/ui/portal.tsx +27 -0
  209. package/registry/default/blocks/hero2/hooks/use-scroll.ts +54 -0
  210. package/registry/default/blocks/hero3/app/page.tsx +15 -0
  211. package/registry/default/blocks/hero3/components/header.tsx +70 -0
  212. package/registry/default/blocks/hero3/components/hero.tsx +104 -0
  213. package/registry/default/blocks/hero3/components/infinite-slider.tsx +109 -0
  214. package/registry/default/blocks/hero3/components/logo-cloud.tsx +67 -0
  215. package/registry/default/blocks/hero3/components/logo.tsx +88 -0
  216. package/registry/default/blocks/hero3/components/logos/claude-wordmark.svg +1 -0
  217. package/registry/default/blocks/hero3/components/logos/clerk-wordmark.svg +1 -0
  218. package/registry/default/blocks/hero3/components/logos/github-wordmark.svg +6 -0
  219. package/registry/default/blocks/hero3/components/logos/nvidia-wordmark.svg +1 -0
  220. package/registry/default/blocks/hero3/components/logos/openai-wordmark.svg +1 -0
  221. package/registry/default/blocks/hero3/components/logos/supabase-wordmark.svg +23 -0
  222. package/registry/default/blocks/hero3/components/logos/turso-wordmark.svg +1 -0
  223. package/registry/default/blocks/hero3/components/logos/vercel-wordmark.svg +1 -0
  224. package/registry/default/blocks/hero3/components/logos-section.tsx +12 -0
  225. package/registry/default/blocks/hero3/components/mobile-nav.tsx +61 -0
  226. package/registry/default/blocks/hero3/components/ui/portal.tsx +27 -0
  227. package/registry/default/blocks/hero3/hooks/use-scroll.ts +54 -0
  228. package/registry/default/blocks/image-gallery-1/app/page.tsx +5 -0
  229. package/registry/default/blocks/image-gallery-1/components/aspect-ratio.tsx +22 -0
  230. package/registry/default/blocks/image-gallery-1/components/image-gallery.tsx +135 -0
  231. package/registry/default/blocks/image-gallery-1/components/lazy-image.tsx +94 -0
  232. package/registry/default/blocks/integrations1/app/page.tsx +9 -0
  233. package/registry/default/blocks/integrations1/components/integrations.tsx +86 -0
  234. package/registry/default/blocks/integrations1/components/logos/adobe.svg +1 -0
  235. package/registry/default/blocks/integrations1/components/logos/canva.svg +1 -0
  236. package/registry/default/blocks/integrations1/components/logos/cursor.svg +1 -0
  237. package/registry/default/blocks/integrations1/components/logos/gmail.svg +1 -0
  238. package/registry/default/blocks/integrations1/components/logos/notion.svg +1 -0
  239. package/registry/default/blocks/integrations1/components/logos/planetscale.svg +1 -0
  240. package/registry/default/blocks/integrations1/components/logos/polar.svg +1 -0
  241. package/registry/default/blocks/integrations1/components/logos/supabase.svg +1 -0
  242. package/registry/default/blocks/integrations1/components/logos/vercel.svg +1 -0
  243. package/registry/default/blocks/integrations2/app/page.tsx +9 -0
  244. package/registry/default/blocks/integrations2/components/decor-icon.tsx +45 -0
  245. package/registry/default/blocks/integrations2/components/integrations.tsx +118 -0
  246. package/registry/default/blocks/integrations2/components/logos/adobe.svg +1 -0
  247. package/registry/default/blocks/integrations2/components/logos/canva.svg +1 -0
  248. package/registry/default/blocks/integrations2/components/logos/cursor.svg +1 -0
  249. package/registry/default/blocks/integrations2/components/logos/gmail.svg +1 -0
  250. package/registry/default/blocks/integrations2/components/logos/notion.svg +1 -0
  251. package/registry/default/blocks/integrations2/components/logos/planetscale.svg +1 -0
  252. package/registry/default/blocks/integrations2/components/logos/polar.svg +1 -0
  253. package/registry/default/blocks/integrations2/components/logos/supabase.svg +1 -0
  254. package/registry/default/blocks/integrations2/components/logos/vercel.svg +1 -0
  255. package/registry/default/blocks/integrations3/app/page.tsx +9 -0
  256. package/registry/default/blocks/integrations3/components/full-width-divider.tsx +33 -0
  257. package/registry/default/blocks/integrations3/components/integrations.tsx +190 -0
  258. package/registry/default/blocks/integrations3/components/logos/adobe.svg +1 -0
  259. package/registry/default/blocks/integrations3/components/logos/canva.svg +1 -0
  260. package/registry/default/blocks/integrations3/components/logos/cursor.svg +1 -0
  261. package/registry/default/blocks/integrations3/components/logos/gmail.svg +1 -0
  262. package/registry/default/blocks/integrations3/components/logos/notion.svg +1 -0
  263. package/registry/default/blocks/integrations3/components/logos/planetscale.svg +1 -0
  264. package/registry/default/blocks/integrations3/components/logos/polar.svg +1 -0
  265. package/registry/default/blocks/integrations3/components/logos/supabase.svg +1 -0
  266. package/registry/default/blocks/integrations3/components/logos/vercel.svg +1 -0
  267. package/registry/default/blocks/integrations4/app/page.tsx +9 -0
  268. package/registry/default/blocks/integrations4/components/integrations.tsx +177 -0
  269. package/registry/default/blocks/integrations4/components/logos/adobe.svg +1 -0
  270. package/registry/default/blocks/integrations4/components/logos/canva.svg +1 -0
  271. package/registry/default/blocks/integrations4/components/logos/cursor.svg +1 -0
  272. package/registry/default/blocks/integrations4/components/logos/gmail.svg +1 -0
  273. package/registry/default/blocks/integrations4/components/logos/notion.svg +1 -0
  274. package/registry/default/blocks/integrations4/components/logos/planetscale.svg +1 -0
  275. package/registry/default/blocks/integrations4/components/logos/polar.svg +1 -0
  276. package/registry/default/blocks/integrations4/components/logos/supabase.svg +1 -0
  277. package/registry/default/blocks/integrations4/components/logos/vercel.svg +1 -0
  278. package/registry/default/blocks/integrations5/app/page.tsx +9 -0
  279. package/registry/default/blocks/integrations5/components/integrations.tsx +112 -0
  280. package/registry/default/blocks/integrations5/components/logos/adobe.svg +1 -0
  281. package/registry/default/blocks/integrations5/components/logos/canva.svg +1 -0
  282. package/registry/default/blocks/integrations5/components/logos/cursor.svg +1 -0
  283. package/registry/default/blocks/integrations5/components/logos/gmail.svg +1 -0
  284. package/registry/default/blocks/integrations5/components/logos/notion.svg +1 -0
  285. package/registry/default/blocks/integrations5/components/logos/planetscale.svg +1 -0
  286. package/registry/default/blocks/integrations5/components/logos/polar.svg +1 -0
  287. package/registry/default/blocks/integrations5/components/logos/supabase.svg +1 -0
  288. package/registry/default/blocks/integrations5/components/logos/vercel.svg +1 -0
  289. package/registry/default/blocks/logo-cloud-1/app/page.tsx +17 -0
  290. package/registry/default/blocks/logo-cloud-1/components/logo-cloud.tsx +70 -0
  291. package/registry/default/blocks/logo-cloud-1/components/logos/claude-wordmark.svg +1 -0
  292. package/registry/default/blocks/logo-cloud-1/components/logos/clerk-wordmark.svg +1 -0
  293. package/registry/default/blocks/logo-cloud-1/components/logos/github-wordmark.svg +6 -0
  294. package/registry/default/blocks/logo-cloud-1/components/logos/nvidia-wordmark.svg +1 -0
  295. package/registry/default/blocks/logo-cloud-1/components/logos/openai-wordmark.svg +1 -0
  296. package/registry/default/blocks/logo-cloud-1/components/logos/supabase-wordmark.svg +23 -0
  297. package/registry/default/blocks/logo-cloud-1/components/logos/turso-wordmark.svg +1 -0
  298. package/registry/default/blocks/logo-cloud-1/components/logos/vercel-wordmark.svg +1 -0
  299. package/registry/default/blocks/logo-cloud-2/app/page.tsx +19 -0
  300. package/registry/default/blocks/logo-cloud-2/components/decor-icon.tsx +45 -0
  301. package/registry/default/blocks/logo-cloud-2/components/logo-cloud.tsx +120 -0
  302. package/registry/default/blocks/logo-cloud-2/components/logos/claude-wordmark.svg +1 -0
  303. package/registry/default/blocks/logo-cloud-2/components/logos/clerk-wordmark.svg +1 -0
  304. package/registry/default/blocks/logo-cloud-2/components/logos/github-wordmark.svg +6 -0
  305. package/registry/default/blocks/logo-cloud-2/components/logos/nvidia-wordmark.svg +1 -0
  306. package/registry/default/blocks/logo-cloud-2/components/logos/openai-wordmark.svg +1 -0
  307. package/registry/default/blocks/logo-cloud-2/components/logos/supabase-wordmark.svg +23 -0
  308. package/registry/default/blocks/logo-cloud-2/components/logos/turso-wordmark.svg +1 -0
  309. package/registry/default/blocks/logo-cloud-2/components/logos/vercel-wordmark.svg +1 -0
  310. package/registry/default/blocks/logo-cloud-3/app/page.tsx +18 -0
  311. package/registry/default/blocks/logo-cloud-3/components/infinite-slider.tsx +109 -0
  312. package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +69 -0
  313. package/registry/default/blocks/logo-cloud-3/components/logos/claude-wordmark.svg +1 -0
  314. package/registry/default/blocks/logo-cloud-3/components/logos/clerk-wordmark.svg +1 -0
  315. package/registry/default/blocks/logo-cloud-3/components/logos/github-wordmark.svg +6 -0
  316. package/registry/default/blocks/logo-cloud-3/components/logos/nvidia-wordmark.svg +1 -0
  317. package/registry/default/blocks/logo-cloud-3/components/logos/openai-wordmark.svg +1 -0
  318. package/registry/default/blocks/logo-cloud-3/components/logos/supabase-wordmark.svg +23 -0
  319. package/registry/default/blocks/logo-cloud-3/components/logos/turso-wordmark.svg +1 -0
  320. package/registry/default/blocks/logo-cloud-3/components/logos/vercel-wordmark.svg +1 -0
  321. package/registry/default/blocks/logo-cloud-4/app/page.tsx +23 -0
  322. package/registry/default/blocks/logo-cloud-4/components/infinite-slider.tsx +109 -0
  323. package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +83 -0
  324. package/registry/default/blocks/logo-cloud-4/components/logos/claude-wordmark.svg +1 -0
  325. package/registry/default/blocks/logo-cloud-4/components/logos/clerk-wordmark.svg +1 -0
  326. package/registry/default/blocks/logo-cloud-4/components/logos/github-wordmark.svg +6 -0
  327. package/registry/default/blocks/logo-cloud-4/components/logos/nvidia-wordmark.svg +1 -0
  328. package/registry/default/blocks/logo-cloud-4/components/logos/openai-wordmark.svg +1 -0
  329. package/registry/default/blocks/logo-cloud-4/components/logos/supabase-wordmark.svg +23 -0
  330. package/registry/default/blocks/logo-cloud-4/components/logos/turso-wordmark.svg +1 -0
  331. package/registry/default/blocks/logo-cloud-4/components/logos/vercel-wordmark.svg +1 -0
  332. package/registry/default/blocks/logo-cloud-4/components/progressive-blur.tsx +63 -0
  333. package/registry/default/blocks/logo-cloud-5/app/page.tsx +17 -0
  334. package/registry/default/blocks/logo-cloud-5/components/logo-cloud.tsx +67 -0
  335. package/registry/default/blocks/logo-cloud-5/components/logos/claude-wordmark.svg +1 -0
  336. package/registry/default/blocks/logo-cloud-5/components/logos/clerk-wordmark.svg +1 -0
  337. package/registry/default/blocks/logo-cloud-5/components/logos/github-wordmark.svg +6 -0
  338. package/registry/default/blocks/logo-cloud-5/components/logos/nvidia-wordmark.svg +1 -0
  339. package/registry/default/blocks/logo-cloud-5/components/logos/openai-wordmark.svg +1 -0
  340. package/registry/default/blocks/logo-cloud-5/components/logos/supabase-wordmark.svg +23 -0
  341. package/registry/default/blocks/logo-cloud-5/components/logos/turso-wordmark.svg +1 -0
  342. package/registry/default/blocks/logo-cloud-5/components/logos/vercel-wordmark.svg +1 -0
  343. package/registry/default/blocks/pricing1/app/page.tsx +9 -0
  344. package/registry/default/blocks/pricing1/components/decor-icon.tsx +45 -0
  345. package/registry/default/blocks/pricing1/components/pricing.tsx +94 -0
  346. package/registry/default/blocks/pricing2/app/page.tsx +9 -0
  347. package/registry/default/blocks/pricing2/components/full-width-divider.tsx +33 -0
  348. package/registry/default/blocks/pricing2/components/pricing.tsx +117 -0
  349. package/registry/default/blocks/pricing3/app/page.tsx +9 -0
  350. package/registry/default/blocks/pricing3/components/pricing-card.tsx +171 -0
  351. package/registry/default/blocks/pricing3/components/pricing.tsx +143 -0
  352. package/registry/default/blocks/pricing4/app/page.tsx +9 -0
  353. package/registry/default/blocks/pricing4/components/frequency-toggle.tsx +47 -0
  354. package/registry/default/blocks/pricing4/components/pricing.tsx +230 -0
  355. package/registry/default/blocks/testimonials1/app/page.tsx +9 -0
  356. package/registry/default/blocks/testimonials1/components/logo.tsx +74 -0
  357. package/registry/default/blocks/testimonials1/components/testimonials.tsx +41 -0
  358. package/registry/default/blocks/testimonials2/app/page.tsx +9 -0
  359. package/registry/default/blocks/testimonials2/components/testimonials.tsx +65 -0
  360. package/registry/default/blocks/testimonials3/app/page.tsx +9 -0
  361. package/registry/default/blocks/testimonials3/components/decor-icon.tsx +45 -0
  362. package/registry/default/blocks/testimonials3/components/testimonials.tsx +114 -0
  363. package/registry/default/blocks/testimonials4/app/page.tsx +9 -0
  364. package/registry/default/blocks/testimonials4/components/full-width-divider.tsx +33 -0
  365. package/registry/default/blocks/testimonials4/components/testimonials.tsx +81 -0
  366. package/registry/default/blocks/testimonials5/app/page.tsx +9 -0
  367. package/registry/default/blocks/testimonials5/components/full-width-divider.tsx +33 -0
  368. package/registry/default/blocks/testimonials5/components/grid-filler.tsx +74 -0
  369. package/registry/default/blocks/testimonials5/components/grid-pattern.tsx +70 -0
  370. package/registry/default/blocks/testimonials5/components/testimonials.tsx +186 -0
  371. package/registry/default/blocks/testimonials6/app/page.tsx +9 -0
  372. package/registry/default/blocks/testimonials6/components/infinite-slider.tsx +109 -0
  373. package/registry/default/blocks/testimonials6/components/testimonials.tsx +193 -0
  374. package/registry/default/examples/accordion-disabled.tsx +58 -0
  375. package/registry/default/examples/accordion-in-card.tsx +92 -0
  376. package/registry/default/examples/accordion-leading-icon.tsx +51 -0
  377. package/registry/default/examples/accordion-user-roles.tsx +97 -0
  378. package/registry/default/examples/accordion-with-icons.tsx +67 -0
  379. package/registry/default/examples/avatar-badge-icons.tsx +60 -0
  380. package/registry/default/examples/avatar-badge-position.tsx +47 -0
  381. package/registry/default/examples/avatar-empty-collaborators.tsx +55 -0
  382. package/registry/default/examples/avatar-group-trust.tsx +49 -0
  383. package/registry/default/examples/avatar-loading.tsx +33 -0
  384. package/registry/default/examples/avatar-menu.tsx +81 -0
  385. package/registry/default/examples/avatar-profile-badge.tsx +30 -0
  386. package/registry/default/examples/avatar-status.tsx +47 -0
  387. package/registry/default/examples/breadcrumb-bullet-separator.tsx +38 -0
  388. package/registry/default/examples/breadcrumb-buttons.tsx +61 -0
  389. package/registry/default/examples/breadcrumb-card.tsx +40 -0
  390. package/registry/default/examples/button-default-icons.tsx +18 -0
  391. package/registry/default/examples/button-default.tsx +5 -0
  392. package/registry/default/examples/button-demo.tsx +11 -1
  393. package/registry/default/examples/button-destructive-icons.tsx +18 -0
  394. package/registry/default/examples/button-destructive-outline-icons.tsx +18 -0
  395. package/registry/default/examples/button-ghost-icons.tsx +18 -0
  396. package/registry/default/examples/button-link-icons.tsx +18 -0
  397. package/registry/default/examples/button-outline-icons.tsx +18 -0
  398. package/registry/default/examples/button-secondary-icons.tsx +18 -0
  399. package/registry/default/examples/button-theme-toggle.tsx +38 -0
  400. package/registry/default/examples/card-author-profile.tsx +66 -0
  401. package/registry/default/examples/card-default-size.tsx +33 -0
  402. package/registry/default/examples/card-depth.tsx +37 -0
  403. package/registry/default/examples/card-help-link.tsx +32 -0
  404. package/registry/default/examples/card-help-menu.tsx +78 -0
  405. package/registry/default/examples/card-image-centered.tsx +38 -0
  406. package/registry/default/examples/card-image-feature.tsx +44 -0
  407. package/registry/default/examples/card-metric-actions.tsx +102 -0
  408. package/registry/default/examples/card-resource-link.tsx +40 -0
  409. package/registry/default/examples/card-team-member.tsx +38 -14
  410. package/registry/default/examples/card-usage-expandable.tsx +98 -0
  411. package/registry/default/examples/card-with-borders.tsx +29 -0
  412. package/registry/default/examples/code-block-shared.tsx +8 -1
  413. package/registry/default/ui/accordion.tsx +82 -2
  414. package/registry/default/ui/avatar.tsx +45 -1
  415. package/registry/default/ui/form.tsx +6 -1
  416. package/registry/default/ui/input-group.tsx +158 -0
  417. package/registry/default/ui/toast-gooey-icons.tsx +68 -0
  418. package/registry/default/ui/toast-gooey-renderer.tsx +614 -0
  419. package/registry/default/ui/toast-gooey-types.ts +45 -0
  420. package/registry/default/ui/toast-gooey.css +511 -0
  421. package/registry/default/ui/toast-gooey.tsx +445 -0
  422. package/registry/default/ui/toast.tsx +1 -1
  423. package/skills/loveui-skills/SKILL.md +170 -0
  424. package/skills/loveui-skills/references/accessibility-baseline.md +32 -0
  425. package/skills/loveui-skills/references/component-api-and-naming.md +30 -0
  426. package/skills/loveui-skills/references/content-ux-writing.md +33 -0
  427. package/skills/loveui-skills/references/design-directions.md +60 -0
  428. package/skills/loveui-skills/references/forms-and-validation.md +30 -0
  429. package/skills/loveui-skills/references/frontend-architecture.md +30 -0
  430. package/skills/loveui-skills/references/interaction-heuristics.md +45 -0
  431. package/skills/loveui-skills/references/mcp-catalog-workflow.md +68 -0
  432. package/skills/loveui-skills/references/motion-and-feedback.md +31 -0
  433. package/skills/loveui-skills/references/navigation-and-information-architecture.md +30 -0
  434. package/skills/loveui-skills/references/page-blueprints.md +76 -0
  435. package/skills/loveui-skills/references/quality-gates.md +51 -0
  436. package/skills/loveui-skills/references/screenshot-translation-protocol.md +52 -0
  437. package/skills/loveui-skills/references/structural-cleanliness.md +37 -0
  438. package/skills/loveui-skills/references/testing-and-quality-strategy.md +33 -0
  439. package/skills/loveui-skills/references/visual-primitives.md +42 -0
  440. package/skills/loveui-skills/skills/adapt/SKILL.md +199 -0
  441. package/skills/loveui-skills/skills/animate/SKILL.md +190 -0
  442. package/skills/loveui-skills/skills/audit/SKILL.md +127 -0
  443. package/skills/loveui-skills/skills/bolder/SKILL.md +132 -0
  444. package/skills/loveui-skills/skills/clarify/SKILL.md +180 -0
  445. package/skills/loveui-skills/skills/colorize/SKILL.md +158 -0
  446. package/skills/loveui-skills/skills/critique/SKILL.md +118 -0
  447. package/skills/loveui-skills/skills/delight/SKILL.md +317 -0
  448. package/skills/loveui-skills/skills/distill/SKILL.md +137 -0
  449. package/skills/loveui-skills/skills/extract/SKILL.md +95 -0
  450. package/skills/loveui-skills/skills/frontend-design/SKILL.md +127 -0
  451. package/skills/loveui-skills/skills/frontend-design/reference/color-and-contrast.md +132 -0
  452. package/skills/loveui-skills/skills/frontend-design/reference/interaction-design.md +123 -0
  453. package/skills/loveui-skills/skills/frontend-design/reference/motion-design.md +99 -0
  454. package/skills/loveui-skills/skills/frontend-design/reference/responsive-design.md +114 -0
  455. package/skills/loveui-skills/skills/frontend-design/reference/spatial-design.md +100 -0
  456. package/skills/loveui-skills/skills/frontend-design/reference/typography.md +131 -0
  457. package/skills/loveui-skills/skills/frontend-design/reference/ux-writing.md +107 -0
  458. package/skills/loveui-skills/skills/harden/SKILL.md +358 -0
  459. package/skills/loveui-skills/skills/normalize/SKILL.md +67 -0
  460. package/skills/loveui-skills/skills/onboard/SKILL.md +243 -0
  461. package/skills/loveui-skills/skills/optimize/SKILL.md +269 -0
  462. package/skills/loveui-skills/skills/polish/SKILL.md +202 -0
  463. package/skills/loveui-skills/skills/quieter/SKILL.md +118 -0
  464. package/skills/loveui-skills/skills/teach-loveui/SKILL.md +69 -0
package/README.md CHANGED
@@ -1,22 +1,30 @@
1
1
  # love-ui
2
2
 
3
- Component registry source for LoveUI.
3
+ Command line utility and component registry source for LoveUI.
4
4
 
5
5
  ## Usage
6
6
 
7
- Install the package and read files from the bundled `registry/` directory:
7
+ Install a component with `npx`:
8
8
 
9
9
  ```bash
10
- npm install love-ui
10
+ npx love-ui@latest add alert
11
11
  ```
12
12
 
13
- The package ships the registry source tree from this repository and does not include the website, CLI build output, generated registry JSON, or copied package artifacts.
13
+ Install LoveUI Skills for an AI coding tool:
14
+
15
+ ```bash
16
+ npx love-ui@latest add loveui-skills
17
+ ```
18
+
19
+ The CLI will ask which target to install. You can also pass a target directly: `codex`, `claude`, `cursor`, `github`, or `all`.
20
+
21
+ The package ships the CLI and the repository-level `registry/` tree used by the CLI.
14
22
 
15
23
  ## Development
16
24
 
17
25
  ```bash
18
26
  bun install
19
- bun run verify:registry
27
+ bun run build
20
28
  ```
21
29
 
22
- The publish flow copies the repository-level `registry/` directory into this package before npm creates the release tarball.
30
+ The build script bundles the CLI into `dist/` and copies the repository-level `registry/` directory into this package before npm creates the release tarball.
package/dist/index.js ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ import{spawnSync as fe}from"child_process";import{existsSync as g}from"fs";import{cp as pe,mkdir as R,readdir as se,readFile as h,writeFile as T}from"fs/promises";import ne from"os";import r from"path";import{createInterface as me}from"readline/promises";import{pathToFileURL as he,fileURLToPath as be}from"url";var ke=r.dirname(be(import.meta.url)),J=r.resolve(ke,".."),z=r.join(J,"packages"),F=r.join(J,"registry"),ye=r.join(J,"skills"),re=new Set([".ts",".tsx",".cts",".mts",".js",".jsx",".css",".scss",".sass",".mdx",".md",".svg"]),V=new Set(["node_modules","dist",".turbo",".next","build",".cache"]),ie=new Set(["accordion","alert","alert-dialog","autocomplete","avatar","badge","breadcrumb","button","card","checkbox","checkbox-group","collapsible","combobox","command","dialog","empty","field","fieldset","form","frame","group","input","input-group","label","menu","meter","number-field","pagination","popover","preview-card","progress","radio-group","scroll-area","select","separator","sheet","skeleton","slider","switch","table","tabs","textarea","toast","toggle","toggle-group","toolbar","tooltip"]),ae=new Map([["auth-one",{sourceDir:"auth1",targetBase:"components/blocks/auth/one"}],["auth-two",{sourceDir:"auth2",targetBase:"components/blocks/auth/two"}],["auth-three",{sourceDir:"auth3",targetBase:"components/blocks/auth/three"}],["header-one",{sourceDir:"header1",targetBase:"components/blocks/header/one"}],["header-two",{sourceDir:"header2",targetBase:"components/blocks/header/two"}],["header-three",{sourceDir:"header3",targetBase:"components/blocks/header/three",dependencies:{"@base-ui/react":"^1.5.0"}}],["footer-one",{sourceDir:"footer1",targetBase:"components/blocks/footer/one"}],["footer-two",{sourceDir:"footer2",targetBase:"components/blocks/footer/two"}],["footer-three",{sourceDir:"footer3",targetBase:"components/blocks/footer/three",dependencies:{motion:"^12.40.0"}}],["footer-four",{sourceDir:"footer4",targetBase:"components/blocks/footer/four"}],["footer-five",{sourceDir:"footer5",targetBase:"components/blocks/footer/five"}],["footer-six",{sourceDir:"footer6",targetBase:"components/blocks/footer/six",dependencies:{motion:"^12.40.0"}}],["logo-cloud-one",{sourceDir:"logo-cloud-1",targetBase:"components/blocks/logo-cloud/one"}],["logo-cloud-two",{sourceDir:"logo-cloud-2",targetBase:"components/blocks/logo-cloud/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["logo-cloud-three",{sourceDir:"logo-cloud-3",targetBase:"components/blocks/logo-cloud/three",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["logo-cloud-four",{sourceDir:"logo-cloud-4",targetBase:"components/blocks/logo-cloud/four",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["logo-cloud-five",{sourceDir:"logo-cloud-5",targetBase:"components/blocks/logo-cloud/five"}],["hero-one",{sourceDir:"hero1",targetBase:"components/blocks/hero/one",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["hero-two",{sourceDir:"hero2",targetBase:"components/blocks/hero/two",dependencies:{"class-variance-authority":"^0.7.1",motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["hero-three",{sourceDir:"hero3",targetBase:"components/blocks/hero/three",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["404-one",{sourceDir:"404-1",targetBase:"components/blocks/404/one"}],["404-two",{sourceDir:"404-2",targetBase:"components/blocks/404/two"}],["blog-one",{sourceDir:"blogs1",targetBase:"components/blocks/blog/one"}],["blog-two",{sourceDir:"blogs2",targetBase:"components/blocks/blog/two"}],["blog-three",{sourceDir:"blogs3",targetBase:"components/blocks/blog/three",dependencies:{motion:"^12.40.0"}}],["contact-one",{sourceDir:"contact1",targetBase:"components/blocks/contact/one"}],["contact-two",{sourceDir:"contact2",targetBase:"components/blocks/contact/two"}],["contact-three",{sourceDir:"contact3",targetBase:"components/blocks/contact/three"}],["contact-four",{sourceDir:"contact4",targetBase:"components/blocks/contact/four"}],["contact-five",{sourceDir:"contact5",targetBase:"components/blocks/contact/five",dependencies:{"class-variance-authority":"^0.7.1"}}],["integrations-one",{sourceDir:"integrations1",targetBase:"components/blocks/integrations/one"}],["integrations-two",{sourceDir:"integrations2",targetBase:"components/blocks/integrations/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["integrations-three",{sourceDir:"integrations3",targetBase:"components/blocks/integrations/three"}],["integrations-four",{sourceDir:"integrations4",targetBase:"components/blocks/integrations/four"}],["integrations-five",{sourceDir:"integrations5",targetBase:"components/blocks/integrations/five"}],["cta-one",{sourceDir:"cta-1",targetBase:"components/blocks/cta/one"}],["cta-two",{sourceDir:"cta-2",targetBase:"components/blocks/cta/two"}],["cta-three",{sourceDir:"cta-3",targetBase:"components/blocks/cta/three"}],["cta-four",{sourceDir:"cta-4",targetBase:"components/blocks/cta/four"}],["cta-five",{sourceDir:"cta-5",targetBase:"components/blocks/cta/five"}],["faq-one",{sourceDir:"faq-1",targetBase:"components/blocks/faq/one"}],["faq-two",{sourceDir:"faq-2",targetBase:"components/blocks/faq/two"}],["faq-three",{sourceDir:"faq-3",targetBase:"components/blocks/faq/three"}],["faq-four",{sourceDir:"faq-4",targetBase:"components/blocks/faq/four"}],["faq-five",{sourceDir:"faq-5",targetBase:"components/blocks/faq/five"}],["pricing-one",{sourceDir:"pricing1",targetBase:"components/blocks/pricing/one"}],["pricing-two",{sourceDir:"pricing2",targetBase:"components/blocks/pricing/two"}],["pricing-three",{sourceDir:"pricing3",targetBase:"components/blocks/pricing/three"}],["pricing-four",{sourceDir:"pricing4",targetBase:"components/blocks/pricing/four",dependencies:{"@number-flow/react":"^0.6.0",motion:"^12.40.0"}}],["testimonials-one",{sourceDir:"testimonials1",targetBase:"components/blocks/testimonials/one"}],["testimonials-two",{sourceDir:"testimonials2",targetBase:"components/blocks/testimonials/two"}],["testimonials-three",{sourceDir:"testimonials3",targetBase:"components/blocks/testimonials/three",dependencies:{"class-variance-authority":"^0.7.1"}}],["testimonials-four",{sourceDir:"testimonials4",targetBase:"components/blocks/testimonials/four"}],["testimonials-five",{sourceDir:"testimonials5",targetBase:"components/blocks/testimonials/five"}],["testimonials-six",{sourceDir:"testimonials6",targetBase:"components/blocks/testimonials/six",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["features-one",{sourceDir:"features1",targetBase:"components/blocks/features/one"}],["features-two",{sourceDir:"features2",targetBase:"components/blocks/features/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["features-three",{sourceDir:"features3",targetBase:"components/blocks/features/three"}],["features-four",{sourceDir:"features4",targetBase:"components/blocks/features/four",dependencies:{"class-variance-authority":"^0.7.1"}}],["features-five",{sourceDir:"features5",targetBase:"components/blocks/features/five"}],["features-six",{sourceDir:"features6",targetBase:"components/blocks/features/six",dependencies:{cobe:"^2.0.1"}}],["image-gallery-one",{sourceDir:"image-gallery-1",targetBase:"components/blocks/image-gallery/one",dependencies:{motion:"^12.40.0"}}]]),we=[".ts",".tsx",".js",".jsx"],ce=/(^|\/)lib\/utils(?:\.[a-z]+)?$/i,ve=/@loveui\/ui\/lib\/utils|@loveui\/shadcn-ui\/lib\/utils|@love-ui\/shadcn-ui\/lib\/utils|@\/lib\/utils|~\/lib\/utils|(?:\.\.\/)+ui\/src\/lib\/utils/,$e=`import { clsx, type ClassValue } from "clsx"
3
+ import { twMerge } from "tailwind-merge"
4
+
5
+ export function cn(...inputs: ClassValue[]) {
6
+ return twMerge(clsx(inputs))
7
+ }
8
+ `,xe="love-ui globals",De=`/* love-ui globals */
9
+ @custom-variant dark (&:is(.dark *));
10
+
11
+ @theme inline {
12
+ --color-background: var(--background);
13
+ --color-foreground: var(--foreground);
14
+ --color-card: var(--card);
15
+ --color-card-foreground: var(--card-foreground);
16
+ --color-popover: var(--popover);
17
+ --color-popover-foreground: var(--popover-foreground);
18
+ --color-primary: var(--primary);
19
+ --color-primary-foreground: var(--primary-foreground);
20
+ --color-secondary: var(--secondary);
21
+ --color-secondary-foreground: var(--secondary-foreground);
22
+ --color-muted: var(--muted);
23
+ --color-muted-foreground: var(--muted-foreground);
24
+ --color-accent: var(--accent);
25
+ --color-accent-foreground: var(--accent-foreground);
26
+ --color-destructive: var(--destructive);
27
+ --color-destructive-foreground: var(--destructive-foreground);
28
+ --color-info: var(--info);
29
+ --color-info-foreground: var(--info-foreground);
30
+ --color-success: var(--success);
31
+ --color-success-foreground: var(--success-foreground);
32
+ --color-warning: var(--warning);
33
+ --color-warning-foreground: var(--warning-foreground);
34
+ --color-border: var(--border);
35
+ --color-input: var(--input);
36
+ --color-ring: var(--ring);
37
+ --radius-sm: calc(var(--radius) - 4px);
38
+ --radius-md: calc(var(--radius) - 2px);
39
+ --radius-lg: var(--radius);
40
+ --radius-xl: calc(var(--radius) + 4px);
41
+ }
42
+
43
+ :root {
44
+ --radius: 0.625rem;
45
+ --background: oklch(1 0 0);
46
+ --foreground: oklch(0.21 0.006 285.885);
47
+ --card: oklch(1 0 0);
48
+ --card-foreground: oklch(0.21 0.006 285.885);
49
+ --popover: oklch(1 0 0);
50
+ --popover-foreground: oklch(0.21 0.006 285.885);
51
+ --primary: oklch(0.274 0.006 286.033);
52
+ --primary-foreground: oklch(0.985 0 0);
53
+ --secondary: oklch(0 0 0 / 4%);
54
+ --secondary-foreground: oklch(0.21 0.006 285.885);
55
+ --muted: oklch(0 0 0 / 4%);
56
+ --muted-foreground: oklch(0.442 0.017 285.786);
57
+ --accent: oklch(0 0 0 / 4%);
58
+ --accent-foreground: oklch(0.21 0.006 285.885);
59
+ --destructive: oklch(0.637 0.237 25.331);
60
+ --destructive-foreground: oklch(0.505 0.213 27.518);
61
+ --info: oklch(0.623 0.214 259.815);
62
+ --info-foreground: oklch(0.488 0.243 264.376);
63
+ --success: oklch(0.696 0.17 162.48);
64
+ --success-foreground: oklch(0.508 0.118 165.612);
65
+ --warning: oklch(0.769 0.188 70.08);
66
+ --warning-foreground: oklch(0.555 0.163 48.998);
67
+ --border: oklch(0 0 0 / 10%);
68
+ --input: oklch(0 0 0 / 10%);
69
+ --ring: oklch(0.705 0.015 286.067);
70
+ }
71
+
72
+ .dark {
73
+ --background: oklch(0.141 0.005 285.823);
74
+ --foreground: oklch(0.967 0.001 286.375);
75
+ --card: color-mix(in srgb, oklch(0.21 0.006 285.885) 80%, oklch(0.141 0.005 285.823));
76
+ --card-foreground: oklch(0.967 0.001 286.375);
77
+ --popover: oklch(0.21 0.006 285.885);
78
+ --popover-foreground: oklch(0.967 0.001 286.375);
79
+ --primary: oklch(0.967 0.001 286.375);
80
+ --primary-foreground: oklch(0.21 0.006 285.885);
81
+ --secondary: oklch(1 0 0 / 6%);
82
+ --secondary-foreground: oklch(0.967 0.001 286.375);
83
+ --muted: oklch(1 0 0 / 6%);
84
+ --muted-foreground: oklch(0.705 0.015 286.067);
85
+ --accent: oklch(1 0 0 / 6%);
86
+ --accent-foreground: oklch(0.967 0.001 286.375);
87
+ --destructive: oklch(0.637 0.237 25.331);
88
+ --destructive-foreground: oklch(0.704 0.191 22.216);
89
+ --info: oklch(0.623 0.214 259.815);
90
+ --info-foreground: oklch(0.707 0.165 254.624);
91
+ --success: oklch(0.696 0.17 162.48);
92
+ --success-foreground: oklch(0.765 0.177 163.223);
93
+ --warning: oklch(0.769 0.188 70.08);
94
+ --warning-foreground: oklch(0.828 0.189 84.429);
95
+ --border: oklch(1 0 0 / 12%);
96
+ --input: oklch(1 0 0 / 12%);
97
+ --ring: oklch(0.552 0.016 285.938);
98
+ }
99
+
100
+ @layer base {
101
+ * {
102
+ @apply border-border outline-ring/50;
103
+ }
104
+ }
105
+ `;function L(e){if(!e)return e;let o=e.split("/");return o[o.length-1]||e}function le(e){let o=e.trim();return o&&((o.startsWith("@/")||o.startsWith("~/"))&&(o=`src/${o.slice(2)}`),o.startsWith("/")&&(o=o.slice(1)),o=o.replace(/^\.\//,""),o=o.replace(/\/+$/,""),o)}function je(e){return e.trim().replace(/\/+$/,"")}function S(e){return e.replace(/\.(?:ts|tsx|js|jsx)$/i,"")}function Q(e){let o=S(e);return we.map(s=>`${o}${s}`)}function Pe(e){let o=e.replace(/\/+$/,"");return o==="src"||o.startsWith("src/")?"src":o==="app"||o.startsWith("app/")?"app":null}function ue(e){let o=L(e);return o==="ui"?"love-ui":o}function Be(e){let o=e.loveui??{},s=typeof o.target=="string"?o.target.trim():"",t=o.category;if(s){let i=typeof o.includePackageName=="boolean"?o.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:i}}return t==="feature"?{base:"components",includePackageName:!0}:t==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function Se(e,o,s){let t=e.startsWith("src/")?e.slice(4):e;if(!o.includePackageName){let u=o.base.split("/").filter(Boolean),c=u[u.length-1];c&&t.startsWith(`${c}/`)&&(t=t.slice(c.length+1))}let a=`${(o.includePackageName?`${o.base}/${s}`:o.base).replace(/\/+/g,"/")}/${t}`.replace(/\/+/g,"/");return{cleanedPath:t,target:a}}async function Te(e){let o=r.join(e,"components.json");try{let s=await h(o,"utf8");return JSON.parse(s).aliases??null}catch{return null}}async function Re(e){let o=["tsconfig.json","jsconfig.json"].map(s=>r.join(e,s)).find(s=>g(s));if(!o)return null;try{let s=await h(o,"utf8"),i=JSON.parse(s).compilerOptions?.paths;return!i||typeof i!="object"?null:i}catch{return null}}function Fe(e,o){if(typeof e=="string"){if(e.trim().startsWith("~/"))return"~/";if(e.trim().startsWith("@/"))return"@/"}if(o){if(Object.prototype.hasOwnProperty.call(o,"~/*"))return"~/";if(Object.prototype.hasOwnProperty.call(o,"@/*"))return"@/"}return"@/"}async function Ue(e,o,s){if(o&&o.length>0)return o;let t=["src/components/ui","app/components/ui","components/ui"];for(let n of t)if(g(r.join(e,n)))return n.replace(/\/ui$/,"");let i=["src/components","app/components","components"];for(let n of i)if(g(r.join(e,n)))return n;if(s){let n=s["@/*"]??s["~/*"]??[];if(Array.isArray(n)&&n.some(a=>/^\.?\/?src\//.test(a)))return"src/components";if(Array.isArray(n)&&n.some(a=>/^\.?\/?app\//.test(a)))return"app/components"}return g(r.join(e,"src"))?"src/components":g(r.join(e,"app"))?"app/components":"components"}async function Le(e,o,s,t){let i=t?.utils??(t?.lib?`${t.lib.replace(/\/+$/,"")}/utils`:void 0);if(i&&i.trim().length>0){let c=S(je(i)),d=S(le(i));for(let p of Q(d))if(g(r.join(e,p)))return{utilsImportPath:c,utilsFilePath:p};return{utilsImportPath:c,utilsFilePath:`${d}.ts`}}let n=Pe(o),a=n?`${n}/lib/utils`:"lib/utils",u=Array.from(new Set([a,"src/lib/utils","app/lib/utils","lib/utils"]));for(let c of u)for(let d of Q(c))if(g(r.join(e,d)))return{utilsImportPath:`${s}lib/utils`,utilsFilePath:d};return{utilsImportPath:`${s}lib/utils`,utilsFilePath:`${a}.ts`}}function Z(e,o,s){let t=a=>{let u=a.startsWith("/"),c=a.endsWith("/"),d=a.split("/").filter(Boolean),p=[];for(let x of d)p[p.length-1]!==x&&p.push(x);let w=p.join("/");return`${u?"/":""}${w}${c?"/":""}`},i=o.replace(/\/+$/,""),n=e.replace(/^\.?\//,"");if(ce.test(n))return t(s);if(n.startsWith("components/")){let a=n.slice(10);return t(`${i}${a}`.replace(/^\//,""))}if(n.startsWith("lib/")){if(i.startsWith("src/"))return t(`src/${n}`);if(i.startsWith("app/"))return t(`app/${n}`)}if(n.startsWith("hooks/")){if(i.startsWith("src/"))return t(`src/${n}`);if(i.startsWith("app/"))return t(`app/${n}`)}return n.startsWith("ui/")?t(`${i}/${n}`):t(n)}function U(e,o){let s=o.startsWith("~/")?"~/":"@/",t=e;return t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@loveui\/ui\/ui\//g,`${s}components/ui/`),t=t.replace(/@loveui\/ui\/lib\//g,`${s}lib/`),t=t.replace(/@\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/building-blocks\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/building-blocks\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@loveui\/shadcn-ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@love-ui\/shadcn-ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']~\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["'](?:\.\.\/)+ui\/src\/lib\/utils["']/g,`from "${o}"`),t}async function Ce(e,o){if(g(r.join(e,o)))return!1;let s=$e,t=r.join(z,"love-ui","src","lib","utils.ts");if(g(t))try{s=await h(t,"utf8")}catch{}return await M(o,e),await T(r.join(e,o),s,"utf8"),!0}async function Ee(e){let s=["app/globals.css","app/global.css","src/app/globals.css","src/app/global.css","styles/globals.css","src/styles/globals.css","globals.css","global.css"].find(c=>g(r.join(e,c)));s||(g(r.join(e,"src","app"))?s="src/app/globals.css":g(r.join(e,"app"))?s="app/globals.css":g(r.join(e,"src"))?s="src/styles/globals.css":s="globals.css");let t=r.join(e,s),i=g(t),n=i?await h(t,"utf8"):"",a=!1;/@import\s+["']tailwindcss["']/.test(n)||(n=`@import "tailwindcss";
106
+ ${n?`
107
+ ${n}`:""}`,a=!0),n.includes(xe)||(n=`${n.trimEnd()}
108
+
109
+ ${De}`,a=!0),(!i||a)&&(await M(s,e),await T(t,n,"utf8"));let u=await Ie(e,s);return{path:s,created:!i,updated:a,imported:u}}async function Ie(e,o){let t=["app/layout.tsx","app/layout.jsx","src/app/layout.tsx","src/app/layout.jsx"].find(c=>g(r.join(e,c)));if(!t)return!1;let i=r.join(e,t),n=await h(i,"utf8"),a=Ae(r.dirname(t),o);if(n.includes(`"${a}"`)||n.includes(`'${a}'`))return!1;let u=`import "${a}";
110
+ ${n}`;return await T(i,u,"utf8"),!0}function Ae(e,o){let s=r.posix.relative(e||".",o);return s.startsWith(".")||(s=`./${s}`),s}async function M(e,o){let s=r.dirname(r.join(o,e));await R(s,{recursive:!0})}async function Oe(e,o){let s=r.join(e,"package.json"),t={};try{let c=await h(s,"utf8");t=JSON.parse(c)}catch{}let i=Be(t),n=L(o),a=[];async function u(c,d){let p=await se(c,{withFileTypes:!0});for(let w of p){if(V.has(w.name))continue;let x=r.join(c,w.name);if(w.isDirectory()){await u(x,d);continue}let P=r.extname(w.name);if(!re.has(P)||w.name==="package.json")continue;let j=r.relative(d,x).split(r.sep).join("/"),{target:D}=Se(j,i,n),k=await h(x,"utf8");a.push({path:j,target:D,content:k})}}return await u(e,e),a}async function _e(e,o){let s=ae.get(e);if(!s)return null;let t=r.join(F,"default","blocks",s.sourceDir);if(!g(t))return null;try{let i=[],n=[],a=new Set;async function u(c){let d=await se(c,{withFileTypes:!0});for(let p of d){if(V.has(p.name))continue;let w=r.join(c,p.name);if(p.isDirectory()){await u(w);continue}let x=r.extname(p.name);if(!re.has(x))continue;let P=r.relative(t,w).split(r.sep).join("/"),j=await h(w,"utf8");for(let D of j.matchAll(/@\/registry\/default\/ui\/([^"']+)/g)){let k=D[1];k&&a.add(k)}n.push({path:`default/blocks/${s.sourceDir}/${P}`,target:`${s.targetBase}/${P}`,content:j})}}await u(t);for(let c of Array.from(a).sort((d,p)=>d.localeCompare(p))){let d=await K(c,o);d&&i.push(...d)}return i.push(...n),i}catch(i){return console.warn(`Warning: unable to read ${e} from bundled blocks`,i),null}}async function K(e,o){let s=r.join(F,"default","ui",`${e}.tsx`);if(g(s))try{let n=U(await h(s,"utf8"),o),a=[{path:`default/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:n}];if(e==="toast"){let u=["toast-gooey.tsx","toast-gooey-renderer.tsx","toast-gooey-icons.tsx","toast-gooey-types.ts","toast-gooey.css"];for(let c of u){let d=r.join(F,"default","ui",c);g(d)&&a.push({path:`default/ui/${c}`,target:`components/ui/${c}`,content:await h(d,"utf8")})}}return a}catch(n){console.warn(`Warning: unable to read ${e} from bundled registry`,n)}let t=r.join(z,"love-ui"),i=r.join(t,"src","ui",`${e}.tsx`);if(!g(i))return null;try{let n=[],a=await h(i,"utf8");a=U(a,o),n.push({path:`src/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:a});let u=r.join(t,"src","lib","utils.ts");if(g(u)){let c=await h(u,"utf8");n.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:c})}return n}catch(n){return console.warn(`Warning: unable to read ${e} component`,n),null}}async function We(e,o){if(ie.has(e))return await K(e,o);let s=r.join(F,"default","examples",`${e}.tsx`);if(g(s))try{let a=await h(s,"utf8"),u=[],c=Array.from(new Set([...a.matchAll(/@\/registry\/default\/ui\/([^"']+)/g)].map(d=>d[1]).filter(Boolean)));for(let d of c){let p=await K(d,o);p&&u.push(...p)}return u.push({path:`default/examples/${e}.tsx`,target:`components/${e}.tsx`,content:U(a,o)}),u}catch(a){return console.warn(`Warning: unable to read ${e} from bundled registry examples`,a),null}let t=await _e(e,o);if(t)return t;let i=ue(e),n=r.join(z,i);if(!g(n))return null;try{return await Oe(n,e)}catch(a){return console.warn(`Warning: unable to read bundled sources for ${e}`,a),null}}async function ge(e){let o=r.join(ye,L(e));return!g(o)||!g(r.join(o,"SKILL.md"))?null:o}var q=["codex","claude","cursor","github"],ee=new Set(q);function qe(){let e=process.env.CODEX_HOME?.trim();return e||r.join(ne.homedir(),".codex")}function Me(){let e=process.env.CLAUDE_HOME?.trim();return e||r.join(ne.homedir(),".claude")}async function _(e,o){let s=await ge(e);if(!s)throw new Error(`Bundled skill "${e}" was not found in this love-ui package.`);return await R(r.dirname(o),{recursive:!0}),g(o)?"exists":(await pe(s,o,{recursive:!0,force:!1,filter:t=>{let i=r.basename(t);return!V.has(i)}}),"installed")}async function te(e,o){return await R(r.dirname(e),{recursive:!0}),g(e)?"exists":(await T(e,o,"utf8"),"installed")}function ze(e){return`---
111
+ description: Use LoveUI Skills when building, reviewing, or polishing LoveUI interfaces.
112
+ globs: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
113
+ alwaysApply: false
114
+ ---
115
+
116
+ Use the LoveUI skill pack in \`.cursor/loveui-skills\` for LoveUI UI work.
117
+
118
+ Start with \`.cursor/loveui-skills/SKILL.md\`, then read the matching files in \`.cursor/loveui-skills/references\` and \`.cursor/loveui-skills/skills\`.
119
+
120
+ For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
121
+
122
+ Installed skill pack: ${e}
123
+ `}function Ge(e){return`---
124
+ applyTo: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
125
+ ---
126
+
127
+ # LoveUI Skills
128
+
129
+ Use the LoveUI skill pack in \`.github/loveui-skills\` when building, reviewing, or polishing LoveUI interfaces.
130
+
131
+ Start with \`.github/loveui-skills/SKILL.md\`, then read the matching files in \`.github/loveui-skills/references\` and \`.github/loveui-skills/skills\`.
132
+
133
+ For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
134
+
135
+ Installed skill pack: ${e}
136
+ `}async function He(e,o,s){let t=L(e);if(o==="codex"){let a=r.join(qe(),"skills",t);return[{label:"Codex skill",path:a,status:await _(e,a)}]}if(o==="claude"){let a=r.join(Me(),"skills",t);return[{label:"Claude skill",path:a,status:await _(e,a)}]}if(o==="cursor"){let a=r.join(s,".cursor","loveui-skills"),u=r.join(s,".cursor","rules","loveui-skills.mdc");return[{label:"Cursor skill files",path:a,status:await _(e,a)},{label:"Cursor rule",path:u,status:await te(u,ze(e))}]}let i=r.join(s,".github","loveui-skills"),n=r.join(s,".github","instructions","loveui-skills.instructions.md");return[{label:"GitHub skill files",path:i,status:await _(e,i)},{label:"GitHub Copilot instructions",path:n,status:await te(n,Ge(e))}]}function Ke(e){let o=new Set;for(let s=0;s<e.length;s++){let t=e[s];if(t){if(t==="--target"||t==="--agent"||t==="-t"){let i=e[s+1];if(s++,!i)throw new Error(`Missing value for ${t}. Use one of: codex, claude, cursor, github, all.`);W(i,o);continue}if(t.startsWith("--target=")){W(t.slice(9),o);continue}if(t.startsWith("--agent=")){W(t.slice(8),o);continue}W(t,o)}}return[...o]}function W(e,o){let s=e.trim().toLowerCase();if(s==="all"){for(let t of ee)o.add(t);return}if(!ee.has(s))throw new Error(`Unknown skill target "${e}". Use one of: codex, claude, cursor, github, all.`);o.add(s)}async function Je(){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Missing skill target. Use one of: codex, claude, cursor, github, all.");let e=[...q.map((s,t)=>({label:s,number:String(t+1),targets:[s]})),{label:"all",number:String(q.length+1),targets:[...q]}];console.log(`
137
+ Which AI tool should LoveUI Skills target?
138
+ `);for(let s of e)console.log(` ${s.number}. ${s.label}`);let o=me({input:process.stdin,output:process.stdout});try{for(;;){let s=(await o.question(`
139
+ Select a target: `)).trim().toLowerCase(),t=e.find(i=>i.number===s||i.label===s);if(t)return t.targets;console.log("Please choose codex, claude, cursor, github, all, or a number from the list.")}}finally{o.close()}}async function Ve(e,o){let s="loveui-skills",t=Ke(e),i=t.length>0?t:await Je();if(!await ge(s))throw new Error("The loveui-skills pack is missing from this love-ui package. Try updating to the latest version.");console.log(`
140
+ Adding ${s} for ${i.join(", ")}...`);for(let n of i){let a=await He(s,n,o);for(let u of a){let c=u.status==="installed"?"Installed":"Already exists";console.log(`\u2713 ${c}: ${u.label} at ${u.path}`)}}console.log(`
141
+ \u2713 Done! Restart or reload your AI tool so it can pick up the new instructions.`)}var oe={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","lucide-react":"^1.16.0","tailwind-merge":"^3.3.1"};async function Xe(e){if(ie.has(e)||g(r.join(F,"default","examples",`${e}.tsx`)))return{...oe};let o=ae.get(e);if(o)return{...oe,..."dependencies"in o?o.dependencies:{}};let s=ue(e),t=r.join(z,s,"package.json");try{let i=await h(t,"utf8");return JSON.parse(i).dependencies??{}}catch{return{}}}async function Ye(e){return g(r.join(e,"bun.lockb"))?"bun":g(r.join(e,"pnpm-lock.yaml"))?"pnpm":g(r.join(e,"yarn.lock"))?"yarn":"npm"}async function Ne(e,o,s){let t=Object.entries(e);if(t.length===0)return!0;console.log(`
142
+ Installing dependencies...`);let i=t.map(([u,c])=>`${u}@${c}`),n;switch(o){case"bun":n=`bun add ${i.join(" ")}`;break;case"pnpm":n=`pnpm add ${i.join(" ")}`;break;case"yarn":n=`yarn add ${i.join(" ")}`;break;default:n=`npm install ${i.join(" ")}`}let a=fe(n,{stdio:"inherit",shell:!0,cwd:s});return a.error||a.status!==0?(console.warn(`
143
+ Failed to install dependencies. You may need to install them manually:`),console.warn(` ${i.join(`
144
+ `)}`),!1):(console.log(`Dependencies installed successfully!
145
+ `),!0)}async function Qe(e=process.argv.slice(2)){if((e.length===0||e.length===1&&(e[0]==="--version"||e[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(e.length<2||e[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui add loveui-skills [codex|claude|cursor|github|all]"),console.log(" npx love-ui add loveui-skills --agent codex"),console.log(" npx love-ui --version"),process.exit(1)),L(e[1]??"")==="loveui-skills"){await Ve(e.slice(2),process.cwd());return}let o=e.slice(1),s=process.cwd(),t=await Te(s),i=await Re(s),n=t?.components?le(t.components):null,a=await Ue(s,n,i),u=Fe(t?.components,i),{utilsImportPath:c,utilsFilePath:d}=await Le(s,a,u,t),p=await Ye(s),w=a.endsWith("/ui")?a:`${a}/ui`,x=!1,P=!1,j=!1,D={};for(let k of o){if(!k.trim())continue;if(console.log(`
146
+ Adding ${k}...`),x||(await R(r.join(s,a),{recursive:!0}),await R(r.join(s,w),{recursive:!0}),x=!0),!j){let l=await Ee(s);l.created?console.log(`\u2713 Created ${l.path}`):l.updated&&console.log(`\u2713 Updated ${l.path}`),l.imported&&console.log(`\u2713 Imported ${l.path} from app layout`),j=!0}P=!0;let m=null,X=null;if(k.startsWith("http://")||k.startsWith("https://")){let l=k;l.includes("/building-blocks/r/")&&(l=l.replace("/building-blocks/r/","/building-blocks/"),console.log(`Auto-corrected URL to: ${l}`));try{let f=await fetch(l);f.ok?m=await f.json():console.warn(`Failed to fetch ${l}: HTTP ${f.status}`)}catch(f){console.warn(`Failed to fetch from ${l}:`,f)}}else{let l=new URL(`r/${k}.json`,"https://www.loveui.dev/");try{let f=await fetch(l);f.ok&&(m=await f.json())}catch{}X=await We(k,c)}let B=X??m?.files??[];B=B.map(l=>{let f=l.target||l.path;return f.startsWith("registry/default/")&&(f=f.replace("registry/default/","")),{...l,target:f}});let C=B.find(l=>l.target.match(/^components\/comp-\d+\.tsx$/));if(C){let l=B.filter(f=>f.target.match(/^components\/[^/]+\//)&&f.target!==C.target);if(l.length>0&&l[0]){let f=l[0].target.match(/^components\/([^/]+)\//);if(f&&f[1]){let b=f[1];C.target=`components/${b}-demo.tsx`}}else if(m?.meta?.tags&&Array.isArray(m.meta.tags)&&m.meta.tags.length>0){let b=m.meta.tags.slice(0,2).filter(v=>v.length>0);if(b.length>0){let v=b.join("-").toLowerCase().replace(/\s+/g,"-");C.target=`components/${v}.tsx`}}}if(!B.length){console.warn(`Component "${k}" not found. Available components can be found at https://loveui.dev`);continue}B.some(l=>ce.test(l.target)||typeof l.content=="string"&&ve.test(l.content))&&await Ce(s,d);let E=0,I=0;for(let l of B){if(!l.content)continue;let f=Z(l.target,a,d),b=r.join(s,f),v=g(b);if(S(f)===S(d)&&v)continue;let O=U(l.content,c);if(v)try{if(await h(b,"utf8")===O)continue}catch{}await M(f,s),await T(b,O,"utf8"),v?I++:E++}if(E>0&&console.log(`\u2713 Created ${E} file${E>1?"s":""}`),I>0&&console.log(`\u2713 Updated ${I} file${I>1?"s":""}`),m?.registryDependencies&&m.registryDependencies.length>0){console.log(`
147
+ Installing ${m.registryDependencies.length} required component${m.registryDependencies.length>1?"s":""}...`);for(let l of m.registryDependencies){let f=l;l.startsWith("https://loveui.dev/building-blocks/r/")&&(f=`https://ui.loveui.dev/ui/r/${l.split("/").pop()}`);try{let b=await fetch(f);if(b.ok){let v=await b.json(),O=(v?.files??[]).map(y=>{let $=y.target||y.path;return $.startsWith("registry/default/")&&($=$.replace("registry/default/","")),{...y,target:$}});for(let y of O){if(!y.content)continue;let $=Z(y.target,a,d),H=r.join(s,$),Y=g(H);if(S($)===S(d)&&Y)continue;let N=U(y.content,c);if(Y)try{if(await h(H,"utf8")===N)continue}catch{}await M($,s),await T(H,N,"utf8")}let G=["@loveui/shadcn-ui","jotai","lucide-react","react","react-dom"];if(v?.dependencies)if(Array.isArray(v.dependencies))v.dependencies.forEach(y=>{G.includes(y)||(D[y]="latest")});else{let y=v.dependencies;Object.keys(y).forEach($=>{!G.includes($)&&y[$]&&(D[$]=y[$])})}}else console.warn(` \u2717 Failed to fetch ${f}: HTTP ${b.status}`)}catch(b){console.warn(` \u2717 Failed to install ${f}:`,b.message)}}console.log("\u2713 Installed registry dependencies")}let A={};m?.dependencies?Array.isArray(m.dependencies)?m.dependencies.forEach(l=>{A[l]="latest"}):A=m.dependencies:A=await Xe(k),Object.assign(D,A)}Object.keys(D).length>0&&await Ne(D,p,s),console.log(P?`
148
+ \u2713 Done! You can now import and use the components in your app.`:`
149
+ \u2713 Done! Skill installation complete.`)}var Ze=process.argv[1]&&(import.meta.url===he(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));Ze&&Qe().catch(e=>{console.error(e),process.exit(1)});export{Qe as run};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{constants as Te}from"fs";import{access as _e,readFile as Q}from"fs/promises";import p from"path";import{fileURLToPath as xe}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as d,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as l,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.18",private:!1,license:"MIT",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","registry","skills"],main:"dist/index.js",exports:{".":{import:"./dist/index.js",require:"./dist/index.js"},"./registry/*":"./registry/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-registry.mjs",prepack:"npm run build","verify:registry":"node ./scripts/copy-registry.mjs",clean:"rimraf dist registry"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as me}from"fs";import{access as ue,readFile as U,readdir as W}from"fs/promises";import T,{extname as q,join as j,relative as ge}from"path";import{fileURLToPath as ye}from"url";import z from"postcss";import fe from"postcss-nested";var he=T.dirname(ye(import.meta.url)),ve=T.resolve(he,".."),M=T.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),Se=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),ke=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),Ee=e=>e.replace(/\\/g,"/"),G=async(e,n,t)=>{let s=await W(e,{withFileTypes:!0});for(let r of s){let o=j(e,r.name);if(r.isDirectory()){if(we.has(r.name))continue;await G(o,n,t);continue}let a=q(r.name);!Re.has(a)||Se.has(r.name)||r.name.endsWith(".d.ts")||r.name.endsWith(".test.ts")||r.name.endsWith(".test.tsx")||r.name.endsWith(".stories.tsx")||t.push({absolute:o,relative:Ee(ge(n,o))})}},Ie=(e,n)=>{let t=e.loveui??{},s=typeof t.target=="string"?t.target.trim():"",r=t.category;if(s.length>0){let o=typeof t.includePackageName=="boolean"?t.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:o}}return r==="feature"?{base:"components",includePackageName:!0}:r==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},De=e=>{let t=(e.loveui??{}).type;return typeof t=="string"&&t.trim().length>0?t:"registry:ui"},Pe=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},b=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),be=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),je=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),H=async()=>(await W(M,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).filter(n=>!ke.has(n)).sort((n,t)=>n.localeCompare(t)),J=async e=>{let n=j(M,e),t=j(n,"package.json");if(!await Pe(t))throw new Error(`Missing package.json for ${e}`);let s=JSON.parse(await U(t,"utf8")),r=De(s),o=Object.keys(s.dependencies??{}),a=Object.keys(s.peerDependencies??{}),N=Object.keys(s.devDependencies??{}),oe=new Set([...o,...a,...N].filter(b).filter(i=>!je.has(i))),O=[...new Set([...o,...a].filter(i=>!b(i)))],A=[...new Set(N.filter(i=>!b(i)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(i)))],k=[];for(let i of oe){let h=be(i);k.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await G(n,n,C);let f=[],m={},g=Ie(s,e);for(let i of C){let h=await U(i.absolute,"utf8"),E=q(i.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await z([fe]).process(h,{from:void 0});z.parse(v.css).walkAtRules("layer",I=>{let D=`@layer ${I.params}`;m[D]??={},I.walkRules(c=>{if(c.parent&&c.parent.type==="atrule"&&c.parent.name==="media")return;let R=c.selector,u={};c.walkDecls(S=>{u[S.prop]=S.value}),Object.keys(u).length>0&&(m[D][R]=u)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,u=m[D];u[R]??={};let S=u[R];c.walkRules(L=>{let pe=L.selector,P={};L.walkDecls($=>{P[$.prop]=$.value}),Object.keys(P).length>0&&(S[pe]=P)})})});continue}let y=i.relative.startsWith("src/")?i.relative.slice(4):i.relative;if(!g.includePackageName){let v=g.base.split("/").filter(Boolean),w=v[v.length-1];w&&y.startsWith(`${w}/`)&&(y=y.slice(w.length+1))}let ce=e.includes("/")?e.split("/").pop()??e:e,le=(g.includePackageName?`${g.base}/${ce}`:g.base).replace(/\/+$/,"");f.push({type:r,path:y,target:`${le}/${y}`.replace(/\/+/g,"/"),content:h})}let ae=!f.length&&Object.keys(m).length>0?"registry:style":r;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:ae,title:s.title??e,description:s.description,author:s.author??"Connor Love <hello@loveconnor.com>",dependencies:O.length?O:void 0,devDependencies:A.length?A:void 0,registryDependencies:k.length?Array.from(new Set(k)):void 0,files:f.length?f:void 0,css:Object.keys(m).length?m:void 0}};var x="loveui://registry/",Ue="loveui://registry/{package}",K="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),ze=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),We=e=>`${x}${e}`,qe=p.dirname(xe(import.meta.url)),X=p.resolve(qe,".."),Me=[p.join(X,"public","r"),p.resolve(X,"..","..","apps","ui","public","r"),p.resolve(process.cwd(),"apps","ui","public","r")],te=async e=>{try{return await _e(e,Te.R_OK),!0}catch{return!1}},ne=e=>ze.some(n=>e.startsWith(n)),Ge=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),se=e=>Array.isArray(e)?e.filter(n=>typeof n=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let n=Array.from(new Set(se(e).filter(t=>!ne(t)&&!ee.has(t))));return n.length>0?n:void 0},He=e=>{let n=Array.from(new Set(se(e).map(t=>t.trim()).filter(Boolean).filter(t=>!ee.has(t)).map(t=>ne(t)?`https://www.loveui.dev/r/${Ge(t)}.json`:t)));return n.length>0?n:void 0},re=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Je=e=>{let n=re(e);if(Z.has(n))throw new l(d.InvalidParams,`${n} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return n},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let n={...e},t=B(n.dependencies),s=B(n.devDependencies),r=He(n.registryDependencies),o=typeof n.name=="string"&&n.name.trim().length>0?n.name.trim():"<component>",a={...n,mcpHints:{installPattern:"npx love-ui add <component>",installCommand:`npx love-ui add ${o}`,neverInstall:["@loveui/*","@love-ui/*","@repo/*","@loveui/shadcn-ui"]}};return t?a.dependencies=t:delete a.dependencies,s?a.devDependencies=s:delete a.devDependencies,r?a.registryDependencies=r:delete a.registryDependencies,a},_=null,ie=async()=>(_||(_=(async()=>{for(let e of Me){let n=p.join(e,"registry.json");if(await te(n))try{let t=JSON.parse(await Q(n,"utf8")),s=Array.from(new Set((t.items??[]).map(r=>r.name?.trim()).filter(r=>!!r))).sort((r,o)=>r.localeCompare(o));if(s.length===0)continue;return{dir:e,names:s,nameSet:new Set(s)}}catch{continue}}return null})()),_),Ke=async()=>{let[e,n]=await Promise.all([ie(),H()]),t=new Set(n);for(let s of e?.names??[])t.add(s);return Array.from(t).map(s=>re(s)).filter(s=>!Z.has(s)).sort((s,r)=>s.localeCompare(r))},Xe=async e=>{let n=await ie();if(!n||!n.nameSet.has(e))return null;let t=p.join(n.dir,`${e}.json`);return await te(t)?JSON.parse(await Q(t,"utf8")):null},Be=e=>{if(!e.startsWith(x))throw new l(d.InvalidParams,`Unsupported resource URI: ${e}`);let n=decodeURIComponent(e.slice(x.length)).trim();if(!n)throw new l(d.InvalidParams,"Package name is required.");return n},V=async e=>{let n=Je(e);try{let t=await Xe(n);return Y(t||await J(n))}catch(t){throw t instanceof l?t:t instanceof Error&&t.message.startsWith(`Missing package.json for ${n}`)?new l(d.InvalidParams,`Registry item "${n}" was not found. Call resources/list and use an exact item name from the registry.`):new l(d.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ye(){let e=new Ne({name:"loveui-mcp",version:F.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(Le,async()=>({resources:(await Ke()).map(s=>({uri:We(s),name:s,description:`loveui registry definition for ${s}`,mimeType:"application/json"}))})),e.setRequestHandler(Ce,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Ue,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(Fe,async t=>{let s=Be(t.params.uri),r=await V(s);return{contents:[{uri:t.params.uri,mimeType:"application/json",text:JSON.stringify(r,null,2)}]}}),e.setRequestHandler($e,async()=>({tools:[{name:K,description:"Fetch a loveui registry definition by package name. Always install with `npx love-ui add <component>` and never install @loveui/* packages directly.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ae,async t=>{if(t.params.name!==K)throw new l(d.InvalidParams,`Tool ${t.params.name} not found`);let s=t.params.arguments?.name;if(typeof s!="string"||s.trim()==="")throw new l(d.InvalidParams,"Package name is required.");let r=await V(s.trim());return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});let n=new Oe;await e.connect(n)}Ye().catch(e=>{console.error(e),process.exit(1)});
package/package.json CHANGED
@@ -1,19 +1,43 @@
1
1
  {
2
2
  "name": "love-ui",
3
- "version": "1.2.15",
3
+ "version": "1.2.18",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
7
+ "bin": {
8
+ "loveui": "dist/index.js",
9
+ "love-ui": "dist/index.js",
10
+ "loveui-mcp": "dist/mcp-server.js"
11
+ },
7
12
  "files": [
8
- "registry"
13
+ "dist",
14
+ "registry",
15
+ "skills"
9
16
  ],
17
+ "main": "dist/index.js",
10
18
  "exports": {
19
+ ".": {
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.js"
22
+ },
11
23
  "./registry/*": "./registry/*",
12
24
  "./package.json": "./package.json"
13
25
  },
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.18.1",
28
+ "postcss": "^8.5.6",
29
+ "postcss-nested": "^7.0.2"
30
+ },
14
31
  "scripts": {
15
- "prepack": "node ./scripts/copy-registry.mjs",
32
+ "build": "tsup",
33
+ "postbuild": "node ./scripts/copy-registry.mjs",
34
+ "prepack": "npm run build",
16
35
  "verify:registry": "node ./scripts/copy-registry.mjs",
17
- "clean": "rimraf registry"
36
+ "clean": "rimraf dist registry"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.14.10",
40
+ "rimraf": "^6.0.1",
41
+ "tsup": "^8.5.0"
18
42
  }
19
43
  }
@@ -2,8 +2,13 @@ import type { ComponentType } from "react"
2
2
 
3
3
  import accordion_controlled from "./default/examples/accordion-controlled"
4
4
  import accordion_demo from "./default/examples/accordion-demo"
5
+ import accordion_disabled from "./default/examples/accordion-disabled"
6
+ import accordion_card from "./default/examples/accordion-in-card"
7
+ import accordion_leading_icon from "./default/examples/accordion-leading-icon"
5
8
  import accordion_multiple from "./default/examples/accordion-multiple"
6
9
  import accordion_single from "./default/examples/accordion-single"
10
+ import accordion_user_roles from "./default/examples/accordion-user-roles"
11
+ import accordion_with_icons from "./default/examples/accordion-with-icons"
7
12
  import alert_demo from "./default/examples/alert-demo"
8
13
  import alert_dialog_demo from "./default/examples/alert-dialog-demo"
9
14
  import alert_error from "./default/examples/alert-error"
@@ -26,10 +31,18 @@ import autocomplete_with_clear from "./default/examples/autocomplete-with-clear"
26
31
  import autocomplete_with_label from "./default/examples/autocomplete-with-label"
27
32
  import autocomplete_with_trigger_clear from "./default/examples/autocomplete-with-trigger-clear"
28
33
  import avatar_demo from "./default/examples/avatar-demo"
34
+ import avatar_badge_icons from "./default/examples/avatar-badge-icons"
35
+ import avatar_badge_position from "./default/examples/avatar-badge-position"
36
+ import avatar_empty_collaborators from "./default/examples/avatar-empty-collaborators"
29
37
  import avatar_fallback from "./default/examples/avatar-fallback"
30
38
  import avatar_group from "./default/examples/avatar-group"
39
+ import avatar_group_trust from "./default/examples/avatar-group-trust"
40
+ import avatar_loading from "./default/examples/avatar-loading"
41
+ import avatar_menu from "./default/examples/avatar-menu"
42
+ import avatar_profile_badge from "./default/examples/avatar-profile-badge"
31
43
  import avatar_radius from "./default/examples/avatar-radius"
32
44
  import avatar_size from "./default/examples/avatar-size"
45
+ import avatar_status from "./default/examples/avatar-status"
33
46
  import badge_demo from "./default/examples/badge-demo"
34
47
  import badge_destructive from "./default/examples/badge-destructive"
35
48
  import badge_error from "./default/examples/badge-error"
@@ -42,22 +55,34 @@ import badge_success from "./default/examples/badge-success"
42
55
  import badge_warning from "./default/examples/badge-warning"
43
56
  import badge_with_icon from "./default/examples/badge-with-icon"
44
57
  import badge_with_link from "./default/examples/badge-with-link"
58
+ import breadcrumb_bullet_separator from "./default/examples/breadcrumb-bullet-separator"
59
+ import breadcrumb_buttons from "./default/examples/breadcrumb-buttons"
60
+ import breadcrumb_card from "./default/examples/breadcrumb-card"
45
61
  import breadcrumb_custom_separator from "./default/examples/breadcrumb-custom-separator"
46
62
  import breadcrumb_demo from "./default/examples/breadcrumb-demo"
63
+ import button_default from "./default/examples/button-default"
64
+ import button_default_icons from "./default/examples/button-default-icons"
47
65
  import button_demo from "./default/examples/button-demo"
48
66
  import button_destructive from "./default/examples/button-destructive"
67
+ import button_destructive_icons from "./default/examples/button-destructive-icons"
49
68
  import button_destructive_outline from "./default/examples/button-destructive-outline"
69
+ import button_destructive_outline_icons from "./default/examples/button-destructive-outline-icons"
50
70
  import button_disabled from "./default/examples/button-disabled"
51
71
  import button_ghost from "./default/examples/button-ghost"
72
+ import button_ghost_icons from "./default/examples/button-ghost-icons"
52
73
  import button_icon from "./default/examples/button-icon"
53
74
  import button_icon_lg from "./default/examples/button-icon-lg"
54
75
  import button_icon_sm from "./default/examples/button-icon-sm"
55
76
  import button_lg from "./default/examples/button-lg"
56
77
  import button_link from "./default/examples/button-link"
78
+ import button_link_icons from "./default/examples/button-link-icons"
57
79
  import button_loading from "./default/examples/button-loading"
58
80
  import button_outline from "./default/examples/button-outline"
81
+ import button_outline_icons from "./default/examples/button-outline-icons"
59
82
  import button_secondary from "./default/examples/button-secondary"
83
+ import button_secondary_icons from "./default/examples/button-secondary-icons"
60
84
  import button_sm from "./default/examples/button-sm"
85
+ import button_theme_toggle from "./default/examples/button-theme-toggle"
61
86
  import button_with_icon from "./default/examples/button-with-icon"
62
87
  import button_with_link from "./default/examples/button-with-link"
63
88
  import button_xl from "./default/examples/button-xl"
@@ -232,9 +257,20 @@ import breadcrumb_workspace_path from "./default/examples/breadcrumb-workspace-p
232
257
  import breadcrumb_compact_path from "./default/examples/breadcrumb-compact-path"
233
258
  import breadcrumb_with_ellipsis from "./default/examples/breadcrumb-with-ellipsis"
234
259
  import button_command_bar from "./default/examples/button-command-bar"
260
+ import card_author_profile from "./default/examples/card-author-profile"
235
261
  import card_metric_summary from "./default/examples/card-metric-summary"
236
262
  import card_billing_plan from "./default/examples/card-billing-plan"
263
+ import card_default_size from "./default/examples/card-default-size"
264
+ import card_depth from "./default/examples/card-depth"
265
+ import card_help_link from "./default/examples/card-help-link"
266
+ import card_help_menu from "./default/examples/card-help-menu"
267
+ import card_image_centered from "./default/examples/card-image-centered"
268
+ import card_image_feature from "./default/examples/card-image-feature"
269
+ import card_metric_actions from "./default/examples/card-metric-actions"
270
+ import card_resource_link from "./default/examples/card-resource-link"
237
271
  import card_team_member from "./default/examples/card-team-member"
272
+ import card_usage_expandable from "./default/examples/card-usage-expandable"
273
+ import card_with_borders from "./default/examples/card-with-borders"
238
274
  import checkbox_notification_row from "./default/examples/checkbox-notification-row"
239
275
  import collapsible_release_notes from "./default/examples/collapsible-release-notes"
240
276
  import collapsible_checklist from "./default/examples/collapsible-checklist"
@@ -296,6 +332,7 @@ import tooltip_keyboard_hints from "./default/examples/tooltip-keyboard-hints"
296
332
 
297
333
  export const Index: Record<string, { component: ComponentType }> = {
298
334
  "accordion-product-faq": { component: accordion_product_faq },
335
+ "accordion-card": { component: accordion_card },
299
336
  "alert-billing-notice": { component: alert_billing_notice },
300
337
  "autocomplete-members": { component: autocomplete_members },
301
338
  "avatar-team-stack": { component: avatar_team_stack },
@@ -304,9 +341,20 @@ export const Index: Record<string, { component: ComponentType }> = {
304
341
  "breadcrumb-compact-path": { component: breadcrumb_compact_path },
305
342
  "breadcrumb-with-ellipsis": { component: breadcrumb_with_ellipsis },
306
343
  "button-command-bar": { component: button_command_bar },
344
+ "card-author-profile": { component: card_author_profile },
307
345
  "card-metric-summary": { component: card_metric_summary },
308
346
  "card-billing-plan": { component: card_billing_plan },
347
+ "card-default-size": { component: card_default_size },
348
+ "card-depth": { component: card_depth },
349
+ "card-help-link": { component: card_help_link },
350
+ "card-help-menu": { component: card_help_menu },
351
+ "card-image-centered": { component: card_image_centered },
352
+ "card-image-feature": { component: card_image_feature },
353
+ "card-metric-actions": { component: card_metric_actions },
354
+ "card-resource-link": { component: card_resource_link },
309
355
  "card-team-member": { component: card_team_member },
356
+ "card-usage-expandable": { component: card_usage_expandable },
357
+ "card-with-borders": { component: card_with_borders },
310
358
  "checkbox-notification-row": { component: checkbox_notification_row },
311
359
  "collapsible-release-notes": { component: collapsible_release_notes },
312
360
  "collapsible-checklist": { component: collapsible_checklist },
@@ -367,8 +415,13 @@ export const Index: Record<string, { component: ComponentType }> = {
367
415
  "tooltip-keyboard-hints": { component: tooltip_keyboard_hints },
368
416
  "accordion-controlled": { component: accordion_controlled },
369
417
  "accordion-demo": { component: accordion_demo },
418
+ "accordion-disabled": { component: accordion_disabled },
419
+ "accordion-in-card": { component: accordion_card },
420
+ "accordion-leading-icon": { component: accordion_leading_icon },
370
421
  "accordion-multiple": { component: accordion_multiple },
371
422
  "accordion-single": { component: accordion_single },
423
+ "accordion-user-roles": { component: accordion_user_roles },
424
+ "accordion-with-icons": { component: accordion_with_icons },
372
425
  "alert-demo": { component: alert_demo },
373
426
  "alert-dialog-demo": { component: alert_dialog_demo },
374
427
  "alert-error": { component: alert_error },
@@ -390,11 +443,19 @@ export const Index: Record<string, { component: ComponentType }> = {
390
443
  "autocomplete-with-clear": { component: autocomplete_with_clear },
391
444
  "autocomplete-with-label": { component: autocomplete_with_label },
392
445
  "autocomplete-with-trigger-clear": { component: autocomplete_with_trigger_clear },
446
+ "avatar-badge-icons": { component: avatar_badge_icons },
447
+ "avatar-badge-position": { component: avatar_badge_position },
393
448
  "avatar-demo": { component: avatar_demo },
449
+ "avatar-empty-collaborators": { component: avatar_empty_collaborators },
394
450
  "avatar-fallback": { component: avatar_fallback },
395
451
  "avatar-group": { component: avatar_group },
452
+ "avatar-group-trust": { component: avatar_group_trust },
453
+ "avatar-loading": { component: avatar_loading },
454
+ "avatar-menu": { component: avatar_menu },
455
+ "avatar-profile-badge": { component: avatar_profile_badge },
396
456
  "avatar-radius": { component: avatar_radius },
397
457
  "avatar-size": { component: avatar_size },
458
+ "avatar-status": { component: avatar_status },
398
459
  "badge-demo": { component: badge_demo },
399
460
  "badge-destructive": { component: badge_destructive },
400
461
  "badge-error": { component: badge_error },
@@ -407,22 +468,34 @@ export const Index: Record<string, { component: ComponentType }> = {
407
468
  "badge-warning": { component: badge_warning },
408
469
  "badge-with-icon": { component: badge_with_icon },
409
470
  "badge-with-link": { component: badge_with_link },
471
+ "breadcrumb-bullet-separator": { component: breadcrumb_bullet_separator },
472
+ "breadcrumb-buttons": { component: breadcrumb_buttons },
473
+ "breadcrumb-card": { component: breadcrumb_card },
410
474
  "breadcrumb-custom-separator": { component: breadcrumb_custom_separator },
411
475
  "breadcrumb-demo": { component: breadcrumb_demo },
476
+ "button-default": { component: button_default },
477
+ "button-default-icons": { component: button_default_icons },
412
478
  "button-demo": { component: button_demo },
413
479
  "button-destructive": { component: button_destructive },
480
+ "button-destructive-icons": { component: button_destructive_icons },
414
481
  "button-destructive-outline": { component: button_destructive_outline },
482
+ "button-destructive-outline-icons": { component: button_destructive_outline_icons },
415
483
  "button-disabled": { component: button_disabled },
416
484
  "button-ghost": { component: button_ghost },
485
+ "button-ghost-icons": { component: button_ghost_icons },
417
486
  "button-icon": { component: button_icon },
418
487
  "button-icon-lg": { component: button_icon_lg },
419
488
  "button-icon-sm": { component: button_icon_sm },
420
489
  "button-lg": { component: button_lg },
421
490
  "button-link": { component: button_link },
491
+ "button-link-icons": { component: button_link_icons },
422
492
  "button-loading": { component: button_loading },
423
493
  "button-outline": { component: button_outline },
494
+ "button-outline-icons": { component: button_outline_icons },
424
495
  "button-secondary": { component: button_secondary },
496
+ "button-secondary-icons": { component: button_secondary_icons },
425
497
  "button-sm": { component: button_sm },
498
+ "button-theme-toggle": { component: button_theme_toggle },
426
499
  "button-with-icon": { component: button_with_icon },
427
500
  "button-with-link": { component: button_with_link },
428
501
  "button-xl": { component: button_xl },
@@ -0,0 +1,5 @@
1
+ import { NotFoundPage } from "../components/not-found";
2
+
3
+ export default function DemoPage() {
4
+ return <NotFoundPage />;
5
+ }
@@ -0,0 +1,33 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ type FullWidthDividerProps = React.ComponentProps<"div"> & {
4
+ contained?: boolean;
5
+ position?: "top" | "bottom";
6
+ };
7
+
8
+ export function FullWidthDivider({
9
+ className,
10
+ contained = false,
11
+ position,
12
+ ...props
13
+ }: FullWidthDividerProps) {
14
+ return (
15
+ <div
16
+ aria-hidden="true"
17
+ className={cn(
18
+ "pointer-events-none absolute h-px bg-border",
19
+ // full-bleed (default)
20
+ "data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
21
+ // contained
22
+ "data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
23
+ // position
24
+ position &&
25
+ "data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
26
+ className
27
+ )}
28
+ data-contained={contained}
29
+ data-position={position}
30
+ {...props}
31
+ />
32
+ );
33
+ }
@@ -0,0 +1,51 @@
1
+ import { Button } from "@/registry/default/ui/button";
2
+ import {
3
+ Empty,
4
+ EmptyContent,
5
+ EmptyDescription,
6
+ EmptyHeader,
7
+ EmptyTitle,
8
+ } from "@/registry/default/ui/empty";
9
+ import { FullWidthDivider } from "./full-width-divider";
10
+ import { HomeIcon, CompassIcon } from "lucide-react";
11
+
12
+ export function NotFoundPage() {
13
+ return (
14
+ <div className="flex w-full items-center justify-center overflow-hidden">
15
+ <div className="flex h-screen items-center border-x">
16
+ <div>
17
+ <FullWidthDivider />
18
+ <Empty>
19
+ <EmptyHeader>
20
+ <EmptyTitle className="font-black font-mono text-8xl">
21
+ 404
22
+ </EmptyTitle>
23
+ <EmptyDescription className="text-nowrap">
24
+ The page you're looking for might have been <br />
25
+ moved or doesn't exist.
26
+ </EmptyDescription>
27
+ </EmptyHeader>
28
+ <EmptyContent>
29
+ <div className="flex gap-2">
30
+ <Button asChild>
31
+ <a href="#">
32
+ <HomeIcon data-icon="inline-start" />
33
+ Go Home
34
+ </a>
35
+ </Button>
36
+
37
+ <Button asChild variant="outline">
38
+ <a href="#">
39
+ <CompassIcon data-icon="inline-start" />
40
+ Explore
41
+ </a>
42
+ </Button>
43
+ </div>
44
+ </EmptyContent>
45
+ </Empty>
46
+ <FullWidthDivider />
47
+ </div>
48
+ </div>
49
+ </div>
50
+ );
51
+ }
@@ -0,0 +1,5 @@
1
+ import { NotFoundPage } from "../components/not-found";
2
+
3
+ export default function DemoPage() {
4
+ return <NotFoundPage />;
5
+ }