love-ui 1.2.19 → 1.2.21

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 (320) hide show
  1. package/dist/chunk-VDMHIXDM.js +121 -0
  2. package/dist/index.js +156 -134
  3. package/dist/mcp-server.js +1 -1
  4. package/package.json +38 -3
  5. package/registry/default/blocks/404-1/components/not-found.tsx +1 -1
  6. package/registry/default/blocks/404-2/components/not-found.tsx +1 -1
  7. package/registry/default/blocks/auth1/components/auth-page.tsx +2 -3
  8. package/registry/default/blocks/auth2/components/auth.tsx +2 -3
  9. package/registry/default/blocks/auth3/components/auth-page.tsx +2 -3
  10. package/registry/default/blocks/contact1/components/contact.tsx +1 -1
  11. package/registry/default/blocks/contact2/components/contact.tsx +2 -2
  12. package/registry/default/blocks/contact3/components/contact.tsx +2 -3
  13. package/registry/default/blocks/contact4/components/contact.tsx +1 -1
  14. package/registry/default/blocks/contact5/components/contact.tsx +1 -1
  15. package/registry/default/blocks/cta-2/components/cta.tsx +1 -1
  16. package/registry/default/blocks/cta-3/components/cta.tsx +1 -1
  17. package/registry/default/blocks/cta-4/components/cta.tsx +1 -1
  18. package/registry/default/blocks/cta-5/components/cta.tsx +1 -1
  19. package/registry/default/blocks/faq-4/components/faq.tsx +7 -1
  20. package/registry/default/blocks/faq-5/components/faq.tsx +1 -1
  21. package/registry/default/blocks/features1/components/feature-section.tsx +6 -1
  22. package/registry/default/blocks/features2/components/feature-section.tsx +1 -1
  23. package/registry/default/blocks/features3/components/feature-section.tsx +6 -1
  24. package/registry/default/blocks/features4/components/feature-section.tsx +6 -1
  25. package/registry/default/blocks/features5/components/feature-section.tsx +8 -1
  26. package/registry/default/blocks/features6/components/feature-section.tsx +1 -1
  27. package/registry/default/blocks/footer1/components/footer.tsx +1 -2
  28. package/registry/default/blocks/footer2/components/footer.tsx +1 -3
  29. package/registry/default/blocks/footer3/components/footer.tsx +1 -4
  30. package/registry/default/blocks/footer4/components/footer.tsx +2 -5
  31. package/registry/default/blocks/footer5/components/footer.tsx +1 -6
  32. package/registry/default/blocks/footer6/app/page.tsx +1 -1
  33. package/registry/default/blocks/footer6/components/footer.tsx +1 -4
  34. package/registry/default/blocks/header1/components/mobile-nav.tsx +1 -1
  35. package/registry/default/blocks/header2/components/mobile-nav.tsx +1 -1
  36. package/registry/default/blocks/header3/components/mobile-nav.tsx +1 -1
  37. package/registry/default/blocks/header3/components/nav-links.tsx +16 -1
  38. package/registry/default/blocks/header3/components/ui/navigation-menu.tsx +1 -1
  39. package/registry/default/blocks/hero1/components/hero.tsx +1 -1
  40. package/registry/default/blocks/hero1/components/logo-cloud.tsx +43 -61
  41. package/registry/default/blocks/hero1/components/mobile-nav.tsx +1 -1
  42. package/registry/default/blocks/hero2/components/hero.tsx +1 -1
  43. package/registry/default/blocks/hero2/components/logo-cloud.tsx +38 -107
  44. package/registry/default/blocks/hero2/components/mobile-nav.tsx +1 -1
  45. package/registry/default/blocks/hero3/components/hero.tsx +1 -1
  46. package/registry/default/blocks/hero3/components/logo-cloud.tsx +39 -55
  47. package/registry/default/blocks/hero3/components/mobile-nav.tsx +1 -1
  48. package/registry/default/blocks/integrations1/components/integrations.tsx +45 -27
  49. package/registry/default/blocks/integrations2/components/integrations.tsx +46 -36
  50. package/registry/default/blocks/integrations3/components/integrations.tsx +53 -106
  51. package/registry/default/blocks/integrations4/components/integrations.tsx +53 -108
  52. package/registry/default/blocks/integrations5/components/integrations.tsx +51 -68
  53. package/registry/default/blocks/logo-cloud-1/components/logo-cloud.tsx +39 -54
  54. package/registry/default/blocks/logo-cloud-2/components/logo-cloud.tsx +39 -50
  55. package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +41 -56
  56. package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +41 -56
  57. package/registry/default/blocks/logo-cloud-5/components/logo-cloud.tsx +39 -55
  58. package/registry/default/blocks/onboarding1/components/onboarding.tsx +7 -7
  59. package/registry/default/blocks/onboarding2/components/onboarding.tsx +19 -9
  60. package/registry/default/blocks/onboarding3/components/onboarding.tsx +1 -1
  61. package/registry/default/blocks/onboarding4/components/onboarding.tsx +6 -6
  62. package/registry/default/blocks/onboarding6/components/onboarding.tsx +1 -1
  63. package/registry/default/blocks/onboarding7/components/onboarding.tsx +4 -4
  64. package/registry/default/blocks/pricing1/components/pricing.tsx +1 -1
  65. package/registry/default/blocks/pricing2/components/pricing.tsx +1 -1
  66. package/registry/default/blocks/pricing3/components/pricing.tsx +6 -1
  67. package/registry/default/blocks/pricing4/components/pricing.tsx +1 -1
  68. package/registry/default/blocks/stats11/components/stats.tsx +1 -1
  69. package/registry/default/blocks/stats2/components/stats.tsx +1 -1
  70. package/registry/default/blocks/stats4/components/stats.tsx +1 -1
  71. package/registry/default/blocks/stats6/components/stats.tsx +6 -1
  72. package/registry/default/blocks/stats7/components/stats.tsx +1 -1
  73. package/registry/default/blocks/testimonials3/components/testimonials.tsx +1 -1
  74. package/registry/default/blocks/testimonials4/components/testimonials.tsx +1 -1
  75. package/registry/default/examples/accordion-in-card.tsx +1 -1
  76. package/registry/default/examples/accordion-leading-icon.tsx +1 -1
  77. package/registry/default/examples/accordion-with-icons.tsx +1 -1
  78. package/registry/default/examples/alert-billing-notice.tsx +1 -1
  79. package/registry/default/examples/alert-error.tsx +1 -1
  80. package/registry/default/examples/alert-info.tsx +1 -1
  81. package/registry/default/examples/alert-success.tsx +1 -1
  82. package/registry/default/examples/alert-warning.tsx +1 -1
  83. package/registry/default/examples/alert-with-icon-action.tsx +1 -1
  84. package/registry/default/examples/alert-with-icon.tsx +1 -1
  85. package/registry/default/examples/autocomplete-async.tsx +1 -1
  86. package/registry/default/examples/avatar-badge-icons.tsx +5 -5
  87. package/registry/default/examples/avatar-empty-collaborators.tsx +1 -1
  88. package/registry/default/examples/avatar-loading.tsx +2 -2
  89. package/registry/default/examples/avatar-menu.tsx +6 -6
  90. package/registry/default/examples/badge-release-status.tsx +1 -1
  91. package/registry/default/examples/badge-with-icon.tsx +1 -1
  92. package/registry/default/examples/breadcrumb-buttons.tsx +5 -5
  93. package/registry/default/examples/breadcrumb-card.tsx +1 -1
  94. package/registry/default/examples/breadcrumb-workspace-path.tsx +1 -1
  95. package/registry/default/examples/button-command-bar.tsx +1 -1
  96. package/registry/default/examples/button-default-icons.tsx +1 -1
  97. package/registry/default/examples/button-demo.tsx +1 -1
  98. package/registry/default/examples/button-destructive-icons.tsx +1 -1
  99. package/registry/default/examples/button-destructive-outline-icons.tsx +1 -1
  100. package/registry/default/examples/button-ghost-icons.tsx +1 -1
  101. package/registry/default/examples/button-icon-lg.tsx +1 -1
  102. package/registry/default/examples/button-icon-sm.tsx +1 -1
  103. package/registry/default/examples/button-icon.tsx +1 -1
  104. package/registry/default/examples/button-link-icons.tsx +1 -1
  105. package/registry/default/examples/button-loading.tsx +1 -1
  106. package/registry/default/examples/button-outline-icons.tsx +1 -1
  107. package/registry/default/examples/button-secondary-icons.tsx +1 -1
  108. package/registry/default/examples/button-theme-toggle.tsx +1 -1
  109. package/registry/default/examples/button-with-icon.tsx +1 -1
  110. package/registry/default/examples/card-help-link.tsx +1 -1
  111. package/registry/default/examples/card-help-menu.tsx +7 -7
  112. package/registry/default/examples/card-image-centered.tsx +1 -1
  113. package/registry/default/examples/card-image-feature.tsx +1 -1
  114. package/registry/default/examples/card-metric-actions.tsx +9 -9
  115. package/registry/default/examples/card-metric-summary.tsx +1 -1
  116. package/registry/default/examples/card-resource-link.tsx +1 -1
  117. package/registry/default/examples/card-usage-expandable.tsx +1 -1
  118. package/registry/default/examples/checkbox-notification-row.tsx +1 -1
  119. package/registry/default/examples/collapsible-demo.tsx +1 -1
  120. package/registry/default/examples/collapsible-release-notes.tsx +1 -1
  121. package/registry/default/examples/combobox-with-inner-input.tsx +1 -1
  122. package/registry/default/examples/empty-demo.tsx +1 -1
  123. package/registry/default/examples/empty-filtered-results.tsx +1 -1
  124. package/registry/default/examples/empty-inbox-zero.tsx +1 -1
  125. package/registry/default/examples/empty-upload-queue.tsx +1 -1
  126. package/registry/default/examples/form.tsx +7 -7
  127. package/registry/default/examples/group-demo.tsx +1 -1
  128. package/registry/default/examples/group-toolbar-actions.tsx +1 -1
  129. package/registry/default/examples/group-with-input.tsx +1 -1
  130. package/registry/default/examples/input-search-inline.tsx +1 -1
  131. package/registry/default/examples/menu-demo.tsx +6 -6
  132. package/registry/default/examples/menu-project-actions.tsx +1 -1
  133. package/registry/default/examples/popover-with-close.tsx +1 -1
  134. package/registry/default/examples/preview-card-demo.tsx +1 -1
  135. package/registry/default/examples/preview-card-repository.tsx +1 -1
  136. package/registry/default/examples/skeleton-demo.tsx +1 -1
  137. package/registry/default/examples/switch-privacy-mode.tsx +1 -1
  138. package/registry/default/examples/table.tsx +1 -1
  139. package/registry/default/examples/toggle-group-demo.tsx +1 -1
  140. package/registry/default/examples/toggle-group-disabled.tsx +1 -1
  141. package/registry/default/examples/toggle-group-lg.tsx +1 -1
  142. package/registry/default/examples/toggle-group-multiple.tsx +1 -1
  143. package/registry/default/examples/toggle-group-outline-with-separator.tsx +1 -1
  144. package/registry/default/examples/toggle-group-outline.tsx +1 -1
  145. package/registry/default/examples/toggle-group-sm.tsx +1 -1
  146. package/registry/default/examples/toggle-group-with-disabled-item.tsx +1 -1
  147. package/registry/default/examples/toggle-icon-group.tsx +1 -1
  148. package/registry/default/examples/toggle-view-mode.tsx +1 -1
  149. package/registry/default/examples/toggle-with-icon.tsx +1 -1
  150. package/registry/default/examples/toolbar-canvas-controls.tsx +1 -1
  151. package/registry/default/examples/toolbar-demo.tsx +6 -6
  152. package/registry/default/examples/toolbar-density-controls.tsx +1 -1
  153. package/registry/default/examples/toolbar-media-controls.tsx +1 -1
  154. package/registry/default/examples/tooltip-grouped.tsx +1 -1
  155. package/registry/default/examples/tooltip-icon-row.tsx +1 -1
  156. package/registry/default/icons/package.json +1 -1
  157. package/registry/default/icons/scripts/generate-registry.ts +5 -5
  158. package/registry/default/logos/package.json +1 -1
  159. package/registry/default/logos/scripts/generate-registry.ts +5 -5
  160. package/registry/default/logos/src/generated/ai/index.tsx +3 -3
  161. package/registry/default/logos/src/generated/index.tsx +4 -4
  162. package/registry/default/ui/accordion.tsx +1 -1
  163. package/registry/default/ui/autocomplete.tsx +1 -1
  164. package/registry/default/ui/breadcrumb.tsx +1 -1
  165. package/registry/default/ui/combobox.tsx +1 -1
  166. package/registry/default/ui/dialog.tsx +1 -1
  167. package/registry/default/ui/dropdown-menu.tsx +1 -1
  168. package/registry/default/ui/menu.tsx +1 -1
  169. package/registry/default/ui/number-field.tsx +1 -1
  170. package/registry/default/ui/pagination.tsx +4 -4
  171. package/registry/default/ui/select.tsx +4 -4
  172. package/registry/default/ui/sheet.tsx +1 -1
  173. package/registry/default/ui/sidebar.tsx +1 -1
  174. package/registry/default/ui/toast.tsx +6 -6
  175. package/registry/default/vectors/package.json +1 -1
  176. package/registry/default/vectors/scripts/generate-registry.ts +5 -5
  177. package/registry/default/blocks/auth1/components/icons/github-icon.tsx +0 -10
  178. package/registry/default/blocks/auth1/components/icons/google-icon.tsx +0 -14
  179. package/registry/default/blocks/auth2/components/icons/github-icon.tsx +0 -10
  180. package/registry/default/blocks/auth2/components/icons/google-icon.tsx +0 -14
  181. package/registry/default/blocks/auth3/components/icons/github-icon.tsx +0 -10
  182. package/registry/default/blocks/auth3/components/icons/google-icon.tsx +0 -14
  183. package/registry/default/blocks/contact2/components/icons/x-icon.tsx +0 -12
  184. package/registry/default/blocks/contact3/components/icons/github-icon.tsx +0 -10
  185. package/registry/default/blocks/contact3/components/icons/x-icon.tsx +0 -12
  186. package/registry/default/blocks/footer1/components/icons/github-icon.tsx +0 -10
  187. package/registry/default/blocks/footer1/components/icons/x-icon.tsx +0 -12
  188. package/registry/default/blocks/footer2/components/icons/github-icon.tsx +0 -10
  189. package/registry/default/blocks/footer2/components/icons/instagram-icon.tsx +0 -12
  190. package/registry/default/blocks/footer2/components/icons/x-icon.tsx +0 -12
  191. package/registry/default/blocks/footer3/components/icons/github-icon.tsx +0 -10
  192. package/registry/default/blocks/footer3/components/icons/instagram-icon.tsx +0 -12
  193. package/registry/default/blocks/footer3/components/icons/linkedin-icon.tsx +0 -12
  194. package/registry/default/blocks/footer3/components/icons/x-icon.tsx +0 -12
  195. package/registry/default/blocks/footer4/components/icons/github-icon.tsx +0 -10
  196. package/registry/default/blocks/footer4/components/icons/instagram-icon.tsx +0 -12
  197. package/registry/default/blocks/footer4/components/icons/linkedin-icon.tsx +0 -12
  198. package/registry/default/blocks/footer4/components/icons/x-icon.tsx +0 -12
  199. package/registry/default/blocks/footer5/components/icons/apple-icon.tsx +0 -18
  200. package/registry/default/blocks/footer5/components/icons/facebook-icon.tsx +0 -12
  201. package/registry/default/blocks/footer5/components/icons/google-play-icon.tsx +0 -10
  202. package/registry/default/blocks/footer5/components/icons/instagram-icon.tsx +0 -12
  203. package/registry/default/blocks/footer5/components/icons/linkedin-icon.tsx +0 -12
  204. package/registry/default/blocks/footer5/components/icons/x-icon.tsx +0 -12
  205. package/registry/default/blocks/footer6/components/icons/apple-icon.tsx +0 -18
  206. package/registry/default/blocks/footer6/components/icons/facebook-icon.tsx +0 -12
  207. package/registry/default/blocks/footer6/components/icons/github-icon.tsx +0 -10
  208. package/registry/default/blocks/footer6/components/icons/google-play-icon.tsx +0 -10
  209. package/registry/default/blocks/footer6/components/icons/instagram-icon.tsx +0 -12
  210. package/registry/default/blocks/footer6/components/icons/linkedin-icon.tsx +0 -12
  211. package/registry/default/blocks/footer6/components/icons/x-icon.tsx +0 -12
  212. package/registry/default/blocks/hero1/components/logos/claude-wordmark.svg +0 -1
  213. package/registry/default/blocks/hero1/components/logos/clerk-wordmark.svg +0 -1
  214. package/registry/default/blocks/hero1/components/logos/github-wordmark.svg +0 -6
  215. package/registry/default/blocks/hero1/components/logos/nvidia-wordmark.svg +0 -1
  216. package/registry/default/blocks/hero1/components/logos/openai-wordmark.svg +0 -1
  217. package/registry/default/blocks/hero1/components/logos/supabase-wordmark.svg +0 -23
  218. package/registry/default/blocks/hero1/components/logos/turso-wordmark.svg +0 -1
  219. package/registry/default/blocks/hero1/components/logos/vercel-wordmark.svg +0 -1
  220. package/registry/default/blocks/hero2/components/logos/claude-wordmark.svg +0 -1
  221. package/registry/default/blocks/hero2/components/logos/clerk-wordmark.svg +0 -1
  222. package/registry/default/blocks/hero2/components/logos/github-wordmark.svg +0 -6
  223. package/registry/default/blocks/hero2/components/logos/nvidia-wordmark.svg +0 -1
  224. package/registry/default/blocks/hero2/components/logos/openai-wordmark.svg +0 -1
  225. package/registry/default/blocks/hero2/components/logos/supabase-wordmark.svg +0 -23
  226. package/registry/default/blocks/hero2/components/logos/turso-wordmark.svg +0 -1
  227. package/registry/default/blocks/hero2/components/logos/vercel-wordmark.svg +0 -1
  228. package/registry/default/blocks/hero3/components/logos/claude-wordmark.svg +0 -1
  229. package/registry/default/blocks/hero3/components/logos/clerk-wordmark.svg +0 -1
  230. package/registry/default/blocks/hero3/components/logos/github-wordmark.svg +0 -6
  231. package/registry/default/blocks/hero3/components/logos/nvidia-wordmark.svg +0 -1
  232. package/registry/default/blocks/hero3/components/logos/openai-wordmark.svg +0 -1
  233. package/registry/default/blocks/hero3/components/logos/supabase-wordmark.svg +0 -23
  234. package/registry/default/blocks/hero3/components/logos/turso-wordmark.svg +0 -1
  235. package/registry/default/blocks/hero3/components/logos/vercel-wordmark.svg +0 -1
  236. package/registry/default/blocks/integrations1/components/logos/adobe.svg +0 -1
  237. package/registry/default/blocks/integrations1/components/logos/canva.svg +0 -1
  238. package/registry/default/blocks/integrations1/components/logos/cursor.svg +0 -1
  239. package/registry/default/blocks/integrations1/components/logos/gmail.svg +0 -1
  240. package/registry/default/blocks/integrations1/components/logos/notion.svg +0 -1
  241. package/registry/default/blocks/integrations1/components/logos/planetscale.svg +0 -1
  242. package/registry/default/blocks/integrations1/components/logos/polar.svg +0 -1
  243. package/registry/default/blocks/integrations1/components/logos/supabase.svg +0 -1
  244. package/registry/default/blocks/integrations1/components/logos/vercel.svg +0 -1
  245. package/registry/default/blocks/integrations2/components/logos/adobe.svg +0 -1
  246. package/registry/default/blocks/integrations2/components/logos/canva.svg +0 -1
  247. package/registry/default/blocks/integrations2/components/logos/cursor.svg +0 -1
  248. package/registry/default/blocks/integrations2/components/logos/gmail.svg +0 -1
  249. package/registry/default/blocks/integrations2/components/logos/notion.svg +0 -1
  250. package/registry/default/blocks/integrations2/components/logos/planetscale.svg +0 -1
  251. package/registry/default/blocks/integrations2/components/logos/polar.svg +0 -1
  252. package/registry/default/blocks/integrations2/components/logos/supabase.svg +0 -1
  253. package/registry/default/blocks/integrations2/components/logos/vercel.svg +0 -1
  254. package/registry/default/blocks/integrations3/components/logos/adobe.svg +0 -1
  255. package/registry/default/blocks/integrations3/components/logos/canva.svg +0 -1
  256. package/registry/default/blocks/integrations3/components/logos/cursor.svg +0 -1
  257. package/registry/default/blocks/integrations3/components/logos/gmail.svg +0 -1
  258. package/registry/default/blocks/integrations3/components/logos/notion.svg +0 -1
  259. package/registry/default/blocks/integrations3/components/logos/planetscale.svg +0 -1
  260. package/registry/default/blocks/integrations3/components/logos/polar.svg +0 -1
  261. package/registry/default/blocks/integrations3/components/logos/supabase.svg +0 -1
  262. package/registry/default/blocks/integrations3/components/logos/vercel.svg +0 -1
  263. package/registry/default/blocks/integrations4/components/logos/adobe.svg +0 -1
  264. package/registry/default/blocks/integrations4/components/logos/canva.svg +0 -1
  265. package/registry/default/blocks/integrations4/components/logos/cursor.svg +0 -1
  266. package/registry/default/blocks/integrations4/components/logos/gmail.svg +0 -1
  267. package/registry/default/blocks/integrations4/components/logos/notion.svg +0 -1
  268. package/registry/default/blocks/integrations4/components/logos/planetscale.svg +0 -1
  269. package/registry/default/blocks/integrations4/components/logos/polar.svg +0 -1
  270. package/registry/default/blocks/integrations4/components/logos/supabase.svg +0 -1
  271. package/registry/default/blocks/integrations4/components/logos/vercel.svg +0 -1
  272. package/registry/default/blocks/integrations5/components/logos/adobe.svg +0 -1
  273. package/registry/default/blocks/integrations5/components/logos/canva.svg +0 -1
  274. package/registry/default/blocks/integrations5/components/logos/cursor.svg +0 -1
  275. package/registry/default/blocks/integrations5/components/logos/gmail.svg +0 -1
  276. package/registry/default/blocks/integrations5/components/logos/notion.svg +0 -1
  277. package/registry/default/blocks/integrations5/components/logos/planetscale.svg +0 -1
  278. package/registry/default/blocks/integrations5/components/logos/polar.svg +0 -1
  279. package/registry/default/blocks/integrations5/components/logos/supabase.svg +0 -1
  280. package/registry/default/blocks/integrations5/components/logos/vercel.svg +0 -1
  281. package/registry/default/blocks/logo-cloud-1/components/logos/claude-wordmark.svg +0 -1
  282. package/registry/default/blocks/logo-cloud-1/components/logos/clerk-wordmark.svg +0 -1
  283. package/registry/default/blocks/logo-cloud-1/components/logos/github-wordmark.svg +0 -6
  284. package/registry/default/blocks/logo-cloud-1/components/logos/nvidia-wordmark.svg +0 -1
  285. package/registry/default/blocks/logo-cloud-1/components/logos/openai-wordmark.svg +0 -1
  286. package/registry/default/blocks/logo-cloud-1/components/logos/supabase-wordmark.svg +0 -23
  287. package/registry/default/blocks/logo-cloud-1/components/logos/turso-wordmark.svg +0 -1
  288. package/registry/default/blocks/logo-cloud-1/components/logos/vercel-wordmark.svg +0 -1
  289. package/registry/default/blocks/logo-cloud-2/components/logos/claude-wordmark.svg +0 -1
  290. package/registry/default/blocks/logo-cloud-2/components/logos/clerk-wordmark.svg +0 -1
  291. package/registry/default/blocks/logo-cloud-2/components/logos/github-wordmark.svg +0 -6
  292. package/registry/default/blocks/logo-cloud-2/components/logos/nvidia-wordmark.svg +0 -1
  293. package/registry/default/blocks/logo-cloud-2/components/logos/openai-wordmark.svg +0 -1
  294. package/registry/default/blocks/logo-cloud-2/components/logos/supabase-wordmark.svg +0 -23
  295. package/registry/default/blocks/logo-cloud-2/components/logos/turso-wordmark.svg +0 -1
  296. package/registry/default/blocks/logo-cloud-2/components/logos/vercel-wordmark.svg +0 -1
  297. package/registry/default/blocks/logo-cloud-3/components/logos/claude-wordmark.svg +0 -1
  298. package/registry/default/blocks/logo-cloud-3/components/logos/clerk-wordmark.svg +0 -1
  299. package/registry/default/blocks/logo-cloud-3/components/logos/github-wordmark.svg +0 -6
  300. package/registry/default/blocks/logo-cloud-3/components/logos/nvidia-wordmark.svg +0 -1
  301. package/registry/default/blocks/logo-cloud-3/components/logos/openai-wordmark.svg +0 -1
  302. package/registry/default/blocks/logo-cloud-3/components/logos/supabase-wordmark.svg +0 -23
  303. package/registry/default/blocks/logo-cloud-3/components/logos/turso-wordmark.svg +0 -1
  304. package/registry/default/blocks/logo-cloud-3/components/logos/vercel-wordmark.svg +0 -1
  305. package/registry/default/blocks/logo-cloud-4/components/logos/claude-wordmark.svg +0 -1
  306. package/registry/default/blocks/logo-cloud-4/components/logos/clerk-wordmark.svg +0 -1
  307. package/registry/default/blocks/logo-cloud-4/components/logos/github-wordmark.svg +0 -6
  308. package/registry/default/blocks/logo-cloud-4/components/logos/nvidia-wordmark.svg +0 -1
  309. package/registry/default/blocks/logo-cloud-4/components/logos/openai-wordmark.svg +0 -1
  310. package/registry/default/blocks/logo-cloud-4/components/logos/supabase-wordmark.svg +0 -23
  311. package/registry/default/blocks/logo-cloud-4/components/logos/turso-wordmark.svg +0 -1
  312. package/registry/default/blocks/logo-cloud-4/components/logos/vercel-wordmark.svg +0 -1
  313. package/registry/default/blocks/logo-cloud-5/components/logos/claude-wordmark.svg +0 -1
  314. package/registry/default/blocks/logo-cloud-5/components/logos/clerk-wordmark.svg +0 -1
  315. package/registry/default/blocks/logo-cloud-5/components/logos/github-wordmark.svg +0 -6
  316. package/registry/default/blocks/logo-cloud-5/components/logos/nvidia-wordmark.svg +0 -1
  317. package/registry/default/blocks/logo-cloud-5/components/logos/openai-wordmark.svg +0 -1
  318. package/registry/default/blocks/logo-cloud-5/components/logos/supabase-wordmark.svg +0 -23
  319. package/registry/default/blocks/logo-cloud-5/components/logos/turso-wordmark.svg +0 -1
  320. package/registry/default/blocks/logo-cloud-5/components/logos/vercel-wordmark.svg +0 -1
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{constants as xe}from"fs";import{access as Te,readFile as Q}from"fs/promises";import p from"path";import{fileURLToPath as _e}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as d,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as l,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.19",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"},"./icons":{types:"./registry/default/icons/dist/index.d.ts",import:"./registry/default/icons/dist/index.mjs",require:"./registry/default/icons/dist/index.cjs"},"./logos":{types:"./registry/default/logos/dist/index.d.ts",import:"./registry/default/logos/dist/index.mjs",require:"./registry/default/logos/dist/index.cjs"},"./vectors":{types:"./registry/default/vectors/dist/index.d.ts",import:"./registry/default/vectors/dist/index.mjs",require:"./registry/default/vectors/dist/index.cjs"},"./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 z}from"fs/promises";import x,{extname as W,join as b,relative as ge}from"path";import{fileURLToPath as ye}from"url";import q from"postcss";import fe from"postcss-nested";var he=x.dirname(ye(import.meta.url)),ve=x.resolve(he,".."),M=x.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),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,s,t)=>{let n=await z(e,{withFileTypes:!0});for(let r of n){let o=b(e,r.name);if(r.isDirectory()){if(we.has(r.name))continue;await G(o,s,t);continue}let a=W(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(s,o))})}},Ie=(e,s)=>{let t=e.loveui??{},n=typeof t.target=="string"?t.target.trim():"",r=t.category;if(n.length>0){let o=typeof t.includePackageName=="boolean"?t.includePackageName:!1;return{base:n.replace(/\/+$/,""),includePackageName:o}}return r==="feature"?{base:"components",includePackageName:!0}:r==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},je=e=>{let t=(e.loveui??{}).type;return typeof t=="string"&&t.trim().length>0?t:"registry:ui"},De=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},P=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),Pe=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),be=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),H=async()=>(await z(M,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name).filter(s=>!ke.has(s)).sort((s,t)=>s.localeCompare(t)),J=async e=>{let s=b(M,e),t=b(s,"package.json");if(!await De(t))throw new Error(`Missing package.json for ${e}`);let n=JSON.parse(await U(t,"utf8")),r=je(n),o=Object.keys(n.dependencies??{}),a=Object.keys(n.peerDependencies??{}),N=Object.keys(n.devDependencies??{}),oe=new Set([...o,...a,...N].filter(P).filter(i=>!be.has(i))),O=[...new Set([...o,...a].filter(i=>!P(i)))],A=[...new Set(N.filter(i=>!P(i)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(i)))],k=[];for(let i of oe){let h=Pe(i);k.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await G(s,s,C);let f=[],m={},g=Ie(n,e);for(let i of C){let h=await U(i.absolute,"utf8"),E=W(i.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await q([fe]).process(h,{from:void 0});q.parse(v.css).walkAtRules("layer",I=>{let j=`@layer ${I.params}`;m[j]??={},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[j][R]=u)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,u=m[j];u[R]??={};let S=u[R];c.walkRules(L=>{let pe=L.selector,D={};L.walkDecls($=>{D[$.prop]=$.value}),Object.keys(D).length>0&&(S[pe]=D)})})});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:n.title??e,description:n.description,author:n.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 _="loveui://registry/",Ue="loveui://registry/{package}",K="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),qe=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),ze=e=>`${_}${e}`,We=p.dirname(_e(import.meta.url)),X=p.resolve(We,".."),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 Te(e,xe.R_OK),!0}catch{return!1}},se=e=>qe.some(s=>e.startsWith(s)),Ge=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),ne=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let s=Array.from(new Set(ne(e).filter(t=>!se(t)&&!ee.has(t))));return s.length>0?s:void 0},He=e=>{let s=Array.from(new Set(ne(e).map(t=>t.trim()).filter(Boolean).filter(t=>!ee.has(t)).map(t=>se(t)?`https://www.loveui.dev/r/${Ge(t)}.json`:t)));return s.length>0?s:void 0},re=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Je=e=>{let s=re(e);if(Z.has(s))throw new l(d.InvalidParams,`${s} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return s},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let s={...e},t=B(s.dependencies),n=B(s.devDependencies),r=He(s.registryDependencies),o=typeof s.name=="string"&&s.name.trim().length>0?s.name.trim():"<component>",a={...s,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,n?a.devDependencies=n:delete a.devDependencies,r?a.registryDependencies=r:delete a.registryDependencies,a},T=null,ie=async()=>(T||(T=(async()=>{for(let e of Me){let s=p.join(e,"registry.json");if(await te(s))try{let t=JSON.parse(await Q(s,"utf8")),n=Array.from(new Set((t.items??[]).map(r=>r.name?.trim()).filter(r=>!!r))).sort((r,o)=>r.localeCompare(o));if(n.length===0)continue;return{dir:e,names:n,nameSet:new Set(n)}}catch{continue}}return null})()),T),Ke=async()=>{let[e,s]=await Promise.all([ie(),H()]),t=new Set(s);for(let n of e?.names??[])t.add(n);return Array.from(t).map(n=>re(n)).filter(n=>!Z.has(n)).sort((n,r)=>n.localeCompare(r))},Xe=async e=>{let s=await ie();if(!s||!s.nameSet.has(e))return null;let t=p.join(s.dir,`${e}.json`);return await te(t)?JSON.parse(await Q(t,"utf8")):null},Be=e=>{if(!e.startsWith(_))throw new l(d.InvalidParams,`Unsupported resource URI: ${e}`);let s=decodeURIComponent(e.slice(_.length)).trim();if(!s)throw new l(d.InvalidParams,"Package name is required.");return s},V=async e=>{let s=Je(e);try{let t=await Xe(s);return Y(t||await J(s))}catch(t){throw t instanceof l?t:t instanceof Error&&t.message.startsWith(`Missing package.json for ${s}`)?new l(d.InvalidParams,`Registry item "${s}" 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(n=>({uri:ze(n),name:n,description:`loveui registry definition for ${n}`,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 n=Be(t.params.uri),r=await V(n);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 n=t.params.arguments?.name;if(typeof n!="string"||n.trim()==="")throw new l(d.InvalidParams,"Package name is required.");let r=await V(n.trim());return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});let s=new Oe;await e.connect(s)}Ye().catch(e=>{console.error(e),process.exit(1)});
2
+ import{Ha as t,e as o,ia as n}from"./chunk-VDMHIXDM.js";import{StdioServerTransport as e}from"@modelcontextprotocol/sdk/server/stdio.js";async function a(){try{let r=new e;await t.connect(r)}catch(r){o.break(),n(r)}}a();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "love-ui",
3
- "version": "1.2.19",
3
+ "version": "1.2.21",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,9 +39,39 @@
39
39
  "./package.json": "./package.json"
40
40
  },
41
41
  "dependencies": {
42
+ "@antfu/ni": "^24.4.0",
43
+ "@babel/core": "^7.28.5",
44
+ "@babel/parser": "^7.28.5",
45
+ "@babel/plugin-transform-typescript": "^7.28.5",
46
+ "@dotenvx/dotenvx": "^1.71.0",
42
47
  "@modelcontextprotocol/sdk": "^1.18.1",
48
+ "clsx": "^2.1.1",
49
+ "commander": "^14.0.2",
50
+ "cosmiconfig": "^9.0.0",
51
+ "dedent": "^1.7.0",
52
+ "deepmerge": "^4.3.1",
53
+ "diff": "^8.0.2",
54
+ "execa": "^9.6.0",
55
+ "fast-glob": "^3.3.3",
56
+ "fs-extra": "^11.3.2",
57
+ "fuzzysort": "^3.1.0",
58
+ "https-proxy-agent": "^7.0.6",
59
+ "kleur": "^4.1.5",
60
+ "node-fetch": "^3.3.2",
61
+ "open": "^10.2.0",
62
+ "ora": "^9.0.0",
43
63
  "postcss": "^8.5.6",
44
- "postcss-nested": "^7.0.2"
64
+ "postcss-nested": "^7.0.2",
65
+ "postcss-selector-parser": "^7.1.1",
66
+ "prompts": "^2.4.2",
67
+ "recast": "^0.23.11",
68
+ "stringify-object": "^5.0.0",
69
+ "tailwind-merge": "^3.6.0",
70
+ "tailwindcss": "^4.3.0",
71
+ "ts-morph": "^27.0.2",
72
+ "tsconfig-paths": "^4.2.0",
73
+ "zod": "^3.25.76",
74
+ "zod-to-json-schema": "^3.25.2"
45
75
  },
46
76
  "scripts": {
47
77
  "build": "tsup",
@@ -51,8 +81,13 @@
51
81
  "clean": "rimraf dist registry"
52
82
  },
53
83
  "devDependencies": {
84
+ "@types/diff": "^7.0.2",
85
+ "@types/fs-extra": "^11.0.4",
54
86
  "@types/node": "^20.14.10",
87
+ "@types/prompts": "^2.4.9",
88
+ "msw": "^2.12.4",
55
89
  "rimraf": "^6.0.1",
56
- "tsup": "^8.5.0"
90
+ "tsup": "^8.5.0",
91
+ "vitest": "^4.0.15"
57
92
  }
58
93
  }
@@ -7,7 +7,7 @@ import {
7
7
  EmptyTitle,
8
8
  } from "@/registry/default/ui/empty";
9
9
  import { FullWidthDivider } from "./full-width-divider";
10
- import { HomeIcon, CompassIcon } from "lucide-react";
10
+ import { House as HomeIcon, Compass as CompassIcon } from "love-ui/icons";
11
11
 
12
12
  export function NotFoundPage() {
13
13
  return (
@@ -6,7 +6,7 @@ import {
6
6
  EmptyHeader,
7
7
  EmptyTitle,
8
8
  } from "@/registry/default/ui/empty";
9
- import { HomeIcon, CompassIcon } from "lucide-react";
9
+ import { House as HomeIcon, Compass as CompassIcon } from "love-ui/icons";
10
10
 
11
11
  export function NotFoundPage() {
12
12
  return (
@@ -1,9 +1,8 @@
1
- import { GithubIcon } from "./icons/github-icon";
2
- import { GoogleIcon } from "./icons/google-icon";
1
+ import { Github as GithubIcon, GoogleIcon } from "love-ui/logos";
3
2
  import { Logo } from "./logo";
4
3
  import { Particles } from "./particles";
5
4
  import { Button } from "@/registry/default/ui/button";
6
- import { ChevronLeftIcon } from "lucide-react";
5
+ import { ChevronLeft as ChevronLeftIcon } from "love-ui/icons";
7
6
 
8
7
  export function AuthPage() {
9
8
  return (
@@ -1,6 +1,5 @@
1
+ import { Github as GithubIcon, GoogleIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
- import { GithubIcon } from "./icons/github-icon";
3
- import { GoogleIcon } from "./icons/google-icon";
4
3
  import { Button } from "@/registry/default/ui/button";
5
4
  import {
6
5
  InputGroup,
@@ -9,7 +8,7 @@ import {
9
8
  } from "@/registry/default/ui/input-group";
10
9
  import { AuthDivider } from "./ui/auth-divider";
11
10
  import { DecorIcon } from "./ui/decor-icon";
12
- import { AtSignIcon } from "lucide-react";
11
+ import { AtSign as AtSignIcon } from "love-ui/icons";
13
12
 
14
13
  export function AuthPage() {
15
14
  return (
@@ -1,6 +1,5 @@
1
+ import { Github as GithubIcon, GoogleIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
- import { GithubIcon } from "./icons/github-icon";
3
- import { GoogleIcon } from "./icons/google-icon";
4
3
  import { Logo } from "./logo";
5
4
  import { Button } from "@/registry/default/ui/button";
6
5
  import {
@@ -9,7 +8,7 @@ import {
9
8
  InputGroupInput,
10
9
  } from "@/registry/default/ui/input-group";
11
10
  import { AuthDivider } from "./ui/auth-divider";
12
- import { AtSignIcon } from "lucide-react";
11
+ import { AtSign as AtSignIcon } from "love-ui/icons";
13
12
 
14
13
  export function AuthPage() {
15
14
  return (
@@ -1,6 +1,6 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import { FullWidthDivider } from "./full-width-divider";
3
- import { Phone, Mail, MapPin } from "lucide-react";
3
+ import { Phone, Mail, MapPin } from "love-ui/icons";
4
4
 
5
5
  const data = [
6
6
  {
@@ -1,7 +1,7 @@
1
+ import { X as XIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
- import { XIcon } from "./icons/x-icon";
3
3
  import { Button } from "@/registry/default/ui/button";
4
- import { Mail, Users } from "lucide-react";
4
+ import { Mail, Users } from "love-ui/icons";
5
5
 
6
6
  const APP_EMAIL = "hello@loveui.dev";
7
7
 
@@ -1,9 +1,8 @@
1
+ import { Github as GithubIcon, X as XIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
3
  import type React from "react";
3
- import { GithubIcon } from "./icons/github-icon";
4
- import { XIcon } from "./icons/x-icon";
5
4
  import { FullWidthDivider } from "./full-width-divider";
6
- import { Mail, MapPin, Phone } from "lucide-react";
5
+ import { Mail, MapPin, Phone } from "love-ui/icons";
7
6
 
8
7
  const APP_EMAIL = "hello@loveui.dev";
9
8
  const APP_PHONE = "+1 555 014 2026";
@@ -3,7 +3,7 @@ import { Button } from "@/registry/default/ui/button";
3
3
  import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
4
4
  import { Input } from "@/registry/default/ui/input";
5
5
  import { Textarea } from "@/registry/default/ui/textarea";
6
- import { MailIcon, PhoneIcon } from "lucide-react";
6
+ import { Mail as MailIcon, Phone as PhoneIcon } from "love-ui/icons";
7
7
 
8
8
  const contactInfo = [
9
9
  {
@@ -4,7 +4,7 @@ import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
4
4
  import { Input } from "@/registry/default/ui/input";
5
5
  import { Textarea } from "@/registry/default/ui/textarea";
6
6
  import { DecorIcon } from "./decor-icon";
7
- import { Phone, Mail } from "lucide-react";
7
+ import { Phone, Mail } from "love-ui/icons";
8
8
 
9
9
  const data = [
10
10
  {
@@ -1,6 +1,6 @@
1
1
  import { Button } from "@/registry/default/ui/button";
2
2
  import { FullWidthDivider } from "./full-width-divider";
3
- import { ArrowRightIcon } from "lucide-react";
3
+ import { ArrowRight as ArrowRightIcon } from "love-ui/icons";
4
4
 
5
5
  export function CallToAction() {
6
6
  return (
@@ -1,6 +1,6 @@
1
1
  import { Button } from "@/registry/default/ui/button";
2
2
  import { DecorIcon } from "./decor-icon";
3
- import { ArrowRightIcon } from "lucide-react";
3
+ import { ArrowRight as ArrowRightIcon } from "love-ui/icons";
4
4
 
5
5
  export function CallToAction() {
6
6
  return (
@@ -1,5 +1,5 @@
1
1
  import { Button } from "@/registry/default/ui/button";
2
- import { CreditCardIcon, ArrowRightIcon } from "lucide-react";
2
+ import { CreditCard as CreditCardIcon, ArrowRight as ArrowRightIcon } from "love-ui/icons";
3
3
 
4
4
  export function CallToAction() {
5
5
  return (
@@ -5,7 +5,7 @@ import {
5
5
  InputGroupInput,
6
6
  } from "@/registry/default/ui/input-group";
7
7
  import { FullWidthDivider } from "./full-width-divider";
8
- import { AtSignIcon, ArrowRightIcon } from "lucide-react";
8
+ import { AtSign as AtSignIcon, ArrowRight as ArrowRightIcon } from "love-ui/icons";
9
9
 
10
10
  export function CallToAction() {
11
11
  return (
@@ -7,7 +7,13 @@ import {
7
7
  AccordionTrigger,
8
8
  } from "@/registry/default/ui/accordion";
9
9
  import { Button } from "@/registry/default/ui/button";
10
- import { LayoutGridIcon, PowerIcon, FeatherIcon, CreditCardIcon, LifeBuoyIcon } from "lucide-react";
10
+ import {
11
+ LayoutGrid as LayoutGridIcon,
12
+ Power as PowerIcon,
13
+ Feather as FeatherIcon,
14
+ CreditCard as CreditCardIcon,
15
+ LifeBuoy as LifeBuoyIcon,
16
+ } from "love-ui/icons";
11
17
 
12
18
  const categories = [
13
19
  {
@@ -22,7 +22,7 @@ import {
22
22
  InputGroupInput,
23
23
  } from "@/registry/default/ui/input-group";
24
24
  import { FullWidthDivider } from "./full-width-divider";
25
- import { SearchIcon, SearchSlashIcon } from "lucide-react";
25
+ import { Search as SearchIcon, SearchSlash as SearchSlashIcon } from "love-ui/icons";
26
26
 
27
27
  export function FaqsSection() {
28
28
  const [searchTerm, setSearchTerm] = React.useState("");
@@ -1,6 +1,11 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
- import { ZapIcon, ShieldCheckIcon, ActivityIcon, GlobeIcon } from "lucide-react";
3
+ import {
4
+ Zap as ZapIcon,
5
+ ShieldCheck as ShieldCheckIcon,
6
+ Activity as ActivityIcon,
7
+ Globe as GlobeIcon,
8
+ } from "love-ui/icons";
4
9
 
5
10
  type FeatureType = {
6
11
  title: string;
@@ -1,7 +1,7 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
3
  import { DecorIcon } from "./decor-icon";
4
- import { HistoryIcon, SquareDashedIcon, CommandIcon } from "lucide-react";
4
+ import { History as HistoryIcon, SquareDashed as SquareDashedIcon, Command as CommandIcon } from "love-ui/icons";
5
5
 
6
6
  type FeatureType = {
7
7
  title: string;
@@ -1,7 +1,12 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
3
  import { FullWidthDivider } from "./full-width-divider";
4
- import { ZapIcon, ShieldCheckIcon, ActivityIcon, GlobeIcon } from "lucide-react";
4
+ import {
5
+ Zap as ZapIcon,
6
+ ShieldCheck as ShieldCheckIcon,
7
+ Activity as ActivityIcon,
8
+ Globe as GlobeIcon,
9
+ } from "love-ui/icons";
5
10
 
6
11
  type FeatureType = {
7
12
  title: string;
@@ -1,7 +1,12 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
3
  import { DecorIcon } from "./decor-icon";
4
- import { LayoutDashboardIcon, TerminalIcon, ShieldCheckIcon, FileTextIcon } from "lucide-react";
4
+ import {
5
+ LayoutDashboard as LayoutDashboardIcon,
6
+ Terminal as TerminalIcon,
7
+ ShieldCheck as ShieldCheckIcon,
8
+ FileText as FileTextIcon,
9
+ } from "love-ui/icons";
5
10
 
6
11
  type FeatureType = {
7
12
  title: string;
@@ -1,7 +1,14 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
3
  import { GridPattern } from "./grid-pattern";
4
- import { ZapIcon, CpuIcon, FingerprintIcon, PencilIcon, Settings2Icon, SparklesIcon } from "lucide-react";
4
+ import {
5
+ Zap as ZapIcon,
6
+ Cpu as CpuIcon,
7
+ FingerprintPattern as FingerprintIcon,
8
+ Pencil as PencilIcon,
9
+ Settings2 as Settings2Icon,
10
+ Sparkles as SparklesIcon,
11
+ } from "love-ui/icons";
5
12
 
6
13
  type FeatureType = {
7
14
  title: string;
@@ -1,7 +1,7 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import type React from "react";
3
3
  import { CobeGlobe } from "./cobe-globe";
4
- import { TrendingUpIcon, SquareMousePointerIcon, GlobeIcon } from "lucide-react";
4
+ import { TrendingUp as TrendingUpIcon, SquareMousePointer as SquareMousePointerIcon, Globe as GlobeIcon } from "love-ui/icons";
5
5
 
6
6
  const features = [
7
7
  {
@@ -1,5 +1,4 @@
1
- import { GithubIcon } from "./icons/github-icon";
2
- import { XIcon } from "./icons/x-icon";
1
+ import { Github as GithubIcon, X as XIcon } from "love-ui/logos";
3
2
  import { Logo } from "./logo";
4
3
  import { Button } from "@/registry/default/ui/button";
5
4
 
@@ -1,7 +1,5 @@
1
+ import { Github as GithubIcon, Instagram as InstagramIcon, X as XIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
- import { GithubIcon } from "./icons/github-icon";
3
- import { InstagramIcon } from "./icons/instagram-icon";
4
- import { XIcon } from "./icons/x-icon";
5
3
  import { Logo } from "./logo";
6
4
  import { Button } from "@/registry/default/ui/button";
7
5
  import { FullWidthDivider } from "./full-width-divider";
@@ -1,11 +1,8 @@
1
1
  "use client";
2
+ import { Github as GithubIcon, Instagram as InstagramIcon, LinkedIn as LinkedinIcon, X as XIcon } from "love-ui/logos";
2
3
  import { cn } from "@/lib/utils";
3
4
  import { motion, useReducedMotion } from "motion/react";
4
5
  import type { ReactNode } from "react";
5
- import { GithubIcon } from "./icons/github-icon";
6
- import { InstagramIcon } from "./icons/instagram-icon";
7
- import { LinkedinIcon } from "./icons/linkedin-icon";
8
- import { XIcon } from "./icons/x-icon";
9
6
  import { Logo } from "./logo";
10
7
 
11
8
  type FooterLink = {
@@ -1,9 +1,6 @@
1
+ import { Github as GithubIcon, Instagram as InstagramIcon, LinkedIn as LinkedinIcon, X as XIcon } from "love-ui/logos";
1
2
  import { cn } from "@/lib/utils";
2
- import { GithubIcon } from "./icons/github-icon";
3
- import { InstagramIcon } from "./icons/instagram-icon";
4
- import { XIcon } from "./icons/x-icon";
5
- import { LinkedinIcon } from "./icons/linkedin-icon";
6
- import { ArrowRightIcon } from "lucide-react";
3
+ import { ArrowRight as ArrowRightIcon } from "love-ui/icons";
7
4
 
8
5
  export function Footer() {
9
6
  return (
@@ -1,11 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { AppleIcon } from "./icons/apple-icon";
4
- import { FacebookIcon } from "./icons/facebook-icon";
5
- import { GooglePlayIcon } from "./icons/google-play-icon";
6
- import { InstagramIcon } from "./icons/instagram-icon";
7
- import { LinkedinIcon } from "./icons/linkedin-icon";
8
- import { XIcon } from "./icons/x-icon";
3
+ import { Instagram as InstagramIcon, LinkedIn as LinkedinIcon, X as XIcon, Apple as AppleIcon, Facebook as FacebookIcon, GooglePlay as GooglePlayIcon } from "love-ui/logos";
9
4
  import { Button } from "@/registry/default/ui/button";
10
5
 
11
6
  export function Footer() {
@@ -1,4 +1,4 @@
1
- import { ArrowDownIcon } from "lucide-react";
1
+ import { ArrowDown as ArrowDownIcon } from "love-ui/icons";
2
2
  import { StickyFooter } from "../components/footer";
3
3
 
4
4
  export default function FooterDemo() {
@@ -1,11 +1,8 @@
1
1
  "use client";
2
+ import { Github as GithubIcon, Instagram as InstagramIcon, LinkedIn as LinkedinIcon, Facebook as FacebookIcon } from "love-ui/logos";
2
3
  import { motion, useReducedMotion } from "motion/react";
3
4
  import type React from "react";
4
5
  import type { ReactNode } from "react";
5
- import { FacebookIcon } from "./icons/facebook-icon";
6
- import { InstagramIcon } from "./icons/instagram-icon";
7
- import { LinkedinIcon } from "./icons/linkedin-icon";
8
- import { GithubIcon } from "./icons/github-icon";
9
6
  import { Logo } from "./logo";
10
7
  import { Button } from "@/registry/default/ui/button";
11
8
 
@@ -3,7 +3,7 @@ import React from "react";
3
3
  import { Button } from "@/registry/default/ui/button";
4
4
  import { Portal, PortalBackdrop } from "./ui/portal";
5
5
  import { navLinks } from "./header";
6
- import { XIcon, MenuIcon } from "lucide-react";
6
+ import { X as XIcon, Menu as MenuIcon } from "love-ui/icons";
7
7
 
8
8
  export function MobileNav() {
9
9
  const [open, setOpen] = React.useState(false);
@@ -3,7 +3,7 @@ import React from "react";
3
3
  import { Button } from "@/registry/default/ui/button";
4
4
  import { Portal, PortalBackdrop } from "./ui/portal";
5
5
  import { navLinks } from "./header";
6
- import { XIcon, MenuIcon } from "lucide-react";
6
+ import { X as XIcon, Menu as MenuIcon } from "love-ui/icons";
7
7
 
8
8
  export function MobileNav() {
9
9
  const [open, setOpen] = React.useState(false);
@@ -4,7 +4,7 @@ import { Button } from "@/registry/default/ui/button";
4
4
  import { Portal, PortalBackdrop } from "./ui/portal";
5
5
  import { companyLinks, companyLinks2, productLinks } from "./nav-links";
6
6
  import { LinkItem } from "./sheard";
7
- import { XIcon, MenuIcon } from "lucide-react";
7
+ import { X as XIcon, Menu as MenuIcon } from "love-ui/icons";
8
8
 
9
9
  export function MobileNav() {
10
10
  const [open, setOpen] = React.useState(false);
@@ -1,5 +1,20 @@
1
1
  import type { LinkItemType } from "./sheard";
2
- import { GlobeIcon, LayersIcon, UserPlusIcon, BarChart3Icon, PlugIcon, CodeIcon, UsersIcon, StarIcon, HandshakeIcon, FileTextIcon, ShieldIcon, RotateCcwIcon, LeafIcon, HelpCircleIcon } from "lucide-react";
2
+ import {
3
+ Globe as GlobeIcon,
4
+ Layers as LayersIcon,
5
+ UserPlus as UserPlusIcon,
6
+ ChartBar as BarChart3Icon,
7
+ Plug as PlugIcon,
8
+ Code as CodeIcon,
9
+ Users as UsersIcon,
10
+ Star as StarIcon,
11
+ Handshake as HandshakeIcon,
12
+ FileText as FileTextIcon,
13
+ Shield as ShieldIcon,
14
+ RotateCcw as RotateCcwIcon,
15
+ Leaf as LeafIcon,
16
+ CircleQuestionMark as HelpCircleIcon,
17
+ } from "love-ui/icons";
3
18
 
4
19
  export const productLinks: LinkItemType[] = [
5
20
  {
@@ -1,6 +1,6 @@
1
1
  import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu"
2
2
  import { cva } from "class-variance-authority"
3
- import { ChevronDownIcon } from "lucide-react"
3
+ import { ChevronDown as ChevronDownIcon } from "love-ui/icons"
4
4
 
5
5
  import { cn } from "@/lib/utils"
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { cn } from "@/lib/utils";
2
2
  import { Button } from "@/registry/default/ui/button";
3
- import { RocketIcon, ArrowRightIcon, PhoneCallIcon } from "lucide-react";
3
+ import { Rocket as RocketIcon, ArrowRight as ArrowRightIcon, PhoneCall as PhoneCallIcon } from "love-ui/icons";
4
4
 
5
5
  export function HeroSection() {
6
6
  return (
@@ -1,69 +1,51 @@
1
- import { InfiniteSlider } from "./infinite-slider";
2
- import ClaudeLogo from "./logos/claude-wordmark.svg";
3
- import ClerkLogo from "./logos/clerk-wordmark.svg";
4
- import GithubLogo from "./logos/github-wordmark.svg";
5
- import NvidiaLogo from "./logos/nvidia-wordmark.svg";
6
- import OpenAILogo from "./logos/openai-wordmark.svg";
7
- import SupabaseLogo from "./logos/supabase-wordmark.svg";
8
- import TursoLogo from "./logos/turso-wordmark.svg";
9
- import VercelLogo from "./logos/vercel-wordmark.svg";
1
+ import type { ElementType, SVGProps } from "react";
2
+ import {
3
+ ClaudeAIWordmark as ClaudeLogo,
4
+ ClerkWordmark as ClerkLogo,
5
+ GithubWordmark as GithubLogo,
6
+ IBMWordmark as IBMLogo,
7
+ NextjsWordmark as NextjsLogo,
8
+ OpenAIWordmark as OpenAILogo,
9
+ ResendWordmark as ResendLogo,
10
+ VercelWordmark as VercelLogo,
11
+ } from "love-ui/logos";
10
12
 
11
- type LogoSource = { src: string } | string;
13
+ type LogoComponent = ElementType<SVGProps<SVGSVGElement>>;
12
14
 
13
- const getLogoSrc = (source: LogoSource) =>
14
- typeof source === "string" ? source : source.src;
15
+ type Logo = {
16
+ Component: LogoComponent;
17
+ alt: string;
18
+ className?: string;
19
+ };
20
+
21
+ function LogoAsset({ logo, className }: { logo: Logo; className: string }) {
22
+ const Component = logo.Component;
23
+ const logoClassName = [className, logo.className].filter(Boolean).join(" ");
24
+
25
+ return <Component aria-label={logo.alt} className={logoClassName} role="img" />;
26
+ }
27
+
28
+ const logos: Logo[] = [
29
+ { Component: VercelLogo, alt: "Vercel Logo" },
30
+ { Component: NextjsLogo, alt: "Next.js Logo" },
31
+ { Component: OpenAILogo, alt: "OpenAI Logo" },
32
+ { Component: ResendLogo, alt: "Resend Logo" },
33
+ { Component: GithubLogo, alt: "GitHub Logo" },
34
+ { Component: ClaudeLogo, alt: "Claude AI Logo" },
35
+ { Component: IBMLogo, alt: "IBM Logo" },
36
+ { Component: ClerkLogo, alt: "Clerk Logo" },
37
+ ];
15
38
 
16
39
  export function LogoCloud() {
17
40
  return (
18
- <div className="mask-[linear-gradient(to_right,transparent,black,transparent)] overflow-hidden py-4">
19
- <InfiniteSlider gap={42} reverse speed={80} speedOnHover={25}>
20
- {logos.map((logo) => (
21
- <img
22
- alt={logo.alt}
23
- className="pointer-events-none h-4 select-none md:h-5 dark:brightness-0 dark:invert"
24
- height="auto"
25
- key={`logo-${logo.alt}`}
26
- loading="lazy"
27
- src={getLogoSrc(logo.src)}
28
- width="auto"
29
- />
30
- ))}
31
- </InfiniteSlider>
41
+ <div className="relative flex flex-wrap items-center justify-center gap-x-8 gap-y-8 py-6 sm:gap-x-12 sm:gap-y-10">
42
+ {logos.map((logo) => (
43
+ <LogoAsset
44
+ className="pointer-events-none h-8 w-32 select-none text-foreground sm:h-9 sm:w-36"
45
+ key={logo.alt}
46
+ logo={logo}
47
+ />
48
+ ))}
32
49
  </div>
33
50
  );
34
51
  }
35
-
36
- const logos = [
37
- {
38
- src: NvidiaLogo,
39
- alt: "Nvidia Logo",
40
- },
41
- {
42
- src: SupabaseLogo,
43
- alt: "Supabase Logo",
44
- },
45
- {
46
- src: OpenAILogo,
47
- alt: "OpenAI Logo",
48
- },
49
- {
50
- src: TursoLogo,
51
- alt: "Turso Logo",
52
- },
53
- {
54
- src: VercelLogo,
55
- alt: "Vercel Logo",
56
- },
57
- {
58
- src: GithubLogo,
59
- alt: "GitHub Logo",
60
- },
61
- {
62
- src: ClaudeLogo,
63
- alt: "Claude AI Logo",
64
- },
65
- {
66
- src: ClerkLogo,
67
- alt: "Clerk Logo",
68
- },
69
- ];