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,181 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import {
|
|
4
|
+
Accordion,
|
|
5
|
+
AccordionContent,
|
|
6
|
+
AccordionItem,
|
|
7
|
+
AccordionTrigger,
|
|
8
|
+
} from "@/registry/default/ui/accordion";
|
|
9
|
+
import { Button } from "@/registry/default/ui/button";
|
|
10
|
+
import { LayoutGridIcon, PowerIcon, FeatherIcon, CreditCardIcon, LifeBuoyIcon } from "lucide-react";
|
|
11
|
+
|
|
12
|
+
const categories = [
|
|
13
|
+
{
|
|
14
|
+
icon: (
|
|
15
|
+
<LayoutGridIcon className="size-4" />
|
|
16
|
+
),
|
|
17
|
+
id: "all",
|
|
18
|
+
label: "All Topics",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
icon: (
|
|
22
|
+
<PowerIcon className="size-4" />
|
|
23
|
+
),
|
|
24
|
+
id: "getting-started",
|
|
25
|
+
label: "Getting Started",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
icon: (
|
|
29
|
+
<FeatherIcon className="size-4" />
|
|
30
|
+
),
|
|
31
|
+
id: "features",
|
|
32
|
+
label: "Features",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
icon: (
|
|
36
|
+
<CreditCardIcon className="size-4" />
|
|
37
|
+
),
|
|
38
|
+
id: "license",
|
|
39
|
+
label: "License",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
icon: (
|
|
43
|
+
<LifeBuoyIcon className="size-4" />
|
|
44
|
+
),
|
|
45
|
+
id: "support",
|
|
46
|
+
label: "Support",
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
export function FaqsSection() {
|
|
51
|
+
const [activeCategory, setActiveCategory] = React.useState("all");
|
|
52
|
+
|
|
53
|
+
const filtered = faqs.filter((faq) => {
|
|
54
|
+
const matchesCategory =
|
|
55
|
+
activeCategory === "all" || faq.category === activeCategory;
|
|
56
|
+
return matchesCategory;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const currentCategory = React.useMemo(
|
|
60
|
+
() => categories.find((cat) => cat.id === activeCategory),
|
|
61
|
+
[activeCategory]
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<section className="mx-auto min-h-screen w-full max-w-5xl">
|
|
66
|
+
<div className="flex flex-col items-center justify-center gap-4 px-4 py-16">
|
|
67
|
+
<h2 className="text-balance font-black font-mono text-4xl md:text-5xl lg:font-black">
|
|
68
|
+
FAQs
|
|
69
|
+
</h2>
|
|
70
|
+
<p className="text-muted-foreground">Answers about using LoveUI.</p>
|
|
71
|
+
</div>
|
|
72
|
+
<div className="relative grid min-h-full grid-cols-1 py-12 md:grid-cols-3">
|
|
73
|
+
<div className="flex h-full items-start justify-center border-b pb-2 md:border-b-0">
|
|
74
|
+
<div className="flex w-max flex-wrap items-start justify-start gap-2 md:flex-col md:justify-center">
|
|
75
|
+
{categories.map((cat) => (
|
|
76
|
+
<Button
|
|
77
|
+
key={cat.id}
|
|
78
|
+
onClick={() => setActiveCategory(cat.id)}
|
|
79
|
+
variant={activeCategory === cat.id ? "outline" : "ghost"}
|
|
80
|
+
>
|
|
81
|
+
{cat.icon}
|
|
82
|
+
{cat.label}
|
|
83
|
+
</Button>
|
|
84
|
+
))}
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
<div className="col-span-2 space-y-5 px-4 py-5">
|
|
88
|
+
{currentCategory && (
|
|
89
|
+
<div className="flex items-center gap-2">
|
|
90
|
+
{currentCategory.icon}
|
|
91
|
+
<span className="font-medium">{currentCategory.label}</span>
|
|
92
|
+
</div>
|
|
93
|
+
)}
|
|
94
|
+
<Accordion className="space-y-2" collapsible type="single">
|
|
95
|
+
{filtered.map((item) => (
|
|
96
|
+
<AccordionItem
|
|
97
|
+
className="border-b-0"
|
|
98
|
+
key={item.id}
|
|
99
|
+
value={item.id.toString()}
|
|
100
|
+
>
|
|
101
|
+
<AccordionTrigger className="bg-muted px-4 hover:no-underline dark:bg-muted/50">
|
|
102
|
+
{item.title}
|
|
103
|
+
</AccordionTrigger>
|
|
104
|
+
|
|
105
|
+
<AccordionContent className="p-4">
|
|
106
|
+
{item.content}
|
|
107
|
+
</AccordionContent>
|
|
108
|
+
</AccordionItem>
|
|
109
|
+
))}
|
|
110
|
+
</Accordion>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</section>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const faqs = [
|
|
118
|
+
{
|
|
119
|
+
id: 1,
|
|
120
|
+
category: "getting-started",
|
|
121
|
+
title: "How do I add my first component?",
|
|
122
|
+
content:
|
|
123
|
+
"Run npx love-ui@latest add loveui to install the shared setup, then add a component such as npx love-ui@latest add button.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 2,
|
|
127
|
+
category: "getting-started",
|
|
128
|
+
title: "What are the system requirements?",
|
|
129
|
+
content:
|
|
130
|
+
"LoveUI is designed for React projects that use Tailwind CSS. If your project uses a different import alias, update the copied imports after installation.",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: 3,
|
|
134
|
+
category: "features",
|
|
135
|
+
title: "Can I use LoveUI with a product team?",
|
|
136
|
+
content:
|
|
137
|
+
"Yes. Because LoveUI components live in your codebase, teams can review, edit, and version them like any other application source.",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 4,
|
|
141
|
+
category: "features",
|
|
142
|
+
title: "What does the component library include?",
|
|
143
|
+
content:
|
|
144
|
+
"LoveUI includes primitives, examples, and full-page blocks for common product interfaces, from forms and dialogs to auth screens and FAQ sections.",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 5,
|
|
148
|
+
category: "features",
|
|
149
|
+
title: "Does LoveUI include AI agent guidance?",
|
|
150
|
+
content:
|
|
151
|
+
"Yes. LoveUI Skills gives AI coding agents design rules, workflow steps, and quality checks for building better interfaces with LoveUI.",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 6,
|
|
155
|
+
category: "license",
|
|
156
|
+
title: "Is LoveUI free to use?",
|
|
157
|
+
content:
|
|
158
|
+
"Yes. LoveUI is open source under the MIT license, so you can use it in personal, internal, and commercial projects.",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 7,
|
|
162
|
+
category: "license",
|
|
163
|
+
title: "Do I have to keep the generated files unchanged?",
|
|
164
|
+
content:
|
|
165
|
+
"No. The source is copied into your app specifically so you can rename, restyle, and reshape it for your product.",
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: 8,
|
|
169
|
+
category: "support",
|
|
170
|
+
title: "How do I report a bug?",
|
|
171
|
+
content:
|
|
172
|
+
"Open a GitHub issue with a small reproduction, the component name, and the behavior you expected to see.",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: 9,
|
|
176
|
+
category: "support",
|
|
177
|
+
title: "Where should I look for examples?",
|
|
178
|
+
content:
|
|
179
|
+
"Start with the component docs and block gallery. Each item shows the install command and source files you can copy or customize.",
|
|
180
|
+
},
|
|
181
|
+
];
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
|
|
4
|
+
import React from "react";
|
|
5
|
+
import {
|
|
6
|
+
Accordion,
|
|
7
|
+
AccordionContent,
|
|
8
|
+
AccordionItem,
|
|
9
|
+
AccordionTrigger,
|
|
10
|
+
} from "@/registry/default/ui/accordion";
|
|
11
|
+
import { Button } from "@/registry/default/ui/button";
|
|
12
|
+
import {
|
|
13
|
+
Empty,
|
|
14
|
+
EmptyContent,
|
|
15
|
+
EmptyHeader,
|
|
16
|
+
EmptyMedia,
|
|
17
|
+
EmptyTitle,
|
|
18
|
+
} from "@/registry/default/ui/empty";
|
|
19
|
+
import {
|
|
20
|
+
InputGroup,
|
|
21
|
+
InputGroupAddon,
|
|
22
|
+
InputGroupInput,
|
|
23
|
+
} from "@/registry/default/ui/input-group";
|
|
24
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
25
|
+
import { SearchIcon, SearchSlashIcon } from "lucide-react";
|
|
26
|
+
|
|
27
|
+
export function FaqsSection() {
|
|
28
|
+
const [searchTerm, setSearchTerm] = React.useState("");
|
|
29
|
+
const [activeCategory, setActiveCategory] = React.useState("all");
|
|
30
|
+
|
|
31
|
+
const categories = [
|
|
32
|
+
{ id: "all", label: "All" },
|
|
33
|
+
{ id: "getting-started", label: "Getting Started" },
|
|
34
|
+
{ id: "features", label: "Features" },
|
|
35
|
+
{ id: "license", label: "License" },
|
|
36
|
+
{ id: "support", label: "Support" },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
const filtered = faqs.filter((faq) => {
|
|
40
|
+
const matchesCategory =
|
|
41
|
+
activeCategory === "all" || faq.category === activeCategory;
|
|
42
|
+
const matchesSearch =
|
|
43
|
+
faq.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
|
44
|
+
faq.content.toLowerCase().includes(searchTerm.toLowerCase());
|
|
45
|
+
return matchesCategory && matchesSearch;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div className="mx-auto min-h-screen w-full max-w-3xl md:border-x">
|
|
50
|
+
<div className="px-4 py-16 lg:px-6">
|
|
51
|
+
<h1 className="mb-4 font-semibold text-3xl md:text-4xl">
|
|
52
|
+
Frequently Asked Questions
|
|
53
|
+
</h1>
|
|
54
|
+
<p className="mb-8 max-w-2xl text-muted-foreground">
|
|
55
|
+
Find answers to common questions about LoveUI. Can't find what you're
|
|
56
|
+
looking for? Our support team is here to help.
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<InputGroup className="max-w-sm">
|
|
60
|
+
<InputGroupInput
|
|
61
|
+
onChange={(e) => setSearchTerm(e.target.value)}
|
|
62
|
+
placeholder="Search FAQs..."
|
|
63
|
+
value={searchTerm}
|
|
64
|
+
/>
|
|
65
|
+
<InputGroupAddon>
|
|
66
|
+
<SearchIcon data-icon="inline-start" />
|
|
67
|
+
</InputGroupAddon>
|
|
68
|
+
</InputGroup>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<FullWidthDivider contained />
|
|
72
|
+
|
|
73
|
+
<div className="flex flex-wrap gap-1 border-b px-4 md:gap-3">
|
|
74
|
+
{categories.map((cat) => (
|
|
75
|
+
<button
|
|
76
|
+
className="flex flex-col"
|
|
77
|
+
key={cat.id}
|
|
78
|
+
onClick={() => setActiveCategory(cat.id)}
|
|
79
|
+
type="button"
|
|
80
|
+
>
|
|
81
|
+
<span
|
|
82
|
+
className={cn(
|
|
83
|
+
"p-1 text-muted-foreground text-sm hover:text-primary md:p-2 md:text-base",
|
|
84
|
+
activeCategory === cat.id && "text-primary"
|
|
85
|
+
)}
|
|
86
|
+
>
|
|
87
|
+
{cat.label}
|
|
88
|
+
</span>
|
|
89
|
+
{activeCategory === cat.id && (
|
|
90
|
+
<span className="h-0.5 w-full rounded-full bg-primary" />
|
|
91
|
+
)}
|
|
92
|
+
</button>
|
|
93
|
+
))}
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<Accordion
|
|
97
|
+
className="space-y-2 border-0! px-4 py-12 lg:px-6"
|
|
98
|
+
collapsible
|
|
99
|
+
type="single"
|
|
100
|
+
>
|
|
101
|
+
{filtered.map((faq) => (
|
|
102
|
+
<AccordionItem
|
|
103
|
+
className="rounded-lg border px-4 shadow-xs"
|
|
104
|
+
key={faq.id}
|
|
105
|
+
value={faq.id.toString()}
|
|
106
|
+
>
|
|
107
|
+
<AccordionTrigger className="hover:no-underline">
|
|
108
|
+
{faq.title}
|
|
109
|
+
</AccordionTrigger>
|
|
110
|
+
<AccordionContent className="pt-2 pb-4 text-muted-foreground">
|
|
111
|
+
{faq.content}
|
|
112
|
+
</AccordionContent>
|
|
113
|
+
</AccordionItem>
|
|
114
|
+
))}
|
|
115
|
+
</Accordion>
|
|
116
|
+
|
|
117
|
+
{filtered.length === 0 && (
|
|
118
|
+
<Empty>
|
|
119
|
+
<EmptyHeader>
|
|
120
|
+
<EmptyMedia variant="icon">
|
|
121
|
+
<SearchIcon
|
|
122
|
+
/>
|
|
123
|
+
</EmptyMedia>
|
|
124
|
+
<EmptyTitle>No FAQs found matching your search.</EmptyTitle>
|
|
125
|
+
</EmptyHeader>
|
|
126
|
+
<EmptyContent>
|
|
127
|
+
<Button onClick={() => setSearchTerm("")} variant="outline">
|
|
128
|
+
<SearchSlashIcon data-icon="inline-start" />
|
|
129
|
+
Clear search
|
|
130
|
+
</Button>
|
|
131
|
+
</EmptyContent>
|
|
132
|
+
</Empty>
|
|
133
|
+
)}
|
|
134
|
+
|
|
135
|
+
<div className="flex items-center px-4 py-6 lg:px-6">
|
|
136
|
+
<p className="text-muted-foreground">
|
|
137
|
+
Can't find what you're looking for?{" "}
|
|
138
|
+
<a className="text-primary hover:underline" href="#">
|
|
139
|
+
Contact Us
|
|
140
|
+
</a>
|
|
141
|
+
</p>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const faqs = [
|
|
148
|
+
{
|
|
149
|
+
id: 1,
|
|
150
|
+
category: "getting-started",
|
|
151
|
+
title: "How do I add my first component?",
|
|
152
|
+
content:
|
|
153
|
+
"Run npx love-ui@latest add loveui to install the shared setup, then add a component such as npx love-ui@latest add button.",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 2,
|
|
157
|
+
category: "getting-started",
|
|
158
|
+
title: "What are the system requirements?",
|
|
159
|
+
content:
|
|
160
|
+
"LoveUI is designed for React projects that use Tailwind CSS. If your project uses a different import alias, update the copied imports after installation.",
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: 3,
|
|
164
|
+
category: "features",
|
|
165
|
+
title: "Can I use LoveUI with a product team?",
|
|
166
|
+
content:
|
|
167
|
+
"Yes. Because LoveUI components live in your codebase, teams can review, edit, and version them like any other application source.",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 4,
|
|
171
|
+
category: "features",
|
|
172
|
+
title: "What does the component library include?",
|
|
173
|
+
content:
|
|
174
|
+
"LoveUI includes primitives, examples, and full-page blocks for common product interfaces, from forms and dialogs to auth screens and FAQ sections.",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 5,
|
|
178
|
+
category: "features",
|
|
179
|
+
title: "Does LoveUI include AI agent guidance?",
|
|
180
|
+
content:
|
|
181
|
+
"Yes. LoveUI Skills gives AI coding agents design rules, workflow steps, and quality checks for building better interfaces with LoveUI.",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: 6,
|
|
185
|
+
category: "license",
|
|
186
|
+
title: "Is LoveUI free to use?",
|
|
187
|
+
content:
|
|
188
|
+
"Yes. LoveUI is open source under the MIT license, so you can use it in personal, internal, and commercial projects.",
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: 7,
|
|
192
|
+
category: "license",
|
|
193
|
+
title: "Do I have to keep the generated files unchanged?",
|
|
194
|
+
content:
|
|
195
|
+
"No. The source is copied into your app specifically so you can rename, restyle, and reshape it for your product.",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 8,
|
|
199
|
+
category: "support",
|
|
200
|
+
title: "How do I report a bug?",
|
|
201
|
+
content:
|
|
202
|
+
"Open a GitHub issue with a small reproduction, the component name, and the behavior you expected to see.",
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
id: 9,
|
|
206
|
+
category: "support",
|
|
207
|
+
title: "Where should I look for examples?",
|
|
208
|
+
content:
|
|
209
|
+
"Start with the component docs and block gallery. Each item shows the install command and source files you can copy or customize.",
|
|
210
|
+
},
|
|
211
|
+
];
|
|
@@ -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,73 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import type React from "react";
|
|
3
|
+
import { ZapIcon, ShieldCheckIcon, ActivityIcon, GlobeIcon } from "lucide-react";
|
|
4
|
+
|
|
5
|
+
type FeatureType = {
|
|
6
|
+
title: string;
|
|
7
|
+
icon: React.ReactNode;
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function FeatureSection() {
|
|
12
|
+
return (
|
|
13
|
+
<div className="mx-auto grid max-w-5xl grid-cols-2 gap-4 py-4 md:grid-cols-4">
|
|
14
|
+
{features.map((feature, index) => (
|
|
15
|
+
<div
|
|
16
|
+
className={cn(
|
|
17
|
+
"relative flex flex-col items-center justify-center p-2",
|
|
18
|
+
"after:absolute after:inset-y-0 after:right-0 after:h-full after:w-px after:bg-linear-to-b after:from-foreground/6 after:via-foreground/25 after:to-foreground/6",
|
|
19
|
+
"[&_svg]:size-6 [&_svg]:text-muted-foreground",
|
|
20
|
+
{
|
|
21
|
+
"after:hidden": index === features.length - 1,
|
|
22
|
+
"after:hidden after:md:block": index === 1,
|
|
23
|
+
}
|
|
24
|
+
)}
|
|
25
|
+
key={feature.title}
|
|
26
|
+
>
|
|
27
|
+
{feature.icon}
|
|
28
|
+
<h3 className="mt-4 text-center font-medium text-xs md:text-sm lg:text-base">
|
|
29
|
+
{feature.title}
|
|
30
|
+
</h3>
|
|
31
|
+
<p className="mt-1 text-center text-[10px] text-muted-foreground md:text-xs">
|
|
32
|
+
{feature.description}
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const features: FeatureType[] = [
|
|
41
|
+
{
|
|
42
|
+
title: "Lightning Fast",
|
|
43
|
+
icon: (
|
|
44
|
+
<ZapIcon
|
|
45
|
+
/>
|
|
46
|
+
),
|
|
47
|
+
description: "Blazing fast edge performance.",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: "Secure by Design",
|
|
51
|
+
icon: (
|
|
52
|
+
<ShieldCheckIcon
|
|
53
|
+
/>
|
|
54
|
+
),
|
|
55
|
+
description: "Security by design, zero config.",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: "Real-time Sync",
|
|
59
|
+
icon: (
|
|
60
|
+
<ActivityIcon
|
|
61
|
+
/>
|
|
62
|
+
),
|
|
63
|
+
description: "Real-time sync across devices.",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
title: "Global Scale",
|
|
67
|
+
icon: (
|
|
68
|
+
<GlobeIcon
|
|
69
|
+
/>
|
|
70
|
+
),
|
|
71
|
+
description: "Instant global deployment.",
|
|
72
|
+
},
|
|
73
|
+
];
|
|
@@ -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,97 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import type React from "react";
|
|
3
|
+
import { DecorIcon } from "./decor-icon";
|
|
4
|
+
import { HistoryIcon, SquareDashedIcon, CommandIcon } 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 max-w-5xl">
|
|
15
|
+
<h2 className="mb-5 text-center font-medium text-2xl md:text-3xl">
|
|
16
|
+
Ensuring your speedy workflow
|
|
17
|
+
</h2>
|
|
18
|
+
|
|
19
|
+
<div className="relative">
|
|
20
|
+
{/* Corner Icons */}
|
|
21
|
+
<DecorIcon
|
|
22
|
+
className="size-6 stroke-2 stroke-border"
|
|
23
|
+
position="top-left"
|
|
24
|
+
/>
|
|
25
|
+
<DecorIcon
|
|
26
|
+
className="size-6 stroke-2 stroke-border"
|
|
27
|
+
position="top-right"
|
|
28
|
+
/>
|
|
29
|
+
<DecorIcon
|
|
30
|
+
className="size-6 stroke-2 stroke-border"
|
|
31
|
+
position="bottom-left"
|
|
32
|
+
/>
|
|
33
|
+
<DecorIcon
|
|
34
|
+
className="size-6 stroke-2 stroke-border"
|
|
35
|
+
position="bottom-right"
|
|
36
|
+
/>
|
|
37
|
+
|
|
38
|
+
<DashedLine className="-top-[1.5px] right-3 left-3" />
|
|
39
|
+
<DashedLine className="top-3 -right-[1.5px] bottom-3" />
|
|
40
|
+
<DashedLine className="top-3 bottom-3 -left-[1.5px]" />
|
|
41
|
+
<DashedLine className="right-3 -bottom-[1.5px] left-3" />
|
|
42
|
+
|
|
43
|
+
<div className="grid grid-cols-1 md:grid-cols-3">
|
|
44
|
+
{features.map((feature) => (
|
|
45
|
+
<div
|
|
46
|
+
className="group [&_svg]:mask-b-from-0% relative p-8 [&_svg]:size-7 [&_svg]:text-muted-foreground"
|
|
47
|
+
key={feature.title}
|
|
48
|
+
>
|
|
49
|
+
{feature.icon}
|
|
50
|
+
<h3 className="font-medium text-lg">{feature.title}</h3>
|
|
51
|
+
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
52
|
+
{feature.description}
|
|
53
|
+
</p>
|
|
54
|
+
<DashedLine className="right-5 bottom-0 left-5 group-last:hidden md:top-5 md:right-0 md:bottom-5 md:left-full" />
|
|
55
|
+
</div>
|
|
56
|
+
))}
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function DashedLine({ className, ...props }: React.ComponentProps<"div">) {
|
|
64
|
+
return (
|
|
65
|
+
<div
|
|
66
|
+
className={cn("absolute border-collapse border border-dashed", className)}
|
|
67
|
+
{...props}
|
|
68
|
+
/>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const features: FeatureType[] = [
|
|
73
|
+
{
|
|
74
|
+
title: "Auto-Save Everything",
|
|
75
|
+
icon: (
|
|
76
|
+
<HistoryIcon
|
|
77
|
+
/>
|
|
78
|
+
),
|
|
79
|
+
description: "Write without worry, every time.",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
title: "Drag-and-Drop Blocks",
|
|
83
|
+
icon: (
|
|
84
|
+
<SquareDashedIcon
|
|
85
|
+
/>
|
|
86
|
+
),
|
|
87
|
+
description: "Rearrange sections with the block editor.",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
title: "Keyboard Shortcuts",
|
|
91
|
+
icon: (
|
|
92
|
+
<CommandIcon
|
|
93
|
+
/>
|
|
94
|
+
),
|
|
95
|
+
description: "Speed up your workflow with quick keys.",
|
|
96
|
+
},
|
|
97
|
+
];
|