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
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawnSync as
|
|
2
|
+
import{spawnSync as fe}from"child_process";import{existsSync as g}from"fs";import{cp as pe,mkdir as R,readdir as se,readFile as h,writeFile as T}from"fs/promises";import ne from"os";import r from"path";import{createInterface as me}from"readline/promises";import{pathToFileURL as he,fileURLToPath as be}from"url";var ke=r.dirname(be(import.meta.url)),J=r.resolve(ke,".."),z=r.join(J,"packages"),F=r.join(J,"registry"),ye=r.join(J,"skills"),re=new Set([".ts",".tsx",".cts",".mts",".js",".jsx",".css",".scss",".sass",".mdx",".md",".svg"]),V=new Set(["node_modules","dist",".turbo",".next","build",".cache"]),ie=new Set(["accordion","alert","alert-dialog","autocomplete","avatar","badge","breadcrumb","button","card","checkbox","checkbox-group","collapsible","combobox","command","dialog","empty","field","fieldset","form","frame","group","input","input-group","label","menu","meter","number-field","pagination","popover","preview-card","progress","radio-group","scroll-area","select","separator","sheet","skeleton","slider","switch","table","tabs","textarea","toast","toggle","toggle-group","toolbar","tooltip"]),ae=new Map([["auth-one",{sourceDir:"auth1",targetBase:"components/blocks/auth/one"}],["auth-two",{sourceDir:"auth2",targetBase:"components/blocks/auth/two"}],["auth-three",{sourceDir:"auth3",targetBase:"components/blocks/auth/three"}],["header-one",{sourceDir:"header1",targetBase:"components/blocks/header/one"}],["header-two",{sourceDir:"header2",targetBase:"components/blocks/header/two"}],["header-three",{sourceDir:"header3",targetBase:"components/blocks/header/three",dependencies:{"@base-ui/react":"^1.5.0"}}],["footer-one",{sourceDir:"footer1",targetBase:"components/blocks/footer/one"}],["footer-two",{sourceDir:"footer2",targetBase:"components/blocks/footer/two"}],["footer-three",{sourceDir:"footer3",targetBase:"components/blocks/footer/three",dependencies:{motion:"^12.40.0"}}],["footer-four",{sourceDir:"footer4",targetBase:"components/blocks/footer/four"}],["footer-five",{sourceDir:"footer5",targetBase:"components/blocks/footer/five"}],["footer-six",{sourceDir:"footer6",targetBase:"components/blocks/footer/six",dependencies:{motion:"^12.40.0"}}],["logo-cloud-one",{sourceDir:"logo-cloud-1",targetBase:"components/blocks/logo-cloud/one"}],["logo-cloud-two",{sourceDir:"logo-cloud-2",targetBase:"components/blocks/logo-cloud/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["logo-cloud-three",{sourceDir:"logo-cloud-3",targetBase:"components/blocks/logo-cloud/three",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["logo-cloud-four",{sourceDir:"logo-cloud-4",targetBase:"components/blocks/logo-cloud/four",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["logo-cloud-five",{sourceDir:"logo-cloud-5",targetBase:"components/blocks/logo-cloud/five"}],["hero-one",{sourceDir:"hero1",targetBase:"components/blocks/hero/one",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["hero-two",{sourceDir:"hero2",targetBase:"components/blocks/hero/two",dependencies:{"class-variance-authority":"^0.7.1",motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["hero-three",{sourceDir:"hero3",targetBase:"components/blocks/hero/three",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["404-one",{sourceDir:"404-1",targetBase:"components/blocks/404/one"}],["404-two",{sourceDir:"404-2",targetBase:"components/blocks/404/two"}],["blog-one",{sourceDir:"blogs1",targetBase:"components/blocks/blog/one"}],["blog-two",{sourceDir:"blogs2",targetBase:"components/blocks/blog/two"}],["blog-three",{sourceDir:"blogs3",targetBase:"components/blocks/blog/three",dependencies:{motion:"^12.40.0"}}],["contact-one",{sourceDir:"contact1",targetBase:"components/blocks/contact/one"}],["contact-two",{sourceDir:"contact2",targetBase:"components/blocks/contact/two"}],["contact-three",{sourceDir:"contact3",targetBase:"components/blocks/contact/three"}],["contact-four",{sourceDir:"contact4",targetBase:"components/blocks/contact/four"}],["contact-five",{sourceDir:"contact5",targetBase:"components/blocks/contact/five",dependencies:{"class-variance-authority":"^0.7.1"}}],["integrations-one",{sourceDir:"integrations1",targetBase:"components/blocks/integrations/one"}],["integrations-two",{sourceDir:"integrations2",targetBase:"components/blocks/integrations/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["integrations-three",{sourceDir:"integrations3",targetBase:"components/blocks/integrations/three"}],["integrations-four",{sourceDir:"integrations4",targetBase:"components/blocks/integrations/four"}],["integrations-five",{sourceDir:"integrations5",targetBase:"components/blocks/integrations/five"}],["cta-one",{sourceDir:"cta-1",targetBase:"components/blocks/cta/one"}],["cta-two",{sourceDir:"cta-2",targetBase:"components/blocks/cta/two"}],["cta-three",{sourceDir:"cta-3",targetBase:"components/blocks/cta/three"}],["cta-four",{sourceDir:"cta-4",targetBase:"components/blocks/cta/four"}],["cta-five",{sourceDir:"cta-5",targetBase:"components/blocks/cta/five"}],["faq-one",{sourceDir:"faq-1",targetBase:"components/blocks/faq/one"}],["faq-two",{sourceDir:"faq-2",targetBase:"components/blocks/faq/two"}],["faq-three",{sourceDir:"faq-3",targetBase:"components/blocks/faq/three"}],["faq-four",{sourceDir:"faq-4",targetBase:"components/blocks/faq/four"}],["faq-five",{sourceDir:"faq-5",targetBase:"components/blocks/faq/five"}],["pricing-one",{sourceDir:"pricing1",targetBase:"components/blocks/pricing/one"}],["pricing-two",{sourceDir:"pricing2",targetBase:"components/blocks/pricing/two"}],["pricing-three",{sourceDir:"pricing3",targetBase:"components/blocks/pricing/three"}],["pricing-four",{sourceDir:"pricing4",targetBase:"components/blocks/pricing/four",dependencies:{"@number-flow/react":"^0.6.0",motion:"^12.40.0"}}],["testimonials-one",{sourceDir:"testimonials1",targetBase:"components/blocks/testimonials/one"}],["testimonials-two",{sourceDir:"testimonials2",targetBase:"components/blocks/testimonials/two"}],["testimonials-three",{sourceDir:"testimonials3",targetBase:"components/blocks/testimonials/three",dependencies:{"class-variance-authority":"^0.7.1"}}],["testimonials-four",{sourceDir:"testimonials4",targetBase:"components/blocks/testimonials/four"}],["testimonials-five",{sourceDir:"testimonials5",targetBase:"components/blocks/testimonials/five"}],["testimonials-six",{sourceDir:"testimonials6",targetBase:"components/blocks/testimonials/six",dependencies:{motion:"^12.40.0","react-use-measure":"^2.1.7"}}],["features-one",{sourceDir:"features1",targetBase:"components/blocks/features/one"}],["features-two",{sourceDir:"features2",targetBase:"components/blocks/features/two",dependencies:{"class-variance-authority":"^0.7.1"}}],["features-three",{sourceDir:"features3",targetBase:"components/blocks/features/three"}],["features-four",{sourceDir:"features4",targetBase:"components/blocks/features/four",dependencies:{"class-variance-authority":"^0.7.1"}}],["features-five",{sourceDir:"features5",targetBase:"components/blocks/features/five"}],["features-six",{sourceDir:"features6",targetBase:"components/blocks/features/six",dependencies:{cobe:"^2.0.1"}}],["image-gallery-one",{sourceDir:"image-gallery-1",targetBase:"components/blocks/image-gallery/one",dependencies:{motion:"^12.40.0"}}]]),we=[".ts",".tsx",".js",".jsx"],ce=/(^|\/)lib\/utils(?:\.[a-z]+)?$/i,ve=/@loveui\/ui\/lib\/utils|@loveui\/shadcn-ui\/lib\/utils|@love-ui\/shadcn-ui\/lib\/utils|@\/lib\/utils|~\/lib\/utils|(?:\.\.\/)+ui\/src\/lib\/utils/,$e=`import { clsx, type ClassValue } from "clsx"
|
|
3
3
|
import { twMerge } from "tailwind-merge"
|
|
4
4
|
|
|
5
5
|
export function cn(...inputs: ClassValue[]) {
|
|
6
6
|
return twMerge(clsx(inputs))
|
|
7
7
|
}
|
|
8
|
-
`,
|
|
8
|
+
`,xe="love-ui globals",De=`/* love-ui globals */
|
|
9
9
|
@custom-variant dark (&:is(.dark *));
|
|
10
10
|
|
|
11
11
|
@theme inline {
|
|
@@ -102,12 +102,12 @@ export function cn(...inputs: ClassValue[]) {
|
|
|
102
102
|
@apply border-border outline-ring/50;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
`;function L(
|
|
106
|
-
${
|
|
107
|
-
${
|
|
105
|
+
`;function L(e){if(!e)return e;let o=e.split("/");return o[o.length-1]||e}function le(e){let o=e.trim();return o&&((o.startsWith("@/")||o.startsWith("~/"))&&(o=`src/${o.slice(2)}`),o.startsWith("/")&&(o=o.slice(1)),o=o.replace(/^\.\//,""),o=o.replace(/\/+$/,""),o)}function je(e){return e.trim().replace(/\/+$/,"")}function S(e){return e.replace(/\.(?:ts|tsx|js|jsx)$/i,"")}function Q(e){let o=S(e);return we.map(s=>`${o}${s}`)}function Pe(e){let o=e.replace(/\/+$/,"");return o==="src"||o.startsWith("src/")?"src":o==="app"||o.startsWith("app/")?"app":null}function ue(e){let o=L(e);return o==="ui"?"love-ui":o}function Be(e){let o=e.loveui??{},s=typeof o.target=="string"?o.target.trim():"",t=o.category;if(s){let i=typeof o.includePackageName=="boolean"?o.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:i}}return t==="feature"?{base:"components",includePackageName:!0}:t==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function Se(e,o,s){let t=e.startsWith("src/")?e.slice(4):e;if(!o.includePackageName){let u=o.base.split("/").filter(Boolean),c=u[u.length-1];c&&t.startsWith(`${c}/`)&&(t=t.slice(c.length+1))}let a=`${(o.includePackageName?`${o.base}/${s}`:o.base).replace(/\/+/g,"/")}/${t}`.replace(/\/+/g,"/");return{cleanedPath:t,target:a}}async function Te(e){let o=r.join(e,"components.json");try{let s=await h(o,"utf8");return JSON.parse(s).aliases??null}catch{return null}}async function Re(e){let o=["tsconfig.json","jsconfig.json"].map(s=>r.join(e,s)).find(s=>g(s));if(!o)return null;try{let s=await h(o,"utf8"),i=JSON.parse(s).compilerOptions?.paths;return!i||typeof i!="object"?null:i}catch{return null}}function Fe(e,o){if(typeof e=="string"){if(e.trim().startsWith("~/"))return"~/";if(e.trim().startsWith("@/"))return"@/"}if(o){if(Object.prototype.hasOwnProperty.call(o,"~/*"))return"~/";if(Object.prototype.hasOwnProperty.call(o,"@/*"))return"@/"}return"@/"}async function Ue(e,o,s){if(o&&o.length>0)return o;let t=["src/components/ui","app/components/ui","components/ui"];for(let n of t)if(g(r.join(e,n)))return n.replace(/\/ui$/,"");let i=["src/components","app/components","components"];for(let n of i)if(g(r.join(e,n)))return n;if(s){let n=s["@/*"]??s["~/*"]??[];if(Array.isArray(n)&&n.some(a=>/^\.?\/?src\//.test(a)))return"src/components";if(Array.isArray(n)&&n.some(a=>/^\.?\/?app\//.test(a)))return"app/components"}return g(r.join(e,"src"))?"src/components":g(r.join(e,"app"))?"app/components":"components"}async function Le(e,o,s,t){let i=t?.utils??(t?.lib?`${t.lib.replace(/\/+$/,"")}/utils`:void 0);if(i&&i.trim().length>0){let c=S(je(i)),d=S(le(i));for(let p of Q(d))if(g(r.join(e,p)))return{utilsImportPath:c,utilsFilePath:p};return{utilsImportPath:c,utilsFilePath:`${d}.ts`}}let n=Pe(o),a=n?`${n}/lib/utils`:"lib/utils",u=Array.from(new Set([a,"src/lib/utils","app/lib/utils","lib/utils"]));for(let c of u)for(let d of Q(c))if(g(r.join(e,d)))return{utilsImportPath:`${s}lib/utils`,utilsFilePath:d};return{utilsImportPath:`${s}lib/utils`,utilsFilePath:`${a}.ts`}}function Z(e,o,s){let t=a=>{let u=a.startsWith("/"),c=a.endsWith("/"),d=a.split("/").filter(Boolean),p=[];for(let x of d)p[p.length-1]!==x&&p.push(x);let w=p.join("/");return`${u?"/":""}${w}${c?"/":""}`},i=o.replace(/\/+$/,""),n=e.replace(/^\.?\//,"");if(ce.test(n))return t(s);if(n.startsWith("components/")){let a=n.slice(10);return t(`${i}${a}`.replace(/^\//,""))}if(n.startsWith("lib/")){if(i.startsWith("src/"))return t(`src/${n}`);if(i.startsWith("app/"))return t(`app/${n}`)}if(n.startsWith("hooks/")){if(i.startsWith("src/"))return t(`src/${n}`);if(i.startsWith("app/"))return t(`app/${n}`)}return n.startsWith("ui/")?t(`${i}/${n}`):t(n)}function U(e,o){let s=o.startsWith("~/")?"~/":"@/",t=e;return t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@loveui\/ui\/ui\//g,`${s}components/ui/`),t=t.replace(/@loveui\/ui\/lib\//g,`${s}lib/`),t=t.replace(/@\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/building-blocks\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/building-blocks\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@loveui\/shadcn-ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@love-ui\/shadcn-ui\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']@\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["']~\/lib\/utils["']/g,`from "${o}"`),t=t.replace(/from\s+["'](?:\.\.\/)+ui\/src\/lib\/utils["']/g,`from "${o}"`),t}async function Ce(e,o){if(g(r.join(e,o)))return!1;let s=$e,t=r.join(z,"love-ui","src","lib","utils.ts");if(g(t))try{s=await h(t,"utf8")}catch{}return await M(o,e),await T(r.join(e,o),s,"utf8"),!0}async function Ee(e){let s=["app/globals.css","app/global.css","src/app/globals.css","src/app/global.css","styles/globals.css","src/styles/globals.css","globals.css","global.css"].find(c=>g(r.join(e,c)));s||(g(r.join(e,"src","app"))?s="src/app/globals.css":g(r.join(e,"app"))?s="app/globals.css":g(r.join(e,"src"))?s="src/styles/globals.css":s="globals.css");let t=r.join(e,s),i=g(t),n=i?await h(t,"utf8"):"",a=!1;/@import\s+["']tailwindcss["']/.test(n)||(n=`@import "tailwindcss";
|
|
106
|
+
${n?`
|
|
107
|
+
${n}`:""}`,a=!0),n.includes(xe)||(n=`${n.trimEnd()}
|
|
108
108
|
|
|
109
|
-
${
|
|
110
|
-
${
|
|
109
|
+
${De}`,a=!0),(!i||a)&&(await M(s,e),await T(t,n,"utf8"));let u=await Ie(e,s);return{path:s,created:!i,updated:a,imported:u}}async function Ie(e,o){let t=["app/layout.tsx","app/layout.jsx","src/app/layout.tsx","src/app/layout.jsx"].find(c=>g(r.join(e,c)));if(!t)return!1;let i=r.join(e,t),n=await h(i,"utf8"),a=Ae(r.dirname(t),o);if(n.includes(`"${a}"`)||n.includes(`'${a}'`))return!1;let u=`import "${a}";
|
|
110
|
+
${n}`;return await T(i,u,"utf8"),!0}function Ae(e,o){let s=r.posix.relative(e||".",o);return s.startsWith(".")||(s=`./${s}`),s}async function M(e,o){let s=r.dirname(r.join(o,e));await R(s,{recursive:!0})}async function Oe(e,o){let s=r.join(e,"package.json"),t={};try{let c=await h(s,"utf8");t=JSON.parse(c)}catch{}let i=Be(t),n=L(o),a=[];async function u(c,d){let p=await se(c,{withFileTypes:!0});for(let w of p){if(V.has(w.name))continue;let x=r.join(c,w.name);if(w.isDirectory()){await u(x,d);continue}let P=r.extname(w.name);if(!re.has(P)||w.name==="package.json")continue;let j=r.relative(d,x).split(r.sep).join("/"),{target:D}=Se(j,i,n),k=await h(x,"utf8");a.push({path:j,target:D,content:k})}}return await u(e,e),a}async function _e(e,o){let s=ae.get(e);if(!s)return null;let t=r.join(F,"default","blocks",s.sourceDir);if(!g(t))return null;try{let i=[],n=[],a=new Set;async function u(c){let d=await se(c,{withFileTypes:!0});for(let p of d){if(V.has(p.name))continue;let w=r.join(c,p.name);if(p.isDirectory()){await u(w);continue}let x=r.extname(p.name);if(!re.has(x))continue;let P=r.relative(t,w).split(r.sep).join("/"),j=await h(w,"utf8");for(let D of j.matchAll(/@\/registry\/default\/ui\/([^"']+)/g)){let k=D[1];k&&a.add(k)}n.push({path:`default/blocks/${s.sourceDir}/${P}`,target:`${s.targetBase}/${P}`,content:j})}}await u(t);for(let c of Array.from(a).sort((d,p)=>d.localeCompare(p))){let d=await K(c,o);d&&i.push(...d)}return i.push(...n),i}catch(i){return console.warn(`Warning: unable to read ${e} from bundled blocks`,i),null}}async function K(e,o){let s=r.join(F,"default","ui",`${e}.tsx`);if(g(s))try{let n=U(await h(s,"utf8"),o),a=[{path:`default/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:n}];if(e==="toast"){let u=["toast-gooey.tsx","toast-gooey-renderer.tsx","toast-gooey-icons.tsx","toast-gooey-types.ts","toast-gooey.css"];for(let c of u){let d=r.join(F,"default","ui",c);g(d)&&a.push({path:`default/ui/${c}`,target:`components/ui/${c}`,content:await h(d,"utf8")})}}return a}catch(n){console.warn(`Warning: unable to read ${e} from bundled registry`,n)}let t=r.join(z,"love-ui"),i=r.join(t,"src","ui",`${e}.tsx`);if(!g(i))return null;try{let n=[],a=await h(i,"utf8");a=U(a,o),n.push({path:`src/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:a});let u=r.join(t,"src","lib","utils.ts");if(g(u)){let c=await h(u,"utf8");n.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:c})}return n}catch(n){return console.warn(`Warning: unable to read ${e} component`,n),null}}async function We(e,o){if(ie.has(e))return await K(e,o);let s=r.join(F,"default","examples",`${e}.tsx`);if(g(s))try{let a=await h(s,"utf8"),u=[],c=Array.from(new Set([...a.matchAll(/@\/registry\/default\/ui\/([^"']+)/g)].map(d=>d[1]).filter(Boolean)));for(let d of c){let p=await K(d,o);p&&u.push(...p)}return u.push({path:`default/examples/${e}.tsx`,target:`components/${e}.tsx`,content:U(a,o)}),u}catch(a){return console.warn(`Warning: unable to read ${e} from bundled registry examples`,a),null}let t=await _e(e,o);if(t)return t;let i=ue(e),n=r.join(z,i);if(!g(n))return null;try{return await Oe(n,e)}catch(a){return console.warn(`Warning: unable to read bundled sources for ${e}`,a),null}}async function ge(e){let o=r.join(ye,L(e));return!g(o)||!g(r.join(o,"SKILL.md"))?null:o}var q=["codex","claude","cursor","github"],ee=new Set(q);function qe(){let e=process.env.CODEX_HOME?.trim();return e||r.join(ne.homedir(),".codex")}function Me(){let e=process.env.CLAUDE_HOME?.trim();return e||r.join(ne.homedir(),".claude")}async function _(e,o){let s=await ge(e);if(!s)throw new Error(`Bundled skill "${e}" was not found in this love-ui package.`);return await R(r.dirname(o),{recursive:!0}),g(o)?"exists":(await pe(s,o,{recursive:!0,force:!1,filter:t=>{let i=r.basename(t);return!V.has(i)}}),"installed")}async function te(e,o){return await R(r.dirname(e),{recursive:!0}),g(e)?"exists":(await T(e,o,"utf8"),"installed")}function ze(e){return`---
|
|
111
111
|
description: Use LoveUI Skills when building, reviewing, or polishing LoveUI interfaces.
|
|
112
112
|
globs: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
|
|
113
113
|
alwaysApply: false
|
|
@@ -119,8 +119,8 @@ Start with \`.cursor/loveui-skills/SKILL.md\`, then read the matching files in \
|
|
|
119
119
|
|
|
120
120
|
For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
|
|
121
121
|
|
|
122
|
-
Installed skill pack: ${
|
|
123
|
-
`}function
|
|
122
|
+
Installed skill pack: ${e}
|
|
123
|
+
`}function Ge(e){return`---
|
|
124
124
|
applyTo: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
|
|
125
125
|
---
|
|
126
126
|
|
|
@@ -132,18 +132,18 @@ Start with \`.github/loveui-skills/SKILL.md\`, then read the matching files in \
|
|
|
132
132
|
|
|
133
133
|
For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
|
|
134
134
|
|
|
135
|
-
Installed skill pack: ${
|
|
136
|
-
`}async function
|
|
135
|
+
Installed skill pack: ${e}
|
|
136
|
+
`}async function He(e,o,s){let t=L(e);if(o==="codex"){let a=r.join(qe(),"skills",t);return[{label:"Codex skill",path:a,status:await _(e,a)}]}if(o==="claude"){let a=r.join(Me(),"skills",t);return[{label:"Claude skill",path:a,status:await _(e,a)}]}if(o==="cursor"){let a=r.join(s,".cursor","loveui-skills"),u=r.join(s,".cursor","rules","loveui-skills.mdc");return[{label:"Cursor skill files",path:a,status:await _(e,a)},{label:"Cursor rule",path:u,status:await te(u,ze(e))}]}let i=r.join(s,".github","loveui-skills"),n=r.join(s,".github","instructions","loveui-skills.instructions.md");return[{label:"GitHub skill files",path:i,status:await _(e,i)},{label:"GitHub Copilot instructions",path:n,status:await te(n,Ge(e))}]}function Ke(e){let o=new Set;for(let s=0;s<e.length;s++){let t=e[s];if(t){if(t==="--target"||t==="--agent"||t==="-t"){let i=e[s+1];if(s++,!i)throw new Error(`Missing value for ${t}. Use one of: codex, claude, cursor, github, all.`);W(i,o);continue}if(t.startsWith("--target=")){W(t.slice(9),o);continue}if(t.startsWith("--agent=")){W(t.slice(8),o);continue}W(t,o)}}return[...o]}function W(e,o){let s=e.trim().toLowerCase();if(s==="all"){for(let t of ee)o.add(t);return}if(!ee.has(s))throw new Error(`Unknown skill target "${e}". Use one of: codex, claude, cursor, github, all.`);o.add(s)}async function Je(){if(!process.stdin.isTTY||!process.stdout.isTTY)throw new Error("Missing skill target. Use one of: codex, claude, cursor, github, all.");let e=[...q.map((s,t)=>({label:s,number:String(t+1),targets:[s]})),{label:"all",number:String(q.length+1),targets:[...q]}];console.log(`
|
|
137
137
|
Which AI tool should LoveUI Skills target?
|
|
138
|
-
`);for(let s of
|
|
139
|
-
Select a target: `)).trim().toLowerCase(),e
|
|
140
|
-
Adding ${s} for ${i.join(", ")}...`);for(let
|
|
141
|
-
\u2713 Done! Restart or reload your AI tool so it can pick up the new instructions.`)}var
|
|
142
|
-
Installing dependencies...`);let i=
|
|
138
|
+
`);for(let s of e)console.log(` ${s.number}. ${s.label}`);let o=me({input:process.stdin,output:process.stdout});try{for(;;){let s=(await o.question(`
|
|
139
|
+
Select a target: `)).trim().toLowerCase(),t=e.find(i=>i.number===s||i.label===s);if(t)return t.targets;console.log("Please choose codex, claude, cursor, github, all, or a number from the list.")}}finally{o.close()}}async function Ve(e,o){let s="loveui-skills",t=Ke(e),i=t.length>0?t:await Je();if(!await ge(s))throw new Error("The loveui-skills pack is missing from this love-ui package. Try updating to the latest version.");console.log(`
|
|
140
|
+
Adding ${s} for ${i.join(", ")}...`);for(let n of i){let a=await He(s,n,o);for(let u of a){let c=u.status==="installed"?"Installed":"Already exists";console.log(`\u2713 ${c}: ${u.label} at ${u.path}`)}}console.log(`
|
|
141
|
+
\u2713 Done! Restart or reload your AI tool so it can pick up the new instructions.`)}var oe={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","lucide-react":"^1.16.0","tailwind-merge":"^3.3.1"};async function Xe(e){if(ie.has(e)||g(r.join(F,"default","examples",`${e}.tsx`)))return{...oe};let o=ae.get(e);if(o)return{...oe,..."dependencies"in o?o.dependencies:{}};let s=ue(e),t=r.join(z,s,"package.json");try{let i=await h(t,"utf8");return JSON.parse(i).dependencies??{}}catch{return{}}}async function Ye(e){return g(r.join(e,"bun.lockb"))?"bun":g(r.join(e,"pnpm-lock.yaml"))?"pnpm":g(r.join(e,"yarn.lock"))?"yarn":"npm"}async function Ne(e,o,s){let t=Object.entries(e);if(t.length===0)return!0;console.log(`
|
|
142
|
+
Installing dependencies...`);let i=t.map(([u,c])=>`${u}@${c}`),n;switch(o){case"bun":n=`bun add ${i.join(" ")}`;break;case"pnpm":n=`pnpm add ${i.join(" ")}`;break;case"yarn":n=`yarn add ${i.join(" ")}`;break;default:n=`npm install ${i.join(" ")}`}let a=fe(n,{stdio:"inherit",shell:!0,cwd:s});return a.error||a.status!==0?(console.warn(`
|
|
143
143
|
Failed to install dependencies. You may need to install them manually:`),console.warn(` ${i.join(`
|
|
144
144
|
`)}`),!1):(console.log(`Dependencies installed successfully!
|
|
145
|
-
`),!0)}async function
|
|
146
|
-
Adding ${
|
|
147
|
-
Installing ${
|
|
145
|
+
`),!0)}async function Qe(e=process.argv.slice(2)){if((e.length===0||e.length===1&&(e[0]==="--version"||e[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(e.length<2||e[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui add loveui-skills [codex|claude|cursor|github|all]"),console.log(" npx love-ui add loveui-skills --agent codex"),console.log(" npx love-ui --version"),process.exit(1)),L(e[1]??"")==="loveui-skills"){await Ve(e.slice(2),process.cwd());return}let o=e.slice(1),s=process.cwd(),t=await Te(s),i=await Re(s),n=t?.components?le(t.components):null,a=await Ue(s,n,i),u=Fe(t?.components,i),{utilsImportPath:c,utilsFilePath:d}=await Le(s,a,u,t),p=await Ye(s),w=a.endsWith("/ui")?a:`${a}/ui`,x=!1,P=!1,j=!1,D={};for(let k of o){if(!k.trim())continue;if(console.log(`
|
|
146
|
+
Adding ${k}...`),x||(await R(r.join(s,a),{recursive:!0}),await R(r.join(s,w),{recursive:!0}),x=!0),!j){let l=await Ee(s);l.created?console.log(`\u2713 Created ${l.path}`):l.updated&&console.log(`\u2713 Updated ${l.path}`),l.imported&&console.log(`\u2713 Imported ${l.path} from app layout`),j=!0}P=!0;let m=null,X=null;if(k.startsWith("http://")||k.startsWith("https://")){let l=k;l.includes("/building-blocks/r/")&&(l=l.replace("/building-blocks/r/","/building-blocks/"),console.log(`Auto-corrected URL to: ${l}`));try{let f=await fetch(l);f.ok?m=await f.json():console.warn(`Failed to fetch ${l}: HTTP ${f.status}`)}catch(f){console.warn(`Failed to fetch from ${l}:`,f)}}else{let l=new URL(`r/${k}.json`,"https://www.loveui.dev/");try{let f=await fetch(l);f.ok&&(m=await f.json())}catch{}X=await We(k,c)}let B=X??m?.files??[];B=B.map(l=>{let f=l.target||l.path;return f.startsWith("registry/default/")&&(f=f.replace("registry/default/","")),{...l,target:f}});let C=B.find(l=>l.target.match(/^components\/comp-\d+\.tsx$/));if(C){let l=B.filter(f=>f.target.match(/^components\/[^/]+\//)&&f.target!==C.target);if(l.length>0&&l[0]){let f=l[0].target.match(/^components\/([^/]+)\//);if(f&&f[1]){let b=f[1];C.target=`components/${b}-demo.tsx`}}else if(m?.meta?.tags&&Array.isArray(m.meta.tags)&&m.meta.tags.length>0){let b=m.meta.tags.slice(0,2).filter(v=>v.length>0);if(b.length>0){let v=b.join("-").toLowerCase().replace(/\s+/g,"-");C.target=`components/${v}.tsx`}}}if(!B.length){console.warn(`Component "${k}" not found. Available components can be found at https://loveui.dev`);continue}B.some(l=>ce.test(l.target)||typeof l.content=="string"&&ve.test(l.content))&&await Ce(s,d);let E=0,I=0;for(let l of B){if(!l.content)continue;let f=Z(l.target,a,d),b=r.join(s,f),v=g(b);if(S(f)===S(d)&&v)continue;let O=U(l.content,c);if(v)try{if(await h(b,"utf8")===O)continue}catch{}await M(f,s),await T(b,O,"utf8"),v?I++:E++}if(E>0&&console.log(`\u2713 Created ${E} file${E>1?"s":""}`),I>0&&console.log(`\u2713 Updated ${I} file${I>1?"s":""}`),m?.registryDependencies&&m.registryDependencies.length>0){console.log(`
|
|
147
|
+
Installing ${m.registryDependencies.length} required component${m.registryDependencies.length>1?"s":""}...`);for(let l of m.registryDependencies){let f=l;l.startsWith("https://loveui.dev/building-blocks/r/")&&(f=`https://ui.loveui.dev/ui/r/${l.split("/").pop()}`);try{let b=await fetch(f);if(b.ok){let v=await b.json(),O=(v?.files??[]).map(y=>{let $=y.target||y.path;return $.startsWith("registry/default/")&&($=$.replace("registry/default/","")),{...y,target:$}});for(let y of O){if(!y.content)continue;let $=Z(y.target,a,d),H=r.join(s,$),Y=g(H);if(S($)===S(d)&&Y)continue;let N=U(y.content,c);if(Y)try{if(await h(H,"utf8")===N)continue}catch{}await M($,s),await T(H,N,"utf8")}let G=["@loveui/shadcn-ui","jotai","lucide-react","react","react-dom"];if(v?.dependencies)if(Array.isArray(v.dependencies))v.dependencies.forEach(y=>{G.includes(y)||(D[y]="latest")});else{let y=v.dependencies;Object.keys(y).forEach($=>{!G.includes($)&&y[$]&&(D[$]=y[$])})}}else console.warn(` \u2717 Failed to fetch ${f}: HTTP ${b.status}`)}catch(b){console.warn(` \u2717 Failed to install ${f}:`,b.message)}}console.log("\u2713 Installed registry dependencies")}let A={};m?.dependencies?Array.isArray(m.dependencies)?m.dependencies.forEach(l=>{A[l]="latest"}):A=m.dependencies:A=await Xe(k),Object.assign(D,A)}Object.keys(D).length>0&&await Ne(D,p,s),console.log(P?`
|
|
148
148
|
\u2713 Done! You can now import and use the components in your app.`:`
|
|
149
|
-
\u2713 Done! Skill installation complete.`)}var
|
|
149
|
+
\u2713 Done! Skill installation complete.`)}var Ze=process.argv[1]&&(import.meta.url===he(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));Ze&&Qe().catch(e=>{console.error(e),process.exit(1)});export{Qe as run};
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{constants as Te}from"fs";import{access as _e,readFile as Q}from"fs/promises";import p from"path";import{fileURLToPath as xe}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as d,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as l,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.
|
|
2
|
+
import{constants as Te}from"fs";import{access as _e,readFile as Q}from"fs/promises";import p from"path";import{fileURLToPath as xe}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as d,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as l,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.18",private:!1,license:"MIT",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","registry","skills"],main:"dist/index.js",exports:{".":{import:"./dist/index.js",require:"./dist/index.js"},"./registry/*":"./registry/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-registry.mjs",prepack:"npm run build","verify:registry":"node ./scripts/copy-registry.mjs",clean:"rimraf dist registry"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as me}from"fs";import{access as ue,readFile as U,readdir as W}from"fs/promises";import T,{extname as q,join as j,relative as ge}from"path";import{fileURLToPath as ye}from"url";import z from"postcss";import fe from"postcss-nested";var he=T.dirname(ye(import.meta.url)),ve=T.resolve(he,".."),M=T.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),Se=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),ke=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),Ee=e=>e.replace(/\\/g,"/"),G=async(e,n,t)=>{let s=await W(e,{withFileTypes:!0});for(let r of s){let o=j(e,r.name);if(r.isDirectory()){if(we.has(r.name))continue;await G(o,n,t);continue}let a=q(r.name);!Re.has(a)||Se.has(r.name)||r.name.endsWith(".d.ts")||r.name.endsWith(".test.ts")||r.name.endsWith(".test.tsx")||r.name.endsWith(".stories.tsx")||t.push({absolute:o,relative:Ee(ge(n,o))})}},Ie=(e,n)=>{let t=e.loveui??{},s=typeof t.target=="string"?t.target.trim():"",r=t.category;if(s.length>0){let o=typeof t.includePackageName=="boolean"?t.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:o}}return r==="feature"?{base:"components",includePackageName:!0}:r==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},De=e=>{let t=(e.loveui??{}).type;return typeof t=="string"&&t.trim().length>0?t:"registry:ui"},Pe=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},b=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),be=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),je=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),H=async()=>(await W(M,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).filter(n=>!ke.has(n)).sort((n,t)=>n.localeCompare(t)),J=async e=>{let n=j(M,e),t=j(n,"package.json");if(!await Pe(t))throw new Error(`Missing package.json for ${e}`);let s=JSON.parse(await U(t,"utf8")),r=De(s),o=Object.keys(s.dependencies??{}),a=Object.keys(s.peerDependencies??{}),N=Object.keys(s.devDependencies??{}),oe=new Set([...o,...a,...N].filter(b).filter(i=>!je.has(i))),O=[...new Set([...o,...a].filter(i=>!b(i)))],A=[...new Set(N.filter(i=>!b(i)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(i)))],k=[];for(let i of oe){let h=be(i);k.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await G(n,n,C);let f=[],m={},g=Ie(s,e);for(let i of C){let h=await U(i.absolute,"utf8"),E=q(i.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await z([fe]).process(h,{from:void 0});z.parse(v.css).walkAtRules("layer",I=>{let D=`@layer ${I.params}`;m[D]??={},I.walkRules(c=>{if(c.parent&&c.parent.type==="atrule"&&c.parent.name==="media")return;let R=c.selector,u={};c.walkDecls(S=>{u[S.prop]=S.value}),Object.keys(u).length>0&&(m[D][R]=u)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,u=m[D];u[R]??={};let S=u[R];c.walkRules(L=>{let pe=L.selector,P={};L.walkDecls($=>{P[$.prop]=$.value}),Object.keys(P).length>0&&(S[pe]=P)})})});continue}let y=i.relative.startsWith("src/")?i.relative.slice(4):i.relative;if(!g.includePackageName){let v=g.base.split("/").filter(Boolean),w=v[v.length-1];w&&y.startsWith(`${w}/`)&&(y=y.slice(w.length+1))}let ce=e.includes("/")?e.split("/").pop()??e:e,le=(g.includePackageName?`${g.base}/${ce}`:g.base).replace(/\/+$/,"");f.push({type:r,path:y,target:`${le}/${y}`.replace(/\/+/g,"/"),content:h})}let ae=!f.length&&Object.keys(m).length>0?"registry:style":r;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:ae,title:s.title??e,description:s.description,author:s.author??"Connor Love <hello@loveconnor.com>",dependencies:O.length?O:void 0,devDependencies:A.length?A:void 0,registryDependencies:k.length?Array.from(new Set(k)):void 0,files:f.length?f:void 0,css:Object.keys(m).length?m:void 0}};var x="loveui://registry/",Ue="loveui://registry/{package}",K="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),ze=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),We=e=>`${x}${e}`,qe=p.dirname(xe(import.meta.url)),X=p.resolve(qe,".."),Me=[p.join(X,"public","r"),p.resolve(X,"..","..","apps","ui","public","r"),p.resolve(process.cwd(),"apps","ui","public","r")],te=async e=>{try{return await _e(e,Te.R_OK),!0}catch{return!1}},ne=e=>ze.some(n=>e.startsWith(n)),Ge=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),se=e=>Array.isArray(e)?e.filter(n=>typeof n=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let n=Array.from(new Set(se(e).filter(t=>!ne(t)&&!ee.has(t))));return n.length>0?n:void 0},He=e=>{let n=Array.from(new Set(se(e).map(t=>t.trim()).filter(Boolean).filter(t=>!ee.has(t)).map(t=>ne(t)?`https://www.loveui.dev/r/${Ge(t)}.json`:t)));return n.length>0?n:void 0},re=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Je=e=>{let n=re(e);if(Z.has(n))throw new l(d.InvalidParams,`${n} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return n},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let n={...e},t=B(n.dependencies),s=B(n.devDependencies),r=He(n.registryDependencies),o=typeof n.name=="string"&&n.name.trim().length>0?n.name.trim():"<component>",a={...n,mcpHints:{installPattern:"npx love-ui add <component>",installCommand:`npx love-ui add ${o}`,neverInstall:["@loveui/*","@love-ui/*","@repo/*","@loveui/shadcn-ui"]}};return t?a.dependencies=t:delete a.dependencies,s?a.devDependencies=s:delete a.devDependencies,r?a.registryDependencies=r:delete a.registryDependencies,a},_=null,ie=async()=>(_||(_=(async()=>{for(let e of Me){let n=p.join(e,"registry.json");if(await te(n))try{let t=JSON.parse(await Q(n,"utf8")),s=Array.from(new Set((t.items??[]).map(r=>r.name?.trim()).filter(r=>!!r))).sort((r,o)=>r.localeCompare(o));if(s.length===0)continue;return{dir:e,names:s,nameSet:new Set(s)}}catch{continue}}return null})()),_),Ke=async()=>{let[e,n]=await Promise.all([ie(),H()]),t=new Set(n);for(let s of e?.names??[])t.add(s);return Array.from(t).map(s=>re(s)).filter(s=>!Z.has(s)).sort((s,r)=>s.localeCompare(r))},Xe=async e=>{let n=await ie();if(!n||!n.nameSet.has(e))return null;let t=p.join(n.dir,`${e}.json`);return await te(t)?JSON.parse(await Q(t,"utf8")):null},Be=e=>{if(!e.startsWith(x))throw new l(d.InvalidParams,`Unsupported resource URI: ${e}`);let n=decodeURIComponent(e.slice(x.length)).trim();if(!n)throw new l(d.InvalidParams,"Package name is required.");return n},V=async e=>{let n=Je(e);try{let t=await Xe(n);return Y(t||await J(n))}catch(t){throw t instanceof l?t:t instanceof Error&&t.message.startsWith(`Missing package.json for ${n}`)?new l(d.InvalidParams,`Registry item "${n}" was not found. Call resources/list and use an exact item name from the registry.`):new l(d.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ye(){let e=new Ne({name:"loveui-mcp",version:F.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(Le,async()=>({resources:(await Ke()).map(s=>({uri:We(s),name:s,description:`loveui registry definition for ${s}`,mimeType:"application/json"}))})),e.setRequestHandler(Ce,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Ue,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(Fe,async t=>{let s=Be(t.params.uri),r=await V(s);return{contents:[{uri:t.params.uri,mimeType:"application/json",text:JSON.stringify(r,null,2)}]}}),e.setRequestHandler($e,async()=>({tools:[{name:K,description:"Fetch a loveui registry definition by package name. Always install with `npx love-ui add <component>` and never install @loveui/* packages directly.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ae,async t=>{if(t.params.name!==K)throw new l(d.InvalidParams,`Tool ${t.params.name} not found`);let s=t.params.arguments?.name;if(typeof s!="string"||s.trim()==="")throw new l(d.InvalidParams,"Package name is required.");let r=await V(s.trim());return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});let n=new Oe;await e.connect(n)}Ye().catch(e=>{console.error(e),process.exit(1)});
|
package/package.json
CHANGED
package/registry/__index__.tsx
CHANGED
|
@@ -2,8 +2,13 @@ import type { ComponentType } from "react"
|
|
|
2
2
|
|
|
3
3
|
import accordion_controlled from "./default/examples/accordion-controlled"
|
|
4
4
|
import accordion_demo from "./default/examples/accordion-demo"
|
|
5
|
+
import accordion_disabled from "./default/examples/accordion-disabled"
|
|
6
|
+
import accordion_card from "./default/examples/accordion-in-card"
|
|
7
|
+
import accordion_leading_icon from "./default/examples/accordion-leading-icon"
|
|
5
8
|
import accordion_multiple from "./default/examples/accordion-multiple"
|
|
6
9
|
import accordion_single from "./default/examples/accordion-single"
|
|
10
|
+
import accordion_user_roles from "./default/examples/accordion-user-roles"
|
|
11
|
+
import accordion_with_icons from "./default/examples/accordion-with-icons"
|
|
7
12
|
import alert_demo from "./default/examples/alert-demo"
|
|
8
13
|
import alert_dialog_demo from "./default/examples/alert-dialog-demo"
|
|
9
14
|
import alert_error from "./default/examples/alert-error"
|
|
@@ -26,10 +31,18 @@ import autocomplete_with_clear from "./default/examples/autocomplete-with-clear"
|
|
|
26
31
|
import autocomplete_with_label from "./default/examples/autocomplete-with-label"
|
|
27
32
|
import autocomplete_with_trigger_clear from "./default/examples/autocomplete-with-trigger-clear"
|
|
28
33
|
import avatar_demo from "./default/examples/avatar-demo"
|
|
34
|
+
import avatar_badge_icons from "./default/examples/avatar-badge-icons"
|
|
35
|
+
import avatar_badge_position from "./default/examples/avatar-badge-position"
|
|
36
|
+
import avatar_empty_collaborators from "./default/examples/avatar-empty-collaborators"
|
|
29
37
|
import avatar_fallback from "./default/examples/avatar-fallback"
|
|
30
38
|
import avatar_group from "./default/examples/avatar-group"
|
|
39
|
+
import avatar_group_trust from "./default/examples/avatar-group-trust"
|
|
40
|
+
import avatar_loading from "./default/examples/avatar-loading"
|
|
41
|
+
import avatar_menu from "./default/examples/avatar-menu"
|
|
42
|
+
import avatar_profile_badge from "./default/examples/avatar-profile-badge"
|
|
31
43
|
import avatar_radius from "./default/examples/avatar-radius"
|
|
32
44
|
import avatar_size from "./default/examples/avatar-size"
|
|
45
|
+
import avatar_status from "./default/examples/avatar-status"
|
|
33
46
|
import badge_demo from "./default/examples/badge-demo"
|
|
34
47
|
import badge_destructive from "./default/examples/badge-destructive"
|
|
35
48
|
import badge_error from "./default/examples/badge-error"
|
|
@@ -42,22 +55,34 @@ import badge_success from "./default/examples/badge-success"
|
|
|
42
55
|
import badge_warning from "./default/examples/badge-warning"
|
|
43
56
|
import badge_with_icon from "./default/examples/badge-with-icon"
|
|
44
57
|
import badge_with_link from "./default/examples/badge-with-link"
|
|
58
|
+
import breadcrumb_bullet_separator from "./default/examples/breadcrumb-bullet-separator"
|
|
59
|
+
import breadcrumb_buttons from "./default/examples/breadcrumb-buttons"
|
|
60
|
+
import breadcrumb_card from "./default/examples/breadcrumb-card"
|
|
45
61
|
import breadcrumb_custom_separator from "./default/examples/breadcrumb-custom-separator"
|
|
46
62
|
import breadcrumb_demo from "./default/examples/breadcrumb-demo"
|
|
63
|
+
import button_default from "./default/examples/button-default"
|
|
64
|
+
import button_default_icons from "./default/examples/button-default-icons"
|
|
47
65
|
import button_demo from "./default/examples/button-demo"
|
|
48
66
|
import button_destructive from "./default/examples/button-destructive"
|
|
67
|
+
import button_destructive_icons from "./default/examples/button-destructive-icons"
|
|
49
68
|
import button_destructive_outline from "./default/examples/button-destructive-outline"
|
|
69
|
+
import button_destructive_outline_icons from "./default/examples/button-destructive-outline-icons"
|
|
50
70
|
import button_disabled from "./default/examples/button-disabled"
|
|
51
71
|
import button_ghost from "./default/examples/button-ghost"
|
|
72
|
+
import button_ghost_icons from "./default/examples/button-ghost-icons"
|
|
52
73
|
import button_icon from "./default/examples/button-icon"
|
|
53
74
|
import button_icon_lg from "./default/examples/button-icon-lg"
|
|
54
75
|
import button_icon_sm from "./default/examples/button-icon-sm"
|
|
55
76
|
import button_lg from "./default/examples/button-lg"
|
|
56
77
|
import button_link from "./default/examples/button-link"
|
|
78
|
+
import button_link_icons from "./default/examples/button-link-icons"
|
|
57
79
|
import button_loading from "./default/examples/button-loading"
|
|
58
80
|
import button_outline from "./default/examples/button-outline"
|
|
81
|
+
import button_outline_icons from "./default/examples/button-outline-icons"
|
|
59
82
|
import button_secondary from "./default/examples/button-secondary"
|
|
83
|
+
import button_secondary_icons from "./default/examples/button-secondary-icons"
|
|
60
84
|
import button_sm from "./default/examples/button-sm"
|
|
85
|
+
import button_theme_toggle from "./default/examples/button-theme-toggle"
|
|
61
86
|
import button_with_icon from "./default/examples/button-with-icon"
|
|
62
87
|
import button_with_link from "./default/examples/button-with-link"
|
|
63
88
|
import button_xl from "./default/examples/button-xl"
|
|
@@ -232,9 +257,20 @@ import breadcrumb_workspace_path from "./default/examples/breadcrumb-workspace-p
|
|
|
232
257
|
import breadcrumb_compact_path from "./default/examples/breadcrumb-compact-path"
|
|
233
258
|
import breadcrumb_with_ellipsis from "./default/examples/breadcrumb-with-ellipsis"
|
|
234
259
|
import button_command_bar from "./default/examples/button-command-bar"
|
|
260
|
+
import card_author_profile from "./default/examples/card-author-profile"
|
|
235
261
|
import card_metric_summary from "./default/examples/card-metric-summary"
|
|
236
262
|
import card_billing_plan from "./default/examples/card-billing-plan"
|
|
263
|
+
import card_default_size from "./default/examples/card-default-size"
|
|
264
|
+
import card_depth from "./default/examples/card-depth"
|
|
265
|
+
import card_help_link from "./default/examples/card-help-link"
|
|
266
|
+
import card_help_menu from "./default/examples/card-help-menu"
|
|
267
|
+
import card_image_centered from "./default/examples/card-image-centered"
|
|
268
|
+
import card_image_feature from "./default/examples/card-image-feature"
|
|
269
|
+
import card_metric_actions from "./default/examples/card-metric-actions"
|
|
270
|
+
import card_resource_link from "./default/examples/card-resource-link"
|
|
237
271
|
import card_team_member from "./default/examples/card-team-member"
|
|
272
|
+
import card_usage_expandable from "./default/examples/card-usage-expandable"
|
|
273
|
+
import card_with_borders from "./default/examples/card-with-borders"
|
|
238
274
|
import checkbox_notification_row from "./default/examples/checkbox-notification-row"
|
|
239
275
|
import collapsible_release_notes from "./default/examples/collapsible-release-notes"
|
|
240
276
|
import collapsible_checklist from "./default/examples/collapsible-checklist"
|
|
@@ -296,6 +332,7 @@ import tooltip_keyboard_hints from "./default/examples/tooltip-keyboard-hints"
|
|
|
296
332
|
|
|
297
333
|
export const Index: Record<string, { component: ComponentType }> = {
|
|
298
334
|
"accordion-product-faq": { component: accordion_product_faq },
|
|
335
|
+
"accordion-card": { component: accordion_card },
|
|
299
336
|
"alert-billing-notice": { component: alert_billing_notice },
|
|
300
337
|
"autocomplete-members": { component: autocomplete_members },
|
|
301
338
|
"avatar-team-stack": { component: avatar_team_stack },
|
|
@@ -304,9 +341,20 @@ export const Index: Record<string, { component: ComponentType }> = {
|
|
|
304
341
|
"breadcrumb-compact-path": { component: breadcrumb_compact_path },
|
|
305
342
|
"breadcrumb-with-ellipsis": { component: breadcrumb_with_ellipsis },
|
|
306
343
|
"button-command-bar": { component: button_command_bar },
|
|
344
|
+
"card-author-profile": { component: card_author_profile },
|
|
307
345
|
"card-metric-summary": { component: card_metric_summary },
|
|
308
346
|
"card-billing-plan": { component: card_billing_plan },
|
|
347
|
+
"card-default-size": { component: card_default_size },
|
|
348
|
+
"card-depth": { component: card_depth },
|
|
349
|
+
"card-help-link": { component: card_help_link },
|
|
350
|
+
"card-help-menu": { component: card_help_menu },
|
|
351
|
+
"card-image-centered": { component: card_image_centered },
|
|
352
|
+
"card-image-feature": { component: card_image_feature },
|
|
353
|
+
"card-metric-actions": { component: card_metric_actions },
|
|
354
|
+
"card-resource-link": { component: card_resource_link },
|
|
309
355
|
"card-team-member": { component: card_team_member },
|
|
356
|
+
"card-usage-expandable": { component: card_usage_expandable },
|
|
357
|
+
"card-with-borders": { component: card_with_borders },
|
|
310
358
|
"checkbox-notification-row": { component: checkbox_notification_row },
|
|
311
359
|
"collapsible-release-notes": { component: collapsible_release_notes },
|
|
312
360
|
"collapsible-checklist": { component: collapsible_checklist },
|
|
@@ -367,8 +415,13 @@ export const Index: Record<string, { component: ComponentType }> = {
|
|
|
367
415
|
"tooltip-keyboard-hints": { component: tooltip_keyboard_hints },
|
|
368
416
|
"accordion-controlled": { component: accordion_controlled },
|
|
369
417
|
"accordion-demo": { component: accordion_demo },
|
|
418
|
+
"accordion-disabled": { component: accordion_disabled },
|
|
419
|
+
"accordion-in-card": { component: accordion_card },
|
|
420
|
+
"accordion-leading-icon": { component: accordion_leading_icon },
|
|
370
421
|
"accordion-multiple": { component: accordion_multiple },
|
|
371
422
|
"accordion-single": { component: accordion_single },
|
|
423
|
+
"accordion-user-roles": { component: accordion_user_roles },
|
|
424
|
+
"accordion-with-icons": { component: accordion_with_icons },
|
|
372
425
|
"alert-demo": { component: alert_demo },
|
|
373
426
|
"alert-dialog-demo": { component: alert_dialog_demo },
|
|
374
427
|
"alert-error": { component: alert_error },
|
|
@@ -390,11 +443,19 @@ export const Index: Record<string, { component: ComponentType }> = {
|
|
|
390
443
|
"autocomplete-with-clear": { component: autocomplete_with_clear },
|
|
391
444
|
"autocomplete-with-label": { component: autocomplete_with_label },
|
|
392
445
|
"autocomplete-with-trigger-clear": { component: autocomplete_with_trigger_clear },
|
|
446
|
+
"avatar-badge-icons": { component: avatar_badge_icons },
|
|
447
|
+
"avatar-badge-position": { component: avatar_badge_position },
|
|
393
448
|
"avatar-demo": { component: avatar_demo },
|
|
449
|
+
"avatar-empty-collaborators": { component: avatar_empty_collaborators },
|
|
394
450
|
"avatar-fallback": { component: avatar_fallback },
|
|
395
451
|
"avatar-group": { component: avatar_group },
|
|
452
|
+
"avatar-group-trust": { component: avatar_group_trust },
|
|
453
|
+
"avatar-loading": { component: avatar_loading },
|
|
454
|
+
"avatar-menu": { component: avatar_menu },
|
|
455
|
+
"avatar-profile-badge": { component: avatar_profile_badge },
|
|
396
456
|
"avatar-radius": { component: avatar_radius },
|
|
397
457
|
"avatar-size": { component: avatar_size },
|
|
458
|
+
"avatar-status": { component: avatar_status },
|
|
398
459
|
"badge-demo": { component: badge_demo },
|
|
399
460
|
"badge-destructive": { component: badge_destructive },
|
|
400
461
|
"badge-error": { component: badge_error },
|
|
@@ -407,22 +468,34 @@ export const Index: Record<string, { component: ComponentType }> = {
|
|
|
407
468
|
"badge-warning": { component: badge_warning },
|
|
408
469
|
"badge-with-icon": { component: badge_with_icon },
|
|
409
470
|
"badge-with-link": { component: badge_with_link },
|
|
471
|
+
"breadcrumb-bullet-separator": { component: breadcrumb_bullet_separator },
|
|
472
|
+
"breadcrumb-buttons": { component: breadcrumb_buttons },
|
|
473
|
+
"breadcrumb-card": { component: breadcrumb_card },
|
|
410
474
|
"breadcrumb-custom-separator": { component: breadcrumb_custom_separator },
|
|
411
475
|
"breadcrumb-demo": { component: breadcrumb_demo },
|
|
476
|
+
"button-default": { component: button_default },
|
|
477
|
+
"button-default-icons": { component: button_default_icons },
|
|
412
478
|
"button-demo": { component: button_demo },
|
|
413
479
|
"button-destructive": { component: button_destructive },
|
|
480
|
+
"button-destructive-icons": { component: button_destructive_icons },
|
|
414
481
|
"button-destructive-outline": { component: button_destructive_outline },
|
|
482
|
+
"button-destructive-outline-icons": { component: button_destructive_outline_icons },
|
|
415
483
|
"button-disabled": { component: button_disabled },
|
|
416
484
|
"button-ghost": { component: button_ghost },
|
|
485
|
+
"button-ghost-icons": { component: button_ghost_icons },
|
|
417
486
|
"button-icon": { component: button_icon },
|
|
418
487
|
"button-icon-lg": { component: button_icon_lg },
|
|
419
488
|
"button-icon-sm": { component: button_icon_sm },
|
|
420
489
|
"button-lg": { component: button_lg },
|
|
421
490
|
"button-link": { component: button_link },
|
|
491
|
+
"button-link-icons": { component: button_link_icons },
|
|
422
492
|
"button-loading": { component: button_loading },
|
|
423
493
|
"button-outline": { component: button_outline },
|
|
494
|
+
"button-outline-icons": { component: button_outline_icons },
|
|
424
495
|
"button-secondary": { component: button_secondary },
|
|
496
|
+
"button-secondary-icons": { component: button_secondary_icons },
|
|
425
497
|
"button-sm": { component: button_sm },
|
|
498
|
+
"button-theme-toggle": { component: button_theme_toggle },
|
|
426
499
|
"button-with-icon": { component: button_with_icon },
|
|
427
500
|
"button-with-link": { component: button_with_link },
|
|
428
501
|
"button-xl": { component: button_xl },
|
|
@@ -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,51 @@
|
|
|
1
|
+
import { Button } from "@/registry/default/ui/button";
|
|
2
|
+
import {
|
|
3
|
+
Empty,
|
|
4
|
+
EmptyContent,
|
|
5
|
+
EmptyDescription,
|
|
6
|
+
EmptyHeader,
|
|
7
|
+
EmptyTitle,
|
|
8
|
+
} from "@/registry/default/ui/empty";
|
|
9
|
+
import { FullWidthDivider } from "./full-width-divider";
|
|
10
|
+
import { HomeIcon, CompassIcon } from "lucide-react";
|
|
11
|
+
|
|
12
|
+
export function NotFoundPage() {
|
|
13
|
+
return (
|
|
14
|
+
<div className="flex w-full items-center justify-center overflow-hidden">
|
|
15
|
+
<div className="flex h-screen items-center border-x">
|
|
16
|
+
<div>
|
|
17
|
+
<FullWidthDivider />
|
|
18
|
+
<Empty>
|
|
19
|
+
<EmptyHeader>
|
|
20
|
+
<EmptyTitle className="font-black font-mono text-8xl">
|
|
21
|
+
404
|
|
22
|
+
</EmptyTitle>
|
|
23
|
+
<EmptyDescription className="text-nowrap">
|
|
24
|
+
The page you're looking for might have been <br />
|
|
25
|
+
moved or doesn't exist.
|
|
26
|
+
</EmptyDescription>
|
|
27
|
+
</EmptyHeader>
|
|
28
|
+
<EmptyContent>
|
|
29
|
+
<div className="flex gap-2">
|
|
30
|
+
<Button asChild>
|
|
31
|
+
<a href="#">
|
|
32
|
+
<HomeIcon data-icon="inline-start" />
|
|
33
|
+
Go Home
|
|
34
|
+
</a>
|
|
35
|
+
</Button>
|
|
36
|
+
|
|
37
|
+
<Button asChild variant="outline">
|
|
38
|
+
<a href="#">
|
|
39
|
+
<CompassIcon data-icon="inline-start" />
|
|
40
|
+
Explore
|
|
41
|
+
</a>
|
|
42
|
+
</Button>
|
|
43
|
+
</div>
|
|
44
|
+
</EmptyContent>
|
|
45
|
+
</Empty>
|
|
46
|
+
<FullWidthDivider />
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
}
|