love-ui 1.2.17 → 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 (413) hide show
  1. package/dist/index.js +20 -20
  2. package/dist/mcp-server.js +1 -1
  3. package/package.json +1 -1
  4. package/registry/__index__.tsx +73 -0
  5. package/registry/default/blocks/404-1/app/page.tsx +5 -0
  6. package/registry/default/blocks/404-1/components/full-width-divider.tsx +33 -0
  7. package/registry/default/blocks/404-1/components/not-found.tsx +51 -0
  8. package/registry/default/blocks/404-2/app/page.tsx +5 -0
  9. package/registry/default/blocks/404-2/components/not-found.tsx +44 -0
  10. package/registry/default/blocks/auth1/app/page.tsx +5 -0
  11. package/registry/default/blocks/auth1/components/auth-page.tsx +66 -0
  12. package/registry/default/blocks/auth1/components/icons/github-icon.tsx +10 -0
  13. package/registry/default/blocks/auth1/components/icons/google-icon.tsx +14 -0
  14. package/registry/default/blocks/auth1/components/logo.tsx +88 -0
  15. package/registry/default/blocks/auth1/components/particles.tsx +321 -0
  16. package/registry/default/blocks/auth2/app/page.tsx +5 -0
  17. package/registry/default/blocks/auth2/components/auth.tsx +87 -0
  18. package/registry/default/blocks/auth2/components/icons/github-icon.tsx +10 -0
  19. package/registry/default/blocks/auth2/components/icons/google-icon.tsx +14 -0
  20. package/registry/default/blocks/auth2/components/ui/auth-divider.tsx +16 -0
  21. package/registry/default/blocks/auth2/components/ui/decor-icon.tsx +45 -0
  22. package/registry/default/blocks/auth3/app/page.tsx +5 -0
  23. package/registry/default/blocks/auth3/components/auth-page.tsx +84 -0
  24. package/registry/default/blocks/auth3/components/icons/github-icon.tsx +10 -0
  25. package/registry/default/blocks/auth3/components/icons/google-icon.tsx +14 -0
  26. package/registry/default/blocks/auth3/components/logo.tsx +88 -0
  27. package/registry/default/blocks/auth3/components/ui/auth-divider.tsx +16 -0
  28. package/registry/default/blocks/auth3/components/ui/decor-icon.tsx +45 -0
  29. package/registry/default/blocks/blogs1/app/page.tsx +5 -0
  30. package/registry/default/blocks/blogs1/components/blogs.tsx +97 -0
  31. package/registry/default/blocks/blogs1/components/full-width-divider.tsx +33 -0
  32. package/registry/default/blocks/blogs2/app/page.tsx +5 -0
  33. package/registry/default/blocks/blogs2/components/blogs.tsx +158 -0
  34. package/registry/default/blocks/blogs2/components/full-width-divider.tsx +33 -0
  35. package/registry/default/blocks/blogs2/components/grid-filler.tsx +74 -0
  36. package/registry/default/blocks/blogs3/app/page.tsx +5 -0
  37. package/registry/default/blocks/blogs3/components/aspect-ratio.tsx +22 -0
  38. package/registry/default/blocks/blogs3/components/blogs.tsx +224 -0
  39. package/registry/default/blocks/blogs3/components/full-width-divider.tsx +33 -0
  40. package/registry/default/blocks/blogs3/components/lazy-image.tsx +94 -0
  41. package/registry/default/blocks/contact1/app/page.tsx +9 -0
  42. package/registry/default/blocks/contact1/components/contact.tsx +65 -0
  43. package/registry/default/blocks/contact1/components/full-width-divider.tsx +33 -0
  44. package/registry/default/blocks/contact2/app/page.tsx +9 -0
  45. package/registry/default/blocks/contact2/components/contact.tsx +74 -0
  46. package/registry/default/blocks/contact2/components/full-width-divider.tsx +33 -0
  47. package/registry/default/blocks/contact2/components/icons/x-icon.tsx +12 -0
  48. package/registry/default/blocks/contact3/app/page.tsx +9 -0
  49. package/registry/default/blocks/contact3/components/contact.tsx +152 -0
  50. package/registry/default/blocks/contact3/components/full-width-divider.tsx +33 -0
  51. package/registry/default/blocks/contact3/components/icons/github-icon.tsx +10 -0
  52. package/registry/default/blocks/contact3/components/icons/x-icon.tsx +12 -0
  53. package/registry/default/blocks/contact4/app/page.tsx +9 -0
  54. package/registry/default/blocks/contact4/components/contact.tsx +120 -0
  55. package/registry/default/blocks/contact5/app/page.tsx +9 -0
  56. package/registry/default/blocks/contact5/components/contact.tsx +119 -0
  57. package/registry/default/blocks/contact5/components/decor-icon.tsx +45 -0
  58. package/registry/default/blocks/cta-1/app/page.tsx +9 -0
  59. package/registry/default/blocks/cta-1/components/cta.tsx +20 -0
  60. package/registry/default/blocks/cta-1/components/full-width-divider.tsx +33 -0
  61. package/registry/default/blocks/cta-2/app/page.tsx +9 -0
  62. package/registry/default/blocks/cta-2/components/cta.tsx +27 -0
  63. package/registry/default/blocks/cta-2/components/full-width-divider.tsx +33 -0
  64. package/registry/default/blocks/cta-3/app/page.tsx +9 -0
  65. package/registry/default/blocks/cta-3/components/cta.tsx +35 -0
  66. package/registry/default/blocks/cta-3/components/decor-icon.tsx +45 -0
  67. package/registry/default/blocks/cta-4/app/page.tsx +9 -0
  68. package/registry/default/blocks/cta-4/components/cta.tsx +28 -0
  69. package/registry/default/blocks/cta-5/app/page.tsx +9 -0
  70. package/registry/default/blocks/cta-5/components/cta.tsx +72 -0
  71. package/registry/default/blocks/cta-5/components/full-width-divider.tsx +33 -0
  72. package/registry/default/blocks/faq-1/app/page.tsx +9 -0
  73. package/registry/default/blocks/faq-1/components/faq.tsx +86 -0
  74. package/registry/default/blocks/faq-2/app/page.tsx +9 -0
  75. package/registry/default/blocks/faq-2/components/faq.tsx +93 -0
  76. package/registry/default/blocks/faq-3/app/page.tsx +9 -0
  77. package/registry/default/blocks/faq-3/components/decor-icon.tsx +45 -0
  78. package/registry/default/blocks/faq-3/components/faq.tsx +110 -0
  79. package/registry/default/blocks/faq-4/app/page.tsx +9 -0
  80. package/registry/default/blocks/faq-4/components/faq.tsx +181 -0
  81. package/registry/default/blocks/faq-5/app/page.tsx +9 -0
  82. package/registry/default/blocks/faq-5/components/faq.tsx +211 -0
  83. package/registry/default/blocks/faq-5/components/full-width-divider.tsx +33 -0
  84. package/registry/default/blocks/features1/app/page.tsx +9 -0
  85. package/registry/default/blocks/features1/components/feature-section.tsx +73 -0
  86. package/registry/default/blocks/features2/app/page.tsx +9 -0
  87. package/registry/default/blocks/features2/components/decor-icon.tsx +45 -0
  88. package/registry/default/blocks/features2/components/feature-section.tsx +97 -0
  89. package/registry/default/blocks/features3/app/page.tsx +9 -0
  90. package/registry/default/blocks/features3/components/feature-section.tsx +93 -0
  91. package/registry/default/blocks/features3/components/full-width-divider.tsx +21 -0
  92. package/registry/default/blocks/features4/app/page.tsx +9 -0
  93. package/registry/default/blocks/features4/components/decor-icon.tsx +45 -0
  94. package/registry/default/blocks/features4/components/feature-section.tsx +114 -0
  95. package/registry/default/blocks/features5/app/page.tsx +9 -0
  96. package/registry/default/blocks/features5/components/feature-section.tsx +115 -0
  97. package/registry/default/blocks/features5/components/grid-pattern.tsx +70 -0
  98. package/registry/default/blocks/features6/app/page.tsx +9 -0
  99. package/registry/default/blocks/features6/components/cobe-globe.tsx +86 -0
  100. package/registry/default/blocks/features6/components/feature-section.tsx +309 -0
  101. package/registry/default/blocks/footer1/app/page.tsx +9 -0
  102. package/registry/default/blocks/footer1/components/footer.tsx +85 -0
  103. package/registry/default/blocks/footer1/components/icons/github-icon.tsx +10 -0
  104. package/registry/default/blocks/footer1/components/icons/x-icon.tsx +12 -0
  105. package/registry/default/blocks/footer1/components/logo.tsx +88 -0
  106. package/registry/default/blocks/footer2/app/page.tsx +9 -0
  107. package/registry/default/blocks/footer2/components/footer.tsx +139 -0
  108. package/registry/default/blocks/footer2/components/full-width-divider.tsx +21 -0
  109. package/registry/default/blocks/footer2/components/icons/github-icon.tsx +10 -0
  110. package/registry/default/blocks/footer2/components/icons/instagram-icon.tsx +12 -0
  111. package/registry/default/blocks/footer2/components/icons/x-icon.tsx +12 -0
  112. package/registry/default/blocks/footer2/components/logo.tsx +88 -0
  113. package/registry/default/blocks/footer3/app/page.tsx +9 -0
  114. package/registry/default/blocks/footer3/components/footer.tsx +155 -0
  115. package/registry/default/blocks/footer3/components/icons/github-icon.tsx +10 -0
  116. package/registry/default/blocks/footer3/components/icons/instagram-icon.tsx +12 -0
  117. package/registry/default/blocks/footer3/components/icons/linkedin-icon.tsx +12 -0
  118. package/registry/default/blocks/footer3/components/icons/x-icon.tsx +12 -0
  119. package/registry/default/blocks/footer3/components/logo.tsx +88 -0
  120. package/registry/default/blocks/footer4/app/page.tsx +9 -0
  121. package/registry/default/blocks/footer4/components/footer.tsx +137 -0
  122. package/registry/default/blocks/footer4/components/icons/github-icon.tsx +10 -0
  123. package/registry/default/blocks/footer4/components/icons/instagram-icon.tsx +12 -0
  124. package/registry/default/blocks/footer4/components/icons/linkedin-icon.tsx +12 -0
  125. package/registry/default/blocks/footer4/components/icons/x-icon.tsx +12 -0
  126. package/registry/default/blocks/footer4/components/logo.tsx +88 -0
  127. package/registry/default/blocks/footer5/app/page.tsx +9 -0
  128. package/registry/default/blocks/footer5/components/footer.tsx +152 -0
  129. package/registry/default/blocks/footer5/components/icons/apple-icon.tsx +18 -0
  130. package/registry/default/blocks/footer5/components/icons/facebook-icon.tsx +12 -0
  131. package/registry/default/blocks/footer5/components/icons/google-play-icon.tsx +10 -0
  132. package/registry/default/blocks/footer5/components/icons/instagram-icon.tsx +12 -0
  133. package/registry/default/blocks/footer5/components/icons/linkedin-icon.tsx +12 -0
  134. package/registry/default/blocks/footer5/components/icons/x-icon.tsx +12 -0
  135. package/registry/default/blocks/footer5/components/logo.tsx +88 -0
  136. package/registry/default/blocks/footer6/app/page.tsx +16 -0
  137. package/registry/default/blocks/footer6/components/footer.tsx +220 -0
  138. package/registry/default/blocks/footer6/components/icons/apple-icon.tsx +18 -0
  139. package/registry/default/blocks/footer6/components/icons/facebook-icon.tsx +12 -0
  140. package/registry/default/blocks/footer6/components/icons/github-icon.tsx +10 -0
  141. package/registry/default/blocks/footer6/components/icons/google-play-icon.tsx +10 -0
  142. package/registry/default/blocks/footer6/components/icons/instagram-icon.tsx +12 -0
  143. package/registry/default/blocks/footer6/components/icons/linkedin-icon.tsx +12 -0
  144. package/registry/default/blocks/footer6/components/icons/x-icon.tsx +12 -0
  145. package/registry/default/blocks/footer6/components/logo.tsx +88 -0
  146. package/registry/default/blocks/header1/app/page.tsx +12 -0
  147. package/registry/default/blocks/header1/components/demo-layout.tsx +33 -0
  148. package/registry/default/blocks/header1/components/header.tsx +58 -0
  149. package/registry/default/blocks/header1/components/logo.tsx +88 -0
  150. package/registry/default/blocks/header1/components/mobile-nav.tsx +61 -0
  151. package/registry/default/blocks/header1/components/ui/portal.tsx +27 -0
  152. package/registry/default/blocks/header1/hooks/use-scroll.ts +54 -0
  153. package/registry/default/blocks/header2/app/page.tsx +11 -0
  154. package/registry/default/blocks/header2/components/demo-layout.tsx +33 -0
  155. package/registry/default/blocks/header2/components/header.tsx +70 -0
  156. package/registry/default/blocks/header2/components/logo.tsx +88 -0
  157. package/registry/default/blocks/header2/components/mobile-nav.tsx +61 -0
  158. package/registry/default/blocks/header2/components/ui/portal.tsx +27 -0
  159. package/registry/default/blocks/header2/hooks/use-scroll.ts +54 -0
  160. package/registry/default/blocks/header3/app/page.tsx +11 -0
  161. package/registry/default/blocks/header3/components/demo-layout.tsx +33 -0
  162. package/registry/default/blocks/header3/components/desktop-nav.tsx +70 -0
  163. package/registry/default/blocks/header3/components/header.tsx +41 -0
  164. package/registry/default/blocks/header3/components/logo.tsx +88 -0
  165. package/registry/default/blocks/header3/components/mobile-nav.tsx +88 -0
  166. package/registry/default/blocks/header3/components/nav-links.tsx +132 -0
  167. package/registry/default/blocks/header3/components/sheard.tsx +41 -0
  168. package/registry/default/blocks/header3/components/ui/navigation-menu.tsx +171 -0
  169. package/registry/default/blocks/header3/components/ui/portal.tsx +27 -0
  170. package/registry/default/blocks/header3/hooks/use-scroll.ts +54 -0
  171. package/registry/default/blocks/hero1/app/page.tsx +15 -0
  172. package/registry/default/blocks/hero1/components/header.tsx +70 -0
  173. package/registry/default/blocks/hero1/components/hero.tsx +80 -0
  174. package/registry/default/blocks/hero1/components/infinite-slider.tsx +109 -0
  175. package/registry/default/blocks/hero1/components/logo-cloud.tsx +69 -0
  176. package/registry/default/blocks/hero1/components/logo.tsx +88 -0
  177. package/registry/default/blocks/hero1/components/logos/claude-wordmark.svg +1 -0
  178. package/registry/default/blocks/hero1/components/logos/clerk-wordmark.svg +1 -0
  179. package/registry/default/blocks/hero1/components/logos/github-wordmark.svg +6 -0
  180. package/registry/default/blocks/hero1/components/logos/nvidia-wordmark.svg +1 -0
  181. package/registry/default/blocks/hero1/components/logos/openai-wordmark.svg +1 -0
  182. package/registry/default/blocks/hero1/components/logos/supabase-wordmark.svg +23 -0
  183. package/registry/default/blocks/hero1/components/logos/turso-wordmark.svg +1 -0
  184. package/registry/default/blocks/hero1/components/logos/vercel-wordmark.svg +1 -0
  185. package/registry/default/blocks/hero1/components/logos-section.tsx +14 -0
  186. package/registry/default/blocks/hero1/components/mobile-nav.tsx +61 -0
  187. package/registry/default/blocks/hero1/components/ui/portal.tsx +27 -0
  188. package/registry/default/blocks/hero1/hooks/use-scroll.ts +54 -0
  189. package/registry/default/blocks/hero2/app/page.tsx +23 -0
  190. package/registry/default/blocks/hero2/components/decor-icon.tsx +45 -0
  191. package/registry/default/blocks/hero2/components/full-width-divider.tsx +21 -0
  192. package/registry/default/blocks/hero2/components/header.tsx +70 -0
  193. package/registry/default/blocks/hero2/components/hero.tsx +104 -0
  194. package/registry/default/blocks/hero2/components/infinite-slider.tsx +109 -0
  195. package/registry/default/blocks/hero2/components/logo-cloud.tsx +120 -0
  196. package/registry/default/blocks/hero2/components/logo.tsx +88 -0
  197. package/registry/default/blocks/hero2/components/logos/claude-wordmark.svg +1 -0
  198. package/registry/default/blocks/hero2/components/logos/clerk-wordmark.svg +1 -0
  199. package/registry/default/blocks/hero2/components/logos/github-wordmark.svg +6 -0
  200. package/registry/default/blocks/hero2/components/logos/nvidia-wordmark.svg +1 -0
  201. package/registry/default/blocks/hero2/components/logos/openai-wordmark.svg +1 -0
  202. package/registry/default/blocks/hero2/components/logos/supabase-wordmark.svg +23 -0
  203. package/registry/default/blocks/hero2/components/logos/turso-wordmark.svg +1 -0
  204. package/registry/default/blocks/hero2/components/logos/vercel-wordmark.svg +1 -0
  205. package/registry/default/blocks/hero2/components/logos-section.tsx +23 -0
  206. package/registry/default/blocks/hero2/components/mobile-nav.tsx +61 -0
  207. package/registry/default/blocks/hero2/components/ui/portal.tsx +27 -0
  208. package/registry/default/blocks/hero2/hooks/use-scroll.ts +54 -0
  209. package/registry/default/blocks/hero3/app/page.tsx +15 -0
  210. package/registry/default/blocks/hero3/components/header.tsx +70 -0
  211. package/registry/default/blocks/hero3/components/hero.tsx +104 -0
  212. package/registry/default/blocks/hero3/components/infinite-slider.tsx +109 -0
  213. package/registry/default/blocks/hero3/components/logo-cloud.tsx +67 -0
  214. package/registry/default/blocks/hero3/components/logo.tsx +88 -0
  215. package/registry/default/blocks/hero3/components/logos/claude-wordmark.svg +1 -0
  216. package/registry/default/blocks/hero3/components/logos/clerk-wordmark.svg +1 -0
  217. package/registry/default/blocks/hero3/components/logos/github-wordmark.svg +6 -0
  218. package/registry/default/blocks/hero3/components/logos/nvidia-wordmark.svg +1 -0
  219. package/registry/default/blocks/hero3/components/logos/openai-wordmark.svg +1 -0
  220. package/registry/default/blocks/hero3/components/logos/supabase-wordmark.svg +23 -0
  221. package/registry/default/blocks/hero3/components/logos/turso-wordmark.svg +1 -0
  222. package/registry/default/blocks/hero3/components/logos/vercel-wordmark.svg +1 -0
  223. package/registry/default/blocks/hero3/components/logos-section.tsx +12 -0
  224. package/registry/default/blocks/hero3/components/mobile-nav.tsx +61 -0
  225. package/registry/default/blocks/hero3/components/ui/portal.tsx +27 -0
  226. package/registry/default/blocks/hero3/hooks/use-scroll.ts +54 -0
  227. package/registry/default/blocks/image-gallery-1/app/page.tsx +5 -0
  228. package/registry/default/blocks/image-gallery-1/components/aspect-ratio.tsx +22 -0
  229. package/registry/default/blocks/image-gallery-1/components/image-gallery.tsx +135 -0
  230. package/registry/default/blocks/image-gallery-1/components/lazy-image.tsx +94 -0
  231. package/registry/default/blocks/integrations1/app/page.tsx +9 -0
  232. package/registry/default/blocks/integrations1/components/integrations.tsx +86 -0
  233. package/registry/default/blocks/integrations1/components/logos/adobe.svg +1 -0
  234. package/registry/default/blocks/integrations1/components/logos/canva.svg +1 -0
  235. package/registry/default/blocks/integrations1/components/logos/cursor.svg +1 -0
  236. package/registry/default/blocks/integrations1/components/logos/gmail.svg +1 -0
  237. package/registry/default/blocks/integrations1/components/logos/notion.svg +1 -0
  238. package/registry/default/blocks/integrations1/components/logos/planetscale.svg +1 -0
  239. package/registry/default/blocks/integrations1/components/logos/polar.svg +1 -0
  240. package/registry/default/blocks/integrations1/components/logos/supabase.svg +1 -0
  241. package/registry/default/blocks/integrations1/components/logos/vercel.svg +1 -0
  242. package/registry/default/blocks/integrations2/app/page.tsx +9 -0
  243. package/registry/default/blocks/integrations2/components/decor-icon.tsx +45 -0
  244. package/registry/default/blocks/integrations2/components/integrations.tsx +118 -0
  245. package/registry/default/blocks/integrations2/components/logos/adobe.svg +1 -0
  246. package/registry/default/blocks/integrations2/components/logos/canva.svg +1 -0
  247. package/registry/default/blocks/integrations2/components/logos/cursor.svg +1 -0
  248. package/registry/default/blocks/integrations2/components/logos/gmail.svg +1 -0
  249. package/registry/default/blocks/integrations2/components/logos/notion.svg +1 -0
  250. package/registry/default/blocks/integrations2/components/logos/planetscale.svg +1 -0
  251. package/registry/default/blocks/integrations2/components/logos/polar.svg +1 -0
  252. package/registry/default/blocks/integrations2/components/logos/supabase.svg +1 -0
  253. package/registry/default/blocks/integrations2/components/logos/vercel.svg +1 -0
  254. package/registry/default/blocks/integrations3/app/page.tsx +9 -0
  255. package/registry/default/blocks/integrations3/components/full-width-divider.tsx +33 -0
  256. package/registry/default/blocks/integrations3/components/integrations.tsx +190 -0
  257. package/registry/default/blocks/integrations3/components/logos/adobe.svg +1 -0
  258. package/registry/default/blocks/integrations3/components/logos/canva.svg +1 -0
  259. package/registry/default/blocks/integrations3/components/logos/cursor.svg +1 -0
  260. package/registry/default/blocks/integrations3/components/logos/gmail.svg +1 -0
  261. package/registry/default/blocks/integrations3/components/logos/notion.svg +1 -0
  262. package/registry/default/blocks/integrations3/components/logos/planetscale.svg +1 -0
  263. package/registry/default/blocks/integrations3/components/logos/polar.svg +1 -0
  264. package/registry/default/blocks/integrations3/components/logos/supabase.svg +1 -0
  265. package/registry/default/blocks/integrations3/components/logos/vercel.svg +1 -0
  266. package/registry/default/blocks/integrations4/app/page.tsx +9 -0
  267. package/registry/default/blocks/integrations4/components/integrations.tsx +177 -0
  268. package/registry/default/blocks/integrations4/components/logos/adobe.svg +1 -0
  269. package/registry/default/blocks/integrations4/components/logos/canva.svg +1 -0
  270. package/registry/default/blocks/integrations4/components/logos/cursor.svg +1 -0
  271. package/registry/default/blocks/integrations4/components/logos/gmail.svg +1 -0
  272. package/registry/default/blocks/integrations4/components/logos/notion.svg +1 -0
  273. package/registry/default/blocks/integrations4/components/logos/planetscale.svg +1 -0
  274. package/registry/default/blocks/integrations4/components/logos/polar.svg +1 -0
  275. package/registry/default/blocks/integrations4/components/logos/supabase.svg +1 -0
  276. package/registry/default/blocks/integrations4/components/logos/vercel.svg +1 -0
  277. package/registry/default/blocks/integrations5/app/page.tsx +9 -0
  278. package/registry/default/blocks/integrations5/components/integrations.tsx +112 -0
  279. package/registry/default/blocks/integrations5/components/logos/adobe.svg +1 -0
  280. package/registry/default/blocks/integrations5/components/logos/canva.svg +1 -0
  281. package/registry/default/blocks/integrations5/components/logos/cursor.svg +1 -0
  282. package/registry/default/blocks/integrations5/components/logos/gmail.svg +1 -0
  283. package/registry/default/blocks/integrations5/components/logos/notion.svg +1 -0
  284. package/registry/default/blocks/integrations5/components/logos/planetscale.svg +1 -0
  285. package/registry/default/blocks/integrations5/components/logos/polar.svg +1 -0
  286. package/registry/default/blocks/integrations5/components/logos/supabase.svg +1 -0
  287. package/registry/default/blocks/integrations5/components/logos/vercel.svg +1 -0
  288. package/registry/default/blocks/logo-cloud-1/app/page.tsx +17 -0
  289. package/registry/default/blocks/logo-cloud-1/components/logo-cloud.tsx +70 -0
  290. package/registry/default/blocks/logo-cloud-1/components/logos/claude-wordmark.svg +1 -0
  291. package/registry/default/blocks/logo-cloud-1/components/logos/clerk-wordmark.svg +1 -0
  292. package/registry/default/blocks/logo-cloud-1/components/logos/github-wordmark.svg +6 -0
  293. package/registry/default/blocks/logo-cloud-1/components/logos/nvidia-wordmark.svg +1 -0
  294. package/registry/default/blocks/logo-cloud-1/components/logos/openai-wordmark.svg +1 -0
  295. package/registry/default/blocks/logo-cloud-1/components/logos/supabase-wordmark.svg +23 -0
  296. package/registry/default/blocks/logo-cloud-1/components/logos/turso-wordmark.svg +1 -0
  297. package/registry/default/blocks/logo-cloud-1/components/logos/vercel-wordmark.svg +1 -0
  298. package/registry/default/blocks/logo-cloud-2/app/page.tsx +19 -0
  299. package/registry/default/blocks/logo-cloud-2/components/decor-icon.tsx +45 -0
  300. package/registry/default/blocks/logo-cloud-2/components/logo-cloud.tsx +120 -0
  301. package/registry/default/blocks/logo-cloud-2/components/logos/claude-wordmark.svg +1 -0
  302. package/registry/default/blocks/logo-cloud-2/components/logos/clerk-wordmark.svg +1 -0
  303. package/registry/default/blocks/logo-cloud-2/components/logos/github-wordmark.svg +6 -0
  304. package/registry/default/blocks/logo-cloud-2/components/logos/nvidia-wordmark.svg +1 -0
  305. package/registry/default/blocks/logo-cloud-2/components/logos/openai-wordmark.svg +1 -0
  306. package/registry/default/blocks/logo-cloud-2/components/logos/supabase-wordmark.svg +23 -0
  307. package/registry/default/blocks/logo-cloud-2/components/logos/turso-wordmark.svg +1 -0
  308. package/registry/default/blocks/logo-cloud-2/components/logos/vercel-wordmark.svg +1 -0
  309. package/registry/default/blocks/logo-cloud-3/app/page.tsx +18 -0
  310. package/registry/default/blocks/logo-cloud-3/components/infinite-slider.tsx +109 -0
  311. package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +69 -0
  312. package/registry/default/blocks/logo-cloud-3/components/logos/claude-wordmark.svg +1 -0
  313. package/registry/default/blocks/logo-cloud-3/components/logos/clerk-wordmark.svg +1 -0
  314. package/registry/default/blocks/logo-cloud-3/components/logos/github-wordmark.svg +6 -0
  315. package/registry/default/blocks/logo-cloud-3/components/logos/nvidia-wordmark.svg +1 -0
  316. package/registry/default/blocks/logo-cloud-3/components/logos/openai-wordmark.svg +1 -0
  317. package/registry/default/blocks/logo-cloud-3/components/logos/supabase-wordmark.svg +23 -0
  318. package/registry/default/blocks/logo-cloud-3/components/logos/turso-wordmark.svg +1 -0
  319. package/registry/default/blocks/logo-cloud-3/components/logos/vercel-wordmark.svg +1 -0
  320. package/registry/default/blocks/logo-cloud-4/app/page.tsx +23 -0
  321. package/registry/default/blocks/logo-cloud-4/components/infinite-slider.tsx +109 -0
  322. package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +83 -0
  323. package/registry/default/blocks/logo-cloud-4/components/logos/claude-wordmark.svg +1 -0
  324. package/registry/default/blocks/logo-cloud-4/components/logos/clerk-wordmark.svg +1 -0
  325. package/registry/default/blocks/logo-cloud-4/components/logos/github-wordmark.svg +6 -0
  326. package/registry/default/blocks/logo-cloud-4/components/logos/nvidia-wordmark.svg +1 -0
  327. package/registry/default/blocks/logo-cloud-4/components/logos/openai-wordmark.svg +1 -0
  328. package/registry/default/blocks/logo-cloud-4/components/logos/supabase-wordmark.svg +23 -0
  329. package/registry/default/blocks/logo-cloud-4/components/logos/turso-wordmark.svg +1 -0
  330. package/registry/default/blocks/logo-cloud-4/components/logos/vercel-wordmark.svg +1 -0
  331. package/registry/default/blocks/logo-cloud-4/components/progressive-blur.tsx +63 -0
  332. package/registry/default/blocks/logo-cloud-5/app/page.tsx +17 -0
  333. package/registry/default/blocks/logo-cloud-5/components/logo-cloud.tsx +67 -0
  334. package/registry/default/blocks/logo-cloud-5/components/logos/claude-wordmark.svg +1 -0
  335. package/registry/default/blocks/logo-cloud-5/components/logos/clerk-wordmark.svg +1 -0
  336. package/registry/default/blocks/logo-cloud-5/components/logos/github-wordmark.svg +6 -0
  337. package/registry/default/blocks/logo-cloud-5/components/logos/nvidia-wordmark.svg +1 -0
  338. package/registry/default/blocks/logo-cloud-5/components/logos/openai-wordmark.svg +1 -0
  339. package/registry/default/blocks/logo-cloud-5/components/logos/supabase-wordmark.svg +23 -0
  340. package/registry/default/blocks/logo-cloud-5/components/logos/turso-wordmark.svg +1 -0
  341. package/registry/default/blocks/logo-cloud-5/components/logos/vercel-wordmark.svg +1 -0
  342. package/registry/default/blocks/pricing1/app/page.tsx +9 -0
  343. package/registry/default/blocks/pricing1/components/decor-icon.tsx +45 -0
  344. package/registry/default/blocks/pricing1/components/pricing.tsx +94 -0
  345. package/registry/default/blocks/pricing2/app/page.tsx +9 -0
  346. package/registry/default/blocks/pricing2/components/full-width-divider.tsx +33 -0
  347. package/registry/default/blocks/pricing2/components/pricing.tsx +117 -0
  348. package/registry/default/blocks/pricing3/app/page.tsx +9 -0
  349. package/registry/default/blocks/pricing3/components/pricing-card.tsx +171 -0
  350. package/registry/default/blocks/pricing3/components/pricing.tsx +143 -0
  351. package/registry/default/blocks/pricing4/app/page.tsx +9 -0
  352. package/registry/default/blocks/pricing4/components/frequency-toggle.tsx +47 -0
  353. package/registry/default/blocks/pricing4/components/pricing.tsx +230 -0
  354. package/registry/default/blocks/testimonials1/app/page.tsx +9 -0
  355. package/registry/default/blocks/testimonials1/components/logo.tsx +74 -0
  356. package/registry/default/blocks/testimonials1/components/testimonials.tsx +41 -0
  357. package/registry/default/blocks/testimonials2/app/page.tsx +9 -0
  358. package/registry/default/blocks/testimonials2/components/testimonials.tsx +65 -0
  359. package/registry/default/blocks/testimonials3/app/page.tsx +9 -0
  360. package/registry/default/blocks/testimonials3/components/decor-icon.tsx +45 -0
  361. package/registry/default/blocks/testimonials3/components/testimonials.tsx +114 -0
  362. package/registry/default/blocks/testimonials4/app/page.tsx +9 -0
  363. package/registry/default/blocks/testimonials4/components/full-width-divider.tsx +33 -0
  364. package/registry/default/blocks/testimonials4/components/testimonials.tsx +81 -0
  365. package/registry/default/blocks/testimonials5/app/page.tsx +9 -0
  366. package/registry/default/blocks/testimonials5/components/full-width-divider.tsx +33 -0
  367. package/registry/default/blocks/testimonials5/components/grid-filler.tsx +74 -0
  368. package/registry/default/blocks/testimonials5/components/grid-pattern.tsx +70 -0
  369. package/registry/default/blocks/testimonials5/components/testimonials.tsx +186 -0
  370. package/registry/default/blocks/testimonials6/app/page.tsx +9 -0
  371. package/registry/default/blocks/testimonials6/components/infinite-slider.tsx +109 -0
  372. package/registry/default/blocks/testimonials6/components/testimonials.tsx +193 -0
  373. package/registry/default/examples/accordion-disabled.tsx +58 -0
  374. package/registry/default/examples/accordion-in-card.tsx +92 -0
  375. package/registry/default/examples/accordion-leading-icon.tsx +51 -0
  376. package/registry/default/examples/accordion-user-roles.tsx +97 -0
  377. package/registry/default/examples/accordion-with-icons.tsx +67 -0
  378. package/registry/default/examples/avatar-badge-icons.tsx +60 -0
  379. package/registry/default/examples/avatar-badge-position.tsx +47 -0
  380. package/registry/default/examples/avatar-empty-collaborators.tsx +55 -0
  381. package/registry/default/examples/avatar-group-trust.tsx +49 -0
  382. package/registry/default/examples/avatar-loading.tsx +33 -0
  383. package/registry/default/examples/avatar-menu.tsx +81 -0
  384. package/registry/default/examples/avatar-profile-badge.tsx +30 -0
  385. package/registry/default/examples/avatar-status.tsx +47 -0
  386. package/registry/default/examples/breadcrumb-bullet-separator.tsx +38 -0
  387. package/registry/default/examples/breadcrumb-buttons.tsx +61 -0
  388. package/registry/default/examples/breadcrumb-card.tsx +40 -0
  389. package/registry/default/examples/button-default-icons.tsx +18 -0
  390. package/registry/default/examples/button-default.tsx +5 -0
  391. package/registry/default/examples/button-demo.tsx +11 -1
  392. package/registry/default/examples/button-destructive-icons.tsx +18 -0
  393. package/registry/default/examples/button-destructive-outline-icons.tsx +18 -0
  394. package/registry/default/examples/button-ghost-icons.tsx +18 -0
  395. package/registry/default/examples/button-link-icons.tsx +18 -0
  396. package/registry/default/examples/button-outline-icons.tsx +18 -0
  397. package/registry/default/examples/button-secondary-icons.tsx +18 -0
  398. package/registry/default/examples/button-theme-toggle.tsx +38 -0
  399. package/registry/default/examples/card-author-profile.tsx +66 -0
  400. package/registry/default/examples/card-default-size.tsx +33 -0
  401. package/registry/default/examples/card-depth.tsx +37 -0
  402. package/registry/default/examples/card-help-link.tsx +32 -0
  403. package/registry/default/examples/card-help-menu.tsx +78 -0
  404. package/registry/default/examples/card-image-centered.tsx +38 -0
  405. package/registry/default/examples/card-image-feature.tsx +44 -0
  406. package/registry/default/examples/card-metric-actions.tsx +102 -0
  407. package/registry/default/examples/card-resource-link.tsx +40 -0
  408. package/registry/default/examples/card-team-member.tsx +38 -14
  409. package/registry/default/examples/card-usage-expandable.tsx +98 -0
  410. package/registry/default/examples/card-with-borders.tsx +29 -0
  411. package/registry/default/ui/accordion.tsx +82 -2
  412. package/registry/default/ui/avatar.tsx +45 -1
  413. package/registry/default/ui/input-group.tsx +158 -0
@@ -0,0 +1,44 @@
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 { HomeIcon, CompassIcon } from "lucide-react";
10
+
11
+ export function NotFoundPage() {
12
+ return (
13
+ <div className="relative flex min-h-screen w-full items-center justify-center overflow-hidden">
14
+ <Empty>
15
+ <EmptyHeader>
16
+ <EmptyTitle className="mask-b-from-20% mask-b-to-80% font-extrabold text-9xl">
17
+ 404
18
+ </EmptyTitle>
19
+ <EmptyDescription className="-mt-8 text-nowrap text-foreground/80">
20
+ The page you're looking for might have been <br />
21
+ moved or doesn't exist.
22
+ </EmptyDescription>
23
+ </EmptyHeader>
24
+ <EmptyContent>
25
+ <div className="flex gap-2">
26
+ <Button asChild>
27
+ <a href="#">
28
+ <HomeIcon data-icon="inline-start" />
29
+ Go Home
30
+ </a>
31
+ </Button>
32
+
33
+ <Button asChild variant="outline">
34
+ <a href="#">
35
+ <CompassIcon data-icon="inline-start" />{" "}
36
+ Explore
37
+ </a>
38
+ </Button>
39
+ </div>
40
+ </EmptyContent>
41
+ </Empty>
42
+ </div>
43
+ );
44
+ }
@@ -0,0 +1,5 @@
1
+ import { AuthPage } from "../components/auth-page";
2
+
3
+ export default function DemoPage() {
4
+ return <AuthPage />;
5
+ }
@@ -0,0 +1,66 @@
1
+ import { GithubIcon } from "./icons/github-icon";
2
+ import { GoogleIcon } from "./icons/google-icon";
3
+ import { Logo } from "./logo";
4
+ import { Particles } from "./particles";
5
+ import { Button } from "@/registry/default/ui/button";
6
+ import { ChevronLeftIcon } from "lucide-react";
7
+
8
+ export function AuthPage() {
9
+ return (
10
+ <div className="relative w-full md:h-screen md:overflow-hidden">
11
+ <Particles
12
+ className="absolute inset-0"
13
+ color="#666666"
14
+ ease={20}
15
+ quantity={120}
16
+ />
17
+ <div className="relative mx-auto flex min-h-screen max-w-5xl flex-col justify-center px-8">
18
+ <Button asChild className="absolute top-4 left-4" variant="ghost">
19
+ <a href="#">
20
+ <ChevronLeftIcon data-icon="inline-start" />
21
+ Home
22
+ </a>
23
+ </Button>
24
+
25
+ <div className="mx-auto space-y-4 sm:w-sm">
26
+ <Logo className="h-5" />
27
+ <div className="flex flex-col space-y-1">
28
+ <h1 className="font-bold text-2xl tracking-wide">
29
+ Sign In or Join Now!
30
+ </h1>
31
+ <p className="text-base text-muted-foreground">
32
+ Sign in or create your LoveUI account.
33
+ </p>
34
+ </div>
35
+ <div className="space-y-2">
36
+ <Button className="w-full" type="button">
37
+ <GoogleIcon data-icon="inline-start" />
38
+ Continue with Google
39
+ </Button>
40
+ <Button className="w-full" type="button">
41
+ <GithubIcon data-icon="inline-start" />
42
+ Continue with GitHub
43
+ </Button>
44
+ </div>
45
+ <p className="mt-8 text-muted-foreground text-sm">
46
+ By clicking continue, you agree to our{" "}
47
+ <a
48
+ className="underline underline-offset-4 hover:text-primary"
49
+ href="#"
50
+ >
51
+ Terms of Service
52
+ </a>{" "}
53
+ and{" "}
54
+ <a
55
+ className="underline underline-offset-4 hover:text-primary"
56
+ href="#"
57
+ >
58
+ Privacy Policy
59
+ </a>
60
+ .
61
+ </p>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ );
66
+ }
@@ -0,0 +1,10 @@
1
+ export function GithubIcon(props: React.ComponentProps<"svg">) {
2
+ return (
3
+ <svg viewBox="0 0 438.549 438.549" {...props}>
4
+ <path
5
+ d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"
6
+ fill="currentColor"
7
+ />
8
+ </svg>
9
+ );
10
+ }
@@ -0,0 +1,14 @@
1
+ export function GoogleIcon(props: React.ComponentProps<"svg">) {
2
+ return (
3
+ <svg
4
+ fill="currentColor"
5
+ viewBox="0 0 24 24"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ {...props}
8
+ >
9
+ <g>
10
+ <path d="M12.479,14.265v-3.279h11.049c0.108,0.571,0.164,1.247,0.164,1.979c0,2.46-0.672,5.502-2.84,7.669C18.744,22.829,16.051,24,12.483,24C5.869,24,0.308,18.613,0.308,12S5.869,0,12.483,0c3.659,0,6.265,1.436,8.223,3.307L18.392,5.62c-1.404-1.317-3.307-2.341-5.913-2.341C7.65,3.279,3.873,7.171,3.873,12s3.777,8.721,8.606,8.721c3.132,0,4.916-1.258,6.059-2.401c0.927-0.927,1.537-2.251,1.777-4.059L12.479,14.265z" />
11
+ </g>
12
+ </svg>
13
+ );
14
+ }
@@ -0,0 +1,88 @@
1
+ export const Logo = (props: React.ComponentProps<"svg">) => (
2
+ <svg
3
+ width="220"
4
+ height="48"
5
+ viewBox="0 0 220 48"
6
+ fill="none"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <defs>
10
+ <linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
11
+ <stop stopColor="#38A3FF" />
12
+ <stop offset="0.55" stopColor="#1266F1" />
13
+ <stop offset="1" stopColor="#0B3FD8" />
14
+ </linearGradient>
15
+
16
+ <linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
17
+ <stop stopColor="#FFFFFF" stopOpacity="0.9" />
18
+ <stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
19
+ </linearGradient>
20
+ </defs>
21
+
22
+ <g transform="translate(0 0)">
23
+ <rect
24
+ x="0"
25
+ y="0"
26
+ width="48"
27
+ height="48"
28
+ rx="12"
29
+ fill="url(#loveui-blue)"
30
+ />
31
+
32
+ <path
33
+ d="
34
+ M12 10
35
+ C12 8.3 13.3 7 15 7
36
+ H18
37
+ C19.7 7 21 8.3 21 10
38
+ V25
39
+ C21 27.2 22.8 29 25 29
40
+ H35
41
+ C36.7 29 38 30.3 38 32
42
+ V34
43
+ C38 35.7 36.7 37 35 37
44
+ H15
45
+ C13.3 37 12 35.7 12 34
46
+ Z"
47
+ fill="white"
48
+ />
49
+
50
+ <rect
51
+ x="28"
52
+ y="14"
53
+ width="9"
54
+ height="9"
55
+ rx="3"
56
+ fill="white"
57
+ />
58
+
59
+ <path
60
+ d="
61
+ M21 25
62
+ C21 27.2 22.8 29 25 29
63
+ H27
64
+ V34
65
+ C27 35.7 25.7 37 24 37
66
+ H15
67
+ C13.3 37 12 35.7 12 34
68
+ V29
69
+ H18
70
+ C19.7 29 21 27.7 21 25
71
+ Z"
72
+ fill="url(#loveui-shine)"
73
+ opacity="0.5"
74
+ />
75
+ </g>
76
+ <text
77
+ x="62"
78
+ y="31"
79
+ fontFamily="Inter, Geist, sans-serif"
80
+ fontSize="24"
81
+ fontWeight="700"
82
+ letterSpacing="-0.04em"
83
+ fill="currentColor"
84
+ >
85
+ LoveUI
86
+ </text>
87
+ </svg>
88
+ );
@@ -0,0 +1,321 @@
1
+ "use client"
2
+
3
+ import React, {
4
+ useEffect,
5
+ useRef,
6
+ useState,
7
+ type ComponentPropsWithoutRef,
8
+ } from "react"
9
+
10
+ import { cn } from "@/lib/utils"
11
+
12
+ interface MousePosition {
13
+ x: number
14
+ y: number
15
+ }
16
+
17
+ function MousePosition(): MousePosition {
18
+ const [mousePosition, setMousePosition] = useState<MousePosition>({
19
+ x: 0,
20
+ y: 0,
21
+ })
22
+
23
+ useEffect(() => {
24
+ const handleMouseMove = (event: MouseEvent) => {
25
+ setMousePosition({ x: event.clientX, y: event.clientY })
26
+ }
27
+
28
+ window.addEventListener("mousemove", handleMouseMove)
29
+
30
+ return () => {
31
+ window.removeEventListener("mousemove", handleMouseMove)
32
+ }
33
+ }, [])
34
+
35
+ return mousePosition
36
+ }
37
+
38
+ interface ParticlesProps extends ComponentPropsWithoutRef<"div"> {
39
+ className?: string
40
+ quantity?: number
41
+ staticity?: number
42
+ ease?: number
43
+ size?: number
44
+ refresh?: boolean
45
+ color?: string
46
+ vx?: number
47
+ vy?: number
48
+ }
49
+
50
+ function hexToRgb(hex: string): number[] {
51
+ hex = hex.replace("#", "")
52
+
53
+ if (hex.length === 3) {
54
+ hex = hex
55
+ .split("")
56
+ .map((char) => char + char)
57
+ .join("")
58
+ }
59
+
60
+ const hexInt = parseInt(hex, 16)
61
+ const red = (hexInt >> 16) & 255
62
+ const green = (hexInt >> 8) & 255
63
+ const blue = hexInt & 255
64
+ return [red, green, blue]
65
+ }
66
+
67
+ type Circle = {
68
+ x: number
69
+ y: number
70
+ translateX: number
71
+ translateY: number
72
+ size: number
73
+ alpha: number
74
+ targetAlpha: number
75
+ dx: number
76
+ dy: number
77
+ magnetism: number
78
+ }
79
+
80
+ export const Particles: React.FC<ParticlesProps> = ({
81
+ className = "",
82
+ quantity = 100,
83
+ staticity = 50,
84
+ ease = 50,
85
+ size = 0.4,
86
+ refresh = false,
87
+ color = "#ffffff",
88
+ vx = 0,
89
+ vy = 0,
90
+ ...props
91
+ }) => {
92
+ const canvasRef = useRef<HTMLCanvasElement>(null)
93
+ const canvasContainerRef = useRef<HTMLDivElement>(null)
94
+ const context = useRef<CanvasRenderingContext2D | null>(null)
95
+ const circles = useRef<Circle[]>([])
96
+ const mousePosition = MousePosition()
97
+ const mouse = useRef<{ x: number; y: number }>({ x: 0, y: 0 })
98
+ const canvasSize = useRef<{ w: number; h: number }>({ w: 0, h: 0 })
99
+ const dpr = typeof window !== "undefined" ? window.devicePixelRatio : 1
100
+ const rafID = useRef<number | null>(null)
101
+ const resizeTimeout = useRef<NodeJS.Timeout | null>(null)
102
+ const initCanvasRef = useRef<() => void>(() => {})
103
+ const onMouseMoveRef = useRef<() => void>(() => {})
104
+ const animateRef = useRef<() => void>(() => {})
105
+
106
+ useEffect(() => {
107
+ if (canvasRef.current) {
108
+ context.current = canvasRef.current.getContext("2d")
109
+ }
110
+ initCanvasRef.current()
111
+ animateRef.current()
112
+
113
+ const handleResize = () => {
114
+ if (resizeTimeout.current) {
115
+ clearTimeout(resizeTimeout.current)
116
+ }
117
+ resizeTimeout.current = setTimeout(() => {
118
+ initCanvasRef.current()
119
+ }, 200)
120
+ }
121
+
122
+ window.addEventListener("resize", handleResize)
123
+
124
+ return () => {
125
+ if (rafID.current != null) {
126
+ window.cancelAnimationFrame(rafID.current)
127
+ }
128
+ if (resizeTimeout.current) {
129
+ clearTimeout(resizeTimeout.current)
130
+ }
131
+ window.removeEventListener("resize", handleResize)
132
+ }
133
+ }, [color])
134
+
135
+ useEffect(() => {
136
+ onMouseMoveRef.current()
137
+ }, [mousePosition.x, mousePosition.y])
138
+
139
+ useEffect(() => {
140
+ initCanvasRef.current()
141
+ }, [refresh])
142
+
143
+ const initCanvas = () => {
144
+ resizeCanvas()
145
+ drawParticles()
146
+ }
147
+
148
+ const onMouseMove = () => {
149
+ if (canvasRef.current) {
150
+ const rect = canvasRef.current.getBoundingClientRect()
151
+ const { w, h } = canvasSize.current
152
+ const x = mousePosition.x - rect.left - w / 2
153
+ const y = mousePosition.y - rect.top - h / 2
154
+ const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2
155
+ if (inside) {
156
+ mouse.current.x = x
157
+ mouse.current.y = y
158
+ }
159
+ }
160
+ }
161
+
162
+ const resizeCanvas = () => {
163
+ if (canvasContainerRef.current && canvasRef.current && context.current) {
164
+ canvasSize.current.w = canvasContainerRef.current.offsetWidth
165
+ canvasSize.current.h = canvasContainerRef.current.offsetHeight
166
+
167
+ canvasRef.current.width = canvasSize.current.w * dpr
168
+ canvasRef.current.height = canvasSize.current.h * dpr
169
+ canvasRef.current.style.width = `${canvasSize.current.w}px`
170
+ canvasRef.current.style.height = `${canvasSize.current.h}px`
171
+ context.current.scale(dpr, dpr)
172
+
173
+ // Clear existing particles and create new ones with exact quantity
174
+ circles.current = []
175
+ for (let i = 0; i < quantity; i++) {
176
+ const circle = circleParams()
177
+ drawCircle(circle)
178
+ }
179
+ }
180
+ }
181
+
182
+ const circleParams = (): Circle => {
183
+ const x = Math.floor(Math.random() * canvasSize.current.w)
184
+ const y = Math.floor(Math.random() * canvasSize.current.h)
185
+ const translateX = 0
186
+ const translateY = 0
187
+ const pSize = Math.floor(Math.random() * 2) + size
188
+ const alpha = 0
189
+ const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1))
190
+ const dx = (Math.random() - 0.5) * 0.1
191
+ const dy = (Math.random() - 0.5) * 0.1
192
+ const magnetism = 0.1 + Math.random() * 4
193
+ return {
194
+ x,
195
+ y,
196
+ translateX,
197
+ translateY,
198
+ size: pSize,
199
+ alpha,
200
+ targetAlpha,
201
+ dx,
202
+ dy,
203
+ magnetism,
204
+ }
205
+ }
206
+
207
+ const rgb = hexToRgb(color)
208
+
209
+ const drawCircle = (circle: Circle, update = false) => {
210
+ if (context.current) {
211
+ const { x, y, translateX, translateY, size, alpha } = circle
212
+ context.current.translate(translateX, translateY)
213
+ context.current.beginPath()
214
+ context.current.arc(x, y, size, 0, 2 * Math.PI)
215
+ context.current.fillStyle = `rgba(${rgb.join(", ")}, ${alpha})`
216
+ context.current.fill()
217
+ context.current.setTransform(dpr, 0, 0, dpr, 0, 0)
218
+
219
+ if (!update) {
220
+ circles.current.push(circle)
221
+ }
222
+ }
223
+ }
224
+
225
+ const clearContext = () => {
226
+ if (context.current) {
227
+ context.current.clearRect(
228
+ 0,
229
+ 0,
230
+ canvasSize.current.w,
231
+ canvasSize.current.h
232
+ )
233
+ }
234
+ }
235
+
236
+ const drawParticles = () => {
237
+ clearContext()
238
+ const particleCount = quantity
239
+ for (let i = 0; i < particleCount; i++) {
240
+ const circle = circleParams()
241
+ drawCircle(circle)
242
+ }
243
+ }
244
+
245
+ const remapValue = (
246
+ value: number,
247
+ start1: number,
248
+ end1: number,
249
+ start2: number,
250
+ end2: number
251
+ ): number => {
252
+ const remapped =
253
+ ((value - start1) * (end2 - start2)) / (end1 - start1) + start2
254
+ return remapped > 0 ? remapped : 0
255
+ }
256
+
257
+ const animate = () => {
258
+ clearContext()
259
+ circles.current.forEach((circle: Circle, i: number) => {
260
+ // Handle the alpha value
261
+ const edge = [
262
+ circle.x + circle.translateX - circle.size, // distance from left edge
263
+ canvasSize.current.w - circle.x - circle.translateX - circle.size, // distance from right edge
264
+ circle.y + circle.translateY - circle.size, // distance from top edge
265
+ canvasSize.current.h - circle.y - circle.translateY - circle.size, // distance from bottom edge
266
+ ]
267
+ const closestEdge = edge.reduce((a, b) => Math.min(a, b))
268
+ const remapClosestEdge = parseFloat(
269
+ remapValue(closestEdge, 0, 20, 0, 1).toFixed(2)
270
+ )
271
+ if (remapClosestEdge > 1) {
272
+ circle.alpha += 0.02
273
+ if (circle.alpha > circle.targetAlpha) {
274
+ circle.alpha = circle.targetAlpha
275
+ }
276
+ } else {
277
+ circle.alpha = circle.targetAlpha * remapClosestEdge
278
+ }
279
+ circle.x += circle.dx + vx
280
+ circle.y += circle.dy + vy
281
+ circle.translateX +=
282
+ (mouse.current.x / (staticity / circle.magnetism) - circle.translateX) /
283
+ ease
284
+ circle.translateY +=
285
+ (mouse.current.y / (staticity / circle.magnetism) - circle.translateY) /
286
+ ease
287
+
288
+ drawCircle(circle, true)
289
+
290
+ // circle gets out of the canvas
291
+ if (
292
+ circle.x < -circle.size ||
293
+ circle.x > canvasSize.current.w + circle.size ||
294
+ circle.y < -circle.size ||
295
+ circle.y > canvasSize.current.h + circle.size
296
+ ) {
297
+ // remove the circle from the array
298
+ circles.current.splice(i, 1)
299
+ // create a new circle
300
+ const newCircle = circleParams()
301
+ drawCircle(newCircle)
302
+ }
303
+ })
304
+ rafID.current = window.requestAnimationFrame(animateRef.current)
305
+ }
306
+
307
+ initCanvasRef.current = initCanvas
308
+ onMouseMoveRef.current = onMouseMove
309
+ animateRef.current = animate
310
+
311
+ return (
312
+ <div
313
+ className={cn("pointer-events-none", className)}
314
+ ref={canvasContainerRef}
315
+ aria-hidden="true"
316
+ {...props}
317
+ >
318
+ <canvas ref={canvasRef} className="size-full" />
319
+ </div>
320
+ )
321
+ }
@@ -0,0 +1,5 @@
1
+ import { AuthPage } from "../components/auth";
2
+
3
+ export default function DemoPage() {
4
+ return <AuthPage />;
5
+ }
@@ -0,0 +1,87 @@
1
+ import { cn } from "@/lib/utils";
2
+ import { GithubIcon } from "./icons/github-icon";
3
+ import { GoogleIcon } from "./icons/google-icon";
4
+ import { Button } from "@/registry/default/ui/button";
5
+ import {
6
+ InputGroup,
7
+ InputGroupAddon,
8
+ InputGroupInput,
9
+ } from "@/registry/default/ui/input-group";
10
+ import { AuthDivider } from "./ui/auth-divider";
11
+ import { DecorIcon } from "./ui/decor-icon";
12
+ import { AtSignIcon } from "lucide-react";
13
+
14
+ export function AuthPage() {
15
+ return (
16
+ <div className="relative flex h-screen w-full items-center justify-center overflow-hidden px-6 md:px-8">
17
+ <div
18
+ className={cn(
19
+ "relative flex w-full max-w-sm flex-col justify-between p-6 md:p-8",
20
+ "dark:bg-[radial-gradient(50%_80%_at_20%_0%,--theme(--color-foreground/.1),transparent)]"
21
+ )}
22
+ >
23
+ <div className="absolute -inset-y-6 -left-px w-px bg-border" />
24
+ <div className="absolute -inset-y-6 -right-px w-px bg-border" />
25
+ <div className="absolute -inset-x-6 -top-px h-px bg-border" />
26
+ <div className="absolute -inset-x-6 -bottom-px h-px bg-border" />
27
+ <DecorIcon position="top-left" />
28
+ <DecorIcon position="bottom-right" />
29
+
30
+ <div className="w-full max-w-sm animate-in space-y-8">
31
+ <div className="flex flex-col space-y-1">
32
+ <h1 className="font-bold text-2xl tracking-wide">Join Now!</h1>
33
+ <p className="text-base text-muted-foreground">
34
+ Sign in or create your LoveUI account.
35
+ </p>
36
+ </div>
37
+ <div className="space-y-4">
38
+ <form className="space-y-2">
39
+ <InputGroup>
40
+ <InputGroupInput
41
+ placeholder="your.email@example.com"
42
+ type="email"
43
+ />
44
+ <InputGroupAddon align="inline-start">
45
+ <AtSignIcon
46
+ />
47
+ </InputGroupAddon>
48
+ </InputGroup>
49
+
50
+ <Button className="w-full" size="sm" type="button">
51
+ Continue With Email
52
+ </Button>
53
+ </form>
54
+ <AuthDivider>OR</AuthDivider>
55
+ <div className="grid grid-cols-2 gap-2">
56
+ <Button className="h-11 w-full" type="button" variant="outline">
57
+ <GoogleIcon data-icon="inline-start" />
58
+ Google
59
+ </Button>
60
+ <Button className="h-11 w-full" type="button" variant="outline">
61
+ <GithubIcon data-icon="inline-start" />
62
+ GitHub
63
+ </Button>
64
+ </div>
65
+ </div>
66
+ <p className="text-muted-foreground text-sm">
67
+ By clicking continue, you agree to our{" "}
68
+ <a
69
+ className="underline underline-offset-4 hover:text-primary"
70
+ href="#"
71
+ >
72
+ Terms of Service
73
+ </a>{" "}
74
+ and{" "}
75
+ <a
76
+ className="underline underline-offset-4 hover:text-primary"
77
+ href="#"
78
+ >
79
+ Privacy Policy
80
+ </a>
81
+ .
82
+ </p>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ );
87
+ }
@@ -0,0 +1,10 @@
1
+ export function GithubIcon(props: React.ComponentProps<"svg">) {
2
+ return (
3
+ <svg viewBox="0 0 438.549 438.549" {...props}>
4
+ <path
5
+ d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"
6
+ fill="currentColor"
7
+ />
8
+ </svg>
9
+ );
10
+ }
@@ -0,0 +1,14 @@
1
+ export function GoogleIcon(props: React.ComponentProps<"svg">) {
2
+ return (
3
+ <svg
4
+ fill="currentColor"
5
+ viewBox="0 0 24 24"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ {...props}
8
+ >
9
+ <g>
10
+ <path d="M12.479,14.265v-3.279h11.049c0.108,0.571,0.164,1.247,0.164,1.979c0,2.46-0.672,5.502-2.84,7.669C18.744,22.829,16.051,24,12.483,24C5.869,24,0.308,18.613,0.308,12S5.869,0,12.483,0c3.659,0,6.265,1.436,8.223,3.307L18.392,5.62c-1.404-1.317-3.307-2.341-5.913-2.341C7.65,3.279,3.873,7.171,3.873,12s3.777,8.721,8.606,8.721c3.132,0,4.916-1.258,6.059-2.401c0.927-0.927,1.537-2.251,1.777-4.059L12.479,14.265z" />
11
+ </g>
12
+ </svg>
13
+ );
14
+ }