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,93 @@
1
+ import { cn } from "@/lib/utils";
2
+ import type React from "react";
3
+ import { FullWidthDivider } from "./full-width-divider";
4
+ import { ZapIcon, ShieldCheckIcon, ActivityIcon, GlobeIcon } from "lucide-react";
5
+
6
+ type FeatureType = {
7
+ title: string;
8
+ icon: React.ReactNode;
9
+ description: string;
10
+ };
11
+
12
+ export function FeatureSection() {
13
+ return (
14
+ <div className="mx-auto min-h-screen w-full max-w-5xl place-content-center space-y-12 border-x py-4">
15
+ <div className="relative grid grid-cols-1 gap-px bg-border md:grid-cols-2 lg:grid-cols-4">
16
+ <FullWidthDivider position="top" />
17
+ {features.map((feature) => (
18
+ <FeatureCard feature={feature} key={feature.title} />
19
+ ))}
20
+ <FullWidthDivider position="bottom" />
21
+ </div>
22
+ </div>
23
+ );
24
+ }
25
+
26
+ export function FeatureCard({
27
+ feature,
28
+ className,
29
+ ...props
30
+ }: React.ComponentProps<"div"> & {
31
+ feature: FeatureType;
32
+ }) {
33
+ return (
34
+ <div
35
+ className={cn(
36
+ "relative flex flex-col justify-between overflow-hidden bg-background p-4 md:p-6",
37
+ className
38
+ )}
39
+ {...props}
40
+ >
41
+ <div
42
+ className={cn(
43
+ "relative z-10 flex items-center pt-4 pb-6",
44
+ "[&_svg]:size-5 [&_svg]:text-primary"
45
+ )}
46
+ >
47
+ {feature.icon}
48
+ </div>
49
+
50
+ <div className="relative z-10 space-y-2">
51
+ <h3 className="font-medium text-foreground text-lg">{feature.title}</h3>
52
+ <p className="text-muted-foreground text-xs leading-relaxed">
53
+ {feature.description}
54
+ </p>
55
+ </div>
56
+ </div>
57
+ );
58
+ }
59
+
60
+ const features: FeatureType[] = [
61
+ {
62
+ title: "Lightning Fast",
63
+ icon: (
64
+ <ZapIcon
65
+ />
66
+ ),
67
+ description: "Blazing fast performance with edge network optimizations.",
68
+ },
69
+ {
70
+ title: "Secure by Design",
71
+ icon: (
72
+ <ShieldCheckIcon
73
+ />
74
+ ),
75
+ description: "Enterprise-grade security, zero configuration required.",
76
+ },
77
+ {
78
+ title: "Real-time Sync",
79
+ icon: (
80
+ <ActivityIcon
81
+ />
82
+ ),
83
+ description: "Real-time data sync across all devices efficiently.",
84
+ },
85
+ {
86
+ title: "Global Scale",
87
+ icon: (
88
+ <GlobeIcon
89
+ />
90
+ ),
91
+ description: "Instant global deployment to 35+ regions worldwide.",
92
+ },
93
+ ];
@@ -0,0 +1,21 @@
1
+ import { cn } from "@/lib/utils";
2
+
3
+ export function FullWidthDivider({
4
+ className,
5
+ position = "bottom",
6
+ ...props
7
+ }: React.ComponentProps<"div"> & {
8
+ position?: "top" | "bottom";
9
+ }) {
10
+ return (
11
+ <div
12
+ aria-hidden="true"
13
+ className={cn(
14
+ "pointer-events-none absolute right-1/2 left-1/2 h-px w-screen -translate-x-1/2 bg-border",
15
+ position === "top" ? "top-0" : "bottom-0",
16
+ className
17
+ )}
18
+ {...props}
19
+ />
20
+ );
21
+ }
@@ -0,0 +1,9 @@
1
+ import { FeatureSection } from "../components/feature-section";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <section className="min-h-screen place-content-center p-4">
6
+ <FeatureSection />
7
+ </section>
8
+ );
9
+ }
@@ -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,114 @@
1
+ import { cn } from "@/lib/utils";
2
+ import type React from "react";
3
+ import { DecorIcon } from "./decor-icon";
4
+ import { LayoutDashboardIcon, TerminalIcon, ShieldCheckIcon, FileTextIcon } from "lucide-react";
5
+
6
+ type FeatureType = {
7
+ title: string;
8
+ icon: React.ReactNode;
9
+ description: string;
10
+ };
11
+
12
+ export function FeatureSection() {
13
+ return (
14
+ <div className="mx-auto flex min-h-screen w-full max-w-5xl flex-col justify-center gap-12 px-4 py-12 md:px-8">
15
+ <div className="mx-auto max-w-2xl space-y-2 text-center">
16
+ <h2 className="font-medium text-3xl tracking-tight md:text-5xl">
17
+ Build apps faster
18
+ </h2>
19
+ <p className="text-muted-foreground text-sm leading-relaxed md:text-base">
20
+ The complete platform for secure, scalable apps. You code, we handle
21
+ the rest.
22
+ </p>
23
+ </div>
24
+
25
+ <div className="grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4">
26
+ {features.map((feature) => (
27
+ <FeatureCard feature={feature} key={feature.title} />
28
+ ))}
29
+ </div>
30
+ </div>
31
+ );
32
+ }
33
+
34
+ function FeatureCard({
35
+ feature,
36
+ className,
37
+ ...props
38
+ }: React.ComponentProps<"div"> & {
39
+ feature: FeatureType;
40
+ }) {
41
+ return (
42
+ <div
43
+ className={cn(
44
+ "relative flex flex-col justify-between gap-6 bg-background px-6 pt-8 pb-6 shadow-xs",
45
+ // Gradient inspired by testimonials
46
+ "dark:bg-[radial-gradient(50%_80%_at_25%_0%,--theme(--color-foreground/.1),transparent)]",
47
+ className
48
+ )}
49
+ {...props}
50
+ >
51
+ {/* Extended Borders */}
52
+ <div className="absolute -inset-y-4 -left-px w-px bg-border" />
53
+ <div className="absolute -inset-y-4 -right-px w-px bg-border" />
54
+ <div className="absolute -inset-x-4 -top-px h-px bg-border" />
55
+ <div className="absolute -right-4 -bottom-px -left-4 h-px bg-border" />
56
+
57
+ {/* Corner Decor */}
58
+ <DecorIcon className="size-3.5" position="top-left" />
59
+
60
+ <div
61
+ className={cn(
62
+ "relative z-10 flex w-fit items-center justify-center rounded-lg border bg-muted/20 p-3",
63
+ "[&_svg]:size-5 [&_svg]:stroke-[1.5] [&_svg]:text-foreground"
64
+ )}
65
+ >
66
+ {feature.icon}
67
+ </div>
68
+
69
+ <div className="relative z-10 space-y-2">
70
+ <h3 className="font-medium text-base text-foreground">
71
+ {feature.title}
72
+ </h3>
73
+ <p className="text-muted-foreground text-xs leading-relaxed">
74
+ {feature.description}
75
+ </p>
76
+ </div>
77
+ </div>
78
+ );
79
+ }
80
+
81
+ const features: FeatureType[] = [
82
+ {
83
+ title: "Interactive Dashboard",
84
+ icon: (
85
+ <LayoutDashboardIcon
86
+ />
87
+ ),
88
+ description: "Visualize your data with drag-and-drop widgets.",
89
+ },
90
+ {
91
+ title: "Instant API",
92
+ icon: (
93
+ <TerminalIcon
94
+ />
95
+ ),
96
+ description: "Auto-generate REST and GraphQL APIs instantly.",
97
+ },
98
+ {
99
+ title: "Role-Based Access",
100
+ icon: (
101
+ <ShieldCheckIcon
102
+ />
103
+ ),
104
+ description: "Secure resources with granular permission controls.",
105
+ },
106
+ {
107
+ title: "Audit Trails",
108
+ icon: (
109
+ <FileTextIcon
110
+ />
111
+ ),
112
+ description: "Track every change with comprehensive logs.",
113
+ },
114
+ ];
@@ -0,0 +1,9 @@
1
+ import { FeatureSection } from "../components/feature-section";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <section className="min-h-screen place-content-center p-4">
6
+ <FeatureSection />
7
+ </section>
8
+ );
9
+ }
@@ -0,0 +1,115 @@
1
+ import { cn } from "@/lib/utils";
2
+ import type React from "react";
3
+ import { GridPattern } from "./grid-pattern";
4
+ import { ZapIcon, CpuIcon, FingerprintIcon, PencilIcon, Settings2Icon, SparklesIcon } from "lucide-react";
5
+
6
+ type FeatureType = {
7
+ title: string;
8
+ icon: React.ReactNode;
9
+ description: string;
10
+ };
11
+
12
+ export function FeatureSection() {
13
+ return (
14
+ <div className="mx-auto w-full max-w-5xl space-y-8">
15
+ <div className="mx-auto max-w-3xl text-center">
16
+ <h2 className="text-balance font-medium text-2xl md:text-4xl lg:text-5xl">
17
+ Power. Speed. Control.
18
+ </h2>
19
+ <p className="mt-4 text-balance text-muted-foreground text-sm md:text-base">
20
+ Everything you need to build fast, secure, scalable apps.
21
+ </p>
22
+ </div>
23
+
24
+ <div className="overflow-hidden rounded-lg border">
25
+ <div className="grid grid-cols-1 gap-px bg-border sm:grid-cols-2 md:grid-cols-3">
26
+ {features.map((feature) => (
27
+ <FeatureCard feature={feature} key={feature.title} />
28
+ ))}
29
+ </div>
30
+ </div>
31
+ </div>
32
+ );
33
+ }
34
+
35
+ export function FeatureCard({
36
+ feature,
37
+ className,
38
+ ...props
39
+ }: React.ComponentProps<"div"> & {
40
+ feature: FeatureType;
41
+ }) {
42
+ return (
43
+ <div
44
+ className={cn("relative overflow-hidden bg-background p-6", className)}
45
+ {...props}
46
+ >
47
+ <div className="mask-[radial-gradient(farthest-side_at_top,white,transparent)] pointer-events-none absolute top-0 left-1/2 -mt-2 -ml-20 size-full">
48
+ <GridPattern
49
+ className="absolute inset-0 size-full stroke-foreground/20"
50
+ height={40}
51
+ width={40}
52
+ x={20}
53
+ />
54
+ </div>
55
+ <div className="[&_svg]:size-6 [&_svg]:text-foreground/75">
56
+ {feature.icon}
57
+ </div>
58
+ <h3 className="mt-10 text-sm md:text-base">{feature.title}</h3>
59
+ <p className="relative z-20 mt-2 font-light text-muted-foreground text-xs">
60
+ {feature.description}
61
+ </p>
62
+ </div>
63
+ );
64
+ }
65
+
66
+ const features: FeatureType[] = [
67
+ {
68
+ title: "Faaast",
69
+ icon: (
70
+ <ZapIcon
71
+ />
72
+ ),
73
+ description: "It supports an entire helping developers and innovate.",
74
+ },
75
+ {
76
+ title: "Powerful",
77
+ icon: (
78
+ <CpuIcon
79
+ />
80
+ ),
81
+ description: "It supports an entire helping developers and businesses.",
82
+ },
83
+ {
84
+ title: "Security",
85
+ icon: (
86
+ <FingerprintIcon
87
+ />
88
+ ),
89
+ description: "It supports an helping developers businesses.",
90
+ },
91
+ {
92
+ title: "Customization",
93
+ icon: (
94
+ <PencilIcon
95
+ />
96
+ ),
97
+ description: "It supports helping developers and businesses innovate.",
98
+ },
99
+ {
100
+ title: "Control",
101
+ icon: (
102
+ <Settings2Icon
103
+ />
104
+ ),
105
+ description: "It supports helping developers and businesses innovate.",
106
+ },
107
+ {
108
+ title: "Built for AI",
109
+ icon: (
110
+ <SparklesIcon
111
+ />
112
+ ),
113
+ description: "It supports helping developers and businesses innovate.",
114
+ },
115
+ ];
@@ -0,0 +1,70 @@
1
+ import { useId } from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ interface GridPatternProps extends React.SVGProps<SVGSVGElement> {
6
+ width?: number
7
+ height?: number
8
+ x?: number
9
+ y?: number
10
+ squares?: Array<[x: number, y: number]>
11
+ strokeDasharray?: string
12
+ className?: string
13
+ [key: string]: unknown
14
+ }
15
+
16
+ export function GridPattern({
17
+ width = 40,
18
+ height = 40,
19
+ x = -1,
20
+ y = -1,
21
+ strokeDasharray = "0",
22
+ squares,
23
+ className,
24
+ ...props
25
+ }: GridPatternProps) {
26
+ const id = useId()
27
+
28
+ return (
29
+ <svg
30
+ aria-hidden="true"
31
+ className={cn(
32
+ "pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/30",
33
+ className
34
+ )}
35
+ {...props}
36
+ >
37
+ <defs>
38
+ <pattern
39
+ id={id}
40
+ width={width}
41
+ height={height}
42
+ patternUnits="userSpaceOnUse"
43
+ x={x}
44
+ y={y}
45
+ >
46
+ <path
47
+ d={`M.5 ${height}V.5H${width}`}
48
+ fill="none"
49
+ strokeDasharray={strokeDasharray}
50
+ />
51
+ </pattern>
52
+ </defs>
53
+ <rect width="100%" height="100%" strokeWidth={0} fill={`url(#${id})`} />
54
+ {squares && (
55
+ <svg x={x} y={y} className="overflow-visible">
56
+ {squares.map(([x, y]) => (
57
+ <rect
58
+ strokeWidth="0"
59
+ key={`${x}-${y}`}
60
+ width={width - 1}
61
+ height={height - 1}
62
+ x={x * width + 1}
63
+ y={y * height + 1}
64
+ />
65
+ ))}
66
+ </svg>
67
+ )}
68
+ </svg>
69
+ )
70
+ }
@@ -0,0 +1,9 @@
1
+ import { FeatureSection } from "../components/feature-section";
2
+
3
+ export default function Page() {
4
+ return (
5
+ <section className="min-h-screen place-content-center p-4">
6
+ <FeatureSection />
7
+ </section>
8
+ );
9
+ }
@@ -0,0 +1,86 @@
1
+ "use client";
2
+
3
+ import createGlobe from "cobe";
4
+ import { useEffect, useRef } from "react";
5
+
6
+ export function CobeGlobe({ className }: { className?: string }) {
7
+ const canvasRef = useRef<HTMLCanvasElement>(null);
8
+
9
+ useEffect(() => {
10
+ const canvas = canvasRef.current;
11
+ if (!canvas) {
12
+ return;
13
+ }
14
+
15
+ let globe: ReturnType<typeof createGlobe> | null = null;
16
+ let rafId = 0;
17
+ let phi = 0;
18
+
19
+ const init = () => {
20
+ const side = canvas.offsetWidth;
21
+ if (side === 0 || globe) {
22
+ return;
23
+ }
24
+
25
+ const dpr = Math.min(window.devicePixelRatio || 1, 2);
26
+
27
+ globe = createGlobe(canvas, {
28
+ devicePixelRatio: dpr,
29
+ width: side,
30
+ height: side,
31
+ phi: 0,
32
+ theta: 0,
33
+ dark: 1,
34
+ diffuse: 1.2,
35
+ mapSamples: 16_000,
36
+ mapBrightness: 6,
37
+ baseColor: [0.3, 0.3, 0.3],
38
+ markerColor: [0.1, 0.8, 1],
39
+ glowColor: [1, 1, 1],
40
+ markers: [
41
+ { location: [37.7595, -122.4367], size: 0.03 },
42
+ { location: [40.7128, -74.006], size: 0.1 },
43
+ ],
44
+ });
45
+
46
+ const loop = () => {
47
+ globe?.update({ phi });
48
+ phi += 0.008;
49
+ rafId = requestAnimationFrame(loop);
50
+ };
51
+ loop();
52
+ };
53
+
54
+ let ro: ResizeObserver | null = null;
55
+
56
+ if (canvas.offsetWidth > 0) {
57
+ init();
58
+ } else {
59
+ ro = new ResizeObserver((entries) => {
60
+ if (
61
+ entries[0]?.contentRect.width &&
62
+ entries[0]?.contentRect.width > 0
63
+ ) {
64
+ ro?.disconnect();
65
+ ro = null;
66
+ init();
67
+ }
68
+ });
69
+ ro.observe(canvas);
70
+ }
71
+
72
+ return () => {
73
+ ro?.disconnect();
74
+ cancelAnimationFrame(rafId);
75
+ globe?.destroy();
76
+ };
77
+ }, []);
78
+
79
+ return (
80
+ <canvas
81
+ className={className}
82
+ ref={canvasRef}
83
+ style={{ width: 600, height: 600, maxWidth: "100%", aspectRatio: 1 }}
84
+ />
85
+ );
86
+ }