love-ui 1.2.19 → 1.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-VDMHIXDM.js +121 -0
- package/dist/index.js +156 -134
- package/dist/mcp-server.js +1 -1
- package/package.json +38 -3
- package/registry/default/blocks/404-1/components/not-found.tsx +1 -1
- package/registry/default/blocks/404-2/components/not-found.tsx +1 -1
- package/registry/default/blocks/auth1/components/auth-page.tsx +2 -3
- package/registry/default/blocks/auth2/components/auth.tsx +2 -3
- package/registry/default/blocks/auth3/components/auth-page.tsx +2 -3
- package/registry/default/blocks/contact1/components/contact.tsx +1 -1
- package/registry/default/blocks/contact2/components/contact.tsx +2 -2
- package/registry/default/blocks/contact3/components/contact.tsx +2 -3
- package/registry/default/blocks/contact4/components/contact.tsx +1 -1
- package/registry/default/blocks/contact5/components/contact.tsx +1 -1
- package/registry/default/blocks/cta-2/components/cta.tsx +1 -1
- package/registry/default/blocks/cta-3/components/cta.tsx +1 -1
- package/registry/default/blocks/cta-4/components/cta.tsx +1 -1
- package/registry/default/blocks/cta-5/components/cta.tsx +1 -1
- package/registry/default/blocks/faq-4/components/faq.tsx +7 -1
- package/registry/default/blocks/faq-5/components/faq.tsx +1 -1
- package/registry/default/blocks/features1/components/feature-section.tsx +6 -1
- package/registry/default/blocks/features2/components/feature-section.tsx +1 -1
- package/registry/default/blocks/features3/components/feature-section.tsx +6 -1
- package/registry/default/blocks/features4/components/feature-section.tsx +6 -1
- package/registry/default/blocks/features5/components/feature-section.tsx +8 -1
- package/registry/default/blocks/features6/components/feature-section.tsx +1 -1
- package/registry/default/blocks/footer1/components/footer.tsx +1 -2
- package/registry/default/blocks/footer2/components/footer.tsx +1 -3
- package/registry/default/blocks/footer3/components/footer.tsx +1 -4
- package/registry/default/blocks/footer4/components/footer.tsx +2 -5
- package/registry/default/blocks/footer5/components/footer.tsx +1 -6
- package/registry/default/blocks/footer6/app/page.tsx +1 -1
- package/registry/default/blocks/footer6/components/footer.tsx +1 -4
- package/registry/default/blocks/header1/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/header2/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/header3/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/header3/components/nav-links.tsx +16 -1
- package/registry/default/blocks/header3/components/ui/navigation-menu.tsx +1 -1
- package/registry/default/blocks/hero1/components/hero.tsx +1 -1
- package/registry/default/blocks/hero1/components/logo-cloud.tsx +43 -61
- package/registry/default/blocks/hero1/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/hero2/components/hero.tsx +1 -1
- package/registry/default/blocks/hero2/components/logo-cloud.tsx +38 -107
- package/registry/default/blocks/hero2/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/hero3/components/hero.tsx +1 -1
- package/registry/default/blocks/hero3/components/logo-cloud.tsx +39 -55
- package/registry/default/blocks/hero3/components/mobile-nav.tsx +1 -1
- package/registry/default/blocks/integrations1/components/integrations.tsx +45 -27
- package/registry/default/blocks/integrations2/components/integrations.tsx +46 -36
- package/registry/default/blocks/integrations3/components/integrations.tsx +53 -106
- package/registry/default/blocks/integrations4/components/integrations.tsx +53 -108
- package/registry/default/blocks/integrations5/components/integrations.tsx +51 -68
- package/registry/default/blocks/logo-cloud-1/components/logo-cloud.tsx +39 -54
- package/registry/default/blocks/logo-cloud-2/components/logo-cloud.tsx +39 -50
- package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +41 -56
- package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +41 -56
- package/registry/default/blocks/logo-cloud-5/components/logo-cloud.tsx +39 -55
- package/registry/default/blocks/onboarding1/components/onboarding.tsx +7 -7
- package/registry/default/blocks/onboarding2/components/onboarding.tsx +19 -9
- package/registry/default/blocks/onboarding3/components/onboarding.tsx +1 -1
- package/registry/default/blocks/onboarding4/components/onboarding.tsx +6 -6
- package/registry/default/blocks/onboarding6/components/onboarding.tsx +1 -1
- package/registry/default/blocks/onboarding7/components/onboarding.tsx +4 -4
- package/registry/default/blocks/pricing1/components/pricing.tsx +1 -1
- package/registry/default/blocks/pricing2/components/pricing.tsx +1 -1
- package/registry/default/blocks/pricing3/components/pricing.tsx +6 -1
- package/registry/default/blocks/pricing4/components/pricing.tsx +1 -1
- package/registry/default/blocks/stats11/components/stats.tsx +1 -1
- package/registry/default/blocks/stats2/components/stats.tsx +1 -1
- package/registry/default/blocks/stats4/components/stats.tsx +1 -1
- package/registry/default/blocks/stats6/components/stats.tsx +6 -1
- package/registry/default/blocks/stats7/components/stats.tsx +1 -1
- package/registry/default/blocks/testimonials3/components/testimonials.tsx +1 -1
- package/registry/default/blocks/testimonials4/components/testimonials.tsx +1 -1
- package/registry/default/examples/accordion-in-card.tsx +1 -1
- package/registry/default/examples/accordion-leading-icon.tsx +1 -1
- package/registry/default/examples/accordion-with-icons.tsx +1 -1
- package/registry/default/examples/alert-billing-notice.tsx +1 -1
- package/registry/default/examples/alert-error.tsx +1 -1
- package/registry/default/examples/alert-info.tsx +1 -1
- package/registry/default/examples/alert-success.tsx +1 -1
- package/registry/default/examples/alert-warning.tsx +1 -1
- package/registry/default/examples/alert-with-icon-action.tsx +1 -1
- package/registry/default/examples/alert-with-icon.tsx +1 -1
- package/registry/default/examples/autocomplete-async.tsx +1 -1
- package/registry/default/examples/avatar-badge-icons.tsx +5 -5
- package/registry/default/examples/avatar-empty-collaborators.tsx +1 -1
- package/registry/default/examples/avatar-loading.tsx +2 -2
- package/registry/default/examples/avatar-menu.tsx +6 -6
- package/registry/default/examples/badge-release-status.tsx +1 -1
- package/registry/default/examples/badge-with-icon.tsx +1 -1
- package/registry/default/examples/breadcrumb-buttons.tsx +5 -5
- package/registry/default/examples/breadcrumb-card.tsx +1 -1
- package/registry/default/examples/breadcrumb-workspace-path.tsx +1 -1
- package/registry/default/examples/button-command-bar.tsx +1 -1
- package/registry/default/examples/button-default-icons.tsx +1 -1
- package/registry/default/examples/button-demo.tsx +1 -1
- package/registry/default/examples/button-destructive-icons.tsx +1 -1
- package/registry/default/examples/button-destructive-outline-icons.tsx +1 -1
- package/registry/default/examples/button-ghost-icons.tsx +1 -1
- package/registry/default/examples/button-icon-lg.tsx +1 -1
- package/registry/default/examples/button-icon-sm.tsx +1 -1
- package/registry/default/examples/button-icon.tsx +1 -1
- package/registry/default/examples/button-link-icons.tsx +1 -1
- package/registry/default/examples/button-loading.tsx +1 -1
- package/registry/default/examples/button-outline-icons.tsx +1 -1
- package/registry/default/examples/button-secondary-icons.tsx +1 -1
- package/registry/default/examples/button-theme-toggle.tsx +1 -1
- package/registry/default/examples/button-with-icon.tsx +1 -1
- package/registry/default/examples/card-help-link.tsx +1 -1
- package/registry/default/examples/card-help-menu.tsx +7 -7
- package/registry/default/examples/card-image-centered.tsx +1 -1
- package/registry/default/examples/card-image-feature.tsx +1 -1
- package/registry/default/examples/card-metric-actions.tsx +9 -9
- package/registry/default/examples/card-metric-summary.tsx +1 -1
- package/registry/default/examples/card-resource-link.tsx +1 -1
- package/registry/default/examples/card-usage-expandable.tsx +1 -1
- package/registry/default/examples/checkbox-notification-row.tsx +1 -1
- package/registry/default/examples/collapsible-demo.tsx +1 -1
- package/registry/default/examples/collapsible-release-notes.tsx +1 -1
- package/registry/default/examples/combobox-with-inner-input.tsx +1 -1
- package/registry/default/examples/empty-demo.tsx +1 -1
- package/registry/default/examples/empty-filtered-results.tsx +1 -1
- package/registry/default/examples/empty-inbox-zero.tsx +1 -1
- package/registry/default/examples/empty-upload-queue.tsx +1 -1
- package/registry/default/examples/form.tsx +7 -7
- package/registry/default/examples/group-demo.tsx +1 -1
- package/registry/default/examples/group-toolbar-actions.tsx +1 -1
- package/registry/default/examples/group-with-input.tsx +1 -1
- package/registry/default/examples/input-search-inline.tsx +1 -1
- package/registry/default/examples/menu-demo.tsx +6 -6
- package/registry/default/examples/menu-project-actions.tsx +1 -1
- package/registry/default/examples/popover-with-close.tsx +1 -1
- package/registry/default/examples/preview-card-demo.tsx +1 -1
- package/registry/default/examples/preview-card-repository.tsx +1 -1
- package/registry/default/examples/skeleton-demo.tsx +1 -1
- package/registry/default/examples/switch-privacy-mode.tsx +1 -1
- package/registry/default/examples/table.tsx +1 -1
- package/registry/default/examples/toggle-group-demo.tsx +1 -1
- package/registry/default/examples/toggle-group-disabled.tsx +1 -1
- package/registry/default/examples/toggle-group-lg.tsx +1 -1
- package/registry/default/examples/toggle-group-multiple.tsx +1 -1
- package/registry/default/examples/toggle-group-outline-with-separator.tsx +1 -1
- package/registry/default/examples/toggle-group-outline.tsx +1 -1
- package/registry/default/examples/toggle-group-sm.tsx +1 -1
- package/registry/default/examples/toggle-group-with-disabled-item.tsx +1 -1
- package/registry/default/examples/toggle-icon-group.tsx +1 -1
- package/registry/default/examples/toggle-view-mode.tsx +1 -1
- package/registry/default/examples/toggle-with-icon.tsx +1 -1
- package/registry/default/examples/toolbar-canvas-controls.tsx +1 -1
- package/registry/default/examples/toolbar-demo.tsx +6 -6
- package/registry/default/examples/toolbar-density-controls.tsx +1 -1
- package/registry/default/examples/toolbar-media-controls.tsx +1 -1
- package/registry/default/examples/tooltip-grouped.tsx +1 -1
- package/registry/default/examples/tooltip-icon-row.tsx +1 -1
- package/registry/default/icons/package.json +1 -1
- package/registry/default/icons/scripts/generate-registry.ts +5 -5
- package/registry/default/logos/package.json +1 -1
- package/registry/default/logos/scripts/generate-registry.ts +5 -5
- package/registry/default/logos/src/generated/ai/index.tsx +3 -3
- package/registry/default/logos/src/generated/index.tsx +4 -4
- package/registry/default/ui/accordion.tsx +1 -1
- package/registry/default/ui/autocomplete.tsx +1 -1
- package/registry/default/ui/breadcrumb.tsx +1 -1
- package/registry/default/ui/combobox.tsx +1 -1
- package/registry/default/ui/dialog.tsx +1 -1
- package/registry/default/ui/dropdown-menu.tsx +1 -1
- package/registry/default/ui/menu.tsx +1 -1
- package/registry/default/ui/number-field.tsx +1 -1
- package/registry/default/ui/pagination.tsx +4 -4
- package/registry/default/ui/select.tsx +4 -4
- package/registry/default/ui/sheet.tsx +1 -1
- package/registry/default/ui/sidebar.tsx +1 -1
- package/registry/default/ui/toast.tsx +6 -6
- package/registry/default/vectors/package.json +1 -1
- package/registry/default/vectors/scripts/generate-registry.ts +5 -5
- package/registry/default/blocks/auth1/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/auth1/components/icons/google-icon.tsx +0 -14
- package/registry/default/blocks/auth2/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/auth2/components/icons/google-icon.tsx +0 -14
- package/registry/default/blocks/auth3/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/auth3/components/icons/google-icon.tsx +0 -14
- package/registry/default/blocks/contact2/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/contact3/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/contact3/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer1/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/footer1/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer2/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/footer2/components/icons/instagram-icon.tsx +0 -12
- package/registry/default/blocks/footer2/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer3/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/footer3/components/icons/instagram-icon.tsx +0 -12
- package/registry/default/blocks/footer3/components/icons/linkedin-icon.tsx +0 -12
- package/registry/default/blocks/footer3/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer4/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/footer4/components/icons/instagram-icon.tsx +0 -12
- package/registry/default/blocks/footer4/components/icons/linkedin-icon.tsx +0 -12
- package/registry/default/blocks/footer4/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer5/components/icons/apple-icon.tsx +0 -18
- package/registry/default/blocks/footer5/components/icons/facebook-icon.tsx +0 -12
- package/registry/default/blocks/footer5/components/icons/google-play-icon.tsx +0 -10
- package/registry/default/blocks/footer5/components/icons/instagram-icon.tsx +0 -12
- package/registry/default/blocks/footer5/components/icons/linkedin-icon.tsx +0 -12
- package/registry/default/blocks/footer5/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/footer6/components/icons/apple-icon.tsx +0 -18
- package/registry/default/blocks/footer6/components/icons/facebook-icon.tsx +0 -12
- package/registry/default/blocks/footer6/components/icons/github-icon.tsx +0 -10
- package/registry/default/blocks/footer6/components/icons/google-play-icon.tsx +0 -10
- package/registry/default/blocks/footer6/components/icons/instagram-icon.tsx +0 -12
- package/registry/default/blocks/footer6/components/icons/linkedin-icon.tsx +0 -12
- package/registry/default/blocks/footer6/components/icons/x-icon.tsx +0 -12
- package/registry/default/blocks/hero1/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/hero1/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/hero1/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/hero1/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/hero1/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/hero1/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/hero1/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/hero1/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/hero2/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/hero2/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/hero2/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/hero3/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/hero3/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/hero3/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/adobe.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/canva.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/cursor.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/gmail.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/notion.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/planetscale.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/polar.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/supabase.svg +0 -1
- package/registry/default/blocks/integrations1/components/logos/vercel.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/adobe.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/canva.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/cursor.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/gmail.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/notion.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/planetscale.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/polar.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/supabase.svg +0 -1
- package/registry/default/blocks/integrations2/components/logos/vercel.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/adobe.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/canva.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/cursor.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/gmail.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/notion.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/planetscale.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/polar.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/supabase.svg +0 -1
- package/registry/default/blocks/integrations3/components/logos/vercel.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/adobe.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/canva.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/cursor.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/gmail.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/notion.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/planetscale.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/polar.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/supabase.svg +0 -1
- package/registry/default/blocks/integrations4/components/logos/vercel.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/adobe.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/canva.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/cursor.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/gmail.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/notion.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/planetscale.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/polar.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/supabase.svg +0 -1
- package/registry/default/blocks/integrations5/components/logos/vercel.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/logo-cloud-1/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/logo-cloud-1/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-1/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/logo-cloud-2/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/logo-cloud-2/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-2/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/logo-cloud-3/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/logo-cloud-3/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-3/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/logo-cloud-4/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/logo-cloud-4/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-4/components/logos/vercel-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/claude-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/clerk-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/github-wordmark.svg +0 -6
- package/registry/default/blocks/logo-cloud-5/components/logos/nvidia-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/openai-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/supabase-wordmark.svg +0 -23
- package/registry/default/blocks/logo-cloud-5/components/logos/turso-wordmark.svg +0 -1
- package/registry/default/blocks/logo-cloud-5/components/logos/vercel-wordmark.svg +0 -1
package/dist/index.js
CHANGED
|
@@ -1,149 +1,171 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
|
|
2
|
+
import{$ as L,A as Lt,Aa as qo,B as _t,Ba as lt,C as jo,Ca as He,D as Vt,Da as Zo,E as Dt,Ea as Xo,F as To,Fa as Qo,G as Ut,Ga as en,H as Mt,Ha as tn,I as xr,J as Fo,K as Oo,L as Ao,M as No,N as q,O as Lo,P as Bt,Q as _o,R as Vo,S as Do,T as Uo,U as j,V as ae,W as ze,X as Mo,Y as Sr,Z as je,_ as Je,a as S,aa as ne,b as re,ba as Wt,c as jt,ca as Bo,d,da as Ir,e as l,ea as Wo,f as M,fa as le,g as B,ga as ce,h as W,ha as zo,i as Ro,ia as R,j as xo,ja as lm,k as Tt,ka as ie,l as z,la as cm,m as So,ma as fm,n as at,na as Ge,o as Ee,oa as Pr,p as Io,pa as Jo,q as Rr,qa as Go,r as Po,ra as zt,s as $o,sa as mm,t as Eo,ta as Ho,u as b,ua as Ko,v as Ft,va as $r,w as We,wa as Yo,x as Ot,xa as pm,y as At,ya as um,z as Nt,za as F}from"./chunk-VDMHIXDM.js";import hl from"path";import{promises as Aa}from"fs";import ue from"path";import on from"path";import Er from"fs-extra";async function nn(e){let t={};if(!Er.existsSync(e.cwd)||!Er.existsSync(on.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let r=b("Preflight checks.",{silent:e.silent}).start();Er.existsSync(on.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),l.break(),l.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
|
|
3
|
+
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),r?.succeed();let o=b("Verifying framework.",{silent:e.silent}).start(),n=e.existingConfig?.tailwind,i=await F(e.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=!0,o?.fail(),!e.monorepo&&await M(e.cwd)){let f=await B(e.cwd);f.length>0&&(W("init",f),process.exit(1))}l.break(),i?.framework.links.installation&&l.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
|
|
4
|
+
Visit ${d.info(i?.framework.links.installation)} to manually configure your project.
|
|
5
|
+
Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var ys=["nova","vega","maia","lyra","mira","luma","sera","rhea"],jr=["neutral","stone","zinc","gray","mauve","olive","mist","taupe"],Gt=["neutral","stone","zinc","gray","amber","blue","cyan","emerald","fuchsia","green","indigo","lime","orange","pink","purple","red","rose","sky","teal","violet","yellow","mauve","olive","mist","taupe"],ws=Gt,sn={neutral:"blue",stone:"lime",zinc:"amber",mauve:"emerald",olive:"violet",mist:"rose",taupe:"cyan"},Tr=["lucide","hugeicons","tabler","phosphor","remixicon"],Ht=["inter","noto-sans","nunito-sans","figtree","roboto","raleway","dm-sans","public-sans","outfit","jetbrains-mono","geist","geist-mono","lora","merriweather","playfair-display","noto-serif","roboto-slab","oxanium","manrope","space-grotesk","montserrat","ibm-plex-sans","source-sans-3","instrument-sans","eb-garamond","instrument-serif"],Fr=["inherit",...Ht],bs=["default","none","small","medium","large"],Or=["subtle","bold"],Ar=["default","inverted","default-translucent","inverted-translucent"],an=[{key:"menuColor",values:Ar,bits:3},{key:"menuAccent",values:Or,bits:3},{key:"radius",values:bs,bits:4},{key:"font",values:Ht,bits:6},{key:"iconLibrary",values:Tr,bits:6},{key:"theme",values:Gt,bits:6},{key:"baseColor",values:jr,bits:6},{key:"style",values:ys,bits:6}],Nr=[...an,{key:"chartColor",values:ws,bits:6},{key:"fontHeading",values:Fr,bits:5}],ks=Object.fromEntries(Nr.map(e=>[e.key,e.values[0]])),Lr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",vs="b",ln=["a","b"];function Cs(e){if(e===0)return"0";let t="",r=e;for(;r>0;)t=Lr[r%62]+t,r=Math.floor(r/62);return t}function Rs(e){let t=0;for(let r=0;r<e.length;r++){let o=Lr.indexOf(e[r]);if(o===-1)return-1;t=t*62+o}return t}function cn(e){let t={...ks,...e},r=0,o=0;for(let n of Nr){let i=n.values.indexOf(t[n.key]);r+=(i===-1?0:i)*2**o,o+=n.bits}return vs+Cs(r)}function Ke(e){if(!e||e.length<2)return null;let t=e[0];if(!ln.includes(t))return null;let r=t==="a"?an:Nr,o=Rs(e.slice(1));if(o<0)return null;let n={},i=0;for(let s of r){let c=Math.floor(o/2**i)%2**s.bits;n[s.key]=c<s.values.length?s.values[c]:s.values[0],i+=s.bits}return t==="a"&&(n.fontHeading="inherit"),n}function Ye(e){if(!e||e.length<2||e.length>10||!ln.includes(e[0]))return!1;for(let t=1;t<e.length;t++)if(Lr.indexOf(e[t])===-1)return!1;return!0}import xs from"path";async function fn(e,t){let r=new Set,o=new Set,n=[...e];for(;n.length>0;){let i=n.shift();if(o.has(i))continue;o.add(i);let{registry:s}=Tt(i);s&&!re[s]&&r.add(s);try{let[c]=await Wo([i],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=Tt(a);f&&!re[f]&&r.add(f),o.has(a)||n.push(a)}}catch(c){if(c instanceof xo){let{registry:a}=Tt(i);a&&!re[a]&&r.add(a);continue}continue}}return Array.from(r)}import Ss from"fs-extra";async function G(e,t,r={}){r={silent:!1,writeFile:!0,...r};let n=(await fn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(re).includes(f));if(n.length===0)return{config:t,newRegistries:[]};let i=await Yo({useCache:process.env.NODE_ENV!=="development"});if(!i)return{config:t,newRegistries:[]};let s={};for(let f of n)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return{config:t,newRegistries:[]};let c=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(re).includes(f))),a={...t,registries:{...c,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=b("Updating components.json.",{silent:r.silent}).start(),u=z.parse(m);await Ss.writeFile(xs.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
6
|
+
`,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import Is from"open";import mn from"prompts";var Z={nova:{title:"Nova",description:"Lucide / Geist",style:"nova",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},vega:{title:"Vega",description:"Lucide / Inter",style:"vega",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},maia:{title:"Maia",description:"Hugeicons / Figtree",style:"maia",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"figtree",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},lyra:{title:"Lyra",description:"Phosphor / JetBrains Mono",style:"lyra",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"phosphor",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},mira:{title:"Mira",description:"Hugeicons / Inter",style:"mira",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"hugeicons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},luma:{title:"Luma",description:"Lucide / Inter",style:"luma",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},sera:{title:"Sera",description:"Lucide / Noto Sans + Playfair Display",style:"sera",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"lucide",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},rhea:{title:"Rhea",description:"Lucide / Inter",style:"rhea",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"lucide",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1}};function _r(e){let t=new URL(`${S}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function Vr(e){if(l.break(),l.log(` Build your custom preset on ${d.info(e.createUrl)}`),l.log(` ${e.followUp}`),l.break(),e.prompt===!1)return;let{proceed:t}=await mn({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});t&&await Is(e.createUrl)}function he(e,t){let r=new URLSearchParams({base:"base",style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:e.iconLibrary,font:e.font,rtl:String(e.rtl??!1),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${S}/init?${r.toString()}`}async function qe(){return"base"}async function ct(e){let t=Object.entries(Z),{selectedPreset:r}=await mn({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${d.info(`${S}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=_r({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Vr({createUrl:n,followUp:`Then ${d.info("copy and run the command")} from loveui.dev.`}),process.exit(0)}let o=Z[r];return o||process.exit(1),{url:he({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let o=L(Je({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await G([e],o,{silent:!0,writeFile:!1});o=n,Bo(e,o);let[i]=await ie([e],{config:o,useCache:!0}),s=i?.type==="registry:base"&&i.config?i.config:void 0,c=e;if(Ps(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString()}return{registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:c}}function Ps(e){try{return new URL(e).pathname==="/init"&&e.startsWith(S)}catch{return!1}}import Pn from"dedent";import $s from"os";import me from"path";import{execa as Fe}from"execa";import V from"fs-extra";var Es=process.env.LOVEUI_GITHUB_URL??"https://github.com/loveconnor/loveui.git";function X(e){return{...e,frameworks:e.frameworks??[],scaffold:e.scaffold??un({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??Os}}function Oe(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=un({title:e.title,templateDir:r.templateDir}),o}function js(e){switch(e){case"pnpm":return["--no-frozen-lockfile"];case"yarn":return["--no-immutable"];default:return[]}}async function Ts(e,t){if(t==="pnpm")return;let r=me.join(e,"pnpm-workspace.yaml"),o=me.join(e,"package.json"),n=me.join(e,"pnpm-lock.yaml");V.existsSync(n)&&await V.remove(n);let i=V.existsSync(r),s=i?Ro(await V.readFile(r,"utf8")):[],c=s.length>0;if(V.existsSync(o)){let a=await V.readFile(o,"utf8"),f=JSON.parse(a);c?f.packageManager=await Fs(t):delete f.packageManager,c&&(f.workspaces=s),await V.writeFile(o,JSON.stringify(f,null,2)+`
|
|
7
|
+
`)}i&&await V.remove(r),c&&t==="npm"&&await pn(e)}async function Fs(e){try{let{stdout:t}=await Fe(e,["--version"]);return`${e}@${t.trim()}`}catch{return`${e}@*`}}async function pn(e){let t=await V.readdir(e,{withFileTypes:!0});for(let r of t){if(r.name==="node_modules")continue;let o=me.join(e,r.name);if(r.isDirectory())await pn(o);else if(r.name==="package.json"){let n=await V.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=!1;for(let c of["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[c];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=!0)}s&&await V.writeFile(o,JSON.stringify(i,null,2)+`
|
|
8
|
+
`)}}}function un({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=b(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.LOVEUI_TEMPLATE_DIR;if(i){let f=me.resolve(i,t);await V.copy(f,r,{filter:m=>!m.includes("node_modules")})}else{let f=me.join($s.tmpdir(),`love-ui-template-${Date.now()}`);await Fe("git",["clone","--depth","1","--filter=blob:none","--sparse",Es,f]),await Fe("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=me.resolve(f,"templates",t);await V.move(m,r),await V.remove(f)}await Ts(r,o);let c=["install",...js(o)];await Fe(o,c,{cwd:r});let a=me.join(r,"package.json");if(V.existsSync(a)){let f=await V.readFile(a,"utf8"),m=JSON.parse(f);m.name=me.basename(r),await V.writeFile(a,JSON.stringify(m,null,2)+`
|
|
9
|
+
`)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function Os({projectPath:e}){try{await Fe("git",["init"],{cwd:e}),await Fe("git",["add","-A"],{cwd:e}),await Fe("git",["commit","-m","feat: initial commit"],{cwd:e})}catch{}}import Xt from"path";import ke from"path";var dn={"--font-heading":"cn-font-heading"};function As(e){return e.startsWith("--")?e:`--${e}`}function Ae(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let n=o.font?.variable;if(!n)continue;let i=dn[n];i&&t.add(i)}for(let o of Object.values(r.cssVars??{}))for(let n of Object.keys(o??{})){let i=dn[As(n)];i&&t.add(i)}}return Array.from(t)}import Ze from"path";function gn(e,t){if(e.includes("\0"))return!1;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r)}catch{return!1}let o=Ze.normalize(r.replace(/\\/g,"/")),n=Ze.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(o)||i(r)||i(e))return!1;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return!1;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):!1;if(Ze.isAbsolute(o))return o.startsWith(n+Ze.sep);let p=Ze.resolve(n,o);return p.startsWith(n+Ze.sep)||p===n}import{promises as kn}from"fs";import Hs from"path";import{promises as hn}from"fs";import Ns from"path";import N from"postcss";import Ls from"postcss/lib/at-rule";import{z as ye}from"zod";async function Kt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,...r};let o=t.resolvedPaths.tailwindCss,n=Ns.relative(t.resolvedPaths.cwd,o),i=b(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),s=await hn.readFile(o,"utf8"),c=await ft(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await hn.writeFile(o,c,"utf8"),i.succeed()}async function ft(e,t,r,o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1}){o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,...o};let n=[_s(t)];o.cleanupDefaultNextStyles&&n.push(wn()),o.tailwindVersion==="v4"&&(n=[],n.push(Ms({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&n.push(wn()),n.push(Ds(t,{overwriteCssVars:o.overwriteCssVars})),n.push(Us(t)),o.tailwindConfig&&(n.push(Bs(o.tailwindConfig)),n.push(zs(o.tailwindConfig)),n.push(Ws(o.tailwindConfig))));let s=(await N(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
4
10
|
|
|
5
|
-
|
|
6
|
-
|
|
11
|
+
`)),s}function _s(e){return{postcssPlugin:"update-css-vars",Once(t){let r=t.nodes.find(o=>o.type==="atrule"&&o.name==="layer"&&o.params==="base");r instanceof Ls||(r=N.atRule({name:"layer",params:"base",nodes:[],raws:{semicolon:!0,before:`
|
|
12
|
+
`,between:" "}}),t.append(r),t.insertBefore(r,N.comment({text:"---break---"}))),r!==void 0&&Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;Vs(r,i,n)})}}}function yn(e){let t=e.nodes.find(r=>r.type==="rule"&&r.selector===":root");if(t){let r=["--background","--foreground"];t.nodes.filter(o=>o.type==="decl"&&r.includes(o.prop)).forEach(o=>o.remove()),t.nodes.length===0&&t.remove()}}function wn(){return{postcssPlugin:"cleanup-default-next-styles",Once(e){let t=e.nodes.find(o=>o.type==="rule"&&o.selector==="body");t&&(t.nodes.find(o=>o.type==="decl"&&o.prop==="color"&&["rgb(var(--foreground-rgb))","var(--foreground)"].includes(o.value))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="background"&&(o.value.startsWith("linear-gradient")||o.value==="var(--background)"))?.remove(),t.nodes.find(o=>o.type==="decl"&&o.prop==="font-family"&&o.value==="Arial, Helvetica, sans-serif")?.remove(),t.nodes.length===0&&t.remove()),yn(e);let r=e.nodes.find(o=>o.type==="atrule"&&o.params==="(prefers-color-scheme: dark)");r&&(yn(r),r.nodes.length===0&&r.remove())}}}function Vs(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);o||Object.keys(r).length>0&&(o=N.rule({selector:t,raws:{between:" ",before:`
|
|
13
|
+
`}}),e.append(o)),Object.entries(r).forEach(([n,i])=>{let s=`--${n.replace(/^--/,"")}`,c=N.decl({prop:s,value:i,raws:{semicolon:!0}}),a=o?.nodes.find(f=>f.type==="decl"&&f.prop===s);a?a.replaceWith(c):o?.append(c)})}function Ds(e,t){return{postcssPlugin:"update-css-vars-v4",Once(r){Object.entries(e).forEach(([o,n])=>{let i=o==="light"?":root":`.${o}`;if(o==="theme"){i="@theme";let c=Yt(r);Object.entries(n).forEach(([a,f])=>{let m=`--${a.replace(/^--/,"")}`,p=N.decl({prop:m,value:f,raws:{semicolon:!0}}),u=c?.nodes?.find(h=>h.type==="decl"&&h.prop===m);t.overwriteCssVars?u?u.replaceWith(p):c?.append(p):u||c?.append(p)});return}let s=r.nodes?.find(c=>c.type==="rule"&&c.selector===i);!s&&Object.keys(n).length>0&&(s=N.rule({selector:i,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
14
|
+
`}}),r.append(s),r.insertBefore(s,N.comment({text:"---break---"}))),Object.entries(n).forEach(([c,a])=>{let f=`--${c.replace(/^--/,"")}`;f==="--sidebar-background"&&(f="--sidebar"),bn(a)&&(a=`hsl(${a})`);let m=N.decl({prop:f,value:a,raws:{semicolon:!0}}),p=s?.nodes.find(u=>u.type==="decl"&&u.prop===f);t.overwriteCssVars?p?p.replaceWith(m):s?.append(m):p||s?.append(m)})})}}}function Us(e){return{postcssPlugin:"update-theme",Once(t){let r=Array.from(new Set(Object.keys(e).flatMap(i=>Object.keys(e[i]||{}))));if(!r.length)return;let o=Yt(t),n=o.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--"));for(let i of r){let s=Object.values(e).find(p=>p[i])?.[i];if(!s)continue;if(i==="radius"){let p={sm:"calc(var(--radius) * 0.6)",md:"calc(var(--radius) * 0.8)",lg:"var(--radius)",xl:"calc(var(--radius) * 1.4)","2xl":"calc(var(--radius) * 1.8)","3xl":"calc(var(--radius) * 2.2)","4xl":"calc(var(--radius) * 2.6)"};for(let[u,h]of Object.entries(p)){let g=N.decl({prop:`--radius-${u}`,value:h,raws:{semicolon:!0}});o?.nodes?.find(y=>y.type==="decl"&&y.prop===g.prop)||o?.append(g)}continue}let c=bn(s)||Gs(s)?`--color-${i.replace(/^--/,"")}`:`--${i.replace(/^--/,"")}`;c==="--color-sidebar-background"&&(c="--color-sidebar");let a=`var(--${i})`;c==="--color-sidebar"&&(a="var(--sidebar)");let f=N.decl({prop:c,value:a,raws:{semicolon:!0}});o?.nodes?.find(p=>p.type==="decl"&&p.prop===f.prop)||(n?.length?o?.insertAfter(n[n.length-1],f):o?.append(f))}}}}function Yt(e){let t=e.nodes.find(r=>r.type==="atrule"&&r.name==="theme"&&r.params==="inline");return t||(t=N.atRule({name:"theme",params:"inline",nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
15
|
+
`}}),e.append(t),e.insertBefore(t,N.comment({text:"---break---"}))),t}function Ms({params:e}){return{postcssPlugin:"add-custom-variant",Once(t){if(!t.nodes.find(o=>o.type==="atrule"&&o.name==="custom-variant")){let o=t.nodes.filter(i=>i.type==="atrule"&&i.name==="import"),n=N.atRule({name:"custom-variant",params:e,raws:{semicolon:!0,before:`
|
|
16
|
+
`}});if(o.length>0){let i=o[o.length-1];t.insertAfter(i,n)}else t.insertAfter(t.nodes[0],n);t.insertBefore(n,N.comment({text:"---break---"}))}}}}function Bs(e){return{postcssPlugin:"update-tailwind-config",Once(t){if(!e?.plugins)return;let o=Js(t)==="single"?"'":'"',n=t.nodes.filter(s=>s.type==="atrule"&&s.name==="plugin"),i=n[n.length-1]||t.nodes[0];for(let s of e.plugins){let c=s.replace(/^require\(["']|["']\)$/g,"");if(n.some(f=>f.params.replace(/["']/g,"")===c))continue;let a=N.atRule({name:"plugin",params:`${o}${c}${o}`,raws:{semicolon:!0,before:`
|
|
17
|
+
`}});t.insertAfter(i,a),t.insertBefore(a,N.comment({text:"---break---"}))}}}}function Ws(e){return{postcssPlugin:"update-tailwind-config-keyframes",Once(t){if(!e?.theme?.extend?.keyframes)return;let r=Yt(t),o=r.nodes?.filter(i=>i.type==="atrule"&&i.name==="keyframes"),n=ye.record(ye.string(),ye.record(ye.string(),ye.string()));for(let[i,s]of Object.entries(e.theme.extend.keyframes)){if(typeof i!="string")continue;let c=n.safeParse(s);if(!c.success||o?.find(f=>f.type==="atrule"&&f.name==="keyframes"&&f.params===i))continue;let a=N.atRule({name:"keyframes",params:i,nodes:[],raws:{semicolon:!0,between:" ",before:`
|
|
18
|
+
`}});for(let[f,m]of Object.entries(c.data)){let p=N.rule({selector:f,nodes:Object.entries(m).map(([u,h])=>N.decl({prop:u,value:h,raws:{semicolon:!0,before:`
|
|
19
|
+
`,between:": "}})),raws:{semicolon:!0,between:" ",before:`
|
|
20
|
+
`}});a.append(p)}r.append(a),r.insertBefore(a,N.comment({text:"---break---"}))}}}}function zs(e){return{postcssPlugin:"update-tailwind-config-animation",Once(t){if(!e?.theme?.extend?.animation)return;let r=Yt(t),o=r.nodes?.filter(i=>i.type==="decl"&&i.prop.startsWith("--animate-")),n=ye.record(ye.string(),ye.string()).safeParse(e.theme.extend.animation);if(n.success)for(let[i,s]of Object.entries(n.data)){let c=`--animate-${i}`;if(o?.find(f=>f.prop===c))continue;let a=N.decl({prop:c,value:s,raws:{semicolon:!0,between:": ",before:`
|
|
21
|
+
`}});r.append(a)}}}}function Js(e){return e.nodes[0].toString().includes("'")?"single":"double"}function bn(e){if(e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch"))return!1;let t=e.split(" ");return t.length===3&&t.slice(1,3).every(r=>r.includes("%"))}function Gs(e){return e.startsWith("hsl")||e.startsWith("rgb")||e.startsWith("#")||e.startsWith("oklch")||e.includes("--color-")}import P from"postcss";import{twMerge as Ks}from"tailwind-merge";async function mt(e,t,r){let o=e&&Object.keys(e).length>0,n=Object.keys(r.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!o&&!n)return;r={silent:!1,...r};let i=t.resolvedPaths.tailwindCss,s=Hs.relative(t.resolvedPaths.cwd,i),c=b(`Updating ${d.info(s)}`,{silent:r.silent}).start(),a=await kn.readFile(i,"utf8");n&&(a=await ft(a,r.cssVars,t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars})),o&&(a=await Dr(a,e)),await kn.writeFile(i,a,"utf8"),c.succeed()}async function Dr(e,t){let r=[Ys(t)],o=await P(r).process(e,{from:void 0}),n=o.css,i=o.root;if(i.nodes&&i.nodes.length>0){let s=i.nodes[i.nodes.length-1];s.type==="atrule"&&!s.nodes&&!n.trimEnd().endsWith(";")&&(n=n.trimEnd()+";")}return n=n.replace(/\/\* ---break--- \*\//g,""),n=n.replace(/(\n\s*\n)+/g,`
|
|
22
|
+
|
|
23
|
+
`),n=n.trimEnd(),n}function Ys(e){return{postcssPlugin:"update-css",Once(t){for(let[r,o]of Object.entries(e))if(r.startsWith("@")){let n=r.match(/@([a-zA-Z-]+)\s*(.*)/);if(!n)continue;let[,i,s]=n;if(i==="import"){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name==="import"&&a.params===s)){let a=P.atRule({name:"import",params:s,raws:{semicolon:!0}}),f=t.nodes?.filter(m=>m.type==="atrule"&&m.name==="import");if(f&&f.length>0){let m=f[f.length-1];a.raws.before=`
|
|
24
|
+
`,t.insertAfter(m,a)}else!t.nodes||t.nodes.length,a.raws.before="",t.prepend(a)}}else if(i==="plugin"){let c=s;s&&!s.startsWith('"')&&!s.startsWith("'")&&(c=`"${s}"`);let a=m=>m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")?m.slice(1,-1):m;if(!t.nodes?.find(m=>m.type!=="atrule"||m.name!=="plugin"?!1:a(m.params)===a(s))){let m=P.atRule({name:"plugin",params:c,raws:{semicolon:!0,before:`
|
|
25
|
+
`}}),p=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="import"),u=t.nodes?.filter(h=>h.type==="atrule"&&h.name==="plugin");if(u&&u.length>0){let h=u[u.length-1];t.insertAfter(h,m)}else if(p&&p.length>0){let h=p[p.length-1];t.insertAfter(h,m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}else t.prepend(m),t.insertBefore(m,P.comment({text:"---break---"})),t.insertAfter(m,P.comment({text:"---break---"}))}}else if(typeof o=="object"&&Object.keys(o).length===0){if(!t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s)){let a=P.atRule({name:i,params:s,raws:{semicolon:!0}});t.append(a),t.insertBefore(a,P.comment({text:"---break---"}))}}else if(i==="keyframes"){let c=t.nodes?.find(m=>m.type==="atrule"&&m.name==="theme"&&m.params==="inline");c||(c=P.atRule({name:"theme",params:"inline",raws:{semicolon:!0,between:" ",before:`
|
|
26
|
+
`}}),t.append(c),t.insertBefore(c,P.comment({text:"---break---"})));let a=c.nodes?.find(m=>m.type==="atrule"&&m.name==="keyframes"&&m.params===s),f;if(a?(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
|
|
27
|
+
`}}),a.replaceWith(f)):(f=P.atRule({name:"keyframes",params:s,raws:{semicolon:!0,between:" ",before:`
|
|
28
|
+
`}}),c.append(f)),typeof o=="object")for(let[m,p]of Object.entries(o))Ne(f,m,p)}else if(i==="utility"){let c=t.nodes?.find(a=>a.type==="atrule"&&a.name===i&&a.params===s);if(c){if(typeof o=="object")for(let[a,f]of Object.entries(o))if(typeof f=="string"){let m=c.nodes?.find(u=>u.type==="decl"&&u.prop===a),p=P.decl({prop:a,value:f,raws:{semicolon:!0,before:`
|
|
29
|
+
`}});m?m.replaceWith(p):c.append(p)}else if(a.startsWith("@")&&typeof f=="object"&&f!==null&&Object.keys(f).length===0){let m=a.match(/@([a-zA-Z-]+)\s*(.*)/);if(m){let[,p,u]=m;if(!c.nodes?.find(g=>g.type==="atrule"&&g.name===p&&g.params===u)){let g=P.atRule({name:p,params:u,raws:{semicolon:!0,before:`
|
|
30
|
+
`}});c.append(g)}}}else typeof f=="object"&&Ne(c,a,f)}else{let a=P.atRule({name:i,params:s,raws:{semicolon:!0,between:" ",before:`
|
|
31
|
+
`}});if(t.append(a),t.insertBefore(a,P.comment({text:"---break---"})),typeof o=="object")for(let[f,m]of Object.entries(o))if(typeof m=="string"){let p=P.decl({prop:f,value:m,raws:{semicolon:!0,before:`
|
|
32
|
+
`}});a.append(p)}else if(f.startsWith("@")&&typeof m=="object"&&m!==null&&Object.keys(m).length===0){let p=f.match(/@([a-zA-Z-]+)\s*(.*)/);if(p){let[,u,h]=p;if(!a.nodes?.find(y=>y.type==="atrule"&&y.name===u&&y.params===h)){let y=P.atRule({name:u,params:h,raws:{semicolon:!0,before:`
|
|
33
|
+
`}});a.append(y)}}}else typeof m=="object"&&Ne(a,f,m)}}else i==="property"?Ne(t,r,o):vn(t,i,s,o)}else Ne(t,r,o)}}}function vn(e,t,r,o){let n=e.nodes?.find(i=>i.type==="atrule"&&i.name===t&&i.params===r);if(n||(n=P.atRule({name:t,params:r,raws:{semicolon:!0,between:" ",before:`
|
|
34
|
+
`}}),e.append(n),e.insertBefore(n,P.comment({text:"---break---"}))),typeof o=="object")for(let[i,s]of Object.entries(o))if(i.startsWith("@")){let c=i.match(/@([a-zA-Z-]+)\s*(.*)/);if(c){let[,a,f]=c;vn(n,a,f,s)}}else Ne(n,i,s);else if(typeof o=="string")try{let s=P.parse(`.temp{${o}}`).first;if(s&&s.nodes){let c=P.rule({selector:"temp",raws:{semicolon:!0,between:" ",before:`
|
|
35
|
+
`}});s.nodes.forEach(a=>{if(a.type==="decl"){let f=a.clone();f.raws.before=`
|
|
36
|
+
`,c.append(f)}}),c.nodes?.length&&n.append(c)}}catch(i){throw console.error("Error parsing at-rule content:",o,i),i}}function Ne(e,t,r){let o=e.nodes?.find(n=>n.type==="rule"&&n.selector===t);if(o||(o=P.rule({selector:t,raws:{semicolon:!0,between:" ",before:`
|
|
37
|
+
`}}),e.append(o)),typeof r=="object"){for(let[n,i]of Object.entries(r))if(n.startsWith("@")&&typeof i=="object"&&i!==null&&Object.keys(i).length===0){let s=n.match(/@([a-zA-Z-]+)\s*(.*)/);if(s){let[,c,a]=s;if(!o.nodes?.find(m=>m.type==="atrule"&&m.name===c&&m.params===a)){if(c==="apply"){let p=o.nodes?.find(u=>u.type==="atrule"&&u.name==="apply");if(p){p.params=Ks(p.params,a);continue}}let m=P.atRule({name:c,params:a,raws:{semicolon:!0,before:`
|
|
38
|
+
`}});o.append(m)}}}else if(typeof i=="string"){let s=P.decl({prop:n,value:i,raws:{semicolon:!0,before:`
|
|
39
|
+
`}}),c=o.nodes?.find(a=>a.type==="decl"&&a.prop===n);c?c.replaceWith(s):o.append(s)}else if(typeof i=="object"){let s=n.startsWith("&")?t.replace(/^([^:]+)/,`$1${n.substring(1)}`):n;Ne(e,s,i)}}else if(typeof r=="string")try{let i=P.parse(`.temp{${r}}`).first;i&&i.nodes&&i.nodes.forEach(s=>{if(s.type==="decl"){let c=s.clone();c.raws.before=`
|
|
40
|
+
`,o?.append(c)}})}catch(n){throw console.error("Error parsing rule content:",t,r,n),n}}import{execa as we}from"execa";import qs from"prompts";var Zs=/^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/i;async function D(e,t,r,o){if(e=Array.from(new Set(e)),t=Array.from(new Set(t)),!e?.length&&!t?.length)return;o={silent:!1,...o};let n=b("Installing dependencies.",{silent:o.silent})?.start(),i=await Qs(r),s="";if(Xs(r)&&i==="npm")if(o.silent)s="force";else{n.stopAndPersist(),l.warn(`
|
|
41
|
+
It looks like you are using React 19.
|
|
42
|
+
Some packages may fail to install due to peer dependency issues in npm (see ${S}/react-19).
|
|
43
|
+
`);let c=await qs([{type:"select",name:"flag",message:"How would you like to proceed?",choices:[{title:"Use --force",value:"force"},{title:"Use --legacy-peer-deps",value:"legacy-peer-deps"}]}]);c&&(s=c.flag)}n?.start(),await ea(i,e,t,r.resolvedPaths.cwd,s),n?.succeed()}function Xs(e){let t=Ee(e.resolvedPaths.cwd,!1);if(!t?.dependencies?.react)return!1;let r=/^(?:\^|~)?19(?:\.\d+)*(?:-.*)?$/.test(t.dependencies.react),o=t.dependencies["react-day-picker"]?.startsWith("8");return r&&o}async function Qs(e){return Ee(e.resolvedPaths.cwd,!1)?.dependencies?.expo?"expo":ce(e.resolvedPaths.cwd)}async function ea(e,t,r,o,n){if(e==="npm")return ta(t,r,o,n);if(e==="deno")return ra(t,r,o);if(e==="expo")return oa(t,r,o);t?.length&&await we(e,["add",...t],{cwd:o}),r?.length&&await we(e,["add","-D",...r],{cwd:o})}async function ta(e,t,r,o){let n=e.map(Cn),i=t.map(Cn);n.length&&await we("npm",["install",...o?[`--${o}`]:[],...n],{cwd:r}),i.length&&await we("npm",["install",...o?[`--${o}`]:[],"-D",...i],{cwd:r})}function Cn(e){return Zs.test(e)?`${e}@latest`:e}async function ra(e,t,r){e?.length&&await we("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await we("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r})}async function oa(e,t,r){e.length&&await we("npx",["expo","install",...e],{cwd:r}),t.length&&await we("npx",["expo","install","-- -D",...t],{cwd:r})}import{existsSync as na,promises as Ur}from"fs";import qt from"path";async function Mr(e,t,r){if(!e||Object.keys(e).length===0)return{envVarsAdded:[],envFileUpdated:null,envFileCreated:null};r={silent:!1,...r};let o=b("Adding environment variables.",{silent:r.silent})?.start(),n=t.resolvedPaths.cwd,i=qt.join(n,".env.local"),s=Po(n);s&&(i=s);let c=na(i),a=qt.basename(i),f=Object.entries(e).map(([h,g])=>`${h}=${g}`).join(`
|
|
44
|
+
`),m=[],p=null,u=null;if(c){let h=await Ur.readFile(i,"utf-8"),g=Eo(h,f);if(m=$o(h,f),m.length>0){if(await Ur.writeFile(i,g,"utf-8"),p=qt.relative(n,i),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let y of m)l.log(` ${d.success("+")} ${y}`)}else o?.stop()}else if(await Ur.writeFile(i,f+`
|
|
45
|
+
`,"utf-8"),u=qt.relative(n,i),m=Object.keys(e),o?.succeed(`Added the following variables to ${d.info(a)}:`),!r.silent)for(let h of m)l.log(` ${d.success("+")} ${h}`);return!r.silent&&m.length>0&&l.break(),{envVarsAdded:m,envFileUpdated:p,envFileCreated:u}}import{existsSync as ia,promises as Rn}from"fs";import sa from"path";import{Project as aa,ScriptKind as la,SyntaxKind as be,VariableDeclarationKind as ca}from"ts-morph";var fa=new Set(["--font-sans","--font-serif","--font-mono"]);async function ut(e,t){if(!e.fonts?.length)return e;let r=await F(t.resolvedPaths.cwd);if(!r)return e;e.cssVars??={},e.cssVars.theme??={};let o=r.framework.name==="next-app"||r.framework.name==="next-pages";for(let n of e.fonts)if(o)e.cssVars.theme[n.font.variable]=`var(${n.font.variable})`;else{let i=n.name.replace("font-",""),s=n.font.dependency??`@fontsource-variable/${i}`;e.dependencies??=[],e.dependencies.push(s),e.css??={},e.css[`@import "${s}"`]={},e.cssVars.theme[n.font.variable]=n.font.family}if(e.fonts.length>0){let n=new Map;for(let i of e.fonts){let s=i.font.selector??ga(i.font.variable);if(!s)continue;let c=i.font.variable.replace("--","");n.has(s)||n.set(s,[]),n.get(s).push(c)}e.css??={},e.css["@layer base"]??={};for(let[i,s]of Array.from(n.entries())){let c=s.join(" ");e.css["@layer base"][i]??={};let a=Object.keys(e.css["@layer base"][i]).find(f=>f.startsWith("@apply "));a?(delete e.css["@layer base"][i][a],e.css["@layer base"][i][`${a} ${c}`]={}):e.css["@layer base"][i][`@apply ${c}`]={}}}return e}async function dt(e,t,r){if(!e?.length)return;let o=await F(t.resolvedPaths.cwd);if(!o||o.framework.name!=="next-app"&&o.framework.name!=="next-pages")return;let n=b("Updating fonts.",{silent:r.silent})?.start();try{await ma(e,t,o),n?.succeed("Updating fonts.")}catch(i){throw n?.fail("Failed to update fonts."),i}}async function ma(e,t,r){let o=await pa(t,r);if(!o)return;let n=await Rn.readFile(o,"utf-8"),i=await ua(n,e,t);i!==n&&await Rn.writeFile(o,i,"utf-8")}async function pa(e,t){let r=e.resolvedPaths.cwd,o=t.isSrcDir,i=t.isTsx?"tsx":"jsx",s=o?[`src/app/layout.${i}`,`app/layout.${i}`]:[`app/layout.${i}`];for(let c of s){let a=sa.join(r,c);if(ia(a))return a}return null}async function ua(e,t,r){let n=new aa({compilerOptions:{}}).createSourceFile("layout.tsx",e,{scriptKind:la.TSX}),i=t.filter(p=>p.font.provider==="google"),s=[],c=[];for(let p of i){let u=p.font.import;if(!u)continue;let h=n.getImportDeclaration(x=>x.getModuleSpecifierValue()==="next/font/google"),g=!1;h?(g=h.getNamedImports().some(C=>C.getName()===u),g||h.addNamedImport(u)):n.addImportDeclaration({moduleSpecifier:"next/font/google",namedImports:[u]});let y=ya(u,p.font.variable),k=da(p),v=ka(n,p.font.variable),I=y;if(!(g&&!v&&Zt(p.font.variable)&&!va(n,u))){if(v)v.setInitializer(`${u}(${k})`),v.getName()!==y&&v.rename(y),I=y;else{let x=Ca(n);n.insertVariableStatement(x,{declarationKind:ca.Const,declarations:[{name:y,initializer:`${u}(${k})`}]}).appendWhitespace(`
|
|
46
|
+
`)}s.push(I),ha(p)&&c.push(p.font.variable.replace("--",""))}}let a=new Set(["font-sans","font-serif","font-mono"]),f=[...c].reverse().find(p=>a.has(p)),m=c.filter(p=>!a.has(p));return f&&m.unshift(f),s.length>0&&Ra(n,s,m,r),n.getFullText()}function da(e){let t={};return e.font.subsets?.length&&(t.subsets=e.font.subsets),e.font.weight?.length&&(t.weight=e.font.weight),t.variable=e.font.variable,JSON.stringify(t).replace(/"([^"]+)":/g,"$1:").replace(/"/g,"'")}function Zt(e){return fa.has(e)}function ga(e){return Zt(e)?"html":null}function ha(e){return!e.font.selector&&Zt(e.font.variable)}function ya(e,t){let r=wa(e);return Zt(t)?r:`${r}${ba(t.replace(/^--font-/,""))}`}function wa(e){return e.split("_").map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ba(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function ka(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let c=i.getArguments();if(c.length===0)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes(t))return n}return null}function va(e,t){let r=e.getVariableStatements();for(let o of r)for(let n of o.getDeclarations()){let i=n.getInitializer();if(!i||i.getKind()!==be.CallExpression)continue;let s=i;if(s.getExpression().getText()!==t)continue;let c=s.getArguments();if(!c.length)continue;let a=c[0].getText();if(a.includes("variable:")&&a.includes("--font-heading"))return!0}return!1}function Ca(e){let t=e.getImportDeclarations();return t.length>0?t[t.length-1].getChildIndex()+1:0}function Ra(e,t,r,o){let n=e.getDescendantsOfKind(be.JsxOpeningElement);for(let i of n){if(i.getTagNameNode().getText()!=="html")continue;let c=r.map(h=>`"${h}"`),a=t.map(h=>`${h}.variable`),f=[...c,...a],m=i.getAttribute("className");if(!m){pt(e,o),i.addAttribute({name:"className",initializer:`{cn(${f.join(", ")})}`});return}if(m.getKind()!==be.JsxAttribute)return;let p=m.asKindOrThrow(be.JsxAttribute),u=p.getInitializer();if(!u)return;if(u.getKind()===be.StringLiteral){let h=u.getText().slice(1,-1);pt(e,o),p.setInitializer(`{cn("${h}", ${f.join(", ")})}`)}else if(u.getKind()===be.JsxExpression){let h=u.asKindOrThrow(be.JsxExpression),g=h.getExpression();if(!g)return;let y=g.getText();if(y.startsWith("cn(")){let k=a.every($=>y.includes($)),v=r.every($=>y.includes(`"${$}"`)),I=["font-sans","font-serif","font-mono"].filter($=>!r.includes($)).some($=>y.includes(`"${$}"`));if(k&&v&&!I)continue;let x=Sa(y,a);x=Ia(x);let C=Pa(x,f);h.replaceWithText(`{${C}}`)}else if(/^\w+\.variable$/.test(y)){if(a.includes(y)&&r.length===0)continue;pt(e,o);let v=(y.split(".")[0]??"").toLowerCase().includes("heading")||r.length===0;h.replaceWithText(v?`{cn(${y}, ${f.join(", ")})}`:`{cn(${f.join(", ")})}`)}else if(y.startsWith("`")&&y.endsWith("`")){let k=xa(y);pt(e,o);let v=new Set(f),I=new Set(["font-sans","font-serif","font-mono"].map(C=>`"${C}"`)),x=k.filter(C=>!v.has(C)&&!I.has(C));h.replaceWithText(`{cn(${[...x,...f].join(", ")})}`)}else pt(e,o),h.replaceWithText(`{cn(${y}, ${f.join(", ")})}`)}}}function pt(e,t){if(!e.getImportDeclaration(o=>o.getNamedImports().some(i=>i.getName()==="cn"))){let o=e.getImportDeclaration(n=>n.getModuleSpecifierValue().includes("/lib/utils"));o?o.getNamedImports().some(i=>i.getName()==="cn")||o.addNamedImport("cn"):e.addImportDeclaration({moduleSpecifier:t.aliases.utils,namedImports:["cn"]})}}function xa(e){let t=[],r=[],n=e.slice(1,-1).split(/(\$\{[^}]+\})/);for(let i of n)if(i)if(i.startsWith("${")&&i.endsWith("}")){let s=i.slice(2,-1).trim();s&&r.push(s)}else{let s=i.trim().split(/\s+/).filter(Boolean);for(let c of s)t.push(`"${c}"`)}return[...t,...r]}function Sa(e,t){let r=e;for(let o of t)r=r.replace(new RegExp(`,?\\s*${o.replace(".","\\.")}`,"g"),"").replace(/cn\(\s*,/,"cn(");return r}function Ia(e){let t=e;for(let r of["font-sans","font-serif","font-mono"])t=t.replace(new RegExp(`,?\\s*"${r}"`,"g"),"").replace(/cn\(\s*,/,"cn(");return t}function Pa(e,t){let r=t.join(", ");return e.replace(/\)$/,`, ${r})`)}import{z as $a}from"zod";async function pe(e,t,r){r={overwrite:!1,silent:!1,isNewProject:!1,...r};let o=await ze(t);return o&&o.ui&&o.ui.resolvedPaths.cwd!==t.resolvedPaths.cwd?await ja(e,t,o,{...r,isRemote:e?.length===1&&!!e[0].match(/\/chat\/b\//)}):await Ea(e,t,{...r,skipFonts:r.skipFonts})}async function Ea(e,t,r){if(!e.length)return;let o=b("Checking registry.",{silent:r.silent})?.start(),n=await le(e,L(t));if(!n)return o?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(n.files??[],t.resolvedPaths.cwd)}catch(a){return o?.fail(),R(a)}o?.succeed();let i=await lt(t);r.skipFonts||(n=await ut(n,t));let s=Ae([n]);await D(n.dependencies,n.devDependencies,t,{silent:r.silent}),await Ir(n.tailwind?.config,t,{silent:r.silent,tailwindVersion:i}),await Mr(n.envVars,t,{silent:r.silent}),r.skipFonts||await dt(n.fonts,t,{silent:r.silent}),await xr(n.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,supportedFontMarkers:s});let c=n.cssVars?r.overwriteCssVars??await xn(e,t):void 0;await mt(n.css,t,{silent:r.silent,cssVars:n.cssVars,cleanupDefaultNextStyles:r.isNewProject,overwriteCssVars:c,tailwindVersion:i,tailwindConfig:n.tailwind?.config}),n.docs&&l.info(n.docs)}async function ja(e,t,r,o){if(!e.length)return;let n=b("Checking registry.",{silent:o.silent})?.start(),i=await le(e,L(t));if(!i)return n?.fail(),R(new Error("Failed to fetch components from registry."));try{Sn(i.files??[],t.resolvedPaths.cwd)}catch(E){return n?.fail(),R(E)}n?.succeed();let s=[],c=[],a=[],f=b("Installing components.")?.start(),m=r.ui,p=await lt(m),u=Sr(t.resolvedPaths.cwd,m.resolvedPaths.ui);i=await ut(i,t);let h=Ae([i]);await D(i.dependencies,i.devDependencies,m,{silent:!0}),i.tailwind?.config&&(await Ir(i.tailwind?.config,m,{silent:!0,tailwindVersion:p}),c.push(ke.relative(u,m.resolvedPaths.tailwindConfig))),i.envVars&&await Mr(i.envVars,m,{silent:!0}),await dt(i.fonts,t,{silent:!0});let g=["components","ui","lib","hooks"],y=new Map,k={"registry:ui":"ui","registry:hook":"hooks","registry:lib":"lib"},v=E=>g.includes(E),I=E=>{let se=E?.match(/^@([^/]+)\//);return se&&v(se[1])?se[1]:null},x=E=>I(E.target)??k[E.type||"registry:ui"]??"components",C=E=>E&&r[E]?r[E]:t;for(let E of i.files??[]){let se=x(E);y.has(se)||y.set(se,[]),y.get(se).push(E)}for(let E of Array.from(y.keys())){let se=y.get(E),Be=C(E),gs=(i.files??[]).filter($e=>C(x($e)).resolvedPaths.cwd===Be.resolvedPaths.cwd),Et=Sr(t.resolvedPaths.cwd,Be.resolvedPaths.ui||Be.resolvedPaths.cwd),vr=await Mo(Et,Be.resolvedPaths.cwd)??Be.resolvedPaths.cwd,Cr=await xr(se,Be,{overwrite:o.overwrite,silent:!0,rootSpinner:f,isRemote:o.isRemote,isWorkspace:!0,path:o.path,plannedFiles:gs,supportedFontMarkers:h});s.push(...Cr.filesCreated.map($e=>ke.relative(Et,ke.join(vr,$e)))),c.push(...Cr.filesUpdated.map($e=>ke.relative(Et,ke.join(vr,$e)))),a.push(...Cr.filesSkipped.map($e=>ke.relative(Et,ke.join(vr,$e))))}let $=i.cssVars?o.overwriteCssVars??await xn(e,t):void 0;await mt(i.css,m,{silent:!0,cssVars:i.cssVars,overwriteCssVars:$,tailwindVersion:p,tailwindConfig:i.tailwind?.config}),(i.cssVars||i.css)&&c.push(ke.relative(u,m.resolvedPaths.tailwindCss)),f?.succeed();let U=Array.from(new Set(s)).sort(),Y=Array.from(new Set(c.filter(E=>!s.includes(E)))).sort(),Pe=Array.from(new Set(a)).sort();if(!(U.length||Y.length)&&!Pe.length&&b("No files updated.",{silent:o.silent})?.info(),U.length){b(`Created ${U.length} ${U.length===1?"file":"files"}:`,{silent:o.silent})?.succeed();for(let E of U)l.log(` - ${E}`)}if(Y.length){b(`Updated ${Y.length} ${Y.length===1?"file":"files"}:`,{silent:o.silent})?.info();for(let E of Y)l.log(` - ${E}`)}if(Pe.length){b(`Skipped ${Pe.length} ${Pe.length===1?"file":"files"}: (use --overwrite to overwrite)`,{silent:o.silent})?.info();for(let E of Pe)l.log(` - ${E}`)}i.docs&&l.info(i.docs)}async function xn(e,t){let r=await ie(e,{config:t});return $a.array(at).parse(r).some(n=>n.type==="registry:theme"||n.type==="registry:style"||n.type==="registry:font"||n.type==="registry:base")}function Sn(e,t){for(let r of e)if(r?.target&&!gn(r.target,t))throw new Error(`We found an unsafe file path "${r.target} in the registry item. Installation aborted.`)}import In from"deepmerge";import Qt from"fs-extra";async function ve(e){let t=Xt.resolve(e.projectPath,"packages/ui"),r=Xt.resolve(e.projectPath,"apps/web"),o=Xt.resolve(t,"components.json"),n=await Qt.readJson(o);e.registryBaseConfig&&(n=In(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),e.menuColor&&(n.menuColor=e.menuColor),e.menuAccent&&(n.menuAccent=e.menuAccent),e.iconLibrary&&(n.iconLibrary=e.iconLibrary),await Qt.writeJson(o,n,{spaces:2});let i=Xt.resolve(r,"components.json"),s=await Qt.readJson(i);e.registryBaseConfig&&(s=In(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),e.menuColor&&(s.menuColor=e.menuColor),e.menuAccent&&(s.menuAccent=e.menuAccent),e.iconLibrary&&(s.iconLibrary=e.iconLibrary),await Qt.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={},h=new Set;for(let g of m.fonts){let y=g.name.replace(/^font-heading-/,"").replace("font-",""),k=g.font.dependency??`@fontsource-variable/${y}`;u[g.font.variable]=g.font.family,h.add(k)}await D(Array.from(h),[],c,{silent:!0}),await Kt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await mt(Object.fromEntries(Array.from(h).map(g=>[`@import "${g}"`,{}])),c,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in We){let u=[...We[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f}var $n=X({name:"astro",title:"Astro",defaultProjectName:"astro-app",templateDir:"astro-app",frameworks:["astro"],create:async()=>{},files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Pn`---
|
|
47
|
+
import Layout from "@/layouts/main.astro"
|
|
48
|
+
import { ComponentExample } from "@/components/component-example"
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
<Layout>
|
|
52
|
+
<ComponentExample client:load />
|
|
53
|
+
</Layout>
|
|
54
|
+
`}],monorepo:{templateDir:"astro-monorepo",init:ve,files:[{type:"registry:page",path:"src/pages/index.astro",target:"src/pages/index.astro",content:Pn`---
|
|
55
|
+
import "@workspace/ui/globals.css"
|
|
56
|
+
import { ComponentExample } from "@/components/component-example"
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
<html lang="en">
|
|
60
|
+
<head>
|
|
61
|
+
<meta charset="utf-8" />
|
|
62
|
+
<meta name="viewport" content="width=device-width" />
|
|
63
|
+
<title>Astro App</title>
|
|
64
|
+
</head>
|
|
65
|
+
<body>
|
|
66
|
+
<ComponentExample client:load />
|
|
67
|
+
</body>
|
|
68
|
+
</html>
|
|
69
|
+
`}]}});var En=X({name:"laravel",title:"Laravel",description:"Requires `laravel new`",defaultProjectName:"laravel-app",templateDir:"laravel-app",frameworks:["laravel"],scaffold:async()=>{l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)},create:async()=>{}});import er from"path";import jn from"dedent";import Tn from"deepmerge";import tr from"fs-extra";var Fn=X({name:"next",title:"Next.js",defaultProjectName:"next-app",templateDir:"next-app",frameworks:["next-app","next-pages"],create:async()=>{},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:jn`import { ComponentExample } from "@/components/component-example";
|
|
70
|
+
|
|
71
|
+
export default function Page() {
|
|
72
|
+
return <ComponentExample />;
|
|
7
73
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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);
|
|
74
|
+
`}],monorepo:{templateDir:"next-monorepo",init:async e=>{let t=er.resolve(e.projectPath,"packages/ui"),r=er.resolve(e.projectPath,"apps/web"),o=er.resolve(t,"components.json"),n=await tr.readJson(o);e.registryBaseConfig&&(n=Tn(n,e.registryBaseConfig)),n.tailwind.baseColor="neutral",e.rtl&&(n.rtl=!0),await tr.writeJson(o,n,{spaces:2});let i=er.resolve(r,"components.json"),s=await tr.readJson(i);e.registryBaseConfig&&(s=Tn(s,e.registryBaseConfig)),s.tailwind.baseColor="neutral",e.rtl&&(s.rtl=!0),await tr.writeJson(i,s,{spaces:2});let c=await ae(t,z.parse(n)),{config:a}=await G(e.components,c,{silent:!0});await pe(e.components,a,{overwrite:!0,silent:e.silent,isNewProject:!0,skipFonts:!0});let f=await ae(r,z.parse(s)),m=await le(e.components,L(a));if(m?.fonts?.length){let u={};for(let h of m.fonts)u[h.font.variable]=`var(${h.font.variable})`;await Kt({theme:u},c,{silent:e.silent,overwriteCssVars:!1,tailwindVersion:"v4"}),await dt(m.fonts,f,{silent:e.silent})}let p=c.iconLibrary;if(p&&p in We){let u=[...We[p].packages];await D(u,[],c,{silent:!0}),await D(u,[],f,{silent:!0})}return f},files:[{type:"registry:page",path:"app/page.tsx",target:"app/page.tsx",content:jn`import { ComponentExample } from "@/components/component-example";
|
|
75
|
+
|
|
76
|
+
export default function Page() {
|
|
77
|
+
return <ComponentExample />;
|
|
41
78
|
}
|
|
79
|
+
`}]}});import On from"dedent";var An=X({name:"react-router",title:"React Router",defaultProjectName:"react-router-app",templateDir:"react-router-app",frameworks:["react-router"],create:async()=>{},files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:On`import { ComponentExample } from "@/components/component-example";
|
|
42
80
|
|
|
43
|
-
|
|
44
|
-
|
|
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);
|
|
81
|
+
export default function Home() {
|
|
82
|
+
return <ComponentExample />;
|
|
70
83
|
}
|
|
84
|
+
`}],monorepo:{templateDir:"react-router-monorepo",init:ve,files:[{type:"registry:file",path:"app/routes/home.tsx",target:"app/routes/home.tsx",content:On`import { ComponentExample } from "@/components/component-example";
|
|
71
85
|
|
|
72
|
-
|
|
73
|
-
|
|
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);
|
|
86
|
+
export default function Home() {
|
|
87
|
+
return <ComponentExample />;
|
|
98
88
|
}
|
|
89
|
+
`}]}});import Nn from"dedent";var Ln=X({name:"start",title:"TanStack Start",defaultProjectName:"start-app",templateDir:"start-app",frameworks:["tanstack-start"],create:async()=>{},files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Nn`import { createFileRoute } from "@tanstack/react-router";
|
|
90
|
+
import { ComponentExample } from "@/components/component-example";
|
|
99
91
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
92
|
+
export const Route = createFileRoute("/")({ component: App });
|
|
93
|
+
|
|
94
|
+
function App() {
|
|
95
|
+
return (
|
|
96
|
+
<ComponentExample />
|
|
97
|
+
);
|
|
104
98
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
${n}`:""}`,a=!0),n.includes(je)||(n=`${n.trimEnd()}
|
|
108
|
-
|
|
109
|
-
${Pe}`,a=!0),(!i||a)&&(await M(s,e),await R(t,n,"utf8"));let u=await Oe(e,s);return{path:s,created:!i,updated:a,imported:u}}async function Oe(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=We(r.dirname(t),o);if(n.includes(`"${a}"`)||n.includes(`'${a}'`))return!1;let u=`import "${a}";
|
|
110
|
-
${n}`;return await R(i,u,"utf8"),!0}function We(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 T(s,{recursive:!0})}async function qe(e,o){let s=r.join(e,"package.json"),t={};try{let c=await h(s,"utf8");t=JSON.parse(c)}catch{}let i=Te(t),n=L(o),a=[];async function u(c,d){let f=await ne(c,{withFileTypes:!0});for(let w of f){if(Y.has(w.name))continue;let $=r.join(c,w.name);if(w.isDirectory()){await u($,d);continue}let j=r.extname(w.name);if(!ie.has(j)||w.name==="package.json")continue;let B=r.relative(d,$).split(r.sep).join("/"),{target:x}=Fe(B,i,n),k=await h($,"utf8");a.push({path:B,target:x,content:k})}}return await u(e,e),a}async function Me(e,o){let s=ce.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 ne(c,{withFileTypes:!0});for(let f of d){if(Y.has(f.name))continue;let w=r.join(c,f.name);if(f.isDirectory()){await u(w);continue}let $=r.extname(f.name);if(!ie.has($))continue;let j=r.relative(t,w).split(r.sep).join("/"),B=await h(w,"utf8");for(let x of B.matchAll(/@\/registry\/default\/ui\/([^"']+)/g)){let k=x[1];k&&a.add(k)}n.push({path:`default/blocks/${s.sourceDir}/${j}`,target:`${s.targetBase}/${j}`,content:B})}}await u(t);for(let c of Array.from(a).sort((d,f)=>d.localeCompare(f))){let d=await V(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 V(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 ze(e,o){if(ae.has(e))return await V(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 f=await V(d,o);f&&u.push(...f)}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 Me(e,o);if(t)return t;let i=ge(e),n=r.join(z,i);if(!g(n))return null;try{return await qe(n,e)}catch(a){return console.warn(`Warning: unable to read bundled sources for ${e}`,a),null}}async function de(e){let o=r.join(we,L(e));return!g(o)||!g(r.join(o,"SKILL.md"))?null:o}var q=["codex","claude","cursor","github"],te=new Set(q);function Ge(){let e=process.env.CODEX_HOME?.trim();return e||r.join(re.homedir(),".codex")}function He(){let e=process.env.CLAUDE_HOME?.trim();return e||r.join(re.homedir(),".claude")}async function O(e,o){let s=await de(e);if(!s)throw new Error(`Bundled skill "${e}" was not found in this love-ui package.`);return await T(r.dirname(o),{recursive:!0}),g(o)?"exists":(await me(s,o,{recursive:!0,force:!1,filter:t=>{let i=r.basename(t);return!Y.has(i)}}),"installed")}async function oe(e,o){return await T(r.dirname(e),{recursive:!0}),g(e)?"exists":(await R(e,o,"utf8"),"installed")}function Ke(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
|
-
---
|
|
99
|
+
`}],monorepo:{templateDir:"start-monorepo",init:ve,files:[{type:"registry:file",path:"src/routes/index.tsx",target:"src/routes/index.tsx",content:Nn`import { createFileRoute } from "@tanstack/react-router";
|
|
100
|
+
import { ComponentExample } from "@/components/component-example";
|
|
115
101
|
|
|
116
|
-
|
|
102
|
+
export const Route = createFileRoute("/")({ component: App });
|
|
117
103
|
|
|
118
|
-
|
|
104
|
+
function App() {
|
|
105
|
+
return (
|
|
106
|
+
<ComponentExample />
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
`}]}});import _n from"dedent";var Vn=X({name:"vite",title:"Vite",defaultProjectName:"vite-app",templateDir:"vite-app",frameworks:["vite"],create:async()=>{},files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:_n`import { ComponentExample } from "@/components/component-example";
|
|
110
|
+
|
|
111
|
+
export function App() {
|
|
112
|
+
return <ComponentExample />;
|
|
113
|
+
}
|
|
119
114
|
|
|
120
|
-
|
|
115
|
+
export default App;
|
|
116
|
+
`}],monorepo:{templateDir:"vite-monorepo",init:ve,files:[{type:"registry:file",path:"src/App.tsx",target:"src/App.tsx",content:_n`import { ComponentExample } from "@/components/component-example";
|
|
121
117
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
118
|
+
export function App() {
|
|
119
|
+
return <ComponentExample />;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default App;
|
|
123
|
+
`}]}});var Q={next:Fn,vite:Vn,start:Ln,"react-router":An,astro:$n,laravel:En};function Xe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Un(e,t){let r=t?.lib??rr(e,"lib");return{ui:t?.ui??rr(e,"ui"),lib:r,hooks:t?.hooks??rr(e,"hooks"),utils:t?.utils??rr(e,"utils",r)}}function rr(e,t,r){let o=e||Bt;if(t==="ui")return`${o}/ui`;if(t==="utils"){let n=r||Dn(o,"lib");return n?`${n}/utils`:_o}return Dn(o,t)}function Dn(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}import Mn from"path";import Br from"fs-extra";import Ta from"prompts";async function or(e){let t=e.template&&e.template in Q?e.template:"next",r=Oe(Q[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:a,name:f}=await Ta([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
|
|
124
|
+
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Oe(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Mn.join(e.cwd,o);try{await Br.access(e.cwd,Br.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Br.existsSync(Mn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Fa}from"fs";import{join as Oa}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=Oa(e,o);Fa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import Le from"fs-extra";var tt=".bak",Qe=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function gt(e){if(!Le.existsSync(e))return null;let t=`${e}${tt}`;try{return Le.renameSync(e,t),t}catch{return null}}function et(e){let t=`${e}${tt}`;if(!Le.existsSync(t))return!1;try{return Le.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function ht(e){let t=`${e}${tt}`;if(!Le.existsSync(t))return!1;try{return Le.unlinkSync(t),!0}catch{return!1}}async function Bn(e,t){if(!Le.existsSync(e))return t();if(!gt(e))throw new Qe(e);let o=()=>et(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),ht(e),n}catch(n){throw process.removeListener("exit",o),et(e),n}}import{Command as Na}from"commander";import La from"deepmerge";import de from"fs-extra";import _e from"prompts";import{z as T}from"zod";var _a=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Va(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var Wn=new Na().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-nova",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",!1).option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&et(r.replace(tt,""))};process.on("exit",n);try{let i=_a.parse({...t,reinstall:t.reinstall,cwd:ue.resolve(t.cwd)}),s=new Map(Object.entries(Z)),c;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(l.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),l.break(),process.exit(1)),typeof i.preset=="string"&&!q(i.preset)&&!Ye(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(l.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),l.break(),process.exit(1))}let a=i.cwd,f=de.existsSync(ue.resolve(a,"components.json"));if(!i.monorepo&&!f&&await M(a)){let u=await F(a);if(!u||u.framework.name==="manual"){let h=await B(a);h.length>0&&(W("init",h),process.exit(1))}}if(f&&!i.force){let{overwrite:u}=await _e({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(l.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),i.force=!0}let m;if(f){try{m=await de.readJson(ue.resolve(a,"components.json"))}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await _e({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h}if(u&&(o=await He(a),o.length)){l.break(),l.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)l.log(` - ${o.slice(h,h+8).join(", ")}`);l.break()}}if(i.preset===void 0&&e.length===0&&!i.defaults){let u=de.existsSync(ue.resolve(a,"package.json"));if(!i.template&&!u){let{template:h}=await _e({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h}if(!i.template&&u){let h=await F(a),g=Xe(h?.framework.name);g&&(i.template=g)}if(i.template==="laravel"&&!u&&(l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await _e({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h}i.base||(i.base=await qe()),i.preset=!0}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await ct({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[h.url,...e],c=h.base}if(typeof u=="string"){let h;if(q(u)){let g=new URL(u);Va(g,i),g.pathname==="/init"&&u.startsWith(S)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0}else if(Ye(u)){let g=Ke(u);g||(l.error(`Invalid preset code: ${d.info(u)}`),l.break(),process.exit(1)),h=he({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),c=void 0}else{let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=he({...g,base:"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),c=void 0}e=[h,...e]}}let p=i.base??c??(m?.style?"base":"");if(!p)if(e.length>0)p="base";else{let u=await qe();p=u,i.base=u}if(i.defaults&&!e.some(q)&&(e=[he({...Z.nova,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&q(e[0])){let u=new URL(e[0]);u.searchParams.set("base",p),e[0]=u.toString()}if(m?.style){let u=await Ma(m.style,p);if(u!==p&&(p=u,e.length>0&&q(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString()}}if(o.length&&(e=[...e,...o]),i.components=e,await ee(i.cwd),e.length>0){let u=ue.resolve(a,"components.json");f&&(r=gt(u)??void 0,r||l.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Te(e[0],a,{registries:m?.registries});e[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h)}await rt(i),l.break(),l.log(`Project initialization completed.
|
|
125
|
+
You may now add components.`),process.removeListener("exit",n),ht(ue.resolve(a,"components.json")),l.break()}catch(i){process.removeListener("exit",n),n(),l.break(),R(i)}finally{ne()}});async function rt(e){let t,r,o,n=e.template,i=n?Oe(Q[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&de.existsSync(ue.resolve(e.cwd,"package.json")))t=await F(e.cwd);else if(e.skipPreflight)t=await F(e.cwd);else{let C=await nn(e);if(C.errors["1"]){let{projectPath:$,template:U}=await or(e);$||process.exit(1),e.cwd=$,e.isNewProject=!0,o=U,t=await F(e.cwd)}else t=C.projectInfo}r=await qo(e.cwd,t);let c=o??n,a=c?Oe(Q[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=o?a?.postInit:void 0;if(a?.init){let C=await a.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??!1,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return m&&await m({projectPath:e.cwd}),C}let p=r?await Ua(r,e):await Da(await j(e.cwd));if(!e.yes){let{proceed:C}=await _e({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:!0});C||process.exit(1)}let u=await ae(e.cwd,p),{config:h}=await G(f,u,{silent:!0});h.registries&&(p.registries=h.registries);let g=b("Writing components.json.").start(),y=ue.resolve(e.cwd,"components.json"),k=`${y}${tt}`,v=(C,$)=>{let{registries:U,...Y}=La(C,$);return{...Y,registries:U}};if(de.existsSync(k)){let C=await de.readJson(k);e.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=v(C,p)}e.registryBaseConfig&&(p=v(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(re).includes(C))),await Aa.writeFile(y,`${JSON.stringify(p,null,2)}
|
|
126
|
+
`,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await ze(I);if(x){let C={};if(p.menuColor&&(C.menuColor=p.menuColor),p.menuAccent&&(C.menuAccent=p.menuAccent),p.rtl!==void 0&&(C.rtl=p.rtl),p.iconLibrary&&(C.iconLibrary=p.iconLibrary),Object.keys(C).length>0)for(let $ of Object.keys(x)){let U=x[$];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=ue.resolve(U.resolvedPaths.cwd,"components.json");if(de.existsSync(Y)){let Pe=await de.readJson(Y);await de.writeJson(Y,{...Pe,...C},{spaces:2})}}}return Uo.clearCaches(),await pe(f,I,{overwrite:!0,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function Da(e=null){let[t,r]=await Promise.all([Pr(),Go()]);l.info("");let o=await _e([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e?.tailwind.css??Vo},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??Do},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e?.aliases.components??Bt},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Un(o.components,n);return z.parse({$schema:"https://www.loveui.dev/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Ua(e,t){let r=typeof t.registryBaseConfig?.style=="string"?t.registryBaseConfig.style:e.style,o=typeof t.registryBaseConfig?.tailwind?.baseColor=="string"?t.registryBaseConfig.tailwind.baseColor:"neutral",n=e.tailwind.cssVariables,i=typeof t.registryBaseConfig?.iconLibrary=="string"?t.registryBaseConfig.iconLibrary:e.iconLibrary??"lucide";if(!t.defaults&&!t.registryBaseConfig?.style){let[s,c]=await Promise.all([Pr(),lt(e)]);r=(await _e([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york"}return n=t.cssVariables,z.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??!1,aliases:e?.aliases})}async function Ma(e,t){return e.startsWith("base-")?t:(l.warn(` Existing config uses ${d.info(e)}. Love UI now uses ${d.info("Base UI")} presets only.`),l.break(),"base")}import zn from"path";import Wr from"fs-extra";async function Jn(e){let t={};if(!Wr.existsSync(e.cwd)||!Wr.existsSync(zn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!Wr.existsSync(zn.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd);r.length>0&&(W("add [component]",r),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
127
|
+
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as zr,promises as Gn}from"fs";import nr from"path";import{Project as Ba}from"ts-morph";import{loadConfig as Wa}from"tsconfig-paths";async function Hn(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await le(e,L(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await ut(n,t));let i=Ae([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await za(n,t,o,r,i),await Ja(n,t,o,r),Ga(n,t,o),r.skipFonts||Ha(n,o),o}async function za(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,c]=await Promise.all([F(t.resolvedPaths.cwd),t.tailwind.baseColor?zt(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=Wa(t.resolvedPaths.cwd)}catch{a={resultType:"failed"}}let f=new Ba({compilerOptions:{}}),m=Ao(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=Fo(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:Oo(i.map($=>$.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,$=>$===".tsx"?".jsx":".js"));let g=zr(h),y=nr.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",v=Rr(h)||k?u.content:await Dt({filename:u.path,raw:u.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:!1,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,To,_t,Ut,Lt]),I=Rr(h)||k?v:await No({config:t,content:v,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",C;g&&(C=await Gn.readFile(h,"utf-8"),Io(C,I)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I,...x==="overwrite"&&{existingContent:C},type:u.type??"registry:ui"})}}async function Ja(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,c=zr(s),a=nr.relative(t.resolvedPaths.cwd,s),f=c?await Gn.readFile(s,"utf8"):"",m=f;i&&(m=await ft(m,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(m=await Dr(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:p}}function Ga(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=nr.join(t.resolvedPaths.cwd,".env.local"),n=zr(o),i=nr.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"}}function Ha(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider})}import{diffWords as Ka,structuredPatch as Ya}from"diff";import{bold as H,cyan as Jr,dim as w,green as K,red as Gr,yellow as ot}from"kleur/colors";var Ce=5,qa=w("\u250C"+"\u2500".repeat(46)),Za=w("\u2514"+"\u2500".repeat(46)),Xa={create:"+",overwrite:"~",skip:"="},Qa={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function yt(e){return e==="create"?K(e):e==="overwrite"||e==="update"?ot(e):w(e)}function wt(e){return`${H("\u250C")} ${H(`love-ui add ${e.join(", ")}`)} ${w("(dry run)")}`}function qn(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ve(e,t,r=o=>o){e.push(`${w("\u2502")} ${qa}`);for(let o of t)e.push(`${w("\u2502")} ${w("\u2502")} ${r(o)}`);e.push(`${w("\u2502")} ${Za}`)}function Zn(e,t,r={}){return r.diff?typeof r.diff=="string"?tl(e,t,r.diff):rl(e,t):r.view?typeof r.view=="string"?nl(e,t,r.view):ol(e,t):el(e,t)}function el(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502")),il(e,r),Kn("Dependencies",e.dependencies,r),Kn("Dev Dependencies",e.devDependencies,r),sl(e,r),al(e,r),ll(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(ot(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(w("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${w("\u2502")} ${w(n.join(", "))}`),r.push(w("\u2502"))),r.push(`${w("\u2502")} ${w("Run with --diff to view changes.")}`),r.push(`${w("\u2502")} ${w("Run with --view to view file contents.")}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
128
|
+
`)}function tl(e,t,r){let o=[];o.push(wt(t)),o.push(w("\u2502"));let n=Qn(e.files,r),i=e.css&&qn(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${ot(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n)Xn(s,o);if(i&&e.css){if(o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${yt(e.css.action)}${w(")")}`),e.css.action==="create"||!e.css.existingContent)Ve(o,e.css.content.split(`
|
|
129
|
+
`),s=>K(`+${s}`));else{let s=ei(e.css.existingContent,e.css.content,e.css.path,{fullContext:!0});Ve(o,s)}o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
|
|
130
|
+
`)}function rl(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No changes.")}`),r.push(w("\u2502"));else{for(let s of o)Xn(s,r);e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --diff <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
131
|
+
`)}function ol(e,t){let r=[];r.push(wt(t)),r.push(w("\u2502"));let o=e.files.slice(0,Ce);if(o.length===0&&!e.css)r.push(`${w("\u2502")} ${w("No files.")}`),r.push(w("\u2502"));else{for(let s of o){let c=s.content.split(`
|
|
132
|
+
`);r.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${yt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(r,c),r.push(w("\u2502"))}e.files.length>Ce&&r.push(w("\u2502"))}let n=e.files.length;return n>Ce&&r.push(` ${w(`Showing ${Ce} of ${n} files. Use --view <path> to view a specific file.`)}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
|
133
|
+
`)}function Xn(e,t){if(t.push(`${w("\u251C")} ${H(e.path)} ${w("(")}${yt(e.action)}${w(")")}`),e.action==="skip")t.push(`${w("\u2502")} ${w("No changes.")}`);else if(e.action==="create")Ve(t,e.content.split(`
|
|
134
|
+
`),r=>K(`+${r}`));else{let r=ei(e.existingContent,e.content,e.path);Ve(t,r)}t.push(w("\u2502"))}function nl(e,t,r){let o=[];o.push(wt(t)),o.push(w("\u2502"));let n=Qn(e.files,r),i=e.css&&qn(e.css.path,r);if(n.length===0&&!i)o.push(`${w("\u2502")} ${ot(`No file matching "${r}" found.`)}`),o.push(w("\u2502"));else{for(let s of n){let c=s.content.split(`
|
|
135
|
+
`);o.push(`${w("\u251C")} ${H(s.path)} ${w("(")}${yt(s.action)}${w(")")} ${w(`${c.length} lines`)}`),Ve(o,c),o.push(w("\u2502"))}if(i&&e.css){let s=e.css.content.split(`
|
|
136
|
+
`);o.push(`${w("\u251C")} ${H(e.css.path)} ${w("(")}${yt(e.css.action)}${w(")")} ${w(`${s.length} lines`)}`),Ve(o,s),o.push(w("\u2502"))}}return o.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),o.join(`
|
|
137
|
+
`)}function il(e,t){if(e.files.length===0)return;let r={create:0,overwrite:0,skip:0};for(let s of e.files)r[s.action]++;let o=[];r.create>0&&o.push(K(`+${r.create} new`)),r.overwrite>0&&o.push(ot(`~${r.overwrite} overwrite`)),r.skip>0&&o.push(w(`=${r.skip} skip`));let n=o.length>0?` ${o.join(w(", "))}`:"";t.push(`${w("\u251C")} ${H("Files")} ${w(`(${e.files.length})`)}${n}`);let i=Math.max(...e.files.map(s=>s.path.length));for(let s of e.files){let c=Xa[s.action],a=Qa[s.action],f=" ".repeat(Math.max(1,i-s.path.length+2)),m=s.action==="create"?K:s.action==="overwrite"?ot:w,p=s.action==="skip"?w(s.path):s.path;t.push(`${w("\u2502")} ${m(c)} ${p}${f}${m(a)}`)}t.push(w("\u2502"))}function Kn(e,t,r){if(t.length){r.push(`${w("\u251C")} ${H(e)} ${w(`(${t.length})`)}`);for(let o of t)r.push(`${w("\u2502")} ${K("+")} ${o}`);r.push(w("\u2502"))}}function sl(e,t){e.css&&(t.push(`${w("\u251C")} ${H("CSS")}`),e.css.cssVarsCount>0?t.push(`${w("\u2502")} ${K("+")} ${e.css.cssVarsCount} CSS variables added to ${Jr(e.css.path)}`):t.push(`${w("\u2502")} ${K("+")} Updated ${Jr(e.css.path)}`),t.push(w("\u2502")))}function al(e,t){if(!e.envVars)return;let r=Object.keys(e.envVars.variables);t.push(`${w("\u251C")} ${H("Environment Variables")}`);for(let o of r)t.push(`${w("\u2502")} ${K("+")} ${o}`);t.push(w("\u2502"))}function ll(e,t){if(e.fonts.length){t.push(`${w("\u251C")} ${H("Fonts")}`);for(let r of e.fonts)t.push(`${w("\u2502")} ${K("+")} ${r.name} ${w(`(${r.provider})`)}`);t.push(w("\u2502"))}}function Qn(e,t){let r=e.filter(o=>o.path===t);return r.length>0?r:e.filter(o=>o.path.includes(t)||o.path.replace(/\\/g,"/").includes(t))}function ei(e,t,r,o={}){if(ul(e,t))return[w(" Formatting-only changes (spacing, quotes, semicolons).")];let n=Yn(e),i=Yn(t),s=o.fullContext?Math.max(n.split(`
|
|
138
|
+
`).length,i.split(`
|
|
139
|
+
`).length):3,c=Ya(`a/${r}`,`b/${r}`,n,i,"","",{context:s});if(!c.hunks.length)return[w(" No changes.")];let a=[w(`--- a/${r}`),w(`+++ b/${r}`)],f=t.split(`
|
|
140
|
+
`);for(let m of c.hunks){let{entries:p,newLineIndex:u}=cl(m,f);if(!p.some(k=>k.kind!=="context"))continue;let h=p.filter(k=>k.kind==="context").length,g=p.filter(k=>k.kind==="removed").length,y=p.filter(k=>k.kind==="added").length;a.push(Jr(`@@ -${m.oldStart},${h+g} +${m.newStart},${h+y} @@`));for(let k of p)a.push(k.formatted)}return a}function cl(e,t){let r=[],o=e.newStart-1,n=0;for(;n<e.lines.length;){let i=e.lines[n];if(i.startsWith("-")){let s=[];for(;n<e.lines.length&&e.lines[n].startsWith("-");)s.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;let c=[];for(;n<e.lines.length&&e.lines[n].startsWith("+");)c.push(e.lines[n].slice(1)),n++;for(;n<e.lines.length&&e.lines[n].startsWith("\\");)n++;o=fl(s,c,t,o,r)}else if(i.startsWith("+")){let s=t[o]??i.slice(1);r.push({kind:"added",formatted:K(`+${s}`)}),o++,n++}else if(i.startsWith("\\"))n++;else{let s=t[o]??i.slice(1);r.push({kind:"context",formatted:w(` ${s}`)}),o++,n++}}return{entries:r,newLineIndex:o}}function fl(e,t,r,o,n){if(dl(e,t)){for(let a=0;a<t.length;a++){let f=r[o]??t[a];n.push({kind:"context",formatted:w(` ${f}`)}),o++}return o}let i=ml(e),s=i.map(ir),c=new Set;for(let a=0;a<t.length;a++){let f=r[o]??t[a],m=ir(t[a]),p=s.findIndex((u,h)=>!c.has(h)&&u===m);if(p!==-1)c.add(p),n.push({kind:"context",formatted:w(` ${f}`)});else{let u=s.findIndex((h,g)=>!c.has(g));if(u!==-1){c.add(u);let{oldHighlighted:h,newHighlighted:g}=pl(i[u],f);n.push({kind:"removed",formatted:h}),n.push({kind:"added",formatted:g})}else n.push({kind:"added",formatted:K(`+${f}`)})}o++}for(let a=0;a<i.length;a++)c.has(a)||n.push({kind:"removed",formatted:Gr(`-${i[a]}`)});return o}function Yn(e){return e.split(`
|
|
141
|
+
`).map(t=>{let r=t.match(/^(\s*)/)?.[1]??"",o=t.slice(r.length);return r+o.replace(/['"]/g,'"').replace(/;$/g,"")}).join(`
|
|
142
|
+
`)}function ml(e){let t=[];for(let r=0;r<e.length;r++){let o=e[r];for(;r+1<e.length&&o.trimEnd().endsWith(":");)r++,o=o.trimEnd()+" "+e[r].trim();t.push(o)}return t}function pl(e,t){let r=Ka(e,t),o="-",n="+";for(let i of r)i.added?n+=H(K(i.value)):i.removed?o+=H(Gr(i.value)):(o+=Gr(i.value),n+=K(i.value));return{oldHighlighted:o,newHighlighted:n}}function ir(e){return e.replace(/\s+/g," ").trim().replace(/['"]/g,"'").replace(/;/g,"").replace(/,$/,"")}function ul(e,t){let r=o=>o.split(`
|
|
143
|
+
`).map(ir).filter(n=>n.length>0).join(" ");return r(e)===r(t)}function dl(e,t){let r=o=>o.map(ir).filter(n=>n.length>0).join(" ");return r(e)===r(t)}import ti from"fs/promises";import gl from"path";async function ri(e,t){let r=gl.join(t.resolvedPaths.cwd,"app/page.tsx");if(!(await ti.stat(r)).isFile())return;let[o]=await ie([e],{config:t});if(!o?.meta?.importSpecifier||!o?.meta?.moduleSpecifier)return;let n=`import { ${o?.meta?.importSpecifier} } from "${o.meta.moduleSpecifier}"
|
|
144
|
+
|
|
145
|
+
export default function Page() {
|
|
146
|
+
return <${o?.meta?.importSpecifier} />
|
|
147
|
+
}`;await ti.writeFile(r,n,"utf8")}import{Command as yl}from"commander";import Hr from"prompts";import{z as _}from"zod";var wl=_.object({components:_.array(_.string()).optional(),yes:_.boolean(),overwrite:_.boolean(),cwd:_.string(),all:_.boolean(),path:_.string().optional(),silent:_.boolean(),dryRun:_.boolean(),diff:_.union([_.string(),_.literal(!0)]).optional(),view:_.union([_.string(),_.literal(!0)]).optional()}),oi=new yl().name("add").description("add a component to your project").argument("[components...]","names, url or local path to component").option("-y, --yes","skip confirmation prompt.",!1).option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --all","add all available components",!1).option("-p, --path <path>","the path to add the component to.").option("-s, --silent","mute output.",!1).option("--dry-run","preview changes without writing files.",!1).option("--diff [path]","show diff for a file.").option("--view [path]","show file contents.").action(async(e,t)=>{try{let r=wl.parse({components:e,...t,cwd:hl.resolve(t.cwd)});await ee(r.cwd);let o=r.dryRun||r.diff||r.view,n=await j(r.cwd);n||(n=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}));let i=!1;if(e.length>0){let{config:g,newRegistries:y}=await G(e,n,{silent:r.silent,writeFile:!1});n=g,i=y.length>0}let s,c=!0;if(e.length>0){let[g]=await ie([e[0]],{config:n});if(s=g?.type,c=s!=="registry:theme"&&s!=="registry:style"&&s!=="registry:base",Lo(g)&&!o){await pe(e,n,r);return}if(!r.yes&&!o&&(s==="registry:style"||s==="registry:theme")){l.break();let{confirm:y}=await Hr({type:"confirm",name:"confirm",message:d.warn(`You are about to install a new ${s.replace("registry:","")}.
|
|
148
|
+
Existing CSS variables and components will be overwritten. Continue?`)});y||(l.break(),l.log("Installation cancelled."),l.break(),process.exit(1))}}r.components?.length||(r.components=await bl(r));let a=await F(r.cwd);if(a?.tailwindVersion==="v4"){let g=jt.filter(y=>r.components?.includes(y.name));g?.length&&(l.break(),g.forEach(y=>{l.warn(d.warn(y.message))}),l.break(),process.exit(1))}let{errors:f,config:m}=await Jn(r),p=!1;if(f["3"]){let{proceed:g}=await Hr({type:"confirm",name:"proceed",message:`You need to create a ${d.info("components.json")} file to add components. Proceed?`,initial:!0});g||(l.break(),process.exit(1));let y=Xe(a?.framework.name),k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!1,silent:r.silent&&!i,isNewProject:!1,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0}let u=!1;if(f["1"]){let{projectPath:g,template:y}=await or({cwd:r.cwd,force:r.overwrite,components:r.components});g||(l.break(),process.exit(1)),r.cwd=g;let k=await qe(),{url:v}=await ct({rtl:!1,base:k,template:y}),{registryBaseConfig:I,installStyleIndex:x,url:C}=await Te(v,r.cwd);m=await rt({cwd:r.cwd,yes:!0,force:!0,defaults:!1,skipPreflight:!0,silent:!i&&r.silent,isNewProject:!0,cssVariables:!0,rtl:!1,installStyleIndex:x,components:[C,...r.components??[]],registryBaseConfig:I}),p=!0,u=r.components?.length===1&&!!r.components[0].match(/\/chat\/b\//)}if(!m)throw new Error(`Failed to read config at ${d.info(r.cwd)}.`);let{config:h}=await G(r.components,m,{silent:r.silent||i,writeFile:!o});if(m=h,o){let g=b("Resolving items.",{silent:r.silent}).start(),y=await Hn(r.components,m,{overwrite:r.overwrite});g.stop(),l.log(Zn(y,r.components,{diff:r.diff,view:r.view}));return}p||await pe(r.components,m,r),u&&await ri(r.components[0],m)}catch(r){l.break(),R(r)}finally{ne()}});async function bl(e){let t=await Ge();if(!t)return l.break(),R(new Error("Failed to fetch registry index.")),[];if(e.all)return t.map(n=>n.name).filter(n=>!jt.some(i=>i.name===n));if(e.components?.length)return e.components;let{components:r}=await Hr({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:t.filter(n=>n.type==="registry:ui"&&!jt.some(i=>i.name===n.name)).map(n=>({title:n.name,value:n.name,selected:e.all?!0:e.components?.includes(n.name)}))});r?.length||(l.warn("No components selected. Exiting."),l.info(""),process.exit(1));let o=_.array(_.string()).safeParse(r);return o.success?o.data:(l.error(""),R(new Error("Something went wrong. Please try again.")),[])}import Zr from"path";import Kr from"path";import Yr from"fs-extra";async function ni(e){let t={};if(!Yr.existsSync(e.cwd)||!Yr.existsSync(Kr.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!Yr.existsSync(Kr.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd),o=[];for(let n of r){let i=await F(Kr.resolve(e.cwd,n.name));i?.framework&&i.framework.name!=="manual"&&o.push(n)}o.length>0&&(W("apply --preset <preset>",o,{cwdFlag:"-c"}),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
149
|
+
Before you can apply a preset, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as kl}from"commander";import qr from"fs-extra";import vl from"prompts";import{z as ge}from"zod";var Cl=ge.object({cwd:ge.string(),positionalPreset:ge.string().optional(),preset:ge.string().optional(),only:ge.union([ge.boolean(),ge.string()]).optional(),yes:ge.boolean(),silent:ge.boolean()}),ai=["theme","font"],nt=class extends Error{constructor(t){super(t),this.name="ApplyOnlyError"}},sr=class extends Error{constructor(t){super(t),this.name="ApplyWorkspaceSyncError"}},li=new kl().name("apply").description("apply a preset to an existing project").argument("[preset]","the preset to apply").option("--preset <preset>","preset configuration to apply").option("--only [parts]","apply only parts of a preset: theme, font").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=Cl.parse({...t,cwd:Zr.resolve(t.cwd),positionalPreset:e}),o=Rl(r),n=ii(r.only);Il({preset:o,only:n});let i=await ni(r);i.errors["1"]&&(l.break(),l.error(`The ${d.info("apply")} command only works in an existing project.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1)),i.errors["3"]&&(l.break(),l.error(`No ${d.info("components.json")} found at ${d.info(r.cwd)}.`),l.error(`Run ${d.info(si(o))} first.`),l.break(),process.exit(1));let s=i.config;s||process.exit(1);let c=s.rtl??!1,a=await El(r.cwd);if(!o){let y=_r({command:"init",template:a,base:je(s.style),rtl:c});await Vr({createUrl:y,followUp:`Then run ${d.info("love-ui apply --preset <preset>")} with the preset code or preset URL from loveui.dev.`,prompt:!r.yes}),process.exit(0)}$l(o);let f=n??ii(xl(o)),m=!f,p=m?await He(r.cwd):[];if(!r.yes){if(l.break(),f?l.warn(d.warn("Applying the selected preset parts will update your project configuration and styles.")):l.warn(d.warn("Applying a new preset will overwrite existing UI components, fonts, and CSS variables.")),l.warn("Commit or stash your changes before continuing so you can easily go back."),m)if(l.break(),l.log(" The following components will be re-installed:"),p.length)for(let k=0;k<p.length;k+=8)l.log(` - ${p.slice(k,k+8).join(", ")}`);else l.log(" - No installed UI components were detected.");l.break();let{proceed:y}=await vl({type:"confirm",name:"proceed",message:"Would you like to continue?",initial:!1});y||(l.break(),process.exit(1))}await ee(r.cwd);let u=je(s.style),h=Fl(o,u,{template:a,rtl:c,only:f?.join(",")}),g=await Bn(Zr.resolve(r.cwd,"components.json"),async()=>{let{registryBaseConfig:y,installStyleIndex:k,url:v}=await Te(h,r.cwd,{registries:s.registries}),I=Pl({registryBaseConfig:y,existingConfig:s,only:f});return await rt({cwd:r.cwd,yes:!0,force:!1,reinstall:m,defaults:!1,silent:r.silent,isNewProject:!1,cssVariables:!0,installStyleIndex:k,registryBaseConfig:I,existingConfig:s,components:[v,...p]})});await jl(g,{only:f}),l.break(),l.log("Preset applied successfully."),l.break()}catch(r){if(r instanceof nt){for(let o of r.message.split(`
|
|
150
|
+
`))l.error(o);l.break(),process.exit(1)}r instanceof Qe&&(l.error(`Could not back up ${d.info("components.json")}. Aborting.`),l.break(),process.exit(1)),r instanceof sr&&(l.error(r.message),l.break(),process.exit(1)),l.break(),R(r)}finally{ne()}});function Rl(e){let t=e.positionalPreset?.trim(),r=e.preset?.trim();return t&&r&&t!==r&&(l.error(`Received two different preset values. Use either the positional preset or ${d.info("--preset")}, or pass the same value to both.`),l.break(),process.exit(1)),r??t}function xl(e){if(!q(e))return;let t=new URL(e);if(t.pathname==="/init")return t.searchParams.get("only")??void 0}function ii(e){if(!(e===void 0||e===!1)){if(e===!0)throw new nt(["Missing value for --only.",`Use one or more of: ${ai.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
|
|
151
|
+
`));return Sl(e)}}function Sl(e){let t={theme:"theme",font:"font",fonts:"font"},r=e.split(",").map(n=>n.trim().toLowerCase()).filter(Boolean),o=r.filter(n=>!t[n]);if(!r.length||o.length)throw new nt([`Invalid value for --only: ${e}.`,`Use one or more of: ${ai.join(", ")}.`,"Example: love-ui apply <preset> --only theme,font."].join(`
|
|
152
|
+
`));return Array.from(new Set(r.map(n=>t[n])))}function Il(e){if(!(!e.only||e.preset))throw new nt(["Missing preset for --only.","Use: love-ui apply <preset> --only theme,font."].join(`
|
|
153
|
+
`))}function Pl(e){if(!e.only||e.only.includes("theme"))return e.registryBaseConfig;let t=typeof e.existingConfig.tailwind=="object"&&e.existingConfig.tailwind!==null?e.existingConfig.tailwind:{},r=typeof e.registryBaseConfig?.tailwind=="object"&&e.registryBaseConfig.tailwind!==null?e.registryBaseConfig.tailwind:{},o={...e.registryBaseConfig,tailwind:{...t,...r}};return e.existingConfig.menuColor&&(o.menuColor=e.existingConfig.menuColor),e.existingConfig.menuAccent&&(o.menuAccent=e.existingConfig.menuAccent),o}function $l(e){if(q(e)||Ye(e))return;let t=Object.keys(Z);t.includes(e)||(l.error(`Invalid preset: ${d.info(e)}.
|
|
154
|
+
Use one of the available presets: ${t.join(", ")}
|
|
155
|
+
or build your own at ${d.info(`${S}/create`)}`),l.break(),process.exit(1))}async function El(e){let t=await F(e);return Xe(t?.framework.name)}async function jl(e,t){if(t?.only&&!t.only.includes("theme"))return;let r=await Tl(e);if(!r.length)return;let o={style:e.style,tailwind:{baseColor:e.tailwind.baseColor,cssVariables:e.tailwind.cssVariables},...e.iconLibrary?{iconLibrary:e.iconLibrary}:{},...e.rtl!==void 0?{rtl:e.rtl}:{},...e.menuColor?{menuColor:e.menuColor}:{},...e.menuAccent?{menuAccent:e.menuAccent}:{}},n=[];for(let i of r){let s=Zr.resolve(i.resolvedPaths.cwd,"components.json");await qr.pathExists(s)&&n.push({configPath:s,existingConfig:await qr.readJson(s)})}try{for(let i of n)if(!gt(i.configPath))throw new Qe(i.configPath);for(let i of n)await qr.writeJson(i.configPath,{...i.existingConfig,...o,tailwind:{...i.existingConfig.tailwind,...o.tailwind}},{spaces:2});for(let i of n)ht(i.configPath)}catch(i){for(let s of[...n].reverse())et(s.configPath);throw new sr(`Failed to sync linked workspace configs.${i instanceof Error?` ${i.message}`:""}`)}}async function Tl(e){let t=await ze(e);if(!t)return[];let r=new Map;for(let o of Object.values(t))o.resolvedPaths.cwd!==e.resolvedPaths.cwd&&r.set(o.resolvedPaths.cwd,o);return Array.from(r.values()).sort((o,n)=>o.resolvedPaths.cwd.localeCompare(n.resolvedPaths.cwd))}function Fl(e,t,r={}){if(q(e)){let n=new URL(e);return n.pathname==="/init"&&e.startsWith(S)&&n.searchParams.set("track","1"),n.searchParams.set("base",t),n.searchParams.set("rtl",String(r.rtl??!1)),r.only&&n.searchParams.set("only",r.only),n.toString()}if(Ye(e)){let n=Ke(e);return n||(l.error(`Invalid preset code: ${d.info(e)}`),l.break(),process.exit(1)),he({...n,base:t,rtl:r.rtl??!1},{preset:e,template:r.template,only:r.only})}let o=Z[e];return he({...o,base:t,rtl:r.rtl??o.rtl},{template:r.template,only:r.only})}function Ol(e){return/[^A-Za-z0-9_./:-]/.test(e)?JSON.stringify(e):e}function si(e){return e?`love-ui init --preset ${Ol(e)}`:"love-ui init"}import*as bt from"fs/promises";import*as De from"path";import fi from"path";import mi from"fs-extra";async function pi(e){let t={},r={cwd:e.cwd,registryFile:fi.resolve(e.cwd,e.registryFile),outputDir:fi.resolve(e.cwd,e.outputDir)};return mi.existsSync(r.registryFile)||(t["13"]=!0),await mi.mkdir(r.outputDir,{recursive:!0}),Object.keys(t).length>0&&(t["13"]&&(l.break(),l.error(`The path ${d.info(r.registryFile)} does not exist.`)),l.break(),process.exit(1)),{errors:t,resolvePaths:r}}import{Command as Al}from"commander";import{z as ar}from"zod";var Nl=ar.object({cwd:ar.string(),registryFile:ar.string(),outputDir:ar.string()}),ui=new Al().name("build").description("build components for a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./public/r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Nl.parse({cwd:De.resolve(t.cwd),registryFile:e,outputDir:t.output}),{resolvePaths:o}=await pi(r),n=await Zo(o.registryFile,{cwd:o.cwd}),i=n.registry,s=n.usesInclude?De.dirname(o.registryFile):o.cwd,c=Xo(n,s,o.cwd),a=b("Building registry...");for(let f of i.items){a.start(`Building ${f.name}...`);let m=await Qo(f,n,s,o.cwd);await bt.writeFile(De.resolve(o.outputDir,`${m.name}.json`),JSON.stringify(m,null,2))}n.usesInclude?await bt.writeFile(De.resolve(o.outputDir,"registry.json"),JSON.stringify(c,null,2)):await bt.copyFile(o.registryFile,De.resolve(o.outputDir,"registry.json")),a.succeed("Building registry.")}catch(r){l.break(),R(r)}});import{existsSync as Xr,promises as Ll}from"fs";import Qr from"path";import{Command as _l}from"commander";import{diffLines as Vl}from"diff";import{z as kt}from"zod";var Dl=kt.object({component:kt.string().optional(),yes:kt.boolean(),cwd:kt.string(),path:kt.string().optional()}),gi=new _l().name("diff").description("[DEPRECATED] Use `add [component] --diff` instead.").argument("[component]","the component name").option("-y, --yes","skip confirmation prompt.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Dl.parse({component:e,...t}),o=Qr.resolve(r.cwd);Xr(o)||(l.error(`The path ${o} does not exist. Please try again.`),process.exit(1));let n=await j(o);if(!n){if(await M(o)){let a=await B(o);a.length>0&&(W("diff [component]",a),process.exit(1))}l.warn(`Configuration is missing. Please run ${d.success("init")} to create a components.json file.`),process.exit(1)}let i=await Ge();if(i||(R(new Error("Failed to fetch registry index.")),process.exit(1)),!r.component){let a=n.resolvedPaths.components,f=i.filter(p=>{for(let u of p.files??[]){let h=Qr.resolve(a,typeof u=="string"?u:u.path);if(Xr(h))return!0}return!1}),m=[];for(let p of f){let u=await di(p,n);u.length&&m.push({name:p.name,changes:u})}m.length||(l.info("No updates found."),process.exit(0)),l.info("The following components have updates available:");for(let p of m){l.info(`- ${p.name}`);for(let u of p.changes)l.info(` - ${u.filePath}`)}l.break(),l.info(`Run ${d.success("diff <component>")} to see the changes.`),process.exit(0)}let s=i.find(a=>a.name===r.component);s||(l.error(`The component ${d.success(r.component)} does not exist.`),process.exit(1));let c=await di(s,n);c.length||(l.info(`No updates found for ${r.component}.`),process.exit(0));for(let a of c)l.info(`- ${a.filePath}`),await Ul(a.patch),l.info("")}catch(r){R(r)}});async function di(e,t){let r=await Ho(t.style,[e]),o=await zt(t.tailwind.baseColor),n=Ae(r);if(!r)return[];let i=[];for(let s of r){let c=await Ko(t,s);if(c)for(let a of s.files??[]){let f=Qr.resolve(c,typeof a=="string"?a:a.path);if(!Xr(f))continue;let m=await Ll.readFile(f,"utf8");if(typeof a=="string"||!a.content)continue;let p=await Dt({filename:a.path,raw:a.content,config:t,baseColor:o,supportedFontMarkers:n},[At,Nt,Ft,Vt,Ot,Mt,_t,Ut,Lt]),u=Vl(p,m);u.length>1&&i.push({filePath:f,patch:u})}}return i}async function Ul(e){e.forEach(t=>{if(t)return t.added?process.stdout.write(d.success(t.value)):t.removed?process.stdout.write(d.error(t.value)):process.stdout.write(t.value)})}import Ml from"path";import{Command as Bl}from"commander";var hi="https://www.loveui.dev",yi=new Bl().name("docs").description("get docs, api references and usage examples for components").argument("<components...>","component names").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-b, --base <base>","the base to use either 'base' or 'radix'. defaults to project base.").option("--json","output as JSON.",!1).action(async(e,t)=>{try{let r=Ml.resolve(t.cwd),o=await j(r),n=t.base??je(o?.style),i=await Ge();i||(l.error("Failed to fetch the registry index."),process.exit(1));let s=[];for(let a of e){let f=i.find(p=>p.name===a);f||(l.error(`Component ${d.info(a)} not found in the Love UI registry.`),process.exit(1));let m=f.meta?.links?.[n];if(!m||Object.keys(m).length===0){l.warn(`No documentation links available for ${d.info(a)}.`);continue}s.push({component:a,base:n,links:Wl(m)})}if(t.json){console.log(JSON.stringify({base:n,results:s},null,2));return}let c=Math.max(...s.flatMap(a=>Object.keys(a.links).map(f=>f.length)));for(let{component:a,links:f}of s){l.log(d.info(a));for(let[m,p]of Object.entries(f))l.log(` - ${m.padEnd(c+2)}${p}`);l.break()}}catch(r){R(r)}});function Wl(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r.startsWith(hi)?`${S}${r.slice(hi.length)}`:r]))}import{promises as eo}from"fs";import te from"path";import{Command as zl}from"commander";import{execa as lr}from"execa";import vt from"fs-extra";import Jl from"prompts";import{z as cr}from"zod";var wi=/@import\s+["']love-ui\/tailwind\.css["'];?\s*\n?/,Gl=cr.object({cwd:cr.string(),yes:cr.boolean(),silent:cr.boolean()}),bi=new zl().name("eject").description("inline love-ui/tailwind.css and remove the love-ui dependency").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-y, --yes","skip confirmation prompt.",!1).option("-s, --silent","mute output.",!1).action(async e=>{try{let t=Gl.parse({cwd:te.resolve(e.cwd),yes:e.yes,silent:e.silent});await Hl(t)}catch(t){R(t)}});async function Hl(e){if(!vt.existsSync(te.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let m=await B(e.cwd);m.length>0&&(W("eject",m),process.exit(1))}l.break(),l.error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}let t=await j(e.cwd);t?.resolvedPaths.tailwindCss||(l.break(),l.error("Could not resolve the Tailwind CSS file from components.json."),l.break(),process.exit(1));let r=t.resolvedPaths.tailwindCss,o=te.relative(e.cwd,r),n=await eo.readFile(r,"utf8");wi.test(n)||(l.break(),l.error(`Could not find ${d.info('@import "love-ui/tailwind.css"')} in ${d.info(o)}.`),l.error("Nothing to eject."),l.break(),process.exit(1));let i=Ee(e.cwd,!1),s=Kl(i),c=ql(e.cwd),a=await eo.readFile(c,"utf8");if(e.silent||(l.break(),l.warn("This action is not reversible. Future Love UI CLI updates to tailwind.css will not apply automatically."),l.break()),!e.yes){l.log("This will:"),l.log(` - Inline ${d.info("love-ui/tailwind.css")} into ${d.info(o)}`),l.log(` - Remove the ${d.info("love-ui")} dependency`),l.break();let{proceed:m}=await Jl({type:"confirm",name:"proceed",message:"Proceed?",initial:!1});m||process.exit(0)}let f=b(`Inlining ${d.info("love-ui/tailwind.css")}.`,{silent:e.silent})?.start();if(n=n.replace(wi,()=>`/* ejected from love-ui@${s} */
|
|
156
|
+
${a.trim()}
|
|
157
|
+
|
|
158
|
+
`),await eo.writeFile(r,n,"utf8"),f?.succeed(),Yl(i)){let m=b(`Removing ${d.info("love-ui")}.`,{silent:e.silent})?.start();await Zl(e.cwd),m?.succeed()}else e.silent||l.warn(`The ${d.info("love-ui")} package was not found in package.json. Skipped removal.`);l.break(),l.log(`Ejected ${d.info("love-ui/tailwind.css")} into ${d.info(o)}.`),l.break()}function Kl(e){return e?(e.dependencies?.["love-ui"]??e.devDependencies?.["love-ui"]??"unknown").replace(/^[\^~]/,"").trim():"unknown"}function Yl(e){return e?!!(e.dependencies?.["love-ui"]||e.devDependencies?.["love-ui"]):!1}function ql(e){let t=te.join(e,"node_modules/love-ui/dist/tailwind.css");if(vt.existsSync(t))return t;let r=process.argv[1]?te.dirname(te.resolve(process.argv[1])):e;for(let o of[te.join(r,"tailwind.css"),te.join(r,"dist","tailwind.css"),te.join(r,"src","tailwind.css"),te.join(process.cwd(),"src/tailwind.css"),te.join(process.cwd(),"dist/tailwind.css")])if(vt.existsSync(o))return o;throw new Error("Could not resolve love-ui/tailwind.css.")}async function Zl(e){switch(await ce(e)){case"npm":await lr("npm",["uninstall","love-ui"],{cwd:e});break;case"pnpm":await lr("pnpm",["remove","love-ui"],{cwd:e});break;case"yarn":await lr("yarn",["remove","love-ui"],{cwd:e});break;case"bun":await lr("bun",["remove","love-ui"],{cwd:e});break;case"deno":{let r=te.join(e,"package.json"),o=await vt.readJson(r);for(let n of["dependencies","devDependencies"])o[n]?.["love-ui"]&&delete o[n]["love-ui"];await vt.writeJson(r,o,{spaces:2});break}}}import{existsSync as Dc}from"fs";import Ai from"path";import{existsSync as rc,promises as Pi}from"fs";import oc from"path";var Xl=["50","100","200","300","400","500","600","700","800","900","950"],Ql=["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","slate","gray","zinc","neutral","stone","mauve","olive","mist","taupe"],ec={red:{50:"oklch(97.1% 0.013 17.38)",100:"oklch(93.6% 0.032 17.717)",200:"oklch(88.5% 0.062 18.334)",300:"oklch(80.8% 0.114 19.571)",400:"oklch(70.4% 0.191 22.216)",500:"oklch(63.7% 0.237 25.331)",600:"oklch(57.7% 0.245 27.325)",700:"oklch(50.5% 0.213 27.518)",800:"oklch(44.4% 0.177 26.899)",900:"oklch(39.6% 0.141 25.723)",950:"oklch(25.8% 0.092 26.042)"},orange:{50:"oklch(98% 0.016 73.684)",100:"oklch(95.4% 0.038 75.164)",200:"oklch(90.1% 0.076 70.697)",300:"oklch(83.7% 0.128 66.29)",400:"oklch(75% 0.183 55.934)",500:"oklch(70.5% 0.213 47.604)",600:"oklch(64.6% 0.222 41.116)",700:"oklch(55.3% 0.195 38.402)",800:"oklch(47% 0.157 37.304)",900:"oklch(40.8% 0.123 38.172)",950:"oklch(26.6% 0.079 36.259)"},amber:{50:"oklch(98.7% 0.022 95.277)",100:"oklch(96.2% 0.059 95.617)",200:"oklch(92.4% 0.12 95.746)",300:"oklch(87.9% 0.169 91.605)",400:"oklch(82.8% 0.189 84.429)",500:"oklch(76.9% 0.188 70.08)",600:"oklch(66.6% 0.179 58.318)",700:"oklch(55.5% 0.163 48.998)",800:"oklch(47.3% 0.137 46.201)",900:"oklch(41.4% 0.112 45.904)",950:"oklch(27.9% 0.077 45.635)"},yellow:{50:"oklch(98.7% 0.026 102.212)",100:"oklch(97.3% 0.071 103.193)",200:"oklch(94.5% 0.129 101.54)",300:"oklch(90.5% 0.182 98.111)",400:"oklch(85.2% 0.199 91.936)",500:"oklch(79.5% 0.184 86.047)",600:"oklch(68.1% 0.162 75.834)",700:"oklch(55.4% 0.135 66.442)",800:"oklch(47.6% 0.114 61.907)",900:"oklch(42.1% 0.095 57.708)",950:"oklch(28.6% 0.066 53.813)"},lime:{50:"oklch(98.6% 0.031 120.757)",100:"oklch(96.7% 0.067 122.328)",200:"oklch(93.8% 0.127 124.321)",300:"oklch(89.7% 0.196 126.665)",400:"oklch(84.1% 0.238 128.85)",500:"oklch(76.8% 0.233 130.85)",600:"oklch(64.8% 0.2 131.684)",700:"oklch(53.2% 0.157 131.589)",800:"oklch(45.3% 0.124 130.933)",900:"oklch(40.5% 0.101 131.063)",950:"oklch(27.4% 0.072 132.109)"},green:{50:"oklch(98.2% 0.018 155.826)",100:"oklch(96.2% 0.044 156.743)",200:"oklch(92.5% 0.084 155.995)",300:"oklch(87.1% 0.15 154.449)",400:"oklch(79.2% 0.209 151.711)",500:"oklch(72.3% 0.219 149.579)",600:"oklch(62.7% 0.194 149.214)",700:"oklch(52.7% 0.154 150.069)",800:"oklch(44.8% 0.119 151.328)",900:"oklch(39.3% 0.095 152.535)",950:"oklch(26.6% 0.065 152.934)"},emerald:{50:"oklch(97.9% 0.021 166.113)",100:"oklch(95% 0.052 163.051)",200:"oklch(90.5% 0.093 164.15)",300:"oklch(84.5% 0.143 164.978)",400:"oklch(76.5% 0.177 163.223)",500:"oklch(69.6% 0.17 162.48)",600:"oklch(59.6% 0.145 163.225)",700:"oklch(50.8% 0.118 165.612)",800:"oklch(43.2% 0.095 166.913)",900:"oklch(37.8% 0.077 168.94)",950:"oklch(26.2% 0.051 172.552)"},teal:{50:"oklch(98.4% 0.014 180.72)",100:"oklch(95.3% 0.051 180.801)",200:"oklch(91% 0.096 180.426)",300:"oklch(85.5% 0.138 181.071)",400:"oklch(77.7% 0.152 181.912)",500:"oklch(70.4% 0.14 182.503)",600:"oklch(60% 0.118 184.704)",700:"oklch(51.1% 0.096 186.391)",800:"oklch(43.7% 0.078 188.216)",900:"oklch(38.6% 0.063 188.416)",950:"oklch(27.7% 0.046 192.524)"},cyan:{50:"oklch(98.4% 0.019 200.873)",100:"oklch(95.6% 0.045 203.388)",200:"oklch(91.7% 0.08 205.041)",300:"oklch(86.5% 0.127 207.078)",400:"oklch(78.9% 0.154 211.53)",500:"oklch(71.5% 0.143 215.221)",600:"oklch(60.9% 0.126 221.723)",700:"oklch(52% 0.105 223.128)",800:"oklch(45% 0.085 224.283)",900:"oklch(39.8% 0.07 227.392)",950:"oklch(30.2% 0.056 229.695)"},sky:{50:"oklch(97.7% 0.013 236.62)",100:"oklch(95.1% 0.026 236.824)",200:"oklch(90.1% 0.058 230.902)",300:"oklch(82.8% 0.111 230.318)",400:"oklch(74.6% 0.16 232.661)",500:"oklch(68.5% 0.169 237.323)",600:"oklch(58.8% 0.158 241.966)",700:"oklch(50% 0.134 242.749)",800:"oklch(44.3% 0.11 240.79)",900:"oklch(39.1% 0.09 240.876)",950:"oklch(29.3% 0.066 243.157)"},blue:{50:"oklch(97% 0.014 254.604)",100:"oklch(93.2% 0.032 255.585)",200:"oklch(88.2% 0.059 254.128)",300:"oklch(80.9% 0.105 251.813)",400:"oklch(70.7% 0.165 254.624)",500:"oklch(62.3% 0.214 259.815)",600:"oklch(54.6% 0.245 262.881)",700:"oklch(48.8% 0.243 264.376)",800:"oklch(42.4% 0.199 265.638)",900:"oklch(37.9% 0.146 265.522)",950:"oklch(28.2% 0.091 267.935)"},indigo:{50:"oklch(96.2% 0.018 272.314)",100:"oklch(93% 0.034 272.788)",200:"oklch(87% 0.065 274.039)",300:"oklch(78.5% 0.115 274.713)",400:"oklch(67.3% 0.182 276.935)",500:"oklch(58.5% 0.233 277.117)",600:"oklch(51.1% 0.262 276.966)",700:"oklch(45.7% 0.24 277.023)",800:"oklch(39.8% 0.195 277.366)",900:"oklch(35.9% 0.144 278.697)",950:"oklch(25.7% 0.09 281.288)"},violet:{50:"oklch(96.9% 0.016 293.756)",100:"oklch(94.3% 0.029 294.588)",200:"oklch(89.4% 0.057 293.283)",300:"oklch(81.1% 0.111 293.571)",400:"oklch(70.2% 0.183 293.541)",500:"oklch(60.6% 0.25 292.717)",600:"oklch(54.1% 0.281 293.009)",700:"oklch(49.1% 0.27 292.581)",800:"oklch(43.2% 0.232 292.759)",900:"oklch(38% 0.189 293.745)",950:"oklch(28.3% 0.141 291.089)"},purple:{50:"oklch(97.7% 0.014 308.299)",100:"oklch(94.6% 0.033 307.174)",200:"oklch(90.2% 0.063 306.703)",300:"oklch(82.7% 0.119 306.383)",400:"oklch(71.4% 0.203 305.504)",500:"oklch(62.7% 0.265 303.9)",600:"oklch(55.8% 0.288 302.321)",700:"oklch(49.6% 0.265 301.924)",800:"oklch(43.8% 0.218 303.724)",900:"oklch(38.1% 0.176 304.987)",950:"oklch(29.1% 0.149 302.717)"},fuchsia:{50:"oklch(97.7% 0.017 320.058)",100:"oklch(95.2% 0.037 318.852)",200:"oklch(90.3% 0.076 319.62)",300:"oklch(83.3% 0.145 321.434)",400:"oklch(74% 0.238 322.16)",500:"oklch(66.7% 0.295 322.15)",600:"oklch(59.1% 0.293 322.896)",700:"oklch(51.8% 0.253 323.949)",800:"oklch(45.2% 0.211 324.591)",900:"oklch(40.1% 0.17 325.612)",950:"oklch(29.3% 0.136 325.661)"},pink:{50:"oklch(97.1% 0.014 343.198)",100:"oklch(94.8% 0.028 342.258)",200:"oklch(89.9% 0.061 343.231)",300:"oklch(82.3% 0.12 346.018)",400:"oklch(71.8% 0.202 349.761)",500:"oklch(65.6% 0.241 354.308)",600:"oklch(59.2% 0.249 0.584)",700:"oklch(52.5% 0.223 3.958)",800:"oklch(45.9% 0.187 3.815)",900:"oklch(40.8% 0.153 2.432)",950:"oklch(28.4% 0.109 3.907)"},rose:{50:"oklch(96.9% 0.015 12.422)",100:"oklch(94.1% 0.03 12.58)",200:"oklch(89.2% 0.058 10.001)",300:"oklch(81% 0.117 11.638)",400:"oklch(71.2% 0.194 13.428)",500:"oklch(64.5% 0.246 16.439)",600:"oklch(58.6% 0.253 17.585)",700:"oklch(51.4% 0.222 16.935)",800:"oklch(45.5% 0.188 13.697)",900:"oklch(41% 0.159 10.272)",950:"oklch(27.1% 0.105 12.094)"},slate:{50:"oklch(98.4% 0.003 247.858)",100:"oklch(96.8% 0.007 247.896)",200:"oklch(92.9% 0.013 255.508)",300:"oklch(86.9% 0.022 252.894)",400:"oklch(70.4% 0.04 256.788)",500:"oklch(55.4% 0.046 257.417)",600:"oklch(44.6% 0.043 257.281)",700:"oklch(37.2% 0.044 257.287)",800:"oklch(27.9% 0.041 260.031)",900:"oklch(20.8% 0.042 265.755)",950:"oklch(12.9% 0.042 264.695)"},gray:{50:"oklch(98.5% 0.002 247.839)",100:"oklch(96.7% 0.003 264.542)",200:"oklch(92.8% 0.006 264.531)",300:"oklch(87.2% 0.01 258.338)",400:"oklch(70.7% 0.022 261.325)",500:"oklch(55.1% 0.027 264.364)",600:"oklch(44.6% 0.03 256.802)",700:"oklch(37.3% 0.034 259.733)",800:"oklch(27.8% 0.033 256.848)",900:"oklch(21% 0.034 264.665)",950:"oklch(13% 0.028 261.692)"},zinc:{50:"oklch(98.5% 0 0)",100:"oklch(96.7% 0.001 286.375)",200:"oklch(92% 0.004 286.32)",300:"oklch(87.1% 0.006 286.286)",400:"oklch(70.5% 0.015 286.067)",500:"oklch(55.2% 0.016 285.938)",600:"oklch(44.2% 0.017 285.786)",700:"oklch(37% 0.013 285.805)",800:"oklch(27.4% 0.006 286.033)",900:"oklch(21% 0.006 285.885)",950:"oklch(14.1% 0.005 285.823)"},neutral:{50:"oklch(98.5% 0 0)",100:"oklch(97% 0 0)",200:"oklch(92.2% 0 0)",300:"oklch(87% 0 0)",400:"oklch(70.8% 0 0)",500:"oklch(55.6% 0 0)",600:"oklch(43.9% 0 0)",700:"oklch(37.1% 0 0)",800:"oklch(26.9% 0 0)",900:"oklch(20.5% 0 0)",950:"oklch(14.5% 0 0)"},stone:{50:"oklch(98.5% 0.001 106.423)",100:"oklch(97% 0.001 106.424)",200:"oklch(92.3% 0.003 48.717)",300:"oklch(86.9% 0.005 56.366)",400:"oklch(70.9% 0.01 56.259)",500:"oklch(55.3% 0.013 58.071)",600:"oklch(44.4% 0.011 73.639)",700:"oklch(37.4% 0.01 67.558)",800:"oklch(26.8% 0.007 34.298)",900:"oklch(21.6% 0.006 56.043)",950:"oklch(14.7% 0.004 49.25)"},mauve:{50:"oklch(98.5% 0 0)",100:"oklch(96% 0.003 325.6)",200:"oklch(92.2% 0.005 325.62)",300:"oklch(86.5% 0.012 325.68)",400:"oklch(71.1% 0.019 323.02)",500:"oklch(54.2% 0.034 322.5)",600:"oklch(43.5% 0.029 321.78)",700:"oklch(36.4% 0.029 323.89)",800:"oklch(26.3% 0.024 320.12)",900:"oklch(21.2% 0.019 322.12)",950:"oklch(14.5% 0.008 326)"},olive:{50:"oklch(98.8% 0.003 106.5)",100:"oklch(96.6% 0.005 106.5)",200:"oklch(93% 0.007 106.5)",300:"oklch(88% 0.011 106.6)",400:"oklch(73.7% 0.021 106.9)",500:"oklch(58% 0.031 107.3)",600:"oklch(46.6% 0.025 107.3)",700:"oklch(39.4% 0.023 107.4)",800:"oklch(28.6% 0.016 107.4)",900:"oklch(22.8% 0.013 107.4)",950:"oklch(15.3% 0.006 107.1)"},mist:{50:"oklch(98.7% 0.002 197.1)",100:"oklch(96.3% 0.002 197.1)",200:"oklch(92.5% 0.005 214.3)",300:"oklch(87.2% 0.007 219.6)",400:"oklch(72.3% 0.014 214.4)",500:"oklch(56% 0.021 213.5)",600:"oklch(45% 0.017 213.2)",700:"oklch(37.8% 0.015 216)",800:"oklch(27.5% 0.011 216.9)",900:"oklch(21.8% 0.008 223.9)",950:"oklch(14.8% 0.004 228.8)"},taupe:{50:"oklch(98.6% 0.002 67.8)",100:"oklch(96% 0.002 17.2)",200:"oklch(92.2% 0.005 34.3)",300:"oklch(86.8% 0.007 39.5)",400:"oklch(71.4% 0.014 41.2)",500:"oklch(54.7% 0.021 43.1)",600:"oklch(43.8% 0.017 39.3)",700:"oklch(36.7% 0.016 35.7)",800:"oklch(26.8% 0.011 36.5)",900:"oklch(21.4% 0.009 43.1)",950:"oklch(14.7% 0.004 49.3)"}},tc={"220.9 39.3% 11%":"gray","210 20% 98%":"gray","12 76% 61%":"gray","220 70% 50%":"gray"},vi=new Map;for(let e of Ql)for(let t of Xl)vi.set(Ri(ec[e][t]),e);function Ci(e){let t=Ri(e);return t?vi.get(t)??tc[t]??null:null}function Ri(e){if(!e)return"";let t=e.trim().replace(/\s+/g," ").toLowerCase();if(!t.startsWith("oklch(")||!t.endsWith(")"))return t;let r=t.slice(6,-1).trim(),[o]=r.split(/\s*\/\s*/),n=o.split(/\s+/);if(n.length<3)return t;let i=to(n[0],{percentage:!0}),s=to(n[1]),c=to(n[2]);return`oklch(${i} ${s} ${c})`}function to(e,t={}){return t.percentage&&e.endsWith("%")?ki(Number.parseFloat(e)/100):ki(Number.parseFloat(e))}function ki(e){return Number.isNaN(e)?"":Number(e.toFixed(12)).toString()}import nc from"postcss";import{Node as Ue,Project as ic,ScriptKind as sc,SyntaxKind as Ct}from"ts-morph";var ac=new Set(jr),lc=new Set(Tr),cc=new Set(Or),fc=new Set(Ar),mc=new Set(Ht),pc=new Set(Fr),uc=new Set(Gt),dc=new Set(["eb-garamond","instrument-serif","lora","merriweather","playfair-display","noto-serif","roboto-slab"]),gc=new Set(["jetbrains-mono","geist-mono"]),Rt=["--font-sans","--font-serif","--font-mono"],$i=new Set(Rt),hc=[...Rt,"--font-heading"],Ei=new Set(hc),xi={appliedBodyVariable:null,variables:{}},yc={0:"none","0rem":"none","0.45rem":"small","0.625rem":"default","0.875rem":"large"};async function pr(e,t){let r=bc(e.style);if(!r)return{code:null,fallbacks:[],values:null};let o=Z[r],n=await wc(e.resolvedPaths.tailwindCss),i=fr(ac,e.tailwind.baseColor),s=Cc(n),c=Rc(n),a=fr(lc,e.iconLibrary),f=Si(n,xi),m=f??o.font,p=Ii(n,m,xi);if(!f||!p){let I=t;if(t===void 0)try{I=await F(e.resolvedPaths.cwd,{configCssFile:e.tailwind.css})}catch{I=null}let x=await $c(e,I);f??=Si(n,x),m=f??o.font,p??=Ii(n,m,x)}let u=Sc(p??o.fontHeading,m,o.fontHeading),h=xc(n.rootVars["--radius"]),g=fr(cc,e.menuAccent),y=fr(fc,e.menuColor),k={style:r,baseColor:i??o.baseColor,theme:s??o.theme,chartColor:c??o.chartColor,iconLibrary:a??o.iconLibrary,font:m,fontHeading:u,radius:h??o.radius,menuAccent:g??o.menuAccent,menuColor:y??o.menuColor},v=[!i&&"baseColor",!s&&"theme",!c&&"chartColor",!a&&"iconLibrary",!f&&"font",!p&&"fontHeading",!h&&"radius",!g&&"menuAccent",!y&&"menuColor"].filter(Boolean);return{code:cn(k),fallbacks:v,values:k}}async function wc(e){let t={darkVars:{},imports:[],rootVars:{},themeVars:{}};if(!e)return t;try{let r=await Pi.readFile(e,"utf8");return kc(r)}catch{return t}}function bc(e){if(!e)return null;let t=e.replace(/^(base|radix)-/,"");return t in Z?t:null}function kc(e){let t=nc.parse(e),r={darkVars:{},imports:[],rootVars:{},themeVars:{}};return t.walkAtRules("import",o=>{let n=vc(o.params);n&&r.imports.push(n)}),t.walkRules(o=>{let n=o.selector.split(",").map(i=>i.trim()).filter(Boolean);n.includes(":root")&&ro(o,r.rootVars),n.includes(".dark")&&ro(o,r.darkVars)}),t.walkAtRules("theme",o=>{o.params.trim()==="inline"&&ro(o,r.themeVars)}),r}function ro(e,t){for(let r of e.nodes??[])r.type!=="decl"||!r.prop.startsWith("--")||(t[r.prop]=r.value.trim())}function vc(e){let t=e.trim();return(t.match(/^url\((['"]?)(.+?)\1\)$/)??t.match(/^(['"])(.+?)\1$/))?.[2]??null}function Cc(e){let t=mr(e.rootVars["--primary"]);if(!t)return null;let r=e.darkVars["--primary"];return r?mr(r)===t?t:null:t}function Rc(e){let t=mr(e.rootVars["--chart-1"]);if(!t)return null;let r=e.darkVars["--chart-1"];return r?mr(r)===t?t:null:t}function mr(e){let t=Ci(e);return!t||!uc.has(t)?null:t}function xc(e){if(!e)return null;let t=ur(e);return yc[t]??null}function Si(e,t){for(let r of Rt){let o=Ti(e,r);if(o)return o}for(let r of Rt){let o=Ic(e.imports,r);if(o)return o}return Pc(t)}function Ii(e,t,r){let o=oo(e,"--font-heading"),n=o?Oi(o):null;if(n)return n===t?"inherit":n;let i=r.variables["--font-heading"],s=ji(e,"--font-heading");if(!s)return i&&i!==t?i:null;let c=no(s);if(c&&$i.has(c)){let a=Ti(e,c),f=r.variables[c],m=a??f??null;return!m||m===t?"inherit":m}return c==="--font-heading"?i?i===t?"inherit":i:null:i&&i!==t?i:null}function Sc(e,t,r){let o=e===t?"inherit":e;return pc.has(o)?o:r}function oo(e,t,r=new Set){if(r.has(t))return null;r.add(t);let o=ji(e,t);if(!o)return null;let n=no(o);return n?Ei.has(n)?oo(e,n,r):null:o}function ji(e,t){let r=e.themeVars[t];return r&&no(r)!==t?r:e.rootVars[t]??r??null}function no(e){return ur(e).match(/^var\((--[a-z0-9-]+)\)$/)?.[1]??null}function Ti(e,t){let r=oo(e,t),o=r?Oi(r):null;return o||null}function Ic(e,t){let r=e.flatMap(o=>{let n=Lc(o);return n&&Vc(n)===t?[n]:[]});return r.length===1?r[0]:null}function Pc(e){if(e.appliedBodyVariable&&e.variables[e.appliedBodyVariable])return e.variables[e.appliedBodyVariable]??null;let t=Rt.map(r=>e.variables[r]).filter(Boolean).filter((r,o,n)=>n.indexOf(r)===o);return t.length===1?t[0]:null}async function $c(e,t){let r={appliedBodyVariable:null,variables:{}};if(!t||t.framework.name!=="next-app"&&t.framework.name!=="next-pages")return r;let o=Ec(e,t);if(!o)return r;try{let n=await Pi.readFile(o,"utf8");return jc(n,t.framework.name)}catch{return r}}function Ec(e,t){let r=t.isTsx?"tsx":"jsx",o=t.framework.name==="next-app"?t.isSrcDir?[`src/app/layout.${r}`,`app/layout.${r}`]:[`app/layout.${r}`]:t.isSrcDir?[`src/pages/_app.${r}`,`pages/_app.${r}`]:[`pages/_app.${r}`];for(let n of o){let i=oc.join(e.resolvedPaths.cwd,n);if(rc(i))return i}return null}function jc(e,t){let o=new ic({compilerOptions:{}}).createSourceFile("font-source.tsx",e,{overwrite:!0,scriptKind:sc.TSX}),n=new Map;for(let c of o.getImportDeclarations())if(c.getModuleSpecifierValue()==="next/font/google")for(let a of c.getNamedImports()){let f=a.getName(),m=a.getAliasNode()?.getText()??f,p=_c(f);p&&n.set(m,p)}let i={},s=new Map;for(let c of o.getVariableStatements())for(let a of c.getDeclarations()){let f=a.getInitializer();if(!f?.isKind(Ct.CallExpression))continue;let m=n.get(f.getExpression().getText());if(!m)continue;let p=Tc(f);p&&(s.set(a.getName(),p),i[p]=m)}return{appliedBodyVariable:Fc(o,s,t),variables:i}}function Tc(e){let t=e.getArguments()[0];if(!t||!Ue.isObjectLiteralExpression(t))return null;let r=t.getProperty("variable");if(!r||!Ue.isPropertyAssignment(r))return null;let o=r.getInitializer();if(!o)return null;let n=Fi(o.getText());return Ei.has(n)?n:null}function Fc(e,t,r){let o=e.getDescendantsOfKind(Ct.JsxOpeningElement).filter(i=>r==="next-app"?i.getTagNameNode().getText()==="html":!0),n=new Set;for(let i of o){let s=i.getAttribute("className");if(!s||!Ue.isJsxAttribute(s))continue;let c=s.getInitializer();if(!c)continue;let a=Oc(c,t),f=Ac(c);if(f&&a.includes(f))return f;a.length===1&&n.add(a[0])}return n.size===1?Array.from(n)[0]:null}function Oc(e,t){let r=Ue.isJsxExpression(e)?[e.getExpression(),...e.getDescendantsOfKind(Ct.PropertyAccessExpression)].filter(Boolean):[],o=new Set;for(let n of r){if(!n||!Ue.isPropertyAccessExpression(n)||n.getName()!=="variable")continue;let i=n.getExpression().getText(),s=t.get(i);s&&$i.has(s)&&o.add(s)}return Array.from(o)}function Ac(e){let t=Nc(e);return/\bfont-sans\b/.test(t)?"--font-sans":/\bfont-serif\b/.test(t)?"--font-serif":/\bfont-mono\b/.test(t)?"--font-mono":null}function Nc(e){let t=[];(Ue.isStringLiteral(e)||Ue.isNoSubstitutionTemplateLiteral(e))&&t.push(e.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.StringLiteral))t.push(r.getLiteralValue());for(let r of e.getDescendantsOfKind(Ct.NoSubstitutionTemplateLiteral))t.push(r.getLiteralValue());return t.length>0?t.join(" "):e.getText()}function Fi(e){return e.replace(/^['"]|['"]$/g,"")}function Oi(e){if(!e)return null;let t=Fi(e.split(",")[0]?.trim()??"").replace(/\s+variable$/i,"").trim();return t?io(t.replace(/\s+/g,"-")):null}function Lc(e){if(!e)return null;let t=ur(e),r="@fontsource-variable/";return t.startsWith(r)?io(t.slice(r.length)):null}function _c(e){return e?io(e.replace(/_/g,"-")):null}function io(e){let t=ur(e);return mc.has(t)?t:null}function Vc(e){return gc.has(e)?"--font-mono":dc.has(e)?"--font-serif":"--font-sans"}function ur(e){return e?e.trim().replace(/\s+/g," ").replace(/\s*,\s*/g,", ").replace(/"/g,"'").toLowerCase():""}function fr(e,t){return t&&e.has(t)?t:null}import{Command as Uc}from"commander";var Ni=`${S}/code/apps/v4/registry/bases`,Li=new Uc().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ai.resolve(e.cwd);if(!Dc(Ai.resolve(t,"components.json"))&&await M(t)){let c=await B(t);c.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running info from a monorepo root. Use the -c flag to specify a workspace.",targets:c.map(a=>a.name)},null,2)):W("info",c),process.exit(1))}let r=await F(t),o=await j(t),n=await He(t),i=je(o?.style),s=await Bc(r,o,n,i);if(e.json){console.log(JSON.stringify(s,null,2));return}Wc(s)}catch(t){R(t)}});function Mc(e){if(!e)return{};let t={};for(let[r,o]of Object.entries(e))t[r]=typeof o=="string"?o:o.url;return t}async function Bc(e,t,r,o){let n=t?await pr(t,e):null;return{project:e?{framework:e.framework.label,frameworkName:e.framework.name,frameworkVersion:e.frameworkVersion??null,srcDirectory:e.isSrcDir,rsc:e.isRSC,typescript:e.isTsx,tailwindVersion:e.tailwindVersion??null,tailwindConfig:e.tailwindConfigFile??null,tailwindCss:e.tailwindCssFile??null,importAlias:e.aliasPrefix??null}:null,config:t?{style:t.style,base:o,rsc:t.rsc,typescript:t.tsx,iconLibrary:t.iconLibrary??null,rtl:t.rtl??!1,menuColor:t.menuColor??null,menuAccent:t.menuAccent??null,aliases:{components:t.aliases.components,utils:t.aliases.utils,ui:t.aliases.ui??null,lib:t.aliases.lib??null,hooks:t.aliases.hooks??null},resolvedPaths:{cwd:t.resolvedPaths.cwd,tailwindConfig:t.resolvedPaths.tailwindConfig||null,tailwindCss:t.resolvedPaths.tailwindCss||null,utils:t.resolvedPaths.utils,components:t.resolvedPaths.components,lib:t.resolvedPaths.lib,hooks:t.resolvedPaths.hooks,ui:t.resolvedPaths.ui},registries:Mc(t.registries)}:null,preset:n,components:r,links:{docs:`${S}/docs`,components:`${S}/docs/components/${o}/[component].md`,ui:`${Ni}/${o}/ui/[component].tsx`,examples:`${Ni}/${o}/examples/[component]-example.tsx`,schema:`${S}/schema.json`}}}function Wc(e){l.log(d.info("Project")),e.project?Re({framework:`${e.project.framework} (${e.project.frameworkName})`,frameworkVersion:e.project.frameworkVersion??"-",srcDirectory:e.project.srcDirectory?"Yes":"No",rsc:e.project.rsc?"Yes":"No",typescript:e.project.typescript?"Yes":"No",tailwindVersion:e.project.tailwindVersion??"-",tailwindConfig:e.project.tailwindConfig??"-",tailwindCss:e.project.tailwindCss??"-",importAlias:e.project.importAlias??"-"}):l.log(" No project info detected."),l.break(),l.log(d.info("Configuration")),e.config?(Re({style:e.config.style,base:e.config.base,rsc:e.config.rsc?"Yes":"No",typescript:e.config.typescript?"Yes":"No",iconLibrary:e.config.iconLibrary??"-",rtl:e.config.rtl?"Yes":"No",menuColor:e.config.menuColor??"-",menuAccent:e.config.menuAccent??"-"}),l.break(),dr(e.preset),l.break(),l.log(d.info("Aliases")),Re({components:e.config.aliases.components,utils:e.config.aliases.utils,ui:e.config.aliases.ui??"-",lib:e.config.aliases.lib??"-",hooks:e.config.aliases.hooks??"-"}),l.break(),l.log(d.info("Resolved Paths")),Re({cwd:e.config.resolvedPaths.cwd,tailwindConfig:e.config.resolvedPaths.tailwindConfig??"-",tailwindCss:e.config.resolvedPaths.tailwindCss??"-",utils:e.config.resolvedPaths.utils,components:e.config.resolvedPaths.components,lib:e.config.resolvedPaths.lib,hooks:e.config.resolvedPaths.hooks,ui:e.config.resolvedPaths.ui}),Object.keys(e.config.registries).length>0&&(l.break(),l.log("registries:"),Re(e.config.registries))):l.log(" No components.json found."),l.break(),l.log(d.info("Installed Components")),e.components.length>0?l.log(` ${e.components.join(", ")}`):l.log(" No components installed."),l.break(),l.log(d.info("Links")),Re(e.links),l.break()}function dr(e,t={}){if(l.log(d.info("Preset")),!e?.code)Re({code:"-"});else{let r=e.fallbacks??[],o=(n,i)=>{let s=r.includes(n)?"*":"";return`${i??"-"}${s}`};Re({code:e.code,version:e.code[0],style:e.values?.style??"-",baseColor:o("baseColor",e.values?.baseColor),theme:o("theme",e.values?.theme),chartColor:o("chartColor",e.values?.chartColor),iconLibrary:o("iconLibrary",e.values?.iconLibrary),font:o("font",e.values?.font),fontHeading:o("fontHeading",e.values?.fontHeading),radius:o("radius",e.values?.radius),menuAccent:o("menuAccent",e.values?.menuAccent),menuColor:o("menuColor",e.values?.menuColor),url:`${S}/create?preset=${e.code}`}),r.length>0&&(l.log(""),l.log(t.fallbackNote??" * Uses preset defaults for values not available as options on love-ui create."))}}function Re(e){let t=Math.max(...Object.keys(e).map(r=>r.length));for(let[r,o]of Object.entries(e))l.log(` ${r.padEnd(t+2)}${o}`)}import{promises as _i}from"fs";import Vi from"path";import{StdioServerTransport as zc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Command as Jc}from"commander";import Gc from"deepmerge";import{execa as Di}from"execa";import Hc from"fs-extra";import Kc from"prompts";import so from"zod";var Me="latest",hr=[{name:"claude",label:"Claude Code",configPath:".mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"cursor",label:"Cursor",configPath:".cursor/mcp.json",config:{mcpServers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"vscode",label:"VS Code",configPath:".vscode/mcp.json",config:{servers:{loveui:{command:"npx",args:[`love-ui@${Me}`,"mcp"]}}}},{name:"codex",label:"Codex",configPath:".codex/config.toml",config:`[mcp_servers.loveui]
|
|
159
|
+
command = "npx"
|
|
160
|
+
args = ["love-ui@${Me}", "mcp"]
|
|
161
|
+
`},{name:"opencode",label:"OpenCode",configPath:"opencode.json",config:{$schema:"https://opencode.ai/config.json",mcp:{loveui:{type:"local",command:["npx",`love-ui@${Me}`,"mcp"],enabled:!0}}}}],gr=[`love-ui@${Me}`],ao=new Jc().name("mcp").description("MCP server and configuration commands").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{await ee(e.cwd);let t=new zc;await tn.connect(t)}catch(t){l.break(),R(t)}}),Yc=so.object({client:so.enum(["claude","cursor","vscode","codex","opencode"]),cwd:so.string()});ao.command("init").description("Initialize MCP configuration for your client").option("--client <client>",`MCP client (${hr.map(e=>e.name).join(", ")})`).action(async(e,t)=>{try{let o=(t.parent?.opts()||{}).cwd||process.cwd(),n=e.client;if(!n){let f=await Kc({type:"select",name:"client",message:"Which MCP client are you using?",choices:hr.map(m=>({title:m.label,value:m.name}))});f.client||(l.break(),process.exit(1)),n=f.client}let i=Yc.parse({client:n,cwd:o}),s=await j(i.cwd);if(i.client==="codex"){if(s)await D([],gr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Di(f,[m,p,...gr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.log("To configure the Love UI MCP server in Codex:"),l.break(),l.log(`1. Open or create the file ${d.info("~/.codex/config.toml")}`),l.log("2. Add the following configuration:"),l.log(),l.info(`[mcp_servers.loveui]
|
|
162
|
+
command = "npx"
|
|
163
|
+
args = ["love-ui@${Me}", "mcp"]`),l.break(),l.info("3. Restart Codex to load the MCP server"),l.break(),process.exit(0)}let c=b("Configuring MCP server...").start(),a=await Zc(i);if(c.succeed("Configuring MCP server."),s)await D([],gr,s,{silent:!1});else{let f=await ce(i.cwd),m=f==="npm"?"install":"add",p=f==="npm"?"--save-dev":"-D",u=b("Installing dependencies...").start();await Di(f,[m,p,...gr],{cwd:i.cwd}),u.succeed("Installing dependencies.")}l.break(),l.success(`Configuration saved to ${a}.`),l.break()}catch(r){R(r)}});var qc=(e,t)=>t;async function Zc(e){let{client:t,cwd:r}=e,o=hr.find(a=>a.name===t);if(!o)throw new Error(`Unknown client: ${t}. Available clients: ${hr.map(a=>a.name).join(", ")}`);let n=Vi.join(r,o.configPath),i=Vi.dirname(n);await Hc.ensureDir(i);let s={};try{let a=await _i.readFile(n,"utf-8");s=JSON.parse(a)}catch{}let c=Gc(s,o.config,{arrayMerge:qc});return await _i.writeFile(n,JSON.stringify(c,null,2)+`
|
|
164
|
+
`,"utf-8"),o.configPath}import uf from"path";import{randomBytes as Xc}from"crypto";import{promises as lo}from"fs";import{tmpdir as Qc}from"os";import yr from"path";var xe={lucide:{name:"lucide-react",package:"lucide-react",import:"lucide-react"},radix:{name:"@radix-ui/react-icons",package:"@radix-ui/react-icons",import:"@radix-ui/react-icons"}};import ef from"fast-glob";import Ui from"prompts";import{Project as tf,ScriptKind as rf,SyntaxKind as of}from"ts-morph";async function Mi(e){if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");let t=e.resolvedPaths.ui,[r,o]=await Promise.all([ef("**/*.{js,ts,jsx,tsx}",{cwd:t}),Jo()]);if(Object.keys(o).length===0)throw new Error("Something went wrong fetching the registry icons.");let n=Object.entries(xe).map(([m,p])=>({title:p.name,value:m})),i=await Ui([{type:"select",name:"sourceLibrary",message:`Which icon library would you like to ${d.info("migrate from")}?`,choices:n},{type:"select",name:"targetLibrary",message:`Which icon library would you like to ${d.info("migrate to")}?`,choices:n}]);if(i.sourceLibrary===i.targetLibrary)throw new Error("You cannot migrate to the same icon library. Please choose a different icon library.");if(!(i.sourceLibrary in xe&&i.targetLibrary in xe))throw new Error("Invalid icon library. Please choose a valid icon library.");let s=xe[i.sourceLibrary],c=xe[i.targetLibrary],{confirm:a}=await Ui({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} files in ${d.info(`./${yr.relative(e.resolvedPaths.cwd,t)}`)} from ${d.info(s.name)} to ${d.info(c.name)}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0)),c.package&&await D([c.package],[],e,{silent:!1});let f=b("Migrating icons...")?.start();await Promise.all(r.map(async m=>{f.text=`Migrating ${m}...`;let p=yr.join(t,m),u=await lo.readFile(p,"utf-8"),h=await nf(u,i.sourceLibrary,i.targetLibrary,o);await lo.writeFile(p,h)})),f.succeed("Migration complete.")}async function nf(e,t,r,o){let n=xe[t]?.import,i=xe[r]?.import,s=await lo.mkdtemp(yr.join(Qc(),"love-ui-")),c=new tf({compilerOptions:{}}),a=yr.join(s,`love-ui-icons-${Xc(4).toString("hex")}.tsx`),f=c.createSourceFile(a,e,{scriptKind:rf.TSX}),m=[];for(let p of f.getImportDeclarations()??[])if(p.getModuleSpecifier()?.getText()===`"${n}"`){for(let u of p.getNamedImports()??[]){let h=u.getName(),g=Object.values(o).find(y=>y[t]===h)?.[r];!g||m.includes(g)||(m.push(g),u.remove(),f.getDescendantsOfKind(of.JsxSelfClosingElement).filter(y=>y.getTagNameNode()?.getText()===h).forEach(y=>y.getTagNameNode()?.replaceWithText(g)))}p.getNamedImports()?.length===0&&p.remove()}return m.length>0&&f.addImportDeclaration({moduleSpecifier:i,namedImports:m.map(p=>({name:p}))}),await f.getText()}import{promises as wr}from"fs";import br from"path";import co from"fast-glob";import sf from"prompts";function af(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function lf(e,t,r,o){let i=e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\s+/g," ").trim().split(",").map(s=>s.trim()).filter(Boolean);for(let s of i){let c=s.match(/^type\s+(\w+)(?:\s+as\s+(\w+))?$/),a=s.match(/^(\w+)\s+as\s+(\w+)$/);if(c){let f=c[1],m=c[2];o==="slot"&&f==="Slot"&&!m?r.push({name:"Slot",alias:"SlotPrimitive",isType:!0}):r.push({name:f,alias:m,isType:!0})}else if(a){let f=a[1],m=a[2];o==="slot"&&f==="Slot"&&m==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:f,alias:m,isType:t})}else o==="slot"&&s==="Slot"?r.push({name:"Slot",alias:"SlotPrimitive",isType:t}):r.push({name:s,isType:t})}}async function Bi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await co(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let a=br.resolve(o,t.path),f=await wr.stat(a).catch(()=>null);if(!f)throw new Error(`File not found: ${t.path}`);if(f.isDirectory())o=a,r=await co("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(f.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.");o=e.resolvedPaths.ui,r=await co("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let c=t.path?t.path:`./${br.relative(e.resolvedPaths.cwd,o)}`,{confirm:a}=await sf({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(c)} to ${d.info("radix-ui")}. Continue?`});a||(l.info("Migration cancelled."),process.exit(0))}let n=b("Migrating imports...")?.start(),i=new Set;await Promise.all(r.map(async c=>{n.text=`Migrating ${c}...`;let a=br.join(o,c),f=await wr.readFile(a,"utf-8"),{content:m,replacedPackages:p}=await cf(f);p.forEach(u=>i.add(u)),await wr.writeFile(a,m)})),n.succeed("Migrating imports.");let s=b("Updating package.json...")?.start();try{let c=Ee(e.resolvedPaths.cwd,!1);if(!c){s.fail("Could not read package.json"),l.warn("Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui");return}let a=Array.from(i);if(a.length>0){if(c.dependencies||(c.dependencies={}),c.dependencies?.["radix-ui"]||c.devDependencies?.["radix-ui"])s.succeed("radix-ui already in package.json.");else{c.dependencies["radix-ui"]="latest";let m=br.join(e.resolvedPaths.cwd,"package.json");await wr.writeFile(m,JSON.stringify(c,null,2)+`
|
|
165
|
+
`),s.succeed("Updated package.json."),await D(["radix-ui"],[],e,{silent:!1})}l.info(""),l.info("Migration complete. The following packages may be removed if no longer in use:"),l.info(d.info(a.join(", "))),l.info("Please review your codebase before removing.")}else s.succeed("No packages found in source files.")}catch{s.fail("Failed to update package.json"),l.warn("You may need to manually replace @radix-ui/react-* packages with radix-ui")}}async function cf(e){let t=/import\s+(?:(type)\s+)?(?:\*\s+as\s+(\w+)|{([^}]+)})\s+from\s+(["'])@radix-ui\/react-([^"']+)\4(;?)/g,r=[],o=[],n=[],i='"',s=!1,c=e,a;for(;(a=t.exec(e))!==null;){let[g,y,k,v,I,x,C]=a;if(x==="icons"||x.startsWith("icons/"))continue;o.push(g),o.length===1&&(i=I,s=C===";"),n.push(`@radix-ui/react-${x}`);let $=!!y;if(k){let U=af(x);r.push({name:U,alias:k,isType:$})}else v&&lf(v,$,r,x)}if(r.length===0)return{content:e,replacedPackages:[]};let f=r.filter((g,y,k)=>y===k.findIndex(v=>v.name===g.name&&v.alias===g.alias&&v.isType===g.isType)),p=`import { ${f.map(g=>{let y=g.isType?"type ":"";return g.alias?`${y}${g.name} as ${g.alias}`:`${y}${g.name}`}).join(", ")} } from ${i}radix-ui${i}${s?";":""}`;c=o.reduce((g,y,k)=>g.replace(y,k===0?p:""),c),c=c.replace(/\n\s*\n\s*\n/g,`
|
|
126
166
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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 Je(e,o,s){let t=L(e);if(o==="codex"){let a=r.join(Ge(),"skills",t);return[{label:"Codex skill",path:a,status:await O(e,a)}]}if(o==="claude"){let a=r.join(He(),"skills",t);return[{label:"Claude skill",path:a,status:await O(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 O(e,a)},{label:"Cursor rule",path:u,status:await oe(u,Ke(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 O(e,i)},{label:"GitHub Copilot instructions",path:n,status:await oe(n,Ve(e))}]}function Ye(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 te)o.add(t);return}if(!te.has(s))throw new Error(`Unknown skill target "${e}". Use one of: codex, claude, cursor, github, all.`);o.add(s)}async function Xe(){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=he({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 Ne(e,o){let s="loveui-skills",t=Ye(e),i=t.length>0?t:await Xe();if(!await de(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 Je(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 se={"@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 Qe(e){if(ae.has(e)||g(r.join(F,"default","examples",`${e}.tsx`)))return{...se};let o=ce.get(e);if(o)return{...se,..."dependencies"in o?o.dependencies:{}};let s=ge(e),t=r.join(z,s,"package.json");try{let i=await h(t,"utf8");return JSON.parse(i).dependencies??{}}catch{return{}}}async function Ze(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 et(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 tt(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 Ne(e.slice(2),process.cwd());return}let o=e.slice(1),s=process.cwd(),t=await Ue(s),i=await Le(s),n=t?.components?ue(t.components):null,a=await Ce(s,n,i),u=Ee(t?.components,i),{utilsImportPath:c,utilsFilePath:d}=await Ie(s,a,u,t),f=await Ze(s),w=a.endsWith("/ui")?a:`${a}/ui`,$=!1,j=!1,B=!1,x={};for(let k of o){if(!k.trim())continue;if(console.log(`
|
|
146
|
-
Adding ${k}...`),$||(await T(r.join(s,a),{recursive:!0}),await T(r.join(s,w),{recursive:!0}),$=!0),!B){let l=await _e(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`),B=!0}j=!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 p=await K(l);m=p.payload,m||console.warn(`Failed to fetch ${l}: HTTP ${p.status??"unknown"}`)}catch(p){console.warn(`Failed to fetch from ${l}:`,p)}}else{let l=new URL(`r/${k}.json`,De());try{m=(await K(l)).payload}catch{}X=await ze(k,c)}let P=X??m?.files??[];P=P.map(l=>{let p=l.target||l.path;return p.startsWith("registry/default/")&&(p=p.replace("registry/default/","")),{...l,target:p}});let E=P.find(l=>l.target.match(/^components\/comp-\d+\.tsx$/));if(E){let l=P.filter(p=>p.target.match(/^components\/[^/]+\//)&&p.target!==E.target);if(l.length>0&&l[0]){let p=l[0].target.match(/^components\/([^/]+)\//);if(p&&p[1]){let b=p[1];E.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,"-");E.target=`components/${v}.tsx`}}}if(!P.length){console.warn(`Component "${k}" not found. Available components can be found at https://loveui.dev`);continue}P.some(l=>le.test(l.target)||typeof l.content=="string"&&xe.test(l.content))&&await Ae(s,d);let C=0,I=0;for(let l of P){if(!l.content)continue;let p=ee(l.target,a,d),b=r.join(s,p),v=g(b);if(S(p)===S(d)&&v)continue;let _=U(l.content,c);if(v)try{if(await h(b,"utf8")===_)continue}catch{}await M(p,s),await R(b,_,"utf8"),v?I++:C++}if(C>0&&console.log(`\u2713 Created ${C} file${C>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 p=l;l.startsWith("https://loveui.dev/building-blocks/r/")&&(p=`https://ui.loveui.dev/ui/r/${l.split("/").pop()}`);try{let b=await K(p);if(b.payload){let v=b.payload,_=(v?.files??[]).map(y=>{let D=y.target||y.path;return D.startsWith("registry/default/")&&(D=D.replace("registry/default/","")),{...y,target:D}});for(let y of _){if(!y.content)continue;let D=ee(y.target,a,d),H=r.join(s,D),N=g(H);if(S(D)===S(d)&&N)continue;let Q=U(y.content,c);if(N)try{if(await h(H,"utf8")===Q)continue}catch{}await M(D,s),await R(H,Q,"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)||(x[y]="latest")});else{let y=v.dependencies;Object.keys(y).forEach(D=>{!G.includes(D)&&y[D]&&(x[D]=y[D])})}}else console.warn(` \u2717 Failed to fetch ${p}: HTTP ${b.status??"unknown"}`)}catch(b){console.warn(` \u2717 Failed to install ${p}:`,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 Qe(k),Object.assign(x,A)}Object.keys(x).length>0&&await et(x,f,s),console.log(j?`
|
|
148
|
-
\u2713 Done! You can now import and use the components in your app.`:`
|
|
149
|
-
\u2713 Done! Skill installation complete.`)}var ot=process.argv[1]&&(import.meta.url===be(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));ot&&tt().catch(e=>{console.error(e),process.exit(1)});export{tt as run};
|
|
167
|
+
`),f.some(g=>g.name==="Slot"&&g.alias==="SlotPrimitive")&&(c=c.split(`
|
|
168
|
+
`).map(k=>{if(k.trim().startsWith("import "))return k;let v=k;return v=v.replace(/\b(asChild\s*\?\s*)Slot(\s*:)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bReact\.ComponentProps<typeof\s+Slot>/g,"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/\bComponentProps<typeof\s+Slot>/g,"ComponentProps<typeof __SLOT_PLACEHOLDER__>"),v=v.replace(/(<\/?)Slot(\s*\/?>)/g,"$1__SLOT_PLACEHOLDER__$2"),v=v.replace(/\bSlot\b/g,(I,x,C)=>{let $=C.substring(0,x),U=($.match(/"/g)||[]).length,Y=($.match(/'/g)||[]).length;return U%2!==0||Y%2!==0?I:"__SLOT_PLACEHOLDER__"}),v=v.replace(/__SLOT_PLACEHOLDER__/g,"SlotPrimitive.Slot"),v}).join(`
|
|
169
|
+
`));let h=Array.from(new Set(n));return{content:c,replacedPackages:h}}import{promises as xt}from"fs";import St from"path";import fo from"fast-glob";import ff from"prompts";var mf=["sidebar.tsx","pagination.tsx","calendar.tsx"],pf=`${S}/docs/rtl#manual-migration-optional`;async function Wi(e,t={}){let r,o;if(t.path){if(o=e.resolvedPaths.cwd,t.path.includes("*"))r=await fo(t.path,{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else{let f=St.resolve(o,t.path),m=await xt.stat(f).catch(()=>null);if(!m)throw new Error(`File not found: ${t.path}`);if(m.isDirectory())o=f,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0,ignore:["**/node_modules/**"]});else if(m.isFile())r=[t.path];else throw new Error(`Unsupported path type: ${t.path}`)}if(r.length===0)throw new Error(`No files found matching: ${t.path}`)}else{if(!e.resolvedPaths.ui)throw new Error("Could not find a valid `ui` path in your `components.json`. Please provide a path or glob pattern.");o=e.resolvedPaths.ui,r=await fo("**/*.{js,ts,jsx,tsx}",{cwd:o,onlyFiles:!0})}if(!t.yes){let a=t.path?t.path:`./${St.relative(e.resolvedPaths.cwd,o)}`,{confirm:f}=await ff({type:"confirm",name:"confirm",initial:!0,message:`We will migrate ${d.info(r.length)} file(s) in ${d.info(a)} to RTL. Continue?`});f||(l.info("Migration cancelled."),process.exit(0))}let n=b("Updating components.json...").start();try{let a=St.resolve(e.resolvedPaths.cwd,"components.json"),f=JSON.parse(await xt.readFile(a,"utf-8"));f.rtl=!0,await xt.writeFile(a,JSON.stringify(f,null,2)+`
|
|
170
|
+
`),n.succeed("Updated components.json.")}catch{throw n.fail("Failed to update components.json."),new Error("Could not update components.json. Please manually set `rtl: true`.")}let i=b("Migrating files to RTL...").start(),s=0,c=[];if(await Promise.all(r.map(async a=>{i.text=`Migrating ${a}...`;let f=St.join(o,a),m=await xt.readFile(f,"utf-8"),p=await jo(m,!0);p!==m&&(await xt.writeFile(f,p),s++);let u=St.basename(a);mf.includes(u)&&c.push(a)})),i.succeed(`Migration complete. ${s} file(s) transformed.`),c.length>0){l.break(),l.warn("The following components may need manual RTL adjustments:");for(let a of c)l.info(` - ${a}`);l.break(),l.info(`See ${d.info(pf)} for more information.`)}}import zi from"path";import mo from"fs-extra";async function Ji(e){let t={};if(!mo.existsSync(e.cwd)||!mo.existsSync(zi.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!mo.existsSync(zi.resolve(e.cwd,"components.json")))return t["3"]=!0,{errors:t,config:null};try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
171
|
+
Before you can run a migration, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{Command as df}from"commander";import{z as it}from"zod";var Gi=[{name:"icons",description:"migrate your ui components to a different icon library."},{name:"radix",description:"migrate to radix-ui."},{name:"rtl",description:"migrate your components to support RTL (right-to-left)."}],gf=it.object({cwd:it.string(),list:it.boolean(),yes:it.boolean(),migration:it.string().refine(e=>e&&Gi.some(t=>t.name===e),{message:"You must specify a valid migration. Run `love-ui migrate --list` to see available migrations."}).optional(),path:it.string().optional()}),Hi=new df().name("migrate").description("run a migration.").argument("[migration]","the migration to run.").argument("[path]","optional path or glob pattern to migrate.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-l, --list","list all migrations.",!1).option("-y, --yes","skip confirmation prompt.",!1).action(async(e,t,r)=>{try{let o=gf.parse({cwd:uf.resolve(r.cwd),migration:e,path:t,list:r.list,yes:r.yes});if(o.list||!o.migration){l.info("Available migrations:");for(let s of Gi)l.info(`- ${s.name}: ${s.description}`);return}if(!o.migration)throw new Error("You must specify a migration. Run `love-ui migrate --list` to see available migrations.");let{errors:n,config:i}=await Ji(o);if(n["1"]||n["3"])throw new Error("No `components.json` file found. Ensure you are at the root of your project.");if(!i)throw new Error("Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.");o.migration==="icons"&&await Mi(i),o.migration==="radix"&&await Bi(i,{yes:o.yes,path:o.path}),o.migration==="rtl"&&await Wi(i,{yes:o.yes,path:o.path})}catch(o){l.break(),R(o)}});import{existsSync as hf}from"fs";import Ki from"path";import{Command as It}from"commander";import yf from"open";function wf(e){return`${S}/create?preset=${e}`}function po(e){let t=Ke(e);if(!t)throw new Error(`Invalid preset code: ${e}`);let r=[],o=t.chartColor??sn[t.theme]??t.theme;return t.chartColor||r.push("chartColor"),{code:e,version:e[0],values:{...t,chartColor:o},derived:r,url:wf(e)}}function bf(e){dr({code:e.code,fallbacks:e.derived,values:e.values},{fallbackNote:" * Compatibility value for older preset versions."})}var kf=new It().name("decode").description("decode a preset code").argument("<code>","the preset code to decode").option("--json","output as JSON.",!1).action((e,t)=>{try{let r=po(e);if(t.json){console.log(JSON.stringify({code:r.code,version:r.version,values:r.values,derived:r.derived,url:r.url},null,2));return}bf(r)}catch(r){kr(r)}}),vf=new It().name("url").description("get the create URL for a preset code").argument("<code>","the preset code").action(e=>{try{l.log(po(e).url)}catch(t){kr(t)}}),Cf=new It().name("open").description("open a preset code in the browser").argument("<code>","the preset code").action(async e=>{let t;try{t=po(e).url}catch(r){kr(r);return}l.break(),l.log(` Opening ${t} in your browser.`),l.break();try{await yf(t)}catch(r){let o=r instanceof Error?r.message:String(r);kr(new Error(`Failed to open preset URL: ${o}`))}}),Rf=new It().name("resolve").alias("info").description("resolve a preset from your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--json","output as JSON.",!1).action(async e=>{try{let t=Ki.resolve(e.cwd);if(!hf(Ki.resolve(t,"components.json"))&&await M(t)){let i=await B(t);i.length>0&&(e.json?console.log(JSON.stringify({error:"monorepo_root",message:"You are running preset resolve from a monorepo root. Use the -c flag to specify a workspace.",targets:i.map(s=>s.name)},null,2)):W("preset resolve",i),process.exit(1))}let r=await j(t);if(!r){if(e.json){console.log(JSON.stringify(null,null,2));return}l.log("No components.json found.");return}let o=await F(t),n=await pr(r,o);if(e.json){console.log(JSON.stringify(n.code?n:null,null,2));return}dr(n)}catch(t){R(t)}}),uo=new It().name("preset").description("manage presets").addCommand(kf).addCommand(Rf).addCommand(vf).addCommand(Cf).action(()=>{uo.outputHelp()});function kr(e){e instanceof Error&&l.error(e.message),process.exit(1)}import Yi from"path";import{Command as xf}from"commander";import go from"fs-extra";import Sf from"prompts";import{z as ho}from"zod";var If=ho.object({cwd:ho.string(),silent:ho.boolean()}),qi=new xf().name("add").description("add registries to your project").argument("[registries...]","registries (@namespace) or registry URLs (@namespace=url)").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",!1).action(async(e,t)=>{try{let r=If.parse({cwd:Yi.resolve(t.cwd),silent:t.silent}),o=e.length>0?e:await Ef({silent:r.silent});await $f(o,r.cwd,{silent:r.silent})}catch(r){l.break(),R(r)}});function Pf(e){let[t,...r]=e.split("="),o=r.length>0?r.join("="):void 0;if(!t.startsWith("@"))throw new Error(`Invalid registry namespace: ${d.info(t)}. Registry names must start with @ (e.g., @acme).`);return{namespace:t,url:o}}function yo(e,t,r){return`${e} ${e===1?t:r}`}async function $f(e,t,r){let o=Yi.resolve(t,"components.json");if(!go.existsSync(o))throw new Error(`No ${d.info("components.json")} found. Run ${d.info("love-ui init")} first.`);let n=e.map(Pf),i=n.filter(g=>!g.url),s=[];if(i.length>0){let g=b("Fetching registries.",{silent:r.silent}).start(),y=await $r();if(!y)throw g.fail(),new Error("Failed to fetch registries.");g.succeed(),s=y}let c={};for(let{namespace:g,url:y}of n){if(g in re){l.warn(`${d.info(g)} is a built-in registry and cannot be added.`);continue}if(y){if(!y.includes("{name}"))throw new Error(`Invalid registry URL for ${d.info(g)}. URL must include {name} placeholder. Example: ${d.info(`${g}=https://example.com/r/{name}.json`)}`);c[g]=y}else{let k=s.find(v=>v.name===g);if(!k)throw new Error(`Registry ${d.info(g)} not found. Provide a URL: ${d.info(`${g}=https://.../{name}.json`)}`);c[g]=k.url}}if(Object.keys(c).length===0)return{addedRegistries:[]};let a=await go.readJson(o),f=a.registries||{},m={},p=[];for(let[g,y]of Object.entries(c))f[g]?p.push(g):m[g]=y;if(Object.keys(m).length===0){if(p.length>0&&!r.silent){b(`Skipped ${yo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let g of p)l.log(` - ${g}`)}else r.silent||l.info("No new registries to add.");return}let u={...a,registries:{...f,...m}},h=b("Updating components.json.",{silent:r.silent}).start();if(await go.writeJson(o,u,{spaces:2}),h.succeed(),!r.silent){let g=Object.keys(m);b(`Added ${yo(g.length,"registry","registries")}:`,{silent:r.silent})?.succeed();for(let y of g)l.log(` - ${y}`);if(p.length>0){b(`Skipped ${yo(p.length,"registry","registries")}: (already configured)`,{silent:r.silent})?.info();for(let y of p)l.log(` - ${y}`)}}}async function Ef(e){let t=b("Fetching registries.",{silent:e.silent}).start(),r=await $r();if(!r)throw t.fail(),new Error("Failed to fetch registries.");t.succeed();let o=[...r].sort((i,s)=>i.name.localeCompare(s.name)),{selected:n}=await Sf({type:"autocompleteMultiselect",name:"selected",message:"Which registries would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:o.map(i=>({title:i.name,description:i.description,value:i.name}))});return n?.length||(l.warn("No registries selected. Exiting."),l.info(""),process.exit(1)),n}import*as Ie from"path";import*as ko from"fs/promises";import*as O from"path";import{z as Se}from"zod";var Zi=32,jf=So.options.filter(e=>e!=="registry:example"&&e!=="registry:internal"),Tf=Se.record(Se.string(),Se.unknown()),Ff=Se.array(Se.string()),Of=Se.array(Se.unknown());async function Qi(e){let t=O.resolve(e.cwd),r=O.resolve(t,e.registryFile),o={cwd:t,rootFile:r,usesInclude:!1,diagnostics:[],registryFiles:new Set,checkedRegistryFiles:new Set,itemsChecked:0,itemSourcesByItem:new Map,firstIncludedFrom:new Map};if(O.basename(r)!=="registry.json"&&A(o,{registryFile:r,message:"Root source registry file must be named registry.json.",suggestion:"Rename the file to registry.json and pass that file to love-ui registry validate."}),!vo(r,t))return A(o,{registryFile:r,message:`Root registry file must stay inside ${st(t,t)}.`,suggestion:"Run the command from the registry root or pass a registry.json file inside --cwd."}),bo(o,[]);let n=await ts(r,o);if(!n)return bo(o,[]);o.usesInclude=!!n.include?.length,Af(n,r,o);let i=await es(r,n,o,[]);return Lf(i,o),await _f(i,o),bo(o,i)}async function es(e,t,r,o){if(o.length>=Zi)return A(r,{registryFile:e,message:`Registry include tree is too deep. The maximum include depth is ${Zi}.`,suggestion:"Flatten part of the registry include tree or reduce nested include depth."}),[];if(o.includes(e))return A(r,{registryFile:e,message:`Registry include cycle detected: ${zf([...o,e])}.`,suggestion:"Remove one include so the registry graph is acyclic."}),[];let n=o.at(-1)??e,i=r.firstIncludedFrom.get(e);if(i)return A(r,{registryFile:e,message:`Registry file included more than once. First included from ${st(i,r.cwd)}, then included from ${st(n,r.cwd)}.`,suggestion:"Remove one include or move shared items into a single included registry.json."}),[];r.registryFiles.add(e),r.firstIncludedFrom.set(e,n);let s=O.dirname(e),c=[...o,e],a=[];for(let m of t.include??[]){let p=Nf(m,e,s,r);if(!p)continue;let u=await ts(p,r);if(!u)continue;let h=await es(p,u,r,c);a.push(...h)}let f=!r.usesInclude&&e===r.rootFile?r.cwd:s;return t.items.forEach((m,p)=>{r.itemSourcesByItem.set(m,{registryFile:e,registryDir:f,itemIndex:p})}),[...a,...t.items]}async function ts(e,t){t.checkedRegistryFiles.add(e);let r;try{r=await ko.readFile(e,"utf-8")}catch{return A(t,{registryFile:e,message:"Registry file was not found or could not be read.",suggestion:"Check that the registry.json file exists and is readable."}),null}let o;try{o=JSON.parse(r)}catch{return A(t,{registryFile:e,message:"Registry file contains invalid JSON.",suggestion:"Fix the JSON syntax in the registry.json file."}),null}return Uf(o,e,t)}function Af(e,t,r){!e.name&&!e.hasName&&A(r,{registryFile:t,message:'Root registry.json must define "name".',suggestion:'Add a top-level "name" field to the root registry.json.'}),!e.homepage&&!e.hasHomepage&&A(r,{registryFile:t,message:'Root registry.json must define "homepage".',suggestion:'Add a top-level "homepage" field to the root registry.json.'})}function Nf(e,t,r,o){if(q(e))return A(o,{registryFile:t,includePath:e,message:`Remote include "${e}" is not supported.`,suggestion:"Use a relative path to an explicit registry.json file in the same repository."}),null;if(O.isAbsolute(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must be relative.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;if(rs(e))return A(o,{registryFile:t,includePath:e,message:`Include "${e}" cannot use parent-directory traversal.`,suggestion:"Registry includes must descend from the including chunk. Move shared registries into the registry root and include them from there."}),null;if(O.basename(e)!=="registry.json")return A(o,{registryFile:t,includePath:e,message:`Include "${e}" must explicitly reference a registry.json file.`,suggestion:'Use a path like "components/ui/registry.json".'}),null;let n=O.resolve(r,e);return vo(n,o.cwd)?n:(A(o,{registryFile:t,includePath:e,message:`Include "${e}" must stay inside ${st(o.cwd,o.cwd)}.`,suggestion:"Keep included registry.json files inside the registry root."}),null)}function Lf(e,t){let r=new Map;for(let o of e){let n=r.get(o.name);if(!n){r.set(o.name,o);continue}let i=t.itemSourcesByItem.get(n),s=t.itemSourcesByItem.get(o);A(t,{registryFile:s?.registryFile??t.rootFile,itemName:o.name,itemIndex:s?.itemIndex,message:`Duplicate registry item name "${o.name}". First defined at ${Jf(i,t.cwd)}.`,suggestion:"Rename one of these items so each name is unique across the resolved registry."})}}async function _f(e,t){let r=Wf(t);for(let o of e){let n=t.itemSourcesByItem.get(o),i={...Df(o,t,r),$schema:"https://www.loveui.dev/schema/registry-item.json"};for(let c=0;c<(o.files?.length??0);c++){let a=o.files?.[c];if(!a||!n)continue;let f=Vf(o,a.path,n,t);if(f)try{await ko.readFile(f,"utf-8")}catch{A(t,{registryFile:n.registryFile,itemName:o.name,itemIndex:n.itemIndex,filePath:a.path,message:`File "${a.path}" was not found or could not be read.`,suggestion:"Make sure the file path is relative to the registry.json file that declares the item."})}}let s=at.safeParse(i);s.success||Pt(s.error,n?.registryFile??t.rootFile,t,{itemName:o.name,itemIndex:n?.itemIndex,suggestion:"Update the registry item so the built item matches the registry item schema."})}}function Vf(e,t,r,o){if(q(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot be remote.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(O.isAbsolute(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must be relative.`,suggestion:"Use a local file path relative to the registry.json file that declares the item."}),null;if(rs(t))return A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" cannot use parent-directory traversal.`,suggestion:"Keep item files inside the registry chunk directory."}),null;let n=O.resolve(r.registryDir,t);return vo(n,r.registryDir)?n:(A(o,{registryFile:r.registryFile,itemName:e.name,itemIndex:r.itemIndex,filePath:t,message:`File path "${t}" must stay inside the registry chunk directory.`,suggestion:"Move the file into the same registry chunk directory or update the registry item path."}),null)}function Df(e,t,r){let o=t.itemSourcesByItem.get(e);return{...e,files:e.files?.map(n=>{let i=O.resolve(o?.registryDir??t.cwd,n.path);return{...n,path:O.relative(r,i).split(O.sep).join("/")}})}}function Uf(e,t,r){let o=Tf.safeParse(e);if(!o.success)return Pt(o.error,t,r,{suggestion:"Update the registry.json file so it matches the schema."}),null;let n=o.data,i={$schema:wo(n,"$schema",t,r),name:wo(n,"name",t,r),homepage:wo(n,"homepage",t,r),hasName:n.name!==void 0,hasHomepage:n.homepage!==void 0,items:[]};if(n.include!==void 0){let s=Ff.safeParse(n.include);s.success?i.include=s.data:Pt(s.error,t,r,{pathPrefix:["include"],suggestion:"Update include so it is an array of registry.json paths."})}if(n.items!==void 0){let s=Of.safeParse(n.items);s.success?(r.itemsChecked+=s.data.length,i.items=Mf(s.data,t,r)):Pt(s.error,t,r,{pathPrefix:["items"],suggestion:"Update items so it is an array of registry items."})}return n.items===void 0&&n.include===void 0&&A(r,{registryFile:t,message:"Registry must define at least one of `items` or `include`.",suggestion:'Add an "items" array, an "include" array, or both to registry.json.'}),i}function Mf(e,t,r){let o=[];return e.forEach((n,i)=>{let s=at.safeParse(n);if(!s.success){Pt(s.error,t,r,{itemName:Bf(n),itemIndex:i,suggestion:"Update the registry item so it matches the registry item schema."});return}o.push(s.data)}),o}function wo(e,t,r,o){let n=e[t];if(n!==void 0){if(typeof n=="string")return n;A(o,{registryFile:r,message:`${t}: Expected string, received ${typeof n}.`,suggestion:`Update "${t}" so it is a string.`})}}function Bf(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.name;return typeof t=="string"?t:void 0}function Pt(e,t,r,o){for(let n of e.errors)A(r,{registryFile:t,itemName:o.itemName,itemIndex:o.itemIndex,message:Gf(n,o.pathPrefix),suggestion:o.suggestion})}function A(e,t){e.diagnostics.push(t)}function bo(e,t){return{valid:e.diagnostics.length===0,cwd:e.cwd,registryFiles:e.checkedRegistryFiles.size,registryFilePaths:Array.from(e.checkedRegistryFiles),items:e.itemsChecked,diagnostics:e.diagnostics}}function Wf(e){return e.usesInclude?O.dirname(e.rootFile):e.cwd}function rs(e){return e.split(/[\\/]+/).includes("..")}function vo(e,t){let r=O.relative(t,e);return!!r&&!r.startsWith("..")&&!O.isAbsolute(r)}function zf(e){return e.map(t=>st(t,O.dirname(e[0]))).join(" -> ")}function Jf(e,t){return e?`${st(e.registryFile,t)} items[${e.itemIndex}]`:"unknown source"}function Xi(e){return e.length?e.join("."):"(root)"}function Gf(e,t=[]){let r=[...t,...e.path];return e.code===Se.ZodIssueCode.invalid_union_discriminator&&e.path.at(-1)==="type"?`${Xi(r)}: Invalid registry item type. Expected ${jf.map(o=>`"${o}"`).join(" | ")}.`:`${Xi(r)}: ${e.message}`}function st(e,t){let r=O.relative(t,e);return r&&!r.startsWith("..")&&!O.isAbsolute(r)?r.split(O.sep).join("/"):r?e:"."}import{Command as Hf}from"commander";import{z as Co}from"zod";var Kf=Co.object({cwd:Co.string(),registryFile:Co.string()}),is=new Hf().name("validate").description("validate a Love UI registry").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{let r;try{let o=Kf.parse({cwd:Ie.resolve(t.cwd),registryFile:e});r=b("Validating registry.").start();let n=await Qi(o);Yf(n,r),n.valid||(process.exitCode=1)}catch(o){r?.fail("Registry validation failed."),l.break(),R(o)}});function Yf(e,t){if(e.valid){t.succeed("Registry is valid."),os(e,{success:!0});return}t.fail("Registry validation failed."),os(e),l.break();for(let[r,o]of Array.from(qf(e))){l.log(d.info(ss(r,e.cwd)));for(let n of o)l.error(` - ${Zf(n)}`),n.suggestion&&l.log(` ${n.suggestion}`);l.break()}}function os(e,t={}){let r=`Checked ${ns(e.registryFiles,"registry file","registry files")} and ${ns(e.items,"item","items")}.`;t.success?Xf(r):l.log(` ${r}`);for(let o of e.registryFilePaths)l.log(` - ${ss(o,e.cwd)}`)}function qf(e){let t=new Map;for(let r of e.diagnostics){let o=t.get(r.registryFile)??[];o.push(r),t.set(r.registryFile,o)}return t}function Zf(e){let t=[];return e.itemIndex!==void 0&&t.push(`items[${e.itemIndex}]`),e.itemName&&t.push(`"${e.itemName}"`),e.includePath&&t.push(`include "${e.includePath}"`),e.filePath&&t.push(`file "${e.filePath}"`),t.length?`${t.join(" ")}: ${e.message}`:e.message}function ss(e,t){let r=Ie.relative(t,e);return r&&!r.startsWith("..")&&!Ie.isAbsolute(r)?r.split(Ie.sep).join("/"):r?e:"."}function Xf(e){b(e).succeed()}function ns(e,t,r){return`${e} ${e===1?t:r}`}import{Command as Qf}from"commander";var as=new Qf().name("registry").description("manage registries").addCommand(qi).addCommand(is);import ls from"path";import{Command as em}from"commander";import cs from"fs-extra";import{z as $t}from"zod";var tm=$t.object({cwd:$t.string(),query:$t.string().optional(),limit:$t.number().optional(),offset:$t.number().optional()}),fs=new em().name("search").alias("list").description("search items from registries").argument("<registries...>","the registry names or urls to search items from. Names must be prefixed with @.").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-l, --limit <number>","maximum number of items to display per registry","100").option("-o, --offset <number>","number of items to skip","0").action(async(e,t)=>{try{let r=tm.parse({cwd:ls.resolve(t.cwd),query:t.query,limit:t.limit?parseInt(t.limit,10):void 0,offset:t.offset?parseInt(t.offset,10):void 0});await ee(r.cwd);let o=Je({style:"new-york",resolvedPaths:{cwd:r.cwd}}),n=L(o),i=ls.resolve(r.cwd,"components.json");if(cs.existsSync(i)){let m=await cs.readJson(i),p=z.partial().parse(m);n=L({...o,...p})}let s=n;try{let m=await j(r.cwd);m&&(s=L(m))}catch{}let{config:c,newRegistries:a}=await G(e.map(m=>`${m}/registry`),s,{silent:!0,writeFile:!1});a.length>0&&(s.registries=c.registries),Wt(e,s);let f=await en(e,{query:r.query,limit:r.limit,offset:r.offset,config:s});console.log(JSON.stringify(f,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import ms from"path";import{Command as rm}from"commander";import ps from"fs-extra";import{z as us}from"zod";var om=us.object({cwd:us.string()}),ds=new rm().name("view").description("view items from the registry").argument("<items...>","the item names or URLs to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=om.parse({cwd:ms.resolve(t.cwd)});await ee(r.cwd);let o=L({}),n=ms.resolve(r.cwd,"components.json");if(ps.existsSync(n)){let f=await ps.readJson(n),m=z.partial().parse(f);o=L(m)}let i=o;try{let f=await j(r.cwd);f&&(i=L(f))}catch{}let{config:s,newRegistries:c}=await G(e,i,{silent:!0,writeFile:!1});c.length>0&&(i.registries=s.registries),Wt(e,i);let a=await ie(e,{config:i});console.log(JSON.stringify(a,null,2)),process.exit(0)}catch(r){R(r)}finally{ne()}});import{Command as nm}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function im(){let e=new nm().name("love-ui").description("build your Love UI component library").version(zo.version||"1.0.0","-v, --version","display the version number");e.addCommand(Wn).addCommand(li).addCommand(oi).addCommand(gi).addCommand(yi).addCommand(ds).addCommand(fs).addCommand(Hi).addCommand(bi).addCommand(Li).addCommand(ui).addCommand(ao).addCommand(uo).addCommand(as),e.parse()}im();export{Ho as fetchTree,Ko as getItemTargetPath,Ge as getLoveUIRegistryIndex,um as getPreset,pm as getPresets,$r as getRegistries,fm as getRegistriesConfig,Yo as getRegistriesIndex,lm as getRegistry,zt as getRegistryBaseColor,Go as getRegistryBaseColors,Jo as getRegistryIcons,ie as getRegistryItems,Pr as getRegistryStyles,cm as resolveRegistryItems,mm as resolveTree};
|