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,16 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
|
|
3
|
+
export function AuthDivider({
|
|
4
|
+
children,
|
|
5
|
+
...props
|
|
6
|
+
}: React.ComponentProps<"div">) {
|
|
7
|
+
return (
|
|
8
|
+
<div className="relative flex w-full items-center" {...props}>
|
|
9
|
+
<div className="w-full border-t" />
|
|
10
|
+
<div className="flex w-max justify-center text-nowrap px-2 text-muted-foreground text-xs">
|
|
11
|
+
{children}
|
|
12
|
+
</div>
|
|
13
|
+
<div className="w-full border-t" />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -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,84 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import { GithubIcon } from "./icons/github-icon";
|
|
3
|
+
import { GoogleIcon } from "./icons/google-icon";
|
|
4
|
+
import { Logo } from "./logo";
|
|
5
|
+
import { Button } from "@/registry/default/ui/button";
|
|
6
|
+
import {
|
|
7
|
+
InputGroup,
|
|
8
|
+
InputGroupAddon,
|
|
9
|
+
InputGroupInput,
|
|
10
|
+
} from "@/registry/default/ui/input-group";
|
|
11
|
+
import { AuthDivider } from "./ui/auth-divider";
|
|
12
|
+
import { AtSignIcon } from "lucide-react";
|
|
13
|
+
|
|
14
|
+
export function AuthPage() {
|
|
15
|
+
return (
|
|
16
|
+
<div className="relative w-full overflow-hidden md:h-screen">
|
|
17
|
+
<div
|
|
18
|
+
className={cn(
|
|
19
|
+
"relative mx-auto flex min-h-screen w-full max-w-sm flex-col justify-between p-6 md:p-8"
|
|
20
|
+
)}
|
|
21
|
+
>
|
|
22
|
+
<div className="flex justify-center">
|
|
23
|
+
<a href="#">
|
|
24
|
+
<Logo className="h-4.5" />
|
|
25
|
+
</a>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div className="fade-in slide-in-from-bottom-4 w-full animate-in space-y-4 duration-600">
|
|
29
|
+
<div className="flex flex-col space-y-1">
|
|
30
|
+
<h1 className="font-bold text-2xl tracking-wide">Join Now!</h1>
|
|
31
|
+
<p className="text-base text-muted-foreground">
|
|
32
|
+
Sign in or create your LoveUI account.
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
<form className="space-y-2">
|
|
36
|
+
<InputGroup>
|
|
37
|
+
<InputGroupInput
|
|
38
|
+
placeholder="your.email@example.com"
|
|
39
|
+
type="email"
|
|
40
|
+
/>
|
|
41
|
+
<InputGroupAddon align="inline-start">
|
|
42
|
+
<AtSignIcon
|
|
43
|
+
/>
|
|
44
|
+
</InputGroupAddon>
|
|
45
|
+
</InputGroup>
|
|
46
|
+
|
|
47
|
+
<Button className="w-full" size="sm" type="button">
|
|
48
|
+
Continue With Email
|
|
49
|
+
</Button>
|
|
50
|
+
</form>
|
|
51
|
+
<AuthDivider>OR CONTINUE WITH</AuthDivider>
|
|
52
|
+
<div className="space-y-2">
|
|
53
|
+
<Button className="w-full" type="button" variant="outline">
|
|
54
|
+
<GoogleIcon data-icon="inline-start" />
|
|
55
|
+
Google
|
|
56
|
+
</Button>
|
|
57
|
+
<Button className="w-full" type="button" variant="outline">
|
|
58
|
+
<GithubIcon data-icon="inline-start" />
|
|
59
|
+
GitHub
|
|
60
|
+
</Button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<p className="text-center text-muted-foreground text-sm">
|
|
65
|
+
This site is protected by reCAPTCHA and the Google{" "}
|
|
66
|
+
<a
|
|
67
|
+
className="underline underline-offset-4 hover:text-primary"
|
|
68
|
+
href="#"
|
|
69
|
+
>
|
|
70
|
+
Privacy Policy
|
|
71
|
+
</a>{" "}
|
|
72
|
+
and{" "}
|
|
73
|
+
<a
|
|
74
|
+
className="underline underline-offset-4 hover:text-primary"
|
|
75
|
+
href="#"
|
|
76
|
+
>
|
|
77
|
+
Terms of Service
|
|
78
|
+
</a>{" "}
|
|
79
|
+
apply.
|
|
80
|
+
</p>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -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,14 @@
|
|
|
1
|
+
export function GoogleIcon(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
|
+
<g>
|
|
10
|
+
<path d="M12.479,14.265v-3.279h11.049c0.108,0.571,0.164,1.247,0.164,1.979c0,2.46-0.672,5.502-2.84,7.669C18.744,22.829,16.051,24,12.483,24C5.869,24,0.308,18.613,0.308,12S5.869,0,12.483,0c3.659,0,6.265,1.436,8.223,3.307L18.392,5.62c-1.404-1.317-3.307-2.341-5.913-2.341C7.65,3.279,3.873,7.171,3.873,12s3.777,8.721,8.606,8.721c3.132,0,4.916-1.258,6.059-2.401c0.927-0.927,1.537-2.251,1.777-4.059L12.479,14.265z" />
|
|
11
|
+
</g>
|
|
12
|
+
</svg>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
2
|
+
<svg
|
|
3
|
+
width="220"
|
|
4
|
+
height="48"
|
|
5
|
+
viewBox="0 0 220 48"
|
|
6
|
+
fill="none"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
>
|
|
9
|
+
<defs>
|
|
10
|
+
<linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
|
|
11
|
+
<stop stopColor="#38A3FF" />
|
|
12
|
+
<stop offset="0.55" stopColor="#1266F1" />
|
|
13
|
+
<stop offset="1" stopColor="#0B3FD8" />
|
|
14
|
+
</linearGradient>
|
|
15
|
+
|
|
16
|
+
<linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
|
|
17
|
+
<stop stopColor="#FFFFFF" stopOpacity="0.9" />
|
|
18
|
+
<stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
|
|
19
|
+
</linearGradient>
|
|
20
|
+
</defs>
|
|
21
|
+
|
|
22
|
+
<g transform="translate(0 0)">
|
|
23
|
+
<rect
|
|
24
|
+
x="0"
|
|
25
|
+
y="0"
|
|
26
|
+
width="48"
|
|
27
|
+
height="48"
|
|
28
|
+
rx="12"
|
|
29
|
+
fill="url(#loveui-blue)"
|
|
30
|
+
/>
|
|
31
|
+
|
|
32
|
+
<path
|
|
33
|
+
d="
|
|
34
|
+
M12 10
|
|
35
|
+
C12 8.3 13.3 7 15 7
|
|
36
|
+
H18
|
|
37
|
+
C19.7 7 21 8.3 21 10
|
|
38
|
+
V25
|
|
39
|
+
C21 27.2 22.8 29 25 29
|
|
40
|
+
H35
|
|
41
|
+
C36.7 29 38 30.3 38 32
|
|
42
|
+
V34
|
|
43
|
+
C38 35.7 36.7 37 35 37
|
|
44
|
+
H15
|
|
45
|
+
C13.3 37 12 35.7 12 34
|
|
46
|
+
Z"
|
|
47
|
+
fill="white"
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
<rect
|
|
51
|
+
x="28"
|
|
52
|
+
y="14"
|
|
53
|
+
width="9"
|
|
54
|
+
height="9"
|
|
55
|
+
rx="3"
|
|
56
|
+
fill="white"
|
|
57
|
+
/>
|
|
58
|
+
|
|
59
|
+
<path
|
|
60
|
+
d="
|
|
61
|
+
M21 25
|
|
62
|
+
C21 27.2 22.8 29 25 29
|
|
63
|
+
H27
|
|
64
|
+
V34
|
|
65
|
+
C27 35.7 25.7 37 24 37
|
|
66
|
+
H15
|
|
67
|
+
C13.3 37 12 35.7 12 34
|
|
68
|
+
V29
|
|
69
|
+
H18
|
|
70
|
+
C19.7 29 21 27.7 21 25
|
|
71
|
+
Z"
|
|
72
|
+
fill="url(#loveui-shine)"
|
|
73
|
+
opacity="0.5"
|
|
74
|
+
/>
|
|
75
|
+
</g>
|
|
76
|
+
<text
|
|
77
|
+
x="62"
|
|
78
|
+
y="31"
|
|
79
|
+
fontFamily="Inter, Geist, sans-serif"
|
|
80
|
+
fontSize="24"
|
|
81
|
+
fontWeight="700"
|
|
82
|
+
letterSpacing="-0.04em"
|
|
83
|
+
fill="currentColor"
|
|
84
|
+
>
|
|
85
|
+
LoveUI
|
|
86
|
+
</text>
|
|
87
|
+
</svg>
|
|
88
|
+
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type React from "react";
|
|
2
|
+
|
|
3
|
+
export function AuthDivider({
|
|
4
|
+
children,
|
|
5
|
+
...props
|
|
6
|
+
}: React.ComponentProps<"div">) {
|
|
7
|
+
return (
|
|
8
|
+
<div className="relative flex w-full items-center" {...props}>
|
|
9
|
+
<div className="w-full border-t" />
|
|
10
|
+
<div className="flex w-max justify-center text-nowrap px-2 text-muted-foreground text-xs">
|
|
11
|
+
{children}
|
|
12
|
+
</div>
|
|
13
|
+
<div className="w-full border-t" />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -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 { FullWidthDivider } from "./full-width-divider";
|
|
3
|
+
|
|
4
|
+
const blogs = [
|
|
5
|
+
{
|
|
6
|
+
title: "Why LoveUI Ships Source",
|
|
7
|
+
date: "May 20 2026",
|
|
8
|
+
description:
|
|
9
|
+
"How editable components give teams more control than a black-box UI package.",
|
|
10
|
+
href: "#",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
title: "Blocks That Feel Finished",
|
|
14
|
+
date: "May 14 2026",
|
|
15
|
+
description: "Design notes from building polished sections on top of primitives.",
|
|
16
|
+
href: "#",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
title: "A Better Registry Workflow",
|
|
20
|
+
date: "Apr 19 2026",
|
|
21
|
+
description: "Install only the files you need, then shape them around your product.",
|
|
22
|
+
href: "#",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
title: "Designing for AI Agents",
|
|
26
|
+
date: "Apr 12 2026",
|
|
27
|
+
description: "Why LoveUI pairs components with guidance for better interface work.",
|
|
28
|
+
href: "#",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Composing Product Screens",
|
|
32
|
+
date: "Mar 23 2026",
|
|
33
|
+
description: "How examples, blocks, and primitives work together in LoveUI.",
|
|
34
|
+
href: "#",
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export function BlogsSection() {
|
|
39
|
+
return (
|
|
40
|
+
<div className="mx-auto flex min-h-screen w-full max-w-3xl flex-col justify-start md:border-x">
|
|
41
|
+
<div className="space-y-2 px-4 py-8 md:py-12">
|
|
42
|
+
<h1 className="font-semibold text-2xl tracking-wide md:text-4xl">
|
|
43
|
+
Latest LoveUI Notes
|
|
44
|
+
</h1>
|
|
45
|
+
<p className="text-muted-foreground text-sm">
|
|
46
|
+
Updates on editable UI source, production blocks, and design system
|
|
47
|
+
workflows.
|
|
48
|
+
</p>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div className="relative">
|
|
52
|
+
<FullWidthDivider />
|
|
53
|
+
<div className="divide-y">
|
|
54
|
+
{blogs.map((blog) => (
|
|
55
|
+
<BlogCard {...blog} key={blog.title} />
|
|
56
|
+
))}
|
|
57
|
+
</div>
|
|
58
|
+
<FullWidthDivider />
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function BlogCard({
|
|
65
|
+
title,
|
|
66
|
+
date,
|
|
67
|
+
description,
|
|
68
|
+
className,
|
|
69
|
+
...props
|
|
70
|
+
}: React.ComponentProps<"a"> & {
|
|
71
|
+
title: string;
|
|
72
|
+
date: string;
|
|
73
|
+
description: string;
|
|
74
|
+
}) {
|
|
75
|
+
return (
|
|
76
|
+
<a
|
|
77
|
+
className={cn(
|
|
78
|
+
"group flex h-24 w-full flex-col justify-center gap-y-1 p-4 hover:cursor-pointer hover:bg-accent/30 active:bg-accent dark:active:bg-accent/50",
|
|
79
|
+
className
|
|
80
|
+
)}
|
|
81
|
+
{...props}
|
|
82
|
+
>
|
|
83
|
+
<div className="relative flex items-end justify-center gap-2">
|
|
84
|
+
<h3 className="whitespace-nowrap font-medium text-foreground text-lg md:text-xl">
|
|
85
|
+
{title}
|
|
86
|
+
</h3>
|
|
87
|
+
<span className="mb-[6px] w-full border-b-2 border-dashed" />
|
|
88
|
+
<span className="whitespace-nowrap font-mono text-muted-foreground text-xs uppercase group-hover:text-foreground md:text-sm">
|
|
89
|
+
{date}
|
|
90
|
+
</span>
|
|
91
|
+
</div>
|
|
92
|
+
<div className="max-w-sm text-muted-foreground text-sm group-hover:text-foreground md:max-w-full md:text-base">
|
|
93
|
+
{description}
|
|
94
|
+
</div>
|
|
95
|
+
</a>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
@@ -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,158 @@
|
|
|
1
|
+
import { cn } from "@/lib/utils";
|
|
2
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
3
|
+
import { GridFiller } from "./grid-filler";
|
|
4
|
+
|
|
5
|
+
type BlogType = {
|
|
6
|
+
title: string;
|
|
7
|
+
date: string;
|
|
8
|
+
description: string;
|
|
9
|
+
category: string;
|
|
10
|
+
author: string;
|
|
11
|
+
href: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const blogs: BlogType[] = [
|
|
15
|
+
{
|
|
16
|
+
title: "Why LoveUI Ships Components as Editable Source",
|
|
17
|
+
date: "May 20 2026",
|
|
18
|
+
category: "Registry",
|
|
19
|
+
author: "Connor Love",
|
|
20
|
+
description:
|
|
21
|
+
"A closer look at why LoveUI copies code into your app instead of hiding interface decisions inside a package.",
|
|
22
|
+
href: "#",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
title: "Designing Blocks That Feel Ready to Ship",
|
|
26
|
+
date: "May 14 2026",
|
|
27
|
+
category: "Blocks",
|
|
28
|
+
author: "Connor Love",
|
|
29
|
+
description:
|
|
30
|
+
"How LoveUI turns common product sections into polished starting points while keeping the implementation easy to reshape.",
|
|
31
|
+
href: "#",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: "Building Better Interfaces with Agent Skills",
|
|
35
|
+
date: "Apr 29 2026",
|
|
36
|
+
category: "AI",
|
|
37
|
+
author: "Connor Love",
|
|
38
|
+
description:
|
|
39
|
+
"Why the LoveUI skill pack gives coding agents concrete design rules instead of vague instructions.",
|
|
40
|
+
href: "#",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
title: "Composing Product Pages from Small Primitives",
|
|
44
|
+
date: "Apr 12 2026",
|
|
45
|
+
category: "Components",
|
|
46
|
+
author: "Connor Love",
|
|
47
|
+
description:
|
|
48
|
+
"How buttons, empty states, accordions, and layout helpers become complete product surfaces inside LoveUI.",
|
|
49
|
+
href: "#",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
title: "Keeping a Design System Close to the App",
|
|
53
|
+
date: "Mar 23 2026",
|
|
54
|
+
category: "Systems",
|
|
55
|
+
author: "Connor Love",
|
|
56
|
+
description:
|
|
57
|
+
"LoveUI is designed so teams can review, version, and customize interface code like any other source file.",
|
|
58
|
+
href: "#",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: "What Makes a Registry Example Useful",
|
|
62
|
+
date: "Mar 05 2026",
|
|
63
|
+
category: "Docs",
|
|
64
|
+
author: "Connor Love",
|
|
65
|
+
description:
|
|
66
|
+
"Examples should show real composition patterns, not isolated screenshots. That principle shapes the LoveUI docs.",
|
|
67
|
+
href: "#",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: "From Single Component to Full Section",
|
|
71
|
+
date: "Feb 18 2026",
|
|
72
|
+
category: "Engineering",
|
|
73
|
+
author: "Connor Love",
|
|
74
|
+
description:
|
|
75
|
+
"The practical patterns behind moving from reusable primitives to full CTA, FAQ, pricing, and testimonial blocks.",
|
|
76
|
+
href: "#",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
title: "The Case for Owning Your UI",
|
|
80
|
+
date: "Feb 02 2026",
|
|
81
|
+
category: "Workflow",
|
|
82
|
+
author: "Connor Love",
|
|
83
|
+
description:
|
|
84
|
+
"When product details matter, copied source gives teams the confidence to adjust behavior, styling, and structure directly.",
|
|
85
|
+
href: "#",
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
export function BlogsSection() {
|
|
90
|
+
return (
|
|
91
|
+
<div className="mx-auto w-full max-w-5xl py-4 lg:border-x">
|
|
92
|
+
<div className="space-y-2 px-4 py-8 md:py-12">
|
|
93
|
+
<h1 className="font-semibold text-2xl tracking-wide md:text-4xl">
|
|
94
|
+
Latest LoveUI Writing
|
|
95
|
+
</h1>
|
|
96
|
+
<p className="text-muted-foreground text-sm">
|
|
97
|
+
Notes from Connor Love on components, blocks, registries, and
|
|
98
|
+
source-first interface systems.
|
|
99
|
+
</p>
|
|
100
|
+
</div>
|
|
101
|
+
<FullWidthDivider contained={true} />
|
|
102
|
+
<div className="grid grid-cols-1 gap-px bg-border sm:grid-cols-2 md:grid-cols-3">
|
|
103
|
+
{blogs.map((blog) => (
|
|
104
|
+
<BlogCard {...blog} key={blog.title} />
|
|
105
|
+
))}
|
|
106
|
+
<GridFiller
|
|
107
|
+
className="bg-background"
|
|
108
|
+
mdColumns={3}
|
|
109
|
+
smColumns={4}
|
|
110
|
+
totalItems={blogs.length}
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
<FullWidthDivider contained={true} />
|
|
114
|
+
</div>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function BlogCard({
|
|
119
|
+
title,
|
|
120
|
+
date,
|
|
121
|
+
description,
|
|
122
|
+
category,
|
|
123
|
+
author,
|
|
124
|
+
className,
|
|
125
|
+
...props
|
|
126
|
+
}: React.ComponentProps<"a"> & BlogType) {
|
|
127
|
+
return (
|
|
128
|
+
<a
|
|
129
|
+
className={cn(
|
|
130
|
+
"group w-full bg-background px-6 py-12 text-muted-foreground hover:cursor-pointer hover:text-foreground active:bg-accent md:px-8 active:dark:bg-accent/50",
|
|
131
|
+
className
|
|
132
|
+
)}
|
|
133
|
+
{...props}
|
|
134
|
+
>
|
|
135
|
+
<h3 className="mb-3 line-clamp-2 font-medium text-foreground text-lg md:text-xl">
|
|
136
|
+
{title}
|
|
137
|
+
</h3>
|
|
138
|
+
<div className="mb-3 flex items-center gap-2">
|
|
139
|
+
<span className="text-muted-foreground text-xs group-hover:text-foreground">
|
|
140
|
+
{category}
|
|
141
|
+
</span>
|
|
142
|
+
<div className="inline-flex size-1 rounded-full bg-muted-foreground" />
|
|
143
|
+
<span className="text-muted-foreground text-xs group-hover:text-foreground">
|
|
144
|
+
{date}
|
|
145
|
+
</span>
|
|
146
|
+
</div>
|
|
147
|
+
<p className="mb-8 line-clamp-3 text-muted-foreground text-sm tracking-wide group-hover:text-foreground">
|
|
148
|
+
{description}
|
|
149
|
+
</p>
|
|
150
|
+
<div className="flex items-center gap-1.5">
|
|
151
|
+
by
|
|
152
|
+
<span className="font-medium font-mono text-foreground/80 text-xs group-hover:text-foreground md:text-sm">
|
|
153
|
+
{author}
|
|
154
|
+
</span>
|
|
155
|
+
</div>
|
|
156
|
+
</a>
|
|
157
|
+
);
|
|
158
|
+
}
|
|
@@ -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
|
+
}
|