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,152 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import type React from "react";
|
|
3
|
+
import { GithubIcon } from "./icons/github-icon";
|
|
4
|
+
import { XIcon } from "./icons/x-icon";
|
|
5
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
6
|
+
import { Mail, MapPin, Phone } from "lucide-react";
|
|
7
|
+
|
|
8
|
+
const APP_EMAIL = "hello@loveui.dev";
|
|
9
|
+
const APP_PHONE = "+1 555 014 2026";
|
|
10
|
+
const APP_PHONE_2 = "+1 555 014 2027";
|
|
11
|
+
|
|
12
|
+
export function Contact() {
|
|
13
|
+
const socialLinks = [
|
|
14
|
+
{
|
|
15
|
+
icon: <GithubIcon className="size-3.5 text-muted-foreground" />,
|
|
16
|
+
href: "#",
|
|
17
|
+
label: "GitHub",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
icon: <XIcon className="size-3.5 text-muted-foreground" />,
|
|
21
|
+
href: "#",
|
|
22
|
+
label: "Twitter",
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div className="relative mx-auto min-h-screen max-w-5xl border-x">
|
|
28
|
+
<div className="flex grow flex-col justify-center px-4 py-18 md:items-center">
|
|
29
|
+
<h1 className="font-bold text-4xl md:text-5xl">Contact Us</h1>
|
|
30
|
+
<p className="mb-5 text-base text-muted-foreground">
|
|
31
|
+
Contact Connor Love about LoveUI, source-first components, and block
|
|
32
|
+
implementation.
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
<FullWidthDivider />
|
|
36
|
+
<div className="grid md:grid-cols-3">
|
|
37
|
+
<Box
|
|
38
|
+
description="Send questions about LoveUI setup, component behavior, or registry installs."
|
|
39
|
+
icon={
|
|
40
|
+
<Mail
|
|
41
|
+
/>
|
|
42
|
+
}
|
|
43
|
+
title="Email"
|
|
44
|
+
>
|
|
45
|
+
<a
|
|
46
|
+
className="font-medium font-mono text-sm tracking-wide hover:underline"
|
|
47
|
+
href={`mailto:${APP_EMAIL}`}
|
|
48
|
+
>
|
|
49
|
+
{APP_EMAIL}
|
|
50
|
+
</a>
|
|
51
|
+
</Box>
|
|
52
|
+
<Box
|
|
53
|
+
description="LoveUI is built as a source-first UI system for product teams."
|
|
54
|
+
icon={
|
|
55
|
+
<MapPin
|
|
56
|
+
/>
|
|
57
|
+
}
|
|
58
|
+
title="Office"
|
|
59
|
+
>
|
|
60
|
+
<span className="font-medium font-mono text-sm tracking-wide">
|
|
61
|
+
Remote product studio by Connor Love
|
|
62
|
+
</span>
|
|
63
|
+
</Box>
|
|
64
|
+
<Box
|
|
65
|
+
className="border-b-0 md:border-r-0"
|
|
66
|
+
description="Use this channel for implementation help and product UI questions."
|
|
67
|
+
icon={
|
|
68
|
+
<Phone
|
|
69
|
+
/>
|
|
70
|
+
}
|
|
71
|
+
title="Phone"
|
|
72
|
+
>
|
|
73
|
+
<div>
|
|
74
|
+
<a
|
|
75
|
+
className="block font-medium font-mono text-sm tracking-wide hover:underline"
|
|
76
|
+
href={`tel:${APP_PHONE}`}
|
|
77
|
+
>
|
|
78
|
+
{APP_PHONE}
|
|
79
|
+
</a>
|
|
80
|
+
<a
|
|
81
|
+
className="block font-medium font-mono text-sm tracking-wide hover:underline"
|
|
82
|
+
href={`tel:${APP_PHONE_2}`}
|
|
83
|
+
>
|
|
84
|
+
{APP_PHONE_2}
|
|
85
|
+
</a>
|
|
86
|
+
</div>
|
|
87
|
+
</Box>
|
|
88
|
+
</div>
|
|
89
|
+
<FullWidthDivider />
|
|
90
|
+
<div className="z-1 flex h-full flex-col items-center justify-center gap-4 py-24">
|
|
91
|
+
<h2 className="text-center font-medium text-2xl text-muted-foreground tracking-tight md:text-3xl">
|
|
92
|
+
Find LoveUI <span className="text-foreground">online</span>
|
|
93
|
+
</h2>
|
|
94
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
95
|
+
{socialLinks.map((link) => (
|
|
96
|
+
<a
|
|
97
|
+
className="flex items-center gap-x-2 rounded-full border bg-card px-3 py-1.5 shadow hover:bg-accent"
|
|
98
|
+
href={link.href}
|
|
99
|
+
key={link.label}
|
|
100
|
+
rel="noopener noreferrer"
|
|
101
|
+
target="_blank"
|
|
102
|
+
>
|
|
103
|
+
{link.icon}
|
|
104
|
+
<span className="font-medium font-mono text-xs tracking-wide">
|
|
105
|
+
{link.label}
|
|
106
|
+
</span>
|
|
107
|
+
</a>
|
|
108
|
+
))}
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
type ContactBox = React.ComponentProps<"div"> & {
|
|
116
|
+
icon: React.ReactNode;
|
|
117
|
+
title: string;
|
|
118
|
+
description: string;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
function Box({
|
|
122
|
+
title,
|
|
123
|
+
description,
|
|
124
|
+
className,
|
|
125
|
+
children,
|
|
126
|
+
...props
|
|
127
|
+
}: ContactBox) {
|
|
128
|
+
return (
|
|
129
|
+
<div
|
|
130
|
+
className={cn(
|
|
131
|
+
"flex flex-col justify-between border-b md:border-r md:border-b-0",
|
|
132
|
+
className
|
|
133
|
+
)}
|
|
134
|
+
>
|
|
135
|
+
<div
|
|
136
|
+
className={cn(
|
|
137
|
+
"flex items-center gap-x-3 border-b bg-secondary/50 p-4 dark:bg-secondary/20",
|
|
138
|
+
"[&_svg]:size-5 [&_svg]:stroke-width-1 [&_svg]:text-muted-foreground"
|
|
139
|
+
)}
|
|
140
|
+
>
|
|
141
|
+
{props.icon}
|
|
142
|
+
<h2 className="font-heading font-medium text-lg tracking-wider">
|
|
143
|
+
{title}
|
|
144
|
+
</h2>
|
|
145
|
+
</div>
|
|
146
|
+
<div className="flex items-center gap-x-2 p-4 py-12">{children}</div>
|
|
147
|
+
<div className="border-t p-4">
|
|
148
|
+
<p className="text-muted-foreground text-sm">{description}</p>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
|
|
3
|
+
type FullWidthDividerProps = React.ComponentProps<"div"> & {
|
|
4
|
+
contained?: boolean;
|
|
5
|
+
position?: "top" | "bottom";
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function FullWidthDivider({
|
|
9
|
+
className,
|
|
10
|
+
contained = false,
|
|
11
|
+
position,
|
|
12
|
+
...props
|
|
13
|
+
}: FullWidthDividerProps) {
|
|
14
|
+
return (
|
|
15
|
+
<div
|
|
16
|
+
aria-hidden="true"
|
|
17
|
+
className={cn(
|
|
18
|
+
"pointer-events-none absolute h-px bg-border",
|
|
19
|
+
// full-bleed (default)
|
|
20
|
+
"data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
|
|
21
|
+
// contained
|
|
22
|
+
"data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
|
|
23
|
+
// position
|
|
24
|
+
position &&
|
|
25
|
+
"data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
|
|
26
|
+
className
|
|
27
|
+
)}
|
|
28
|
+
data-contained={contained}
|
|
29
|
+
data-position={position}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function GithubIcon(props: React.ComponentProps<"svg">) {
|
|
2
|
+
return (
|
|
3
|
+
<svg viewBox="0 0 438.549 438.549" {...props}>
|
|
4
|
+
<path
|
|
5
|
+
d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"
|
|
6
|
+
fill="currentColor"
|
|
7
|
+
/>
|
|
8
|
+
</svg>
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function XIcon(props: React.ComponentProps<"svg">) {
|
|
2
|
+
return (
|
|
3
|
+
<svg
|
|
4
|
+
fill="currentColor"
|
|
5
|
+
viewBox="0 0 24 24"
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
{...props}
|
|
8
|
+
>
|
|
9
|
+
<path d="m18.9,1.153h3.682l-8.042,9.189,9.46,12.506h-7.405l-5.804-7.583-6.634,7.583H.469l8.6-9.831L0,1.153h7.593l5.241,6.931,6.065-6.931Zm-1.293,19.494h2.039L6.482,3.239h-2.19l13.314,17.408Z" />
|
|
10
|
+
</svg>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import { Button } from "@/registry/default/ui/button";
|
|
3
|
+
import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
|
|
4
|
+
import { Input } from "@/registry/default/ui/input";
|
|
5
|
+
import { Textarea } from "@/registry/default/ui/textarea";
|
|
6
|
+
import { MailIcon, PhoneIcon } from "lucide-react";
|
|
7
|
+
|
|
8
|
+
const contactInfo = [
|
|
9
|
+
{
|
|
10
|
+
icon: (
|
|
11
|
+
<MailIcon
|
|
12
|
+
/>
|
|
13
|
+
),
|
|
14
|
+
label: "Email",
|
|
15
|
+
value: "hello@loveui.dev",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
icon: (
|
|
19
|
+
<PhoneIcon
|
|
20
|
+
/>
|
|
21
|
+
),
|
|
22
|
+
label: "Phone",
|
|
23
|
+
value: "+1 555 014 2026",
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
export function ContactSection() {
|
|
28
|
+
return (
|
|
29
|
+
<div className="relative mx-auto grid h-full w-full max-w-4xl rounded-2xl border md:grid-cols-[1fr_0.70fr]">
|
|
30
|
+
<div className="col-span-1 flex flex-col space-y-4 p-8 lg:p-10">
|
|
31
|
+
<h1 className="font-medium text-2xl tracking-wide md:text-3xl">
|
|
32
|
+
Contact LoveUI
|
|
33
|
+
</h1>
|
|
34
|
+
<p className="max-w-md text-muted-foreground text-sm leading-relaxed md:text-base">
|
|
35
|
+
Have a question about components, blocks, registry setup, or using
|
|
36
|
+
LoveUI in your product? Send a note here.
|
|
37
|
+
</p>
|
|
38
|
+
<p className="max-w-md text-muted-foreground text-xs leading-relaxed md:text-sm">
|
|
39
|
+
Connor Love reviews product UI questions and implementation feedback.
|
|
40
|
+
</p>
|
|
41
|
+
<div className="grid gap-4">
|
|
42
|
+
{contactInfo?.map((info) => (
|
|
43
|
+
<ContactInfo key={info.label} {...info} />
|
|
44
|
+
))}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div className="col-span-1 flex items-center border-t p-8 md:border-t-0 md:border-l">
|
|
48
|
+
<ContactForm />
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function ContactForm() {
|
|
55
|
+
return (
|
|
56
|
+
<form className="w-full">
|
|
57
|
+
<FieldGroup>
|
|
58
|
+
<Field>
|
|
59
|
+
<FieldLabel htmlFor="full-name">Full name</FieldLabel>
|
|
60
|
+
<Input autoComplete="off" id="full-name" placeholder="Connor Love" />
|
|
61
|
+
</Field>
|
|
62
|
+
<Field>
|
|
63
|
+
<FieldLabel htmlFor="email">Email</FieldLabel>
|
|
64
|
+
<Input
|
|
65
|
+
autoComplete="off"
|
|
66
|
+
id="email"
|
|
67
|
+
placeholder="you@example.com"
|
|
68
|
+
type="email"
|
|
69
|
+
/>
|
|
70
|
+
</Field>
|
|
71
|
+
<Field>
|
|
72
|
+
<FieldLabel htmlFor="phone">Phone</FieldLabel>
|
|
73
|
+
<Input
|
|
74
|
+
autoComplete="off"
|
|
75
|
+
id="phone"
|
|
76
|
+
placeholder="+1 (555) 123-4567"
|
|
77
|
+
type="tel"
|
|
78
|
+
/>
|
|
79
|
+
</Field>
|
|
80
|
+
<Field>
|
|
81
|
+
<FieldLabel htmlFor="message">Message</FieldLabel>
|
|
82
|
+
<Textarea
|
|
83
|
+
autoComplete="off"
|
|
84
|
+
id="message"
|
|
85
|
+
placeholder="Tell us what you are building with LoveUI"
|
|
86
|
+
/>
|
|
87
|
+
</Field>
|
|
88
|
+
</FieldGroup>
|
|
89
|
+
<Button className="mt-8 w-full" type="button">
|
|
90
|
+
Submit
|
|
91
|
+
</Button>
|
|
92
|
+
</form>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
type ContactInfoProps = React.ComponentProps<"div"> & {
|
|
97
|
+
icon: React.ReactNode;
|
|
98
|
+
label: string;
|
|
99
|
+
value: string;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
function ContactInfo({
|
|
103
|
+
icon,
|
|
104
|
+
label,
|
|
105
|
+
value,
|
|
106
|
+
className,
|
|
107
|
+
...props
|
|
108
|
+
}: ContactInfoProps) {
|
|
109
|
+
return (
|
|
110
|
+
<div className={cn("flex items-center gap-3 py-3", className)} {...props}>
|
|
111
|
+
<div className="rounded-lg border bg-card p-3 shadow-xs [&_svg]:size-5">
|
|
112
|
+
{icon}
|
|
113
|
+
</div>
|
|
114
|
+
<div>
|
|
115
|
+
<p className="font-medium">{label}</p>
|
|
116
|
+
<p className="text-muted-foreground text-xs">{value}</p>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import { Button } from "@/registry/default/ui/button";
|
|
3
|
+
import { Field, FieldGroup, FieldLabel } from "@/registry/default/ui/field";
|
|
4
|
+
import { Input } from "@/registry/default/ui/input";
|
|
5
|
+
import { Textarea } from "@/registry/default/ui/textarea";
|
|
6
|
+
import { DecorIcon } from "./decor-icon";
|
|
7
|
+
import { Phone, Mail } from "lucide-react";
|
|
8
|
+
|
|
9
|
+
const data = [
|
|
10
|
+
{
|
|
11
|
+
title: "Talk LoveUI",
|
|
12
|
+
value: "+1 (555) 014-2026",
|
|
13
|
+
icon: (
|
|
14
|
+
<Phone
|
|
15
|
+
/>
|
|
16
|
+
),
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
title: "Email the team",
|
|
20
|
+
value: "hello@loveui.dev",
|
|
21
|
+
icon: (
|
|
22
|
+
<Mail
|
|
23
|
+
/>
|
|
24
|
+
),
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export function ContactSection() {
|
|
29
|
+
return (
|
|
30
|
+
<div className="relative mx-auto w-full max-w-lg border">
|
|
31
|
+
<div className="border-b px-6 py-8">
|
|
32
|
+
<div className="mb-8 flex flex-col gap-2">
|
|
33
|
+
<h1 className="font-semibold text-xl md:text-2xl">Get in touch</h1>{" "}
|
|
34
|
+
<p className="text-muted-foreground text-sm">
|
|
35
|
+
Have a LoveUI question, block request, or implementation idea?{" "}
|
|
36
|
+
<br /> Send Connor Love a note.
|
|
37
|
+
</p>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div className="grid gap-2 md:grid-cols-2">
|
|
41
|
+
{data.map((item) => (
|
|
42
|
+
<div className="flex items-center gap-4 p-2" key={item.title}>
|
|
43
|
+
<div className="[&_svg]:size-5 [&_svg]:text-muted-foreground">
|
|
44
|
+
{item.icon}
|
|
45
|
+
</div>
|
|
46
|
+
<div className={cn("flex flex-col gap-y-0.5")}>
|
|
47
|
+
<h2 className="text-sm">{item.title}</h2>
|
|
48
|
+
<p className="text-muted-foreground text-xs">{item.value}</p>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
))}
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div className="px-6 py-8">
|
|
56
|
+
<div className="mb-8 flex flex-col gap-1.5">
|
|
57
|
+
<h2 className="font-medium text-xl">Send a message</h2>{" "}
|
|
58
|
+
<p className="text-muted-foreground text-sm">
|
|
59
|
+
Tell us how you are using LoveUI and what would make the registry
|
|
60
|
+
better.
|
|
61
|
+
</p>
|
|
62
|
+
</div>
|
|
63
|
+
<ContactForm />
|
|
64
|
+
</div>
|
|
65
|
+
<DecorIcon position="top-left" />
|
|
66
|
+
<DecorIcon position="top-right" />
|
|
67
|
+
<DecorIcon position="bottom-left" />
|
|
68
|
+
<DecorIcon position="bottom-right" />
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ContactForm() {
|
|
74
|
+
return (
|
|
75
|
+
<form className="w-full">
|
|
76
|
+
<FieldGroup>
|
|
77
|
+
<div className="grid grid-cols-2 gap-4">
|
|
78
|
+
<Field>
|
|
79
|
+
<FieldLabel htmlFor="first-name">First name</FieldLabel>
|
|
80
|
+
<Input autoComplete="off" id="first-name" placeholder="Connor" />
|
|
81
|
+
</Field>
|
|
82
|
+
<Field>
|
|
83
|
+
<FieldLabel htmlFor="last-name">Last name</FieldLabel>
|
|
84
|
+
<Input autoComplete="off" id="last-name" placeholder="Love" />
|
|
85
|
+
</Field>
|
|
86
|
+
</div>
|
|
87
|
+
<Field>
|
|
88
|
+
<FieldLabel htmlFor="email">Email</FieldLabel>
|
|
89
|
+
<Input
|
|
90
|
+
autoComplete="off"
|
|
91
|
+
id="email"
|
|
92
|
+
placeholder="you@example.com"
|
|
93
|
+
type="email"
|
|
94
|
+
/>
|
|
95
|
+
</Field>
|
|
96
|
+
<Field>
|
|
97
|
+
<FieldLabel htmlFor="phone">Phone</FieldLabel>
|
|
98
|
+
<Input
|
|
99
|
+
autoComplete="off"
|
|
100
|
+
id="phone"
|
|
101
|
+
placeholder="+1 (555) 123-4567"
|
|
102
|
+
type="tel"
|
|
103
|
+
/>
|
|
104
|
+
</Field>
|
|
105
|
+
<Field>
|
|
106
|
+
<FieldLabel htmlFor="message">Message</FieldLabel>
|
|
107
|
+
<Textarea
|
|
108
|
+
autoComplete="off"
|
|
109
|
+
id="message"
|
|
110
|
+
placeholder="Tell us what you are building with LoveUI"
|
|
111
|
+
/>
|
|
112
|
+
</Field>
|
|
113
|
+
</FieldGroup>
|
|
114
|
+
<Button className="mt-8 w-full" type="button">
|
|
115
|
+
Submit
|
|
116
|
+
</Button>
|
|
117
|
+
</form>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
|
+
|
|
4
|
+
const DecorIconVariants = cva(
|
|
5
|
+
"pointer-events-none absolute z-1 size-5 shrink-0 stroke-1 stroke-muted-foreground",
|
|
6
|
+
{
|
|
7
|
+
variants: {
|
|
8
|
+
position: {
|
|
9
|
+
"top-left":
|
|
10
|
+
"top-0 left-0 -translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
|
|
11
|
+
"top-right":
|
|
12
|
+
"top-0 right-0 translate-x-[calc(50%+0.5px)] -translate-y-[calc(50%+0.5px)]",
|
|
13
|
+
"bottom-right":
|
|
14
|
+
"right-0 bottom-0 translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
|
|
15
|
+
"bottom-left":
|
|
16
|
+
"bottom-0 left-0 -translate-x-[calc(50%+0.5px)] translate-y-[calc(50%+0.5px)]",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
position: "top-left",
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
type DecorIconProps = React.ComponentProps<"svg"> &
|
|
26
|
+
VariantProps<typeof DecorIconVariants>;
|
|
27
|
+
|
|
28
|
+
export function DecorIcon({ position, className, ...props }: DecorIconProps) {
|
|
29
|
+
return (
|
|
30
|
+
<svg
|
|
31
|
+
aria-hidden="true"
|
|
32
|
+
className={cn(DecorIconVariants({ position, className }))}
|
|
33
|
+
fill="none"
|
|
34
|
+
stroke="currentColor"
|
|
35
|
+
strokeLinecap="round"
|
|
36
|
+
strokeLinejoin="round"
|
|
37
|
+
viewBox="0 0 24 24"
|
|
38
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
39
|
+
{...props}
|
|
40
|
+
>
|
|
41
|
+
<path d="M5 12h14" />
|
|
42
|
+
<path d="M12 5v14" />
|
|
43
|
+
</svg>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Button } from "@/registry/default/ui/button";
|
|
2
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
3
|
+
|
|
4
|
+
export function CallToAction() {
|
|
5
|
+
return (
|
|
6
|
+
<div className="relative mx-auto flex w-full max-w-3xl flex-col justify-between border-x md:flex-row">
|
|
7
|
+
<FullWidthDivider className="-top-px" />
|
|
8
|
+
<div className="border-b p-4 md:border-b-0">
|
|
9
|
+
<h2 className="text-center font-bold text-lg md:text-left md:text-2xl">
|
|
10
|
+
Ship cleaner dashboards this week.
|
|
11
|
+
</h2>
|
|
12
|
+
</div>
|
|
13
|
+
<div className="flex items-center justify-center gap-2 p-4 md:border-l">
|
|
14
|
+
<Button variant="secondary">Book a Demo</Button>
|
|
15
|
+
<Button>Start Building</Button>
|
|
16
|
+
</div>
|
|
17
|
+
<FullWidthDivider className="-bottom-px" />
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
|
|
3
|
+
type FullWidthDividerProps = React.ComponentProps<"div"> & {
|
|
4
|
+
contained?: boolean;
|
|
5
|
+
position?: "top" | "bottom";
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function FullWidthDivider({
|
|
9
|
+
className,
|
|
10
|
+
contained = false,
|
|
11
|
+
position,
|
|
12
|
+
...props
|
|
13
|
+
}: FullWidthDividerProps) {
|
|
14
|
+
return (
|
|
15
|
+
<div
|
|
16
|
+
aria-hidden="true"
|
|
17
|
+
className={cn(
|
|
18
|
+
"pointer-events-none absolute h-px bg-border",
|
|
19
|
+
// full-bleed (default)
|
|
20
|
+
"data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
|
|
21
|
+
// contained
|
|
22
|
+
"data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
|
|
23
|
+
// position
|
|
24
|
+
position &&
|
|
25
|
+
"data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
|
|
26
|
+
className
|
|
27
|
+
)}
|
|
28
|
+
data-contained={contained}
|
|
29
|
+
data-position={position}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Button } from "@/registry/default/ui/button";
|
|
2
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
3
|
+
import { ArrowRightIcon } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
export function CallToAction() {
|
|
6
|
+
return (
|
|
7
|
+
<div className="relative mx-auto flex w-full max-w-3xl flex-col justify-between border-x">
|
|
8
|
+
<FullWidthDivider className="-top-px" />
|
|
9
|
+
<div className="border-b px-2 py-8">
|
|
10
|
+
<h2 className="text-center font-semibold text-lg md:text-2xl">
|
|
11
|
+
Turn scattered work into one clear launch plan.
|
|
12
|
+
</h2>
|
|
13
|
+
<p className="text-balance text-center text-muted-foreground text-sm md:text-base">
|
|
14
|
+
Bring tasks, owners, and decisions together before the next sprint.
|
|
15
|
+
</p>
|
|
16
|
+
</div>
|
|
17
|
+
<div className="flex items-center justify-center gap-2 bg-secondary/80 p-4 dark:bg-secondary/40">
|
|
18
|
+
<Button variant="outline">See Plans</Button>
|
|
19
|
+
<Button>
|
|
20
|
+
Create Workspace{" "}
|
|
21
|
+
<ArrowRightIcon data-icon="inline-end" />
|
|
22
|
+
</Button>
|
|
23
|
+
</div>
|
|
24
|
+
<FullWidthDivider className="-bottom-px" />
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
|
|
3
|
+
type FullWidthDividerProps = React.ComponentProps<"div"> & {
|
|
4
|
+
contained?: boolean;
|
|
5
|
+
position?: "top" | "bottom";
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function FullWidthDivider({
|
|
9
|
+
className,
|
|
10
|
+
contained = false,
|
|
11
|
+
position,
|
|
12
|
+
...props
|
|
13
|
+
}: FullWidthDividerProps) {
|
|
14
|
+
return (
|
|
15
|
+
<div
|
|
16
|
+
aria-hidden="true"
|
|
17
|
+
className={cn(
|
|
18
|
+
"pointer-events-none absolute h-px bg-border",
|
|
19
|
+
// full-bleed (default)
|
|
20
|
+
"data-[contained=false]:left-1/2 data-[contained=false]:w-screen data-[contained=false]:-translate-x-1/2",
|
|
21
|
+
// contained
|
|
22
|
+
"data-[contained=true]:inset-x-0 data-[contained=true]:w-full",
|
|
23
|
+
// position
|
|
24
|
+
position &&
|
|
25
|
+
"data-[position=top]:-top-px data-[position=bottom]:-bottom-px",
|
|
26
|
+
className
|
|
27
|
+
)}
|
|
28
|
+
data-contained={contained}
|
|
29
|
+
data-position={position}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|