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.
- package/dist/index.js +20 -20
- package/dist/mcp-server.js +1 -1
- package/package.json +1 -1
- package/registry/__index__.tsx +73 -0
- package/registry/default/blocks/404-1/app/page.tsx +5 -0
- package/registry/default/blocks/404-1/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/404-1/components/not-found.tsx +51 -0
- package/registry/default/blocks/404-2/app/page.tsx +5 -0
- package/registry/default/blocks/404-2/components/not-found.tsx +44 -0
- package/registry/default/blocks/auth1/app/page.tsx +5 -0
- package/registry/default/blocks/auth1/components/auth-page.tsx +66 -0
- package/registry/default/blocks/auth1/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/auth1/components/icons/google-icon.tsx +14 -0
- package/registry/default/blocks/auth1/components/logo.tsx +88 -0
- package/registry/default/blocks/auth1/components/particles.tsx +321 -0
- package/registry/default/blocks/auth2/app/page.tsx +5 -0
- package/registry/default/blocks/auth2/components/auth.tsx +87 -0
- package/registry/default/blocks/auth2/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/auth2/components/icons/google-icon.tsx +14 -0
- package/registry/default/blocks/auth2/components/ui/auth-divider.tsx +16 -0
- package/registry/default/blocks/auth2/components/ui/decor-icon.tsx +45 -0
- package/registry/default/blocks/auth3/app/page.tsx +5 -0
- package/registry/default/blocks/auth3/components/auth-page.tsx +84 -0
- package/registry/default/blocks/auth3/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/auth3/components/icons/google-icon.tsx +14 -0
- package/registry/default/blocks/auth3/components/logo.tsx +88 -0
- package/registry/default/blocks/auth3/components/ui/auth-divider.tsx +16 -0
- package/registry/default/blocks/auth3/components/ui/decor-icon.tsx +45 -0
- package/registry/default/blocks/blogs1/app/page.tsx +5 -0
- package/registry/default/blocks/blogs1/components/blogs.tsx +97 -0
- package/registry/default/blocks/blogs1/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/blogs2/app/page.tsx +5 -0
- package/registry/default/blocks/blogs2/components/blogs.tsx +158 -0
- package/registry/default/blocks/blogs2/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/blogs2/components/grid-filler.tsx +74 -0
- package/registry/default/blocks/blogs3/app/page.tsx +5 -0
- package/registry/default/blocks/blogs3/components/aspect-ratio.tsx +22 -0
- package/registry/default/blocks/blogs3/components/blogs.tsx +224 -0
- package/registry/default/blocks/blogs3/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/blogs3/components/lazy-image.tsx +94 -0
- package/registry/default/blocks/contact1/app/page.tsx +9 -0
- package/registry/default/blocks/contact1/components/contact.tsx +65 -0
- package/registry/default/blocks/contact1/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/contact2/app/page.tsx +9 -0
- package/registry/default/blocks/contact2/components/contact.tsx +74 -0
- package/registry/default/blocks/contact2/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/contact2/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/contact3/app/page.tsx +9 -0
- package/registry/default/blocks/contact3/components/contact.tsx +152 -0
- package/registry/default/blocks/contact3/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/contact3/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/contact3/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/contact4/app/page.tsx +9 -0
- package/registry/default/blocks/contact4/components/contact.tsx +120 -0
- package/registry/default/blocks/contact5/app/page.tsx +9 -0
- package/registry/default/blocks/contact5/components/contact.tsx +119 -0
- package/registry/default/blocks/contact5/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/cta-1/app/page.tsx +9 -0
- package/registry/default/blocks/cta-1/components/cta.tsx +20 -0
- package/registry/default/blocks/cta-1/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/cta-2/app/page.tsx +9 -0
- package/registry/default/blocks/cta-2/components/cta.tsx +27 -0
- package/registry/default/blocks/cta-2/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/cta-3/app/page.tsx +9 -0
- package/registry/default/blocks/cta-3/components/cta.tsx +35 -0
- package/registry/default/blocks/cta-3/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/cta-4/app/page.tsx +9 -0
- package/registry/default/blocks/cta-4/components/cta.tsx +28 -0
- package/registry/default/blocks/cta-5/app/page.tsx +9 -0
- package/registry/default/blocks/cta-5/components/cta.tsx +72 -0
- package/registry/default/blocks/cta-5/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/faq-1/app/page.tsx +9 -0
- package/registry/default/blocks/faq-1/components/faq.tsx +86 -0
- package/registry/default/blocks/faq-2/app/page.tsx +9 -0
- package/registry/default/blocks/faq-2/components/faq.tsx +93 -0
- package/registry/default/blocks/faq-3/app/page.tsx +9 -0
- package/registry/default/blocks/faq-3/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/faq-3/components/faq.tsx +110 -0
- package/registry/default/blocks/faq-4/app/page.tsx +9 -0
- package/registry/default/blocks/faq-4/components/faq.tsx +181 -0
- package/registry/default/blocks/faq-5/app/page.tsx +9 -0
- package/registry/default/blocks/faq-5/components/faq.tsx +211 -0
- package/registry/default/blocks/faq-5/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/features1/app/page.tsx +9 -0
- package/registry/default/blocks/features1/components/feature-section.tsx +73 -0
- package/registry/default/blocks/features2/app/page.tsx +9 -0
- package/registry/default/blocks/features2/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/features2/components/feature-section.tsx +97 -0
- package/registry/default/blocks/features3/app/page.tsx +9 -0
- package/registry/default/blocks/features3/components/feature-section.tsx +93 -0
- package/registry/default/blocks/features3/components/full-width-divider.tsx +21 -0
- package/registry/default/blocks/features4/app/page.tsx +9 -0
- package/registry/default/blocks/features4/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/features4/components/feature-section.tsx +114 -0
- package/registry/default/blocks/features5/app/page.tsx +9 -0
- package/registry/default/blocks/features5/components/feature-section.tsx +115 -0
- package/registry/default/blocks/features5/components/grid-pattern.tsx +70 -0
- package/registry/default/blocks/features6/app/page.tsx +9 -0
- package/registry/default/blocks/features6/components/cobe-globe.tsx +86 -0
- package/registry/default/blocks/features6/components/feature-section.tsx +309 -0
- package/registry/default/blocks/footer1/app/page.tsx +9 -0
- package/registry/default/blocks/footer1/components/footer.tsx +85 -0
- package/registry/default/blocks/footer1/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/footer1/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer1/components/logo.tsx +88 -0
- package/registry/default/blocks/footer2/app/page.tsx +9 -0
- package/registry/default/blocks/footer2/components/footer.tsx +139 -0
- package/registry/default/blocks/footer2/components/full-width-divider.tsx +21 -0
- package/registry/default/blocks/footer2/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/footer2/components/icons/instagram-icon.tsx +12 -0
- package/registry/default/blocks/footer2/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer2/components/logo.tsx +88 -0
- package/registry/default/blocks/footer3/app/page.tsx +9 -0
- package/registry/default/blocks/footer3/components/footer.tsx +155 -0
- package/registry/default/blocks/footer3/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/footer3/components/icons/instagram-icon.tsx +12 -0
- package/registry/default/blocks/footer3/components/icons/linkedin-icon.tsx +12 -0
- package/registry/default/blocks/footer3/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer3/components/logo.tsx +88 -0
- package/registry/default/blocks/footer4/app/page.tsx +9 -0
- package/registry/default/blocks/footer4/components/footer.tsx +137 -0
- package/registry/default/blocks/footer4/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/footer4/components/icons/instagram-icon.tsx +12 -0
- package/registry/default/blocks/footer4/components/icons/linkedin-icon.tsx +12 -0
- package/registry/default/blocks/footer4/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer4/components/logo.tsx +88 -0
- package/registry/default/blocks/footer5/app/page.tsx +9 -0
- package/registry/default/blocks/footer5/components/footer.tsx +152 -0
- package/registry/default/blocks/footer5/components/icons/apple-icon.tsx +18 -0
- package/registry/default/blocks/footer5/components/icons/facebook-icon.tsx +12 -0
- package/registry/default/blocks/footer5/components/icons/google-play-icon.tsx +10 -0
- package/registry/default/blocks/footer5/components/icons/instagram-icon.tsx +12 -0
- package/registry/default/blocks/footer5/components/icons/linkedin-icon.tsx +12 -0
- package/registry/default/blocks/footer5/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer5/components/logo.tsx +88 -0
- package/registry/default/blocks/footer6/app/page.tsx +16 -0
- package/registry/default/blocks/footer6/components/footer.tsx +220 -0
- package/registry/default/blocks/footer6/components/icons/apple-icon.tsx +18 -0
- package/registry/default/blocks/footer6/components/icons/facebook-icon.tsx +12 -0
- package/registry/default/blocks/footer6/components/icons/github-icon.tsx +10 -0
- package/registry/default/blocks/footer6/components/icons/google-play-icon.tsx +10 -0
- package/registry/default/blocks/footer6/components/icons/instagram-icon.tsx +12 -0
- package/registry/default/blocks/footer6/components/icons/linkedin-icon.tsx +12 -0
- package/registry/default/blocks/footer6/components/icons/x-icon.tsx +12 -0
- package/registry/default/blocks/footer6/components/logo.tsx +88 -0
- package/registry/default/blocks/header1/app/page.tsx +12 -0
- package/registry/default/blocks/header1/components/demo-layout.tsx +33 -0
- package/registry/default/blocks/header1/components/header.tsx +58 -0
- package/registry/default/blocks/header1/components/logo.tsx +88 -0
- package/registry/default/blocks/header1/components/mobile-nav.tsx +61 -0
- package/registry/default/blocks/header1/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/header1/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/header2/app/page.tsx +11 -0
- package/registry/default/blocks/header2/components/demo-layout.tsx +33 -0
- package/registry/default/blocks/header2/components/header.tsx +70 -0
- package/registry/default/blocks/header2/components/logo.tsx +88 -0
- package/registry/default/blocks/header2/components/mobile-nav.tsx +61 -0
- package/registry/default/blocks/header2/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/header2/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/header3/app/page.tsx +11 -0
- package/registry/default/blocks/header3/components/demo-layout.tsx +33 -0
- package/registry/default/blocks/header3/components/desktop-nav.tsx +70 -0
- package/registry/default/blocks/header3/components/header.tsx +41 -0
- package/registry/default/blocks/header3/components/logo.tsx +88 -0
- package/registry/default/blocks/header3/components/mobile-nav.tsx +88 -0
- package/registry/default/blocks/header3/components/nav-links.tsx +132 -0
- package/registry/default/blocks/header3/components/sheard.tsx +41 -0
- package/registry/default/blocks/header3/components/ui/navigation-menu.tsx +171 -0
- package/registry/default/blocks/header3/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/header3/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/hero1/app/page.tsx +15 -0
- package/registry/default/blocks/hero1/components/header.tsx +70 -0
- package/registry/default/blocks/hero1/components/hero.tsx +80 -0
- package/registry/default/blocks/hero1/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/hero1/components/logo-cloud.tsx +69 -0
- package/registry/default/blocks/hero1/components/logo.tsx +88 -0
- package/registry/default/blocks/hero1/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/hero1/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/hero1/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/hero1/components/logos-section.tsx +14 -0
- package/registry/default/blocks/hero1/components/mobile-nav.tsx +61 -0
- package/registry/default/blocks/hero1/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/hero1/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/hero2/app/page.tsx +23 -0
- package/registry/default/blocks/hero2/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/hero2/components/full-width-divider.tsx +21 -0
- package/registry/default/blocks/hero2/components/header.tsx +70 -0
- package/registry/default/blocks/hero2/components/hero.tsx +104 -0
- package/registry/default/blocks/hero2/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/hero2/components/logo-cloud.tsx +120 -0
- package/registry/default/blocks/hero2/components/logo.tsx +88 -0
- package/registry/default/blocks/hero2/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/hero2/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/hero2/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/hero2/components/logos-section.tsx +23 -0
- package/registry/default/blocks/hero2/components/mobile-nav.tsx +61 -0
- package/registry/default/blocks/hero2/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/hero2/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/hero3/app/page.tsx +15 -0
- package/registry/default/blocks/hero3/components/header.tsx +70 -0
- package/registry/default/blocks/hero3/components/hero.tsx +104 -0
- package/registry/default/blocks/hero3/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/hero3/components/logo-cloud.tsx +67 -0
- package/registry/default/blocks/hero3/components/logo.tsx +88 -0
- package/registry/default/blocks/hero3/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/hero3/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/hero3/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/hero3/components/logos-section.tsx +12 -0
- package/registry/default/blocks/hero3/components/mobile-nav.tsx +61 -0
- package/registry/default/blocks/hero3/components/ui/portal.tsx +27 -0
- package/registry/default/blocks/hero3/hooks/use-scroll.ts +54 -0
- package/registry/default/blocks/image-gallery-1/app/page.tsx +5 -0
- package/registry/default/blocks/image-gallery-1/components/aspect-ratio.tsx +22 -0
- package/registry/default/blocks/image-gallery-1/components/image-gallery.tsx +135 -0
- package/registry/default/blocks/image-gallery-1/components/lazy-image.tsx +94 -0
- package/registry/default/blocks/integrations1/app/page.tsx +9 -0
- package/registry/default/blocks/integrations1/components/integrations.tsx +86 -0
- package/registry/default/blocks/integrations1/components/logos/adobe.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/canva.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/cursor.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/gmail.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/notion.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/planetscale.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/polar.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/supabase.svg +1 -0
- package/registry/default/blocks/integrations1/components/logos/vercel.svg +1 -0
- package/registry/default/blocks/integrations2/app/page.tsx +9 -0
- package/registry/default/blocks/integrations2/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/integrations2/components/integrations.tsx +118 -0
- package/registry/default/blocks/integrations2/components/logos/adobe.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/canva.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/cursor.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/gmail.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/notion.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/planetscale.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/polar.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/supabase.svg +1 -0
- package/registry/default/blocks/integrations2/components/logos/vercel.svg +1 -0
- package/registry/default/blocks/integrations3/app/page.tsx +9 -0
- package/registry/default/blocks/integrations3/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/integrations3/components/integrations.tsx +190 -0
- package/registry/default/blocks/integrations3/components/logos/adobe.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/canva.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/cursor.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/gmail.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/notion.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/planetscale.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/polar.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/supabase.svg +1 -0
- package/registry/default/blocks/integrations3/components/logos/vercel.svg +1 -0
- package/registry/default/blocks/integrations4/app/page.tsx +9 -0
- package/registry/default/blocks/integrations4/components/integrations.tsx +177 -0
- package/registry/default/blocks/integrations4/components/logos/adobe.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/canva.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/cursor.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/gmail.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/notion.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/planetscale.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/polar.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/supabase.svg +1 -0
- package/registry/default/blocks/integrations4/components/logos/vercel.svg +1 -0
- package/registry/default/blocks/integrations5/app/page.tsx +9 -0
- package/registry/default/blocks/integrations5/components/integrations.tsx +112 -0
- package/registry/default/blocks/integrations5/components/logos/adobe.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/canva.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/cursor.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/gmail.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/notion.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/planetscale.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/polar.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/supabase.svg +1 -0
- package/registry/default/blocks/integrations5/components/logos/vercel.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/app/page.tsx +17 -0
- package/registry/default/blocks/logo-cloud-1/components/logo-cloud.tsx +70 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-1/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/app/page.tsx +19 -0
- package/registry/default/blocks/logo-cloud-2/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/logo-cloud-2/components/logo-cloud.tsx +120 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-2/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/app/page.tsx +18 -0
- package/registry/default/blocks/logo-cloud-3/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +69 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-3/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/app/page.tsx +23 -0
- package/registry/default/blocks/logo-cloud-4/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +83 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-4/components/progressive-blur.tsx +63 -0
- package/registry/default/blocks/logo-cloud-5/app/page.tsx +17 -0
- package/registry/default/blocks/logo-cloud-5/components/logo-cloud.tsx +67 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/claude-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/clerk-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/github-wordmark.svg +6 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/nvidia-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/openai-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/supabase-wordmark.svg +23 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/turso-wordmark.svg +1 -0
- package/registry/default/blocks/logo-cloud-5/components/logos/vercel-wordmark.svg +1 -0
- package/registry/default/blocks/pricing1/app/page.tsx +9 -0
- package/registry/default/blocks/pricing1/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/pricing1/components/pricing.tsx +94 -0
- package/registry/default/blocks/pricing2/app/page.tsx +9 -0
- package/registry/default/blocks/pricing2/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/pricing2/components/pricing.tsx +117 -0
- package/registry/default/blocks/pricing3/app/page.tsx +9 -0
- package/registry/default/blocks/pricing3/components/pricing-card.tsx +171 -0
- package/registry/default/blocks/pricing3/components/pricing.tsx +143 -0
- package/registry/default/blocks/pricing4/app/page.tsx +9 -0
- package/registry/default/blocks/pricing4/components/frequency-toggle.tsx +47 -0
- package/registry/default/blocks/pricing4/components/pricing.tsx +230 -0
- package/registry/default/blocks/testimonials1/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials1/components/logo.tsx +74 -0
- package/registry/default/blocks/testimonials1/components/testimonials.tsx +41 -0
- package/registry/default/blocks/testimonials2/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials2/components/testimonials.tsx +65 -0
- package/registry/default/blocks/testimonials3/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials3/components/decor-icon.tsx +45 -0
- package/registry/default/blocks/testimonials3/components/testimonials.tsx +114 -0
- package/registry/default/blocks/testimonials4/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials4/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/testimonials4/components/testimonials.tsx +81 -0
- package/registry/default/blocks/testimonials5/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials5/components/full-width-divider.tsx +33 -0
- package/registry/default/blocks/testimonials5/components/grid-filler.tsx +74 -0
- package/registry/default/blocks/testimonials5/components/grid-pattern.tsx +70 -0
- package/registry/default/blocks/testimonials5/components/testimonials.tsx +186 -0
- package/registry/default/blocks/testimonials6/app/page.tsx +9 -0
- package/registry/default/blocks/testimonials6/components/infinite-slider.tsx +109 -0
- package/registry/default/blocks/testimonials6/components/testimonials.tsx +193 -0
- package/registry/default/examples/accordion-disabled.tsx +58 -0
- package/registry/default/examples/accordion-in-card.tsx +92 -0
- package/registry/default/examples/accordion-leading-icon.tsx +51 -0
- package/registry/default/examples/accordion-user-roles.tsx +97 -0
- package/registry/default/examples/accordion-with-icons.tsx +67 -0
- package/registry/default/examples/avatar-badge-icons.tsx +60 -0
- package/registry/default/examples/avatar-badge-position.tsx +47 -0
- package/registry/default/examples/avatar-empty-collaborators.tsx +55 -0
- package/registry/default/examples/avatar-group-trust.tsx +49 -0
- package/registry/default/examples/avatar-loading.tsx +33 -0
- package/registry/default/examples/avatar-menu.tsx +81 -0
- package/registry/default/examples/avatar-profile-badge.tsx +30 -0
- package/registry/default/examples/avatar-status.tsx +47 -0
- package/registry/default/examples/breadcrumb-bullet-separator.tsx +38 -0
- package/registry/default/examples/breadcrumb-buttons.tsx +61 -0
- package/registry/default/examples/breadcrumb-card.tsx +40 -0
- package/registry/default/examples/button-default-icons.tsx +18 -0
- package/registry/default/examples/button-default.tsx +5 -0
- package/registry/default/examples/button-demo.tsx +11 -1
- package/registry/default/examples/button-destructive-icons.tsx +18 -0
- package/registry/default/examples/button-destructive-outline-icons.tsx +18 -0
- package/registry/default/examples/button-ghost-icons.tsx +18 -0
- package/registry/default/examples/button-link-icons.tsx +18 -0
- package/registry/default/examples/button-outline-icons.tsx +18 -0
- package/registry/default/examples/button-secondary-icons.tsx +18 -0
- package/registry/default/examples/button-theme-toggle.tsx +38 -0
- package/registry/default/examples/card-author-profile.tsx +66 -0
- package/registry/default/examples/card-default-size.tsx +33 -0
- package/registry/default/examples/card-depth.tsx +37 -0
- package/registry/default/examples/card-help-link.tsx +32 -0
- package/registry/default/examples/card-help-menu.tsx +78 -0
- package/registry/default/examples/card-image-centered.tsx +38 -0
- package/registry/default/examples/card-image-feature.tsx +44 -0
- package/registry/default/examples/card-metric-actions.tsx +102 -0
- package/registry/default/examples/card-resource-link.tsx +40 -0
- package/registry/default/examples/card-team-member.tsx +38 -14
- package/registry/default/examples/card-usage-expandable.tsx +98 -0
- package/registry/default/examples/card-with-borders.tsx +29 -0
- package/registry/default/ui/accordion.tsx +82 -2
- package/registry/default/ui/avatar.tsx +45 -1
- 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,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,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,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
|
+
}
|