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,9 @@
1
+ import { Contact } from "../components/contact";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="min-h-screen w-full place-content-center overflow-hidden px-4">
6
+ <Contact />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,152 @@
1
+ import { cn } from "@/lib/utils";
2
+ import type React from "react";
3
+ import { GithubIcon } from "./icons/github-icon";
4
+ import { XIcon } from "./icons/x-icon";
5
+ import { FullWidthDivider } from "./full-width-divider";
6
+ import { Mail, MapPin, Phone } from "lucide-react";
7
+
8
+ const APP_EMAIL = "hello@loveui.dev";
9
+ const APP_PHONE = "+1 555 014 2026";
10
+ const APP_PHONE_2 = "+1 555 014 2027";
11
+
12
+ export function Contact() {
13
+ const socialLinks = [
14
+ {
15
+ icon: <GithubIcon className="size-3.5 text-muted-foreground" />,
16
+ href: "#",
17
+ label: "GitHub",
18
+ },
19
+ {
20
+ icon: <XIcon className="size-3.5 text-muted-foreground" />,
21
+ href: "#",
22
+ label: "Twitter",
23
+ },
24
+ ];
25
+
26
+ return (
27
+ <div className="relative mx-auto min-h-screen max-w-5xl border-x">
28
+ <div className="flex grow flex-col justify-center px-4 py-18 md:items-center">
29
+ <h1 className="font-bold text-4xl md:text-5xl">Contact Us</h1>
30
+ <p className="mb-5 text-base text-muted-foreground">
31
+ Contact Connor Love about LoveUI, source-first components, and block
32
+ implementation.
33
+ </p>
34
+ </div>
35
+ <FullWidthDivider />
36
+ <div className="grid md:grid-cols-3">
37
+ <Box
38
+ description="Send questions about LoveUI setup, component behavior, or registry installs."
39
+ icon={
40
+ <Mail
41
+ />
42
+ }
43
+ title="Email"
44
+ >
45
+ <a
46
+ className="font-medium font-mono text-sm tracking-wide hover:underline"
47
+ href={`mailto:${APP_EMAIL}`}
48
+ >
49
+ {APP_EMAIL}
50
+ </a>
51
+ </Box>
52
+ <Box
53
+ description="LoveUI is built as a source-first UI system for product teams."
54
+ icon={
55
+ <MapPin
56
+ />
57
+ }
58
+ title="Office"
59
+ >
60
+ <span className="font-medium font-mono text-sm tracking-wide">
61
+ Remote product studio by Connor Love
62
+ </span>
63
+ </Box>
64
+ <Box
65
+ className="border-b-0 md:border-r-0"
66
+ description="Use this channel for implementation help and product UI questions."
67
+ icon={
68
+ <Phone
69
+ />
70
+ }
71
+ title="Phone"
72
+ >
73
+ <div>
74
+ <a
75
+ className="block font-medium font-mono text-sm tracking-wide hover:underline"
76
+ href={`tel:${APP_PHONE}`}
77
+ >
78
+ {APP_PHONE}
79
+ </a>
80
+ <a
81
+ className="block font-medium font-mono text-sm tracking-wide hover:underline"
82
+ href={`tel:${APP_PHONE_2}`}
83
+ >
84
+ {APP_PHONE_2}
85
+ </a>
86
+ </div>
87
+ </Box>
88
+ </div>
89
+ <FullWidthDivider />
90
+ <div className="z-1 flex h-full flex-col items-center justify-center gap-4 py-24">
91
+ <h2 className="text-center font-medium text-2xl text-muted-foreground tracking-tight md:text-3xl">
92
+ Find LoveUI <span className="text-foreground">online</span>
93
+ </h2>
94
+ <div className="flex flex-wrap items-center gap-2">
95
+ {socialLinks.map((link) => (
96
+ <a
97
+ className="flex items-center gap-x-2 rounded-full border bg-card px-3 py-1.5 shadow hover:bg-accent"
98
+ href={link.href}
99
+ key={link.label}
100
+ rel="noopener noreferrer"
101
+ target="_blank"
102
+ >
103
+ {link.icon}
104
+ <span className="font-medium font-mono text-xs tracking-wide">
105
+ {link.label}
106
+ </span>
107
+ </a>
108
+ ))}
109
+ </div>
110
+ </div>
111
+ </div>
112
+ );
113
+ }
114
+
115
+ type ContactBox = React.ComponentProps<"div"> & {
116
+ icon: React.ReactNode;
117
+ title: string;
118
+ description: string;
119
+ };
120
+
121
+ function Box({
122
+ title,
123
+ description,
124
+ className,
125
+ children,
126
+ ...props
127
+ }: ContactBox) {
128
+ return (
129
+ <div
130
+ className={cn(
131
+ "flex flex-col justify-between border-b md:border-r md:border-b-0",
132
+ className
133
+ )}
134
+ >
135
+ <div
136
+ className={cn(
137
+ "flex items-center gap-x-3 border-b bg-secondary/50 p-4 dark:bg-secondary/20",
138
+ "[&_svg]:size-5 [&_svg]:stroke-width-1 [&_svg]:text-muted-foreground"
139
+ )}
140
+ >
141
+ {props.icon}
142
+ <h2 className="font-heading font-medium text-lg tracking-wider">
143
+ {title}
144
+ </h2>
145
+ </div>
146
+ <div className="flex items-center gap-x-2 p-4 py-12">{children}</div>
147
+ <div className="border-t p-4">
148
+ <p className="text-muted-foreground text-sm">{description}</p>
149
+ </div>
150
+ </div>
151
+ );
152
+ }
@@ -0,0 +1,33 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ type FullWidthDividerProps = React.ComponentProps<"div"> & {
4
+ contained?: boolean;
5
+ position?: "top" | "bottom";
6
+ };
7
+
8
+ export function FullWidthDivider({
9
+ className,
10
+ contained = false,
11
+ position,
12
+ ...props
13
+ }: FullWidthDividerProps) {
14
+ return (
15
+ <div
16
+ aria-hidden="true"
17
+ className={cn(
18
+ "pointer-events-none absolute h-px bg-border",
19
+ // full-bleed (default)
20
+ "data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
21
+ // contained
22
+ "data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
23
+ // position
24
+ position &&
25
+ "data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
26
+ className
27
+ )}
28
+ data-contained={contained}
29
+ data-position={position}
30
+ {...props}
31
+ />
32
+ );
33
+ }
@@ -0,0 +1,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,12 @@
1
+ export function XIcon(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
+ <path d="m18.9,1.153h3.682l-8.042,9.189,9.46,12.506h-7.405l-5.804-7.583-6.634,7.583H.469l8.6-9.831L0,1.153h7.593l5.241,6.931,6.065-6.931Zm-1.293,19.494h2.039L6.482,3.239h-2.19l13.314,17.408Z" />
10
+ </svg>
11
+ );
12
+ }
@@ -0,0 +1,9 @@
1
+ import { ContactSection } from "../components/contact";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="min-h-screen w-full place-content-center overflow-hidden px-4">
6
+ <ContactSection />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,120 @@
1
+ import { cn } from "@/lib/utils";
2
+ import { Button } from "@/registry/default/ui/button";
3
+ import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
4
+ import { Input } from "@/registry/default/ui/input";
5
+ import { Textarea } from "@/registry/default/ui/textarea";
6
+ import { MailIcon, PhoneIcon } from "lucide-react";
7
+
8
+ const contactInfo = [
9
+ {
10
+ icon: (
11
+ <MailIcon
12
+ />
13
+ ),
14
+ label: "Email",
15
+ value: "hello@loveui.dev",
16
+ },
17
+ {
18
+ icon: (
19
+ <PhoneIcon
20
+ />
21
+ ),
22
+ label: "Phone",
23
+ value: "+1 555 014 2026",
24
+ },
25
+ ];
26
+
27
+ export function ContactSection() {
28
+ return (
29
+ <div className="relative mx-auto grid h-full w-full max-w-4xl rounded-2xl border md:grid-cols-[1fr_0.70fr]">
30
+ <div className="col-span-1 flex flex-col space-y-4 p-8 lg:p-10">
31
+ <h1 className="font-medium text-2xl tracking-wide md:text-3xl">
32
+ Contact LoveUI
33
+ </h1>
34
+ <p className="max-w-md text-muted-foreground text-sm leading-relaxed md:text-base">
35
+ Have a question about components, blocks, registry setup, or using
36
+ LoveUI in your product? Send a note here.
37
+ </p>
38
+ <p className="max-w-md text-muted-foreground text-xs leading-relaxed md:text-sm">
39
+ Connor Love reviews product UI questions and implementation feedback.
40
+ </p>
41
+ <div className="grid gap-4">
42
+ {contactInfo?.map((info) => (
43
+ <ContactInfo key={info.label} {...info} />
44
+ ))}
45
+ </div>
46
+ </div>
47
+ <div className="col-span-1 flex items-center border-t p-8 md:border-t-0 md:border-l">
48
+ <ContactForm />
49
+ </div>
50
+ </div>
51
+ );
52
+ }
53
+
54
+ function ContactForm() {
55
+ return (
56
+ <form className="w-full">
57
+ <FieldGroup>
58
+ <Field>
59
+ <FieldLabel htmlFor="full-name">Full name</FieldLabel>
60
+ <Input autoComplete="off" id="full-name" placeholder="Connor Love" />
61
+ </Field>
62
+ <Field>
63
+ <FieldLabel htmlFor="email">Email</FieldLabel>
64
+ <Input
65
+ autoComplete="off"
66
+ id="email"
67
+ placeholder="you@example.com"
68
+ type="email"
69
+ />
70
+ </Field>
71
+ <Field>
72
+ <FieldLabel htmlFor="phone">Phone</FieldLabel>
73
+ <Input
74
+ autoComplete="off"
75
+ id="phone"
76
+ placeholder="+1 (555) 123-4567"
77
+ type="tel"
78
+ />
79
+ </Field>
80
+ <Field>
81
+ <FieldLabel htmlFor="message">Message</FieldLabel>
82
+ <Textarea
83
+ autoComplete="off"
84
+ id="message"
85
+ placeholder="Tell us what you are building with LoveUI"
86
+ />
87
+ </Field>
88
+ </FieldGroup>
89
+ <Button className="mt-8 w-full" type="button">
90
+ Submit
91
+ </Button>
92
+ </form>
93
+ );
94
+ }
95
+
96
+ type ContactInfoProps = React.ComponentProps<"div"> & {
97
+ icon: React.ReactNode;
98
+ label: string;
99
+ value: string;
100
+ };
101
+
102
+ function ContactInfo({
103
+ icon,
104
+ label,
105
+ value,
106
+ className,
107
+ ...props
108
+ }: ContactInfoProps) {
109
+ return (
110
+ <div className={cn("flex items-center gap-3 py-3", className)} {...props}>
111
+ <div className="rounded-lg border bg-card p-3 shadow-xs [&_svg]:size-5">
112
+ {icon}
113
+ </div>
114
+ <div>
115
+ <p className="font-medium">{label}</p>
116
+ <p className="text-muted-foreground text-xs">{value}</p>
117
+ </div>
118
+ </div>
119
+ );
120
+ }
@@ -0,0 +1,9 @@
1
+ import { ContactSection } from "../components/contact";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="min-h-screen w-full place-content-center overflow-hidden px-4">
6
+ <ContactSection />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,119 @@
1
+ import { cn } from "@/lib/utils";
2
+ import { Button } from "@/registry/default/ui/button";
3
+ import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
4
+ import { Input } from "@/registry/default/ui/input";
5
+ import { Textarea } from "@/registry/default/ui/textarea";
6
+ import { DecorIcon } from "./decor-icon";
7
+ import { Phone, Mail } from "lucide-react";
8
+
9
+ const data = [
10
+ {
11
+ title: "Talk LoveUI",
12
+ value: "+1 (555) 014-2026",
13
+ icon: (
14
+ <Phone
15
+ />
16
+ ),
17
+ },
18
+ {
19
+ title: "Email the team",
20
+ value: "hello@loveui.dev",
21
+ icon: (
22
+ <Mail
23
+ />
24
+ ),
25
+ },
26
+ ];
27
+
28
+ export function ContactSection() {
29
+ return (
30
+ <div className="relative mx-auto w-full max-w-lg border">
31
+ <div className="border-b px-6 py-8">
32
+ <div className="mb-8 flex flex-col gap-2">
33
+ <h1 className="font-semibold text-xl md:text-2xl">Get in touch</h1>{" "}
34
+ <p className="text-muted-foreground text-sm">
35
+ Have a LoveUI question, block request, or implementation idea?{" "}
36
+ <br /> Send Connor Love a note.
37
+ </p>
38
+ </div>
39
+
40
+ <div className="grid gap-2 md:grid-cols-2">
41
+ {data.map((item) => (
42
+ <div className="flex items-center gap-4 p-2" key={item.title}>
43
+ <div className="[&_svg]:size-5 [&_svg]:text-muted-foreground">
44
+ {item.icon}
45
+ </div>
46
+ <div className={cn("flex flex-col gap-y-0.5")}>
47
+ <h2 className="text-sm">{item.title}</h2>
48
+ <p className="text-muted-foreground text-xs">{item.value}</p>
49
+ </div>
50
+ </div>
51
+ ))}
52
+ </div>
53
+ </div>
54
+
55
+ <div className="px-6 py-8">
56
+ <div className="mb-8 flex flex-col gap-1.5">
57
+ <h2 className="font-medium text-xl">Send a message</h2>{" "}
58
+ <p className="text-muted-foreground text-sm">
59
+ Tell us how you are using LoveUI and what would make the registry
60
+ better.
61
+ </p>
62
+ </div>
63
+ <ContactForm />
64
+ </div>
65
+ <DecorIcon position="top-left" />
66
+ <DecorIcon position="top-right" />
67
+ <DecorIcon position="bottom-left" />
68
+ <DecorIcon position="bottom-right" />
69
+ </div>
70
+ );
71
+ }
72
+
73
+ function ContactForm() {
74
+ return (
75
+ <form className="w-full">
76
+ <FieldGroup>
77
+ <div className="grid grid-cols-2 gap-4">
78
+ <Field>
79
+ <FieldLabel htmlFor="first-name">First name</FieldLabel>
80
+ <Input autoComplete="off" id="first-name" placeholder="Connor" />
81
+ </Field>
82
+ <Field>
83
+ <FieldLabel htmlFor="last-name">Last name</FieldLabel>
84
+ <Input autoComplete="off" id="last-name" placeholder="Love" />
85
+ </Field>
86
+ </div>
87
+ <Field>
88
+ <FieldLabel htmlFor="email">Email</FieldLabel>
89
+ <Input
90
+ autoComplete="off"
91
+ id="email"
92
+ placeholder="you@example.com"
93
+ type="email"
94
+ />
95
+ </Field>
96
+ <Field>
97
+ <FieldLabel htmlFor="phone">Phone</FieldLabel>
98
+ <Input
99
+ autoComplete="off"
100
+ id="phone"
101
+ placeholder="+1 (555) 123-4567"
102
+ type="tel"
103
+ />
104
+ </Field>
105
+ <Field>
106
+ <FieldLabel htmlFor="message">Message</FieldLabel>
107
+ <Textarea
108
+ autoComplete="off"
109
+ id="message"
110
+ placeholder="Tell us what you are building with LoveUI"
111
+ />
112
+ </Field>
113
+ </FieldGroup>
114
+ <Button className="mt-8 w-full" type="button">
115
+ Submit
116
+ </Button>
117
+ </form>
118
+ );
119
+ }
@@ -0,0 +1,45 @@
1
+ import { cn } from "@/lib/utils";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
+
4
+ const DecorIconVariants = cva(
5
+ "pointer-events-none absolute z-1 size-5 shrink-0 stroke-1 stroke-muted-foreground",
6
+ {
7
+ variants: {
8
+ position: {
9
+ "top-left":
10
+ "top-0 left-0 -translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
11
+ "top-right":
12
+ "top-0 right-0 translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
13
+ "bottom-right":
14
+ "right-0 bottom-0 translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
15
+ "bottom-left":
16
+ "bottom-0 left-0 -translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ position: "top-left",
21
+ },
22
+ }
23
+ );
24
+
25
+ type DecorIconProps = React.ComponentProps<"svg"> &
26
+ VariantProps<typeof DecorIconVariants>;
27
+
28
+ export function DecorIcon({ position, className, ...props }: DecorIconProps) {
29
+ return (
30
+ <svg
31
+ aria-hidden="true"
32
+ className={cn(DecorIconVariants({ position, className }))}
33
+ fill="none"
34
+ stroke="currentColor"
35
+ strokeLinecap="round"
36
+ strokeLinejoin="round"
37
+ viewBox="0 0 24 24"
38
+ xmlns="http://www.w3.org/2000/svg"
39
+ {...props}
40
+ >
41
+ <path d="M5 12h14" />
42
+ <path d="M12 5v14" />
43
+ </svg>
44
+ );
45
+ }
@@ -0,0 +1,9 @@
1
+ import { CallToAction } from "../components/cta";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="flex min-h-screen items-center justify-center p-4">
6
+ <CallToAction />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,20 @@
1
+ import { Button } from "@/registry/default/ui/button";
2
+ import { FullWidthDivider } from "./full-width-divider";
3
+
4
+ export function CallToAction() {
5
+ return (
6
+ <div className="relative mx-auto flex w-full max-w-3xl flex-col justify-between border-x md:flex-row">
7
+ <FullWidthDivider className="-top-px" />
8
+ <div className="border-b p-4 md:border-b-0">
9
+ <h2 className="text-center font-bold text-lg md:text-left md:text-2xl">
10
+ Ship cleaner dashboards this week.
11
+ </h2>
12
+ </div>
13
+ <div className="flex items-center justify-center gap-2 p-4 md:border-l">
14
+ <Button variant="secondary">Book a Demo</Button>
15
+ <Button>Start Building</Button>
16
+ </div>
17
+ <FullWidthDivider className="-bottom-px" />
18
+ </div>
19
+ );
20
+ }
@@ -0,0 +1,33 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ type FullWidthDividerProps = React.ComponentProps<"div"> & {
4
+ contained?: boolean;
5
+ position?: "top" | "bottom";
6
+ };
7
+
8
+ export function FullWidthDivider({
9
+ className,
10
+ contained = false,
11
+ position,
12
+ ...props
13
+ }: FullWidthDividerProps) {
14
+ return (
15
+ <div
16
+ aria-hidden="true"
17
+ className={cn(
18
+ "pointer-events-none absolute h-px bg-border",
19
+ // full-bleed (default)
20
+ "data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
21
+ // contained
22
+ "data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
23
+ // position
24
+ position &&
25
+ "data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
26
+ className
27
+ )}
28
+ data-contained={contained}
29
+ data-position={position}
30
+ {...props}
31
+ />
32
+ );
33
+ }
@@ -0,0 +1,9 @@
1
+ import { CallToAction } from "../components/cta";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="flex min-h-screen items-center justify-center p-4">
6
+ <CallToAction />
7
+ </div>
8
+ );
9
+ }
@@ -0,0 +1,27 @@
1
+ import { Button } from "@/registry/default/ui/button";
2
+ import { FullWidthDivider } from "./full-width-divider";
3
+ import { ArrowRightIcon } from "lucide-react";
4
+
5
+ export function CallToAction() {
6
+ return (
7
+ <div className="relative mx-auto flex w-full max-w-3xl flex-col justify-between border-x">
8
+ <FullWidthDivider className="-top-px" />
9
+ <div className="border-b px-2 py-8">
10
+ <h2 className="text-center font-semibold text-lg md:text-2xl">
11
+ Turn scattered work into one clear launch plan.
12
+ </h2>
13
+ <p className="text-balance text-center text-muted-foreground text-sm md:text-base">
14
+ Bring tasks, owners, and decisions together before the next sprint.
15
+ </p>
16
+ </div>
17
+ <div className="flex items-center justify-center gap-2 bg-secondary/80 p-4 dark:bg-secondary/40">
18
+ <Button variant="outline">See Plans</Button>
19
+ <Button>
20
+ Create Workspace{" "}
21
+ <ArrowRightIcon data-icon="inline-end" />
22
+ </Button>
23
+ </div>
24
+ <FullWidthDivider className="-bottom-px" />
25
+ </div>
26
+ );
27
+ }
@@ -0,0 +1,33 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ type FullWidthDividerProps = React.ComponentProps<"div"> & {
4
+ contained?: boolean;
5
+ position?: "top" | "bottom";
6
+ };
7
+
8
+ export function FullWidthDivider({
9
+ className,
10
+ contained = false,
11
+ position,
12
+ ...props
13
+ }: FullWidthDividerProps) {
14
+ return (
15
+ <div
16
+ aria-hidden="true"
17
+ className={cn(
18
+ "pointer-events-none absolute h-px bg-border",
19
+ // full-bleed (default)
20
+ "data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
21
+ // contained
22
+ "data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
23
+ // position
24
+ position &&
25
+ "data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
26
+ className
27
+ )}
28
+ data-contained={contained}
29
+ data-position={position}
30
+ {...props}
31
+ />
32
+ );
33
+ }
@@ -0,0 +1,9 @@
1
+ import { CallToAction } from "../components/cta";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <div className="flex min-h-screen items-center justify-center p-4">
6
+ <CallToAction />
7
+ </div>
8
+ );
9
+ }