love-ui 1.2.15 → 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/README.md +14 -6
- package/dist/index.js +149 -0
- package/dist/mcp-server.js +2 -0
- package/package.json +28 -4
- 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/examples/code-block-shared.tsx +8 -1
- package/registry/default/ui/accordion.tsx +82 -2
- package/registry/default/ui/avatar.tsx +45 -1
- package/registry/default/ui/form.tsx +6 -1
- package/registry/default/ui/input-group.tsx +158 -0
- package/registry/default/ui/toast-gooey-icons.tsx +68 -0
- package/registry/default/ui/toast-gooey-renderer.tsx +614 -0
- package/registry/default/ui/toast-gooey-types.ts +45 -0
- package/registry/default/ui/toast-gooey.css +511 -0
- package/registry/default/ui/toast-gooey.tsx +445 -0
- package/registry/default/ui/toast.tsx +1 -1
- package/skills/loveui-skills/SKILL.md +170 -0
- package/skills/loveui-skills/references/accessibility-baseline.md +32 -0
- package/skills/loveui-skills/references/component-api-and-naming.md +30 -0
- package/skills/loveui-skills/references/content-ux-writing.md +33 -0
- package/skills/loveui-skills/references/design-directions.md +60 -0
- package/skills/loveui-skills/references/forms-and-validation.md +30 -0
- package/skills/loveui-skills/references/frontend-architecture.md +30 -0
- package/skills/loveui-skills/references/interaction-heuristics.md +45 -0
- package/skills/loveui-skills/references/mcp-catalog-workflow.md +68 -0
- package/skills/loveui-skills/references/motion-and-feedback.md +31 -0
- package/skills/loveui-skills/references/navigation-and-information-architecture.md +30 -0
- package/skills/loveui-skills/references/page-blueprints.md +76 -0
- package/skills/loveui-skills/references/quality-gates.md +51 -0
- package/skills/loveui-skills/references/screenshot-translation-protocol.md +52 -0
- package/skills/loveui-skills/references/structural-cleanliness.md +37 -0
- package/skills/loveui-skills/references/testing-and-quality-strategy.md +33 -0
- package/skills/loveui-skills/references/visual-primitives.md +42 -0
- package/skills/loveui-skills/skills/adapt/SKILL.md +199 -0
- package/skills/loveui-skills/skills/animate/SKILL.md +190 -0
- package/skills/loveui-skills/skills/audit/SKILL.md +127 -0
- package/skills/loveui-skills/skills/bolder/SKILL.md +132 -0
- package/skills/loveui-skills/skills/clarify/SKILL.md +180 -0
- package/skills/loveui-skills/skills/colorize/SKILL.md +158 -0
- package/skills/loveui-skills/skills/critique/SKILL.md +118 -0
- package/skills/loveui-skills/skills/delight/SKILL.md +317 -0
- package/skills/loveui-skills/skills/distill/SKILL.md +137 -0
- package/skills/loveui-skills/skills/extract/SKILL.md +95 -0
- package/skills/loveui-skills/skills/frontend-design/SKILL.md +127 -0
- package/skills/loveui-skills/skills/frontend-design/reference/color-and-contrast.md +132 -0
- package/skills/loveui-skills/skills/frontend-design/reference/interaction-design.md +123 -0
- package/skills/loveui-skills/skills/frontend-design/reference/motion-design.md +99 -0
- package/skills/loveui-skills/skills/frontend-design/reference/responsive-design.md +114 -0
- package/skills/loveui-skills/skills/frontend-design/reference/spatial-design.md +100 -0
- package/skills/loveui-skills/skills/frontend-design/reference/typography.md +131 -0
- package/skills/loveui-skills/skills/frontend-design/reference/ux-writing.md +107 -0
- package/skills/loveui-skills/skills/harden/SKILL.md +358 -0
- package/skills/loveui-skills/skills/normalize/SKILL.md +67 -0
- package/skills/loveui-skills/skills/onboard/SKILL.md +243 -0
- package/skills/loveui-skills/skills/optimize/SKILL.md +269 -0
- package/skills/loveui-skills/skills/polish/SKILL.md +202 -0
- package/skills/loveui-skills/skills/quieter/SKILL.md +118 -0
- package/skills/loveui-skills/skills/teach-loveui/SKILL.md +69 -0
package/README.md
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
# love-ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Command line utility and component registry source for LoveUI.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
7
|
-
Install
|
|
7
|
+
Install a component with `npx`:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
npx love-ui@latest add alert
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Install LoveUI Skills for an AI coding tool:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx love-ui@latest add loveui-skills
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The CLI will ask which target to install. You can also pass a target directly: `codex`, `claude`, `cursor`, `github`, or `all`.
|
|
20
|
+
|
|
21
|
+
The package ships the CLI and the repository-level `registry/` tree used by the CLI.
|
|
14
22
|
|
|
15
23
|
## Development
|
|
16
24
|
|
|
17
25
|
```bash
|
|
18
26
|
bun install
|
|
19
|
-
bun run
|
|
27
|
+
bun run build
|
|
20
28
|
```
|
|
21
29
|
|
|
22
|
-
The
|
|
30
|
+
The build script bundles the CLI into `dist/` and copies the repository-level `registry/` directory into this package before npm creates the release tarball.
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
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
|
+
import { twMerge } from "tailwind-merge"
|
|
4
|
+
|
|
5
|
+
export function cn(...inputs: ClassValue[]) {
|
|
6
|
+
return twMerge(clsx(inputs))
|
|
7
|
+
}
|
|
8
|
+
`,xe="love-ui globals",De=`/* love-ui globals */
|
|
9
|
+
@custom-variant dark (&:is(.dark *));
|
|
10
|
+
|
|
11
|
+
@theme inline {
|
|
12
|
+
--color-background: var(--background);
|
|
13
|
+
--color-foreground: var(--foreground);
|
|
14
|
+
--color-card: var(--card);
|
|
15
|
+
--color-card-foreground: var(--card-foreground);
|
|
16
|
+
--color-popover: var(--popover);
|
|
17
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
18
|
+
--color-primary: var(--primary);
|
|
19
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
20
|
+
--color-secondary: var(--secondary);
|
|
21
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
22
|
+
--color-muted: var(--muted);
|
|
23
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
24
|
+
--color-accent: var(--accent);
|
|
25
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
26
|
+
--color-destructive: var(--destructive);
|
|
27
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
28
|
+
--color-info: var(--info);
|
|
29
|
+
--color-info-foreground: var(--info-foreground);
|
|
30
|
+
--color-success: var(--success);
|
|
31
|
+
--color-success-foreground: var(--success-foreground);
|
|
32
|
+
--color-warning: var(--warning);
|
|
33
|
+
--color-warning-foreground: var(--warning-foreground);
|
|
34
|
+
--color-border: var(--border);
|
|
35
|
+
--color-input: var(--input);
|
|
36
|
+
--color-ring: var(--ring);
|
|
37
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
38
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
39
|
+
--radius-lg: var(--radius);
|
|
40
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:root {
|
|
44
|
+
--radius: 0.625rem;
|
|
45
|
+
--background: oklch(1 0 0);
|
|
46
|
+
--foreground: oklch(0.21 0.006 285.885);
|
|
47
|
+
--card: oklch(1 0 0);
|
|
48
|
+
--card-foreground: oklch(0.21 0.006 285.885);
|
|
49
|
+
--popover: oklch(1 0 0);
|
|
50
|
+
--popover-foreground: oklch(0.21 0.006 285.885);
|
|
51
|
+
--primary: oklch(0.274 0.006 286.033);
|
|
52
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
53
|
+
--secondary: oklch(0 0 0 / 4%);
|
|
54
|
+
--secondary-foreground: oklch(0.21 0.006 285.885);
|
|
55
|
+
--muted: oklch(0 0 0 / 4%);
|
|
56
|
+
--muted-foreground: oklch(0.442 0.017 285.786);
|
|
57
|
+
--accent: oklch(0 0 0 / 4%);
|
|
58
|
+
--accent-foreground: oklch(0.21 0.006 285.885);
|
|
59
|
+
--destructive: oklch(0.637 0.237 25.331);
|
|
60
|
+
--destructive-foreground: oklch(0.505 0.213 27.518);
|
|
61
|
+
--info: oklch(0.623 0.214 259.815);
|
|
62
|
+
--info-foreground: oklch(0.488 0.243 264.376);
|
|
63
|
+
--success: oklch(0.696 0.17 162.48);
|
|
64
|
+
--success-foreground: oklch(0.508 0.118 165.612);
|
|
65
|
+
--warning: oklch(0.769 0.188 70.08);
|
|
66
|
+
--warning-foreground: oklch(0.555 0.163 48.998);
|
|
67
|
+
--border: oklch(0 0 0 / 10%);
|
|
68
|
+
--input: oklch(0 0 0 / 10%);
|
|
69
|
+
--ring: oklch(0.705 0.015 286.067);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.dark {
|
|
73
|
+
--background: oklch(0.141 0.005 285.823);
|
|
74
|
+
--foreground: oklch(0.967 0.001 286.375);
|
|
75
|
+
--card: color-mix(in srgb, oklch(0.21 0.006 285.885) 80%, oklch(0.141 0.005 285.823));
|
|
76
|
+
--card-foreground: oklch(0.967 0.001 286.375);
|
|
77
|
+
--popover: oklch(0.21 0.006 285.885);
|
|
78
|
+
--popover-foreground: oklch(0.967 0.001 286.375);
|
|
79
|
+
--primary: oklch(0.967 0.001 286.375);
|
|
80
|
+
--primary-foreground: oklch(0.21 0.006 285.885);
|
|
81
|
+
--secondary: oklch(1 0 0 / 6%);
|
|
82
|
+
--secondary-foreground: oklch(0.967 0.001 286.375);
|
|
83
|
+
--muted: oklch(1 0 0 / 6%);
|
|
84
|
+
--muted-foreground: oklch(0.705 0.015 286.067);
|
|
85
|
+
--accent: oklch(1 0 0 / 6%);
|
|
86
|
+
--accent-foreground: oklch(0.967 0.001 286.375);
|
|
87
|
+
--destructive: oklch(0.637 0.237 25.331);
|
|
88
|
+
--destructive-foreground: oklch(0.704 0.191 22.216);
|
|
89
|
+
--info: oklch(0.623 0.214 259.815);
|
|
90
|
+
--info-foreground: oklch(0.707 0.165 254.624);
|
|
91
|
+
--success: oklch(0.696 0.17 162.48);
|
|
92
|
+
--success-foreground: oklch(0.765 0.177 163.223);
|
|
93
|
+
--warning: oklch(0.769 0.188 70.08);
|
|
94
|
+
--warning-foreground: oklch(0.828 0.189 84.429);
|
|
95
|
+
--border: oklch(1 0 0 / 12%);
|
|
96
|
+
--input: oklch(1 0 0 / 12%);
|
|
97
|
+
--ring: oklch(0.552 0.016 285.938);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@layer base {
|
|
101
|
+
* {
|
|
102
|
+
@apply border-border outline-ring/50;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
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
|
+
|
|
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
|
+
description: Use LoveUI Skills when building, reviewing, or polishing LoveUI interfaces.
|
|
112
|
+
globs: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
|
|
113
|
+
alwaysApply: false
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
Use the LoveUI skill pack in \`.cursor/loveui-skills\` for LoveUI UI work.
|
|
117
|
+
|
|
118
|
+
Start with \`.cursor/loveui-skills/SKILL.md\`, then read the matching files in \`.cursor/loveui-skills/references\` and \`.cursor/loveui-skills/skills\`.
|
|
119
|
+
|
|
120
|
+
For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
|
|
121
|
+
|
|
122
|
+
Installed skill pack: ${e}
|
|
123
|
+
`}function Ge(e){return`---
|
|
124
|
+
applyTo: "**/*.{ts,tsx,js,jsx,css,md,mdx}"
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
# LoveUI Skills
|
|
128
|
+
|
|
129
|
+
Use the LoveUI skill pack in \`.github/loveui-skills\` when building, reviewing, or polishing LoveUI interfaces.
|
|
130
|
+
|
|
131
|
+
Start with \`.github/loveui-skills/SKILL.md\`, then read the matching files in \`.github/loveui-skills/references\` and \`.github/loveui-skills/skills\`.
|
|
132
|
+
|
|
133
|
+
For component installs, use \`npx love-ui add <component>\`. Do not install internal \`@loveui/*\`, \`@love-ui/*\`, or \`@repo/*\` packages directly.
|
|
134
|
+
|
|
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
|
+
Which AI tool should LoveUI Skills target?
|
|
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
|
+
Failed to install dependencies. You may need to install them manually:`),console.warn(` ${i.join(`
|
|
144
|
+
`)}`),!1):(console.log(`Dependencies installed successfully!
|
|
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
|
+
\u2713 Done! You can now import and use the components in your app.`:`
|
|
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};
|
|
@@ -0,0 +1,2 @@
|
|
|
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.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
|
@@ -1,19 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "love-ui",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"loveui": "dist/index.js",
|
|
9
|
+
"love-ui": "dist/index.js",
|
|
10
|
+
"loveui-mcp": "dist/mcp-server.js"
|
|
11
|
+
},
|
|
7
12
|
"files": [
|
|
8
|
-
"
|
|
13
|
+
"dist",
|
|
14
|
+
"registry",
|
|
15
|
+
"skills"
|
|
9
16
|
],
|
|
17
|
+
"main": "dist/index.js",
|
|
10
18
|
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"require": "./dist/index.js"
|
|
22
|
+
},
|
|
11
23
|
"./registry/*": "./registry/*",
|
|
12
24
|
"./package.json": "./package.json"
|
|
13
25
|
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.18.1",
|
|
28
|
+
"postcss": "^8.5.6",
|
|
29
|
+
"postcss-nested": "^7.0.2"
|
|
30
|
+
},
|
|
14
31
|
"scripts": {
|
|
15
|
-
"
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"postbuild": "node ./scripts/copy-registry.mjs",
|
|
34
|
+
"prepack": "npm run build",
|
|
16
35
|
"verify:registry": "node ./scripts/copy-registry.mjs",
|
|
17
|
-
"clean": "rimraf registry"
|
|
36
|
+
"clean": "rimraf dist registry"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^20.14.10",
|
|
40
|
+
"rimraf": "^6.0.1",
|
|
41
|
+
"tsup": "^8.5.0"
|
|
18
42
|
}
|
|
19
43
|
}
|
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
|
+
}
|