From 21878fb7623da8de6211392d5b5865d25799d1ef Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 29 Jan 2025 11:50:45 -0500 Subject: [PATCH 1/8] feat: use new shadcn registry --- CONTRIBUTING.md | 6 +- app/(marketing)/showcase/page.tsx | 2 +- components/component-preview.tsx | 48 +- components/component-wrapper.tsx | 7 +- components/mdx-components.tsx | 2 +- components/open-in-v0-button.tsx | 34 + components/sections/showcase.tsx | 2 +- components/sections/testimonials.tsx | 4 +- components/sidebar-cta.tsx | 4 +- components/site-header.tsx | 2 +- content/docs/components/android.mdx | 2 +- content/docs/components/line-shadow-text.mdx | 2 +- content/docs/components/warp-background.mdx | 2 +- lib/rehype-component.ts | 224 +- lib/use-config.ts | 21 - package.json | 4 +- pnpm-lock.yaml | 658 ++++- public/r/android-demo-2.json | 15 + public/r/android-demo-3.json | 15 + public/r/android-demo.json | 15 + public/r/{styles/default => }/android.json | 10 +- public/r/animated-beam-bidirectional.json | 15 + public/r/animated-beam-demo.json | 18 + public/r/animated-beam-multiple-inputs.json | 15 + public/r/animated-beam-multiple-outputs.json | 15 + public/r/animated-beam-unidirectional.json | 15 + .../r/{styles/default => }/animated-beam.json | 10 +- .../animated-circular-progress-bar-demo.json | 12 + .../animated-circular-progress-bar.json | 10 +- public/r/animated-gradient-text-demo.json | 18 + .../default => }/animated-gradient-text.json | 10 +- public/r/animated-grid-pattern-demo.json | 15 + .../default => }/animated-grid-pattern.json | 10 +- public/r/animated-list-demo.json | 15 + .../r/{styles/default => }/animated-list.json | 10 +- public/r/animated-shiny-text-demo.json | 18 + .../default => }/animated-shiny-text.json | 10 +- public/r/animated-subscribe-button-demo.json | 12 + .../animated-subscribe-button.json | 10 +- public/r/aurora-text-demo.json | 15 + .../r/{styles/default => }/aurora-text.json | 10 +- public/r/avatar-circles-demo.json | 15 + public/r/avatar-circles.json | 14 + public/r/bento-demo-vertical.json | 18 + public/r/bento-demo.json | 23 + public/r/{styles/default => }/bento-grid.json | 10 +- public/r/blur-fade-demo.json | 12 + public/r/blur-fade-text-demo.json | 12 + public/r/{styles/default => }/blur-fade.json | 10 +- public/r/border-beam-demo.json | 15 + .../r/{styles/default => }/border-beam.json | 10 +- public/r/box-reveal-demo.json | 12 + public/r/{styles/default => }/box-reveal.json | 10 +- public/r/client-tweet-card.json | 17 + public/r/code-comparison-demo.json | 12 + .../{styles/default => }/code-comparison.json | 10 +- public/r/colors/gray.json | 102 - public/r/colors/index.json | 1999 --------------- public/r/colors/neutral.json | 102 - public/r/colors/slate.json | 102 - public/r/colors/stone.json | 102 - public/r/colors/zinc.json | 102 - public/r/confetti-basic-cannon.json | 12 + public/r/confetti-custom-shapes.json | 12 + public/r/confetti-demo.json | 12 + public/r/confetti-emoji.json | 12 + public/r/confetti-fireworks.json | 12 + public/r/confetti-random-direction.json | 12 + public/r/confetti-side-cannons.json | 12 + public/r/confetti-stars.json | 12 + public/r/{styles/default => }/confetti.json | 10 +- public/r/cool-mode-custom.json | 12 + public/r/cool-mode-demo.json | 12 + public/r/{styles/default => }/cool-mode.json | 10 +- public/r/dock-demo-2.json | 15 + public/r/dock-demo-3.json | 15 + public/r/dock-demo.json | 15 + public/r/{styles/default => }/dock.json | 10 +- public/r/dot-pattern-demo.json | 15 + public/r/dot-pattern-linear-gradient.json | 15 + .../r/{styles/default => }/dot-pattern.json | 10 +- public/r/file-tree-demo.json | 12 + public/r/{styles/default => }/file-tree.json | 10 +- public/r/flickering-grid-demo.json | 12 + public/r/flickering-grid-rounded-demo.json | 12 + .../{styles/default => }/flickering-grid.json | 10 +- public/r/flip-text-demo.json | 15 + public/r/{styles/default => }/flip-text.json | 10 +- public/r/globe-demo.json | 15 + public/r/{styles/default => }/globe.json | 10 +- public/r/grid-pattern-dashed.json | 15 + public/r/grid-pattern-demo.json | 15 + public/r/grid-pattern-linear-gradient.json | 15 + .../r/{styles/default => }/grid-pattern.json | 10 +- ...o-video-dialog-demo-top-in-bottom-out.json | 12 + public/r/hero-video-dialog-demo.json | 12 + public/r/hero-video-dialog.json | 17 + public/r/hyper-text-demo.json | 15 + public/r/{styles/default => }/hyper-text.json | 10 +- public/r/icon-cloud-demo-2.json | 15 + public/r/icon-cloud-demo-3.json | 15 + public/r/icon-cloud-demo.json | 15 + public/r/{styles/default => }/icon-cloud.json | 10 +- public/r/index.json | 1166 --------- public/r/interactive-grid-pattern-demo-2.json | 15 + public/r/interactive-grid-pattern-demo.json | 15 + .../interactive-grid-pattern.json | 10 +- public/r/interactive-hover-button-demo.json | 12 + .../interactive-hover-button.json | 10 +- public/r/iphone-15-pro-demo-2.json | 12 + public/r/iphone-15-pro-demo-3.json | 12 + public/r/iphone-15-pro-demo.json | 12 + .../r/{styles/default => }/iphone-15-pro.json | 10 +- public/r/line-shadow-text-demo.json | 15 + .../default => }/line-shadow-text.json | 10 +- public/r/magic-card-demo.json | 15 + public/r/{styles/default => }/magic-card.json | 10 +- public/r/marquee-3d.json | 15 + public/r/marquee-demo-vertical.json | 15 + public/r/marquee-demo.json | 15 + public/r/marquee-logos.json | 15 + public/r/{styles/default => }/marquee.json | 10 +- public/r/meteors-demo.json | 15 + public/r/{styles/default => }/meteors.json | 10 +- public/r/morphing-text-demo.json | 15 + .../r/{styles/default => }/morphing-text.json | 10 +- public/r/neon-gradient-card-demo.json | 12 + .../default => }/neon-gradient-card.json | 10 +- public/r/number-ticker-decimal-demo.json | 15 + public/r/number-ticker-demo.json | 15 + .../r/{styles/default => }/number-ticker.json | 10 +- public/r/orbiting-circles-demo.json | 18 + .../default => }/orbiting-circles.json | 10 +- public/r/particles-demo.json | 18 + public/r/{styles/default => }/particles.json | 10 +- public/r/pulsating-button-demo.json | 12 + .../default => }/pulsating-button.json | 10 +- public/r/rainbow-button-demo.json | 12 + .../{styles/default => }/rainbow-button.json | 10 +- public/r/retro-grid-demo.json | 12 + public/r/{styles/default => }/retro-grid.json | 10 +- public/r/ripple-button-demo.json | 12 + .../r/{styles/default => }/ripple-button.json | 10 +- public/r/ripple-demo.json | 15 + public/r/{styles/default => }/ripple.json | 10 +- public/r/safari-demo-2.json | 12 + public/r/safari-demo-3.json | 12 + public/r/safari-demo-4.json | 12 + public/r/safari-demo.json | 12 + public/r/safari.json | 14 + public/r/scratch-to-reveal-demo.json | 15 + .../default => }/scratch-to-reveal.json | 10 +- public/r/script-copy-btn-demo.json | 12 + .../{styles/default => }/script-copy-btn.json | 10 +- public/r/scroll-based-velocity-demo.json | 15 + .../default => }/scroll-based-velocity.json | 10 +- public/r/scroll-progress-demo.json | 15 + .../{styles/default => }/scroll-progress.json | 10 +- public/r/shimmer-button-demo.json | 15 + .../{styles/default => }/shimmer-button.json | 10 +- public/r/shine-border-demo-2.json | 12 + public/r/shine-border-demo.json | 12 + .../r/{styles/default => }/shine-border.json | 10 +- public/r/shiny-button-demo.json | 12 + .../r/{styles/default => }/shiny-button.json | 10 +- public/r/sparkles-text-demo.json | 12 + .../r/{styles/default => }/sparkles-text.json | 10 +- public/r/styles/default/avatar-circles.json | 12 - .../r/styles/default/client-tweet-card.json | 15 - .../r/styles/default/hero-video-dialog.json | 15 - public/r/styles/default/index.json | 21 - public/r/styles/default/safari.json | 12 - public/r/styles/default/tweet-card.json | 15 - public/r/styles/default/utils.json | 15 - public/r/styles/index.json | 6 - public/r/{styles/default => }/terminal.json | 0 public/r/text-animate-demo-2.json | 12 + public/r/text-animate-demo-3.json | 12 + public/r/text-animate-demo-4.json | 12 + public/r/text-animate-demo-5.json | 12 + public/r/text-animate-demo-6.json | 12 + public/r/text-animate-demo.json | 12 + .../r/{styles/default => }/text-animate.json | 10 +- public/r/text-reveal-demo.json | 15 + .../r/{styles/default => }/text-reveal.json | 10 +- public/r/themes.css | 768 ------ public/r/themes/gray.json | 58 - public/r/themes/neutral.json | 58 - public/r/themes/slate.json | 58 - public/r/themes/stone.json | 58 - public/r/themes/zinc.json | 58 - public/r/tweet-card-demo.json | 15 + public/r/tweet-card-images.json | 15 + public/r/tweet-card-meta-preview.json | 15 + public/r/tweet-card.json | 17 + public/r/typing-animation-demo.json | 15 + .../default => }/typing-animation.json | 10 +- public/r/warp-background-demo.json | 15 + .../{styles/default => }/warp-background.json | 10 +- public/r/word-rotate-demo.json | 15 + .../r/{styles/default => }/word-rotate.json | 10 +- registry.json | 2214 +++++++++++++++++ .../{default => }/example/android-demo-2.tsx | 2 +- .../{default => }/example/android-demo-3.tsx | 2 +- .../{default => }/example/android-demo.tsx | 2 +- .../example/animated-beam-bidirectional.tsx | 2 +- .../example/animated-beam-demo.tsx | 4 +- .../example/animated-beam-multiple-inputs.tsx | 4 +- .../animated-beam-multiple-outputs.tsx | 2 +- .../example/animated-beam-unidirectional.tsx | 2 +- .../animated-circular-progress-bar-demo.tsx | 2 +- .../example/animated-gradient-text-demo.tsx | 2 +- .../example/animated-grid-pattern-demo.tsx | 2 +- .../example/animated-list-demo.tsx | 2 +- .../example/animated-shiny-text-demo.tsx | 2 +- .../animated-subscribe-button-demo.tsx | 2 +- .../example/aurora-text-demo.tsx | 2 +- .../example/avatar-circles-demo.tsx | 2 +- .../example/bento-demo-vertical.tsx | 2 +- registry/{default => }/example/bento-demo.tsx | 8 +- .../{default => }/example/blur-fade-demo.tsx | 2 +- .../example/blur-fade-text-demo.tsx | 2 +- .../example/border-beam-demo-2.tsx | 6 +- .../example/border-beam-demo.tsx | 2 +- .../{default => }/example/box-reveal-demo.tsx | 2 +- .../example/code-comparison-demo.tsx | 2 +- .../example/confetti-basic-cannon.tsx | 2 +- .../example/confetti-custom-shapes.tsx | 0 .../{default => }/example/confetti-demo.tsx | 5 +- .../{default => }/example/confetti-emoji.tsx | 0 .../example/confetti-fireworks.tsx | 0 .../example/confetti-random-direction.tsx | 2 +- .../example/confetti-side-cannons.tsx | 0 .../{default => }/example/confetti-stars.tsx | 0 .../example/cool-mode-custom.tsx | 2 +- .../{default => }/example/cool-mode-demo.tsx | 2 +- .../{default => }/example/dock-demo-2.tsx | 2 +- .../{default => }/example/dock-demo-3.tsx | 2 +- registry/{default => }/example/dock-demo.tsx | 2 +- .../example/dot-pattern-demo.tsx | 2 +- .../example/dot-pattern-linear-gradient.tsx | 2 +- .../{default => }/example/file-tree-demo.tsx | 2 +- .../example/flickering-grid-demo.tsx | 2 +- .../example/flickering-grid-rounded-demo.tsx | 2 +- .../{default => }/example/flip-text-demo.tsx | 2 +- registry/{default => }/example/globe-demo.tsx | 2 +- .../example/grid-pattern-dashed.tsx | 2 +- .../example/grid-pattern-demo.tsx | 2 +- .../example/grid-pattern-linear-gradient.tsx | 2 +- ...ro-video-dialog-demo-top-in-bottom-out.tsx | 4 +- .../example/hero-video-dialog-demo.tsx | 4 +- .../{default => }/example/hyper-text-demo.tsx | 2 +- .../example/icon-cloud-demo-2.tsx | 2 +- .../example/icon-cloud-demo-3.tsx | 2 +- .../{default => }/example/icon-cloud-demo.tsx | 2 +- .../interactive-grid-pattern-demo-2.tsx | 2 +- .../example/interactive-grid-pattern-demo.tsx | 2 +- .../example/interactive-hover-button-demo.tsx | 2 +- .../example/iphone-15-pro-demo-2.tsx | 2 +- .../example/iphone-15-pro-demo-3.tsx | 2 +- .../example/iphone-15-pro-demo.tsx | 2 +- .../example/line-shadow-text-demo.tsx | 2 +- .../{default => }/example/magic-card-demo.tsx | 2 +- registry/{default => }/example/marquee-3d.tsx | 2 +- .../example/marquee-demo-vertical.tsx | 2 +- .../{default => }/example/marquee-demo.tsx | 2 +- .../{default => }/example/marquee-logos.tsx | 2 +- .../{default => }/example/meteors-demo.tsx | 2 +- .../example/morphing-text-demo.tsx | 2 +- .../example/neon-gradient-card-demo.tsx | 2 +- .../example/number-ticker-decimal-demo.tsx | 2 +- .../example/number-ticker-demo.tsx | 2 +- .../example/orbiting-circles-demo.tsx | 2 +- .../{default => }/example/particles-demo.tsx | 2 +- .../example/pulsating-button-demo.tsx | 2 +- .../example/rainbow-button-demo.tsx | 2 +- .../{default => }/example/retro-grid-demo.tsx | 2 +- .../example/ripple-button-demo.tsx | 2 +- .../{default => }/example/ripple-demo.tsx | 2 +- .../{default => }/example/safari-demo-2.tsx | 2 +- .../{default => }/example/safari-demo-3.tsx | 2 +- .../{default => }/example/safari-demo-4.tsx | 2 +- .../{default => }/example/safari-demo.tsx | 2 +- .../example/scratch-to-reveal-demo.tsx | 2 +- .../example/script-copy-btn-demo.tsx | 2 +- .../example/scroll-based-velocity-demo.tsx | 2 +- .../example/scroll-progress-demo.tsx | 2 +- .../example/shimmer-button-demo.tsx | 2 +- .../example/shine-border-demo-2.tsx | 2 +- .../example/shine-border-demo.tsx | 2 +- .../example/shiny-button-demo.tsx | 2 +- .../example/sparkles-text-demo.tsx | 2 +- .../{default => }/example/terminal-demo.tsx | 0 .../example/text-animate-demo-2.tsx | 2 +- .../example/text-animate-demo-3.tsx | 2 +- .../example/text-animate-demo-4.tsx | 2 +- .../example/text-animate-demo-5.tsx | 2 +- .../example/text-animate-demo-6.tsx | 2 +- .../example/text-animate-demo.tsx | 2 +- .../example/text-reveal-demo.tsx | 2 +- .../{default => }/example/tweet-card-demo.tsx | 2 +- .../example/tweet-card-images.tsx | 2 +- .../example/tweet-card-meta-preview.tsx | 2 +- .../example/typing-animation-demo.tsx | 2 +- .../example/warp-background-demo.tsx | 2 +- .../example/word-rotate-demo.tsx | 2 +- registry/index.tsx | 16 - registry/{default => }/lib/utils.ts | 0 registry/{default => }/magicui/android.tsx | 0 .../{default => }/magicui/animated-beam.tsx | 0 .../animated-circular-progress-bar.tsx | 0 .../magicui/animated-gradient-text.tsx | 0 .../magicui/animated-grid-pattern.tsx | 0 .../{default => }/magicui/animated-list.tsx | 0 .../magicui/animated-shiny-text.tsx | 0 .../magicui/animated-subscribe-button.tsx | 0 .../{default => }/magicui/aurora-text.tsx | 0 .../{default => }/magicui/avatar-circles.tsx | 0 registry/{default => }/magicui/bento-grid.tsx | 0 registry/{default => }/magicui/blur-fade.tsx | 0 .../{default => }/magicui/border-beam.tsx | 0 registry/{default => }/magicui/box-reveal.tsx | 0 .../magicui/client-tweet-card.tsx | 2 +- .../{default => }/magicui/code-comparison.tsx | 0 .../{default => }/magicui/confetti-button.tsx | 0 registry/{default => }/magicui/confetti.tsx | 0 registry/{default => }/magicui/cool-mode.tsx | 0 registry/{default => }/magicui/dock.tsx | 0 .../{default => }/magicui/dot-pattern.tsx | 0 registry/{default => }/magicui/file-tree.tsx | 0 .../{default => }/magicui/flickering-grid.tsx | 0 registry/{default => }/magicui/flip-text.tsx | 0 registry/{default => }/magicui/globe.tsx | 0 .../{default => }/magicui/grid-pattern.tsx | 0 .../magicui/hero-video-dialog.tsx | 0 registry/{default => }/magicui/hyper-text.tsx | 0 registry/{default => }/magicui/icon-cloud.tsx | 0 .../magicui/interactive-grid-pattern.tsx | 0 .../magicui/interactive-hover-button.tsx | 0 .../{default => }/magicui/iphone-15-pro.tsx | 0 .../magicui/line-shadow-text.tsx | 0 .../{default => }/magicui/linear-mask.tsx | 0 registry/{default => }/magicui/magic-card.tsx | 0 registry/{default => }/magicui/marquee.tsx | 0 registry/{default => }/magicui/meteors.tsx | 0 .../{default => }/magicui/morphing-text.tsx | 0 .../magicui/neon-gradient-card.tsx | 0 .../{default => }/magicui/number-ticker.tsx | 0 .../magicui/orbiting-circles.tsx | 0 registry/{default => }/magicui/particles.tsx | 0 .../magicui/pulsating-button.tsx | 0 .../{default => }/magicui/rainbow-button.tsx | 0 registry/{default => }/magicui/retro-grid.tsx | 0 .../{default => }/magicui/ripple-button.tsx | 0 registry/{default => }/magicui/ripple.tsx | 0 registry/{default => }/magicui/safari.tsx | 2 +- .../magicui/scratch-to-reveal.tsx | 0 .../{default => }/magicui/script-copy-btn.tsx | 0 .../magicui/scroll-based-velocity.tsx | 0 .../{default => }/magicui/scroll-progress.tsx | 0 .../{default => }/magicui/shimmer-button.tsx | 0 .../{default => }/magicui/shine-border.tsx | 0 .../{default => }/magicui/shiny-button.tsx | 0 .../{default => }/magicui/sparkles-text.tsx | 0 registry/{default => }/magicui/terminal.tsx | 0 .../{default => }/magicui/text-animate.tsx | 0 .../{default => }/magicui/text-reveal.tsx | 0 registry/{default => }/magicui/tweet-card.tsx | 0 .../magicui/typing-animation.tsx | 0 .../{default => }/magicui/warp-background.tsx | 0 .../{default => }/magicui/word-rotate.tsx | 0 registry/registry-base-colors.ts | 756 ------ registry/registry-blocks.ts | 3 - registry/registry-colors.ts | 1566 ------------ registry/registry-hooks.ts | 3 - registry/registry-lib.ts | 15 - registry/registry-styles.ts | 8 - registry/registry-themes.ts | 3 - registry/schema.ts | 90 - tsconfig.json | 6 +- 380 files changed, 4993 insertions(+), 7826 deletions(-) create mode 100644 components/open-in-v0-button.tsx delete mode 100644 lib/use-config.ts create mode 100644 public/r/android-demo-2.json create mode 100644 public/r/android-demo-3.json create mode 100644 public/r/android-demo.json rename public/r/{styles/default => }/android.json (92%) create mode 100644 public/r/animated-beam-bidirectional.json create mode 100644 public/r/animated-beam-demo.json create mode 100644 public/r/animated-beam-multiple-inputs.json create mode 100644 public/r/animated-beam-multiple-outputs.json create mode 100644 public/r/animated-beam-unidirectional.json rename public/r/{styles/default => }/animated-beam.json (93%) create mode 100644 public/r/animated-circular-progress-bar-demo.json rename public/r/{styles/default => }/animated-circular-progress-bar.json (91%) create mode 100644 public/r/animated-gradient-text-demo.json rename public/r/{styles/default => }/animated-gradient-text.json (82%) create mode 100644 public/r/animated-grid-pattern-demo.json rename public/r/{styles/default => }/animated-grid-pattern.json (92%) create mode 100644 public/r/animated-list-demo.json rename public/r/{styles/default => }/animated-list.json (85%) create mode 100644 public/r/animated-shiny-text-demo.json rename public/r/{styles/default => }/animated-shiny-text.json (83%) create mode 100644 public/r/animated-subscribe-button-demo.json rename public/r/{styles/default => }/animated-subscribe-button.json (90%) create mode 100644 public/r/aurora-text-demo.json rename public/r/{styles/default => }/aurora-text.json (94%) create mode 100644 public/r/avatar-circles-demo.json create mode 100644 public/r/avatar-circles.json create mode 100644 public/r/bento-demo-vertical.json create mode 100644 public/r/bento-demo.json rename public/r/{styles/default => }/bento-grid.json (89%) create mode 100644 public/r/blur-fade-demo.json create mode 100644 public/r/blur-fade-text-demo.json rename public/r/{styles/default => }/blur-fade.json (87%) create mode 100644 public/r/border-beam-demo.json rename public/r/{styles/default => }/border-beam.json (87%) create mode 100644 public/r/box-reveal-demo.json rename public/r/{styles/default => }/box-reveal.json (86%) create mode 100644 public/r/client-tweet-card.json create mode 100644 public/r/code-comparison-demo.json rename public/r/{styles/default => }/code-comparison.json (92%) delete mode 100644 public/r/colors/gray.json delete mode 100644 public/r/colors/index.json delete mode 100644 public/r/colors/neutral.json delete mode 100644 public/r/colors/slate.json delete mode 100644 public/r/colors/stone.json delete mode 100644 public/r/colors/zinc.json create mode 100644 public/r/confetti-basic-cannon.json create mode 100644 public/r/confetti-custom-shapes.json create mode 100644 public/r/confetti-demo.json create mode 100644 public/r/confetti-emoji.json create mode 100644 public/r/confetti-fireworks.json create mode 100644 public/r/confetti-random-direction.json create mode 100644 public/r/confetti-side-cannons.json create mode 100644 public/r/confetti-stars.json rename public/r/{styles/default => }/confetti.json (92%) create mode 100644 public/r/cool-mode-custom.json create mode 100644 public/r/cool-mode-demo.json rename public/r/{styles/default => }/cool-mode.json (96%) create mode 100644 public/r/dock-demo-2.json create mode 100644 public/r/dock-demo-3.json create mode 100644 public/r/dock-demo.json rename public/r/{styles/default => }/dock.json (92%) create mode 100644 public/r/dot-pattern-demo.json create mode 100644 public/r/dot-pattern-linear-gradient.json rename public/r/{styles/default => }/dot-pattern.json (80%) create mode 100644 public/r/file-tree-demo.json rename public/r/{styles/default => }/file-tree.json (97%) create mode 100644 public/r/flickering-grid-demo.json create mode 100644 public/r/flickering-grid-rounded-demo.json rename public/r/{styles/default => }/flickering-grid.json (94%) create mode 100644 public/r/flip-text-demo.json rename public/r/{styles/default => }/flip-text.json (82%) create mode 100644 public/r/globe-demo.json rename public/r/{styles/default => }/globe.json (92%) create mode 100644 public/r/grid-pattern-dashed.json create mode 100644 public/r/grid-pattern-demo.json create mode 100644 public/r/grid-pattern-linear-gradient.json rename public/r/{styles/default => }/grid-pattern.json (84%) create mode 100644 public/r/hero-video-dialog-demo-top-in-bottom-out.json create mode 100644 public/r/hero-video-dialog-demo.json create mode 100644 public/r/hero-video-dialog.json create mode 100644 public/r/hyper-text-demo.json rename public/r/{styles/default => }/hyper-text.json (93%) create mode 100644 public/r/icon-cloud-demo-2.json create mode 100644 public/r/icon-cloud-demo-3.json create mode 100644 public/r/icon-cloud-demo.json rename public/r/{styles/default => }/icon-cloud.json (97%) delete mode 100644 public/r/index.json create mode 100644 public/r/interactive-grid-pattern-demo-2.json create mode 100644 public/r/interactive-grid-pattern-demo.json rename public/r/{styles/default => }/interactive-grid-pattern.json (87%) create mode 100644 public/r/interactive-hover-button-demo.json rename public/r/{styles/default => }/interactive-hover-button.json (77%) create mode 100644 public/r/iphone-15-pro-demo-2.json create mode 100644 public/r/iphone-15-pro-demo-3.json create mode 100644 public/r/iphone-15-pro-demo.json rename public/r/{styles/default => }/iphone-15-pro.json (93%) create mode 100644 public/r/line-shadow-text-demo.json rename public/r/{styles/default => }/line-shadow-text.json (83%) create mode 100644 public/r/magic-card-demo.json rename public/r/{styles/default => }/magic-card.json (92%) create mode 100644 public/r/marquee-3d.json create mode 100644 public/r/marquee-demo-vertical.json create mode 100644 public/r/marquee-demo.json create mode 100644 public/r/marquee-logos.json rename public/r/{styles/default => }/marquee.json (89%) create mode 100644 public/r/meteors-demo.json rename public/r/{styles/default => }/meteors.json (89%) create mode 100644 public/r/morphing-text-demo.json rename public/r/{styles/default => }/morphing-text.json (93%) create mode 100644 public/r/neon-gradient-card-demo.json rename public/r/{styles/default => }/neon-gradient-card.json (94%) create mode 100644 public/r/number-ticker-decimal-demo.json create mode 100644 public/r/number-ticker-demo.json rename public/r/{styles/default => }/number-ticker.json (86%) create mode 100644 public/r/orbiting-circles-demo.json rename public/r/{styles/default => }/orbiting-circles.json (89%) create mode 100644 public/r/particles-demo.json rename public/r/{styles/default => }/particles.json (96%) create mode 100644 public/r/pulsating-button-demo.json rename public/r/{styles/default => }/pulsating-button.json (85%) create mode 100644 public/r/rainbow-button-demo.json rename public/r/{styles/default => }/rainbow-button.json (91%) create mode 100644 public/r/retro-grid-demo.json rename public/r/{styles/default => }/retro-grid.json (90%) create mode 100644 public/r/ripple-button-demo.json rename public/r/{styles/default => }/ripple-button.json (91%) create mode 100644 public/r/ripple-demo.json rename public/r/{styles/default => }/ripple.json (88%) create mode 100644 public/r/safari-demo-2.json create mode 100644 public/r/safari-demo-3.json create mode 100644 public/r/safari-demo-4.json create mode 100644 public/r/safari-demo.json create mode 100644 public/r/safari.json create mode 100644 public/r/scratch-to-reveal-demo.json rename public/r/{styles/default => }/scratch-to-reveal.json (93%) create mode 100644 public/r/script-copy-btn-demo.json rename public/r/{styles/default => }/script-copy-btn.json (95%) create mode 100644 public/r/scroll-based-velocity-demo.json rename public/r/{styles/default => }/scroll-based-velocity.json (92%) create mode 100644 public/r/scroll-progress-demo.json rename public/r/{styles/default => }/scroll-progress.json (78%) create mode 100644 public/r/shimmer-button-demo.json rename public/r/{styles/default => }/shimmer-button.json (93%) create mode 100644 public/r/shine-border-demo-2.json create mode 100644 public/r/shine-border-demo.json rename public/r/{styles/default => }/shine-border.json (91%) create mode 100644 public/r/shiny-button-demo.json rename public/r/{styles/default => }/shiny-button.json (88%) create mode 100644 public/r/sparkles-text-demo.json rename public/r/{styles/default => }/sparkles-text.json (92%) delete mode 100644 public/r/styles/default/avatar-circles.json delete mode 100644 public/r/styles/default/client-tweet-card.json delete mode 100644 public/r/styles/default/hero-video-dialog.json delete mode 100644 public/r/styles/default/index.json delete mode 100644 public/r/styles/default/safari.json delete mode 100644 public/r/styles/default/tweet-card.json delete mode 100644 public/r/styles/default/utils.json delete mode 100644 public/r/styles/index.json rename public/r/{styles/default => }/terminal.json (100%) create mode 100644 public/r/text-animate-demo-2.json create mode 100644 public/r/text-animate-demo-3.json create mode 100644 public/r/text-animate-demo-4.json create mode 100644 public/r/text-animate-demo-5.json create mode 100644 public/r/text-animate-demo-6.json create mode 100644 public/r/text-animate-demo.json rename public/r/{styles/default => }/text-animate.json (96%) create mode 100644 public/r/text-reveal-demo.json rename public/r/{styles/default => }/text-reveal.json (88%) delete mode 100644 public/r/themes.css delete mode 100644 public/r/themes/gray.json delete mode 100644 public/r/themes/neutral.json delete mode 100644 public/r/themes/slate.json delete mode 100644 public/r/themes/stone.json delete mode 100644 public/r/themes/zinc.json create mode 100644 public/r/tweet-card-demo.json create mode 100644 public/r/tweet-card-images.json create mode 100644 public/r/tweet-card-meta-preview.json create mode 100644 public/r/tweet-card.json create mode 100644 public/r/typing-animation-demo.json rename public/r/{styles/default => }/typing-animation.json (89%) create mode 100644 public/r/warp-background-demo.json rename public/r/{styles/default => }/warp-background.json (95%) create mode 100644 public/r/word-rotate-demo.json rename public/r/{styles/default => }/word-rotate.json (83%) create mode 100644 registry.json rename registry/{default => }/example/android-demo-2.tsx (85%) rename registry/{default => }/example/android-demo-3.tsx (81%) rename registry/{default => }/example/android-demo.tsx (70%) rename registry/{default => }/example/animated-beam-bidirectional.tsx (98%) rename registry/{default => }/example/animated-beam-demo.tsx (99%) rename registry/{default => }/example/animated-beam-multiple-inputs.tsx (99%) rename registry/{default => }/example/animated-beam-multiple-outputs.tsx (99%) rename registry/{default => }/example/animated-beam-unidirectional.tsx (97%) rename registry/{default => }/example/animated-circular-progress-bar-demo.tsx (86%) rename registry/{default => }/example/animated-gradient-text-demo.tsx (89%) rename registry/{default => }/example/animated-grid-pattern-demo.tsx (89%) rename registry/{default => }/example/animated-list-demo.tsx (97%) rename registry/{default => }/example/animated-shiny-text-demo.tsx (91%) rename registry/{default => }/example/animated-subscribe-button-demo.tsx (85%) rename registry/{default => }/example/aurora-text-demo.tsx (74%) rename registry/{default => }/example/avatar-circles-demo.tsx (92%) rename registry/{default => }/example/bento-demo-vertical.tsx (96%) rename registry/{default => }/example/bento-demo.tsx (92%) rename registry/{default => }/example/blur-fade-demo.tsx (92%) rename registry/{default => }/example/blur-fade-text-demo.tsx (88%) rename registry/{default => }/example/border-beam-demo-2.tsx (50%) rename registry/{default => }/example/border-beam-demo.tsx (88%) rename registry/{default => }/example/box-reveal-demo.tsx (95%) rename registry/{default => }/example/code-comparison-demo.tsx (95%) rename registry/{default => }/example/confetti-basic-cannon.tsx (69%) rename registry/{default => }/example/confetti-custom-shapes.tsx (100%) rename registry/{default => }/example/confetti-demo.tsx (89%) rename registry/{default => }/example/confetti-emoji.tsx (100%) rename registry/{default => }/example/confetti-fireworks.tsx (100%) rename registry/{default => }/example/confetti-random-direction.tsx (80%) rename registry/{default => }/example/confetti-side-cannons.tsx (100%) rename registry/{default => }/example/confetti-stars.tsx (100%) rename registry/{default => }/example/cool-mode-custom.tsx (85%) rename registry/{default => }/example/cool-mode-demo.tsx (78%) rename registry/{default => }/example/dock-demo-2.tsx (99%) rename registry/{default => }/example/dock-demo-3.tsx (99%) rename registry/{default => }/example/dock-demo.tsx (99%) rename registry/{default => }/example/dot-pattern-demo.tsx (89%) rename registry/{default => }/example/dot-pattern-linear-gradient.tsx (90%) rename registry/{default => }/example/file-tree-demo.tsx (96%) rename registry/{default => }/example/flickering-grid-demo.tsx (84%) rename registry/{default => }/example/flickering-grid-rounded-demo.tsx (86%) rename registry/{default => }/example/flip-text-demo.tsx (76%) rename registry/{default => }/example/globe-demo.tsx (92%) rename registry/{default => }/example/grid-pattern-dashed.tsx (90%) rename registry/{default => }/example/grid-pattern-demo.tsx (92%) rename registry/{default => }/example/grid-pattern-linear-gradient.tsx (90%) rename registry/{default => }/example/hero-video-dialog-demo-top-in-bottom-out.tsx (85%) rename registry/{default => }/example/hero-video-dialog-demo.tsx (85%) rename registry/{default => }/example/hyper-text-demo.tsx (56%) rename registry/{default => }/example/icon-cloud-demo-2.tsx (97%) rename registry/{default => }/example/icon-cloud-demo-3.tsx (99%) rename registry/{default => }/example/icon-cloud-demo.tsx (91%) rename registry/{default => }/example/interactive-grid-pattern-demo-2.tsx (88%) rename registry/{default => }/example/interactive-grid-pattern-demo.tsx (87%) rename registry/{default => }/example/interactive-hover-button-demo.tsx (57%) rename registry/{default => }/example/iphone-15-pro-demo-2.tsx (75%) rename registry/{default => }/example/iphone-15-pro-demo-3.tsx (79%) rename registry/{default => }/example/iphone-15-pro-demo.tsx (68%) rename registry/{default => }/example/line-shadow-text-demo.tsx (85%) rename registry/{default => }/example/magic-card-demo.tsx (91%) rename registry/{default => }/example/marquee-3d.tsx (96%) rename registry/{default => }/example/marquee-demo-vertical.tsx (97%) rename registry/{default => }/example/marquee-demo.tsx (97%) rename registry/{default => }/example/marquee-logos.tsx (95%) rename registry/{default => }/example/meteors-demo.tsx (89%) rename registry/{default => }/example/morphing-text-demo.tsx (75%) rename registry/{default => }/example/neon-gradient-card-demo.tsx (85%) rename registry/{default => }/example/number-ticker-decimal-demo.tsx (76%) rename registry/{default => }/example/number-ticker-demo.tsx (74%) rename registry/{default => }/example/orbiting-circles-demo.tsx (99%) rename registry/{default => }/example/particles-demo.tsx (92%) rename registry/{default => }/example/pulsating-button-demo.tsx (60%) rename registry/{default => }/example/rainbow-button-demo.tsx (59%) rename registry/{default => }/example/retro-grid-demo.tsx (88%) rename registry/{default => }/example/ripple-button-demo.tsx (61%) rename registry/{default => }/example/ripple-demo.tsx (86%) rename registry/{default => }/example/safari-demo-2.tsx (80%) rename registry/{default => }/example/safari-demo-3.tsx (83%) rename registry/{default => }/example/safari-demo-4.tsx (75%) rename registry/{default => }/example/safari-demo.tsx (74%) rename registry/{default => }/example/scratch-to-reveal-demo.tsx (86%) rename registry/{default => }/example/script-copy-btn-demo.tsx (85%) rename registry/{default => }/example/scroll-based-velocity-demo.tsx (57%) rename registry/{default => }/example/scroll-progress-demo.tsx (88%) rename registry/{default => }/example/shimmer-button-demo.tsx (81%) rename registry/{default => }/example/shine-border-demo-2.tsx (81%) rename registry/{default => }/example/shine-border-demo.tsx (88%) rename registry/{default => }/example/shiny-button-demo.tsx (57%) rename registry/{default => }/example/sparkles-text-demo.tsx (55%) rename registry/{default => }/example/terminal-demo.tsx (100%) rename registry/{default => }/example/text-animate-demo-2.tsx (67%) rename registry/{default => }/example/text-animate-demo-3.tsx (68%) rename registry/{default => }/example/text-animate-demo-4.tsx (68%) rename registry/{default => }/example/text-animate-demo-5.tsx (77%) rename registry/{default => }/example/text-animate-demo-6.tsx (70%) rename registry/{default => }/example/text-animate-demo.tsx (69%) rename registry/{default => }/example/text-reveal-demo.tsx (78%) rename registry/{default => }/example/tweet-card-demo.tsx (71%) rename registry/{default => }/example/tweet-card-images.tsx (60%) rename registry/{default => }/example/tweet-card-meta-preview.tsx (61%) rename registry/{default => }/example/typing-animation-demo.tsx (58%) rename registry/{default => }/example/warp-background-demo.tsx (89%) rename registry/{default => }/example/word-rotate-demo.tsx (72%) delete mode 100644 registry/index.tsx rename registry/{default => }/lib/utils.ts (100%) rename registry/{default => }/magicui/android.tsx (100%) rename registry/{default => }/magicui/animated-beam.tsx (100%) rename registry/{default => }/magicui/animated-circular-progress-bar.tsx (100%) rename registry/{default => }/magicui/animated-gradient-text.tsx (100%) rename registry/{default => }/magicui/animated-grid-pattern.tsx (100%) rename registry/{default => }/magicui/animated-list.tsx (100%) rename registry/{default => }/magicui/animated-shiny-text.tsx (100%) rename registry/{default => }/magicui/animated-subscribe-button.tsx (100%) rename registry/{default => }/magicui/aurora-text.tsx (100%) rename registry/{default => }/magicui/avatar-circles.tsx (100%) rename registry/{default => }/magicui/bento-grid.tsx (100%) rename registry/{default => }/magicui/blur-fade.tsx (100%) rename registry/{default => }/magicui/border-beam.tsx (100%) rename registry/{default => }/magicui/box-reveal.tsx (100%) rename registry/{default => }/magicui/client-tweet-card.tsx (93%) rename registry/{default => }/magicui/code-comparison.tsx (100%) rename registry/{default => }/magicui/confetti-button.tsx (100%) rename registry/{default => }/magicui/confetti.tsx (100%) rename registry/{default => }/magicui/cool-mode.tsx (100%) rename registry/{default => }/magicui/dock.tsx (100%) rename registry/{default => }/magicui/dot-pattern.tsx (100%) rename registry/{default => }/magicui/file-tree.tsx (100%) rename registry/{default => }/magicui/flickering-grid.tsx (100%) rename registry/{default => }/magicui/flip-text.tsx (100%) rename registry/{default => }/magicui/globe.tsx (100%) rename registry/{default => }/magicui/grid-pattern.tsx (100%) rename registry/{default => }/magicui/hero-video-dialog.tsx (100%) rename registry/{default => }/magicui/hyper-text.tsx (100%) rename registry/{default => }/magicui/icon-cloud.tsx (100%) rename registry/{default => }/magicui/interactive-grid-pattern.tsx (100%) rename registry/{default => }/magicui/interactive-hover-button.tsx (100%) rename registry/{default => }/magicui/iphone-15-pro.tsx (100%) rename registry/{default => }/magicui/line-shadow-text.tsx (100%) rename registry/{default => }/magicui/linear-mask.tsx (100%) rename registry/{default => }/magicui/magic-card.tsx (100%) rename registry/{default => }/magicui/marquee.tsx (100%) rename registry/{default => }/magicui/meteors.tsx (100%) rename registry/{default => }/magicui/morphing-text.tsx (100%) rename registry/{default => }/magicui/neon-gradient-card.tsx (100%) rename registry/{default => }/magicui/number-ticker.tsx (100%) rename registry/{default => }/magicui/orbiting-circles.tsx (100%) rename registry/{default => }/magicui/particles.tsx (100%) rename registry/{default => }/magicui/pulsating-button.tsx (100%) rename registry/{default => }/magicui/rainbow-button.tsx (100%) rename registry/{default => }/magicui/retro-grid.tsx (100%) rename registry/{default => }/magicui/ripple-button.tsx (100%) rename registry/{default => }/magicui/ripple.tsx (100%) rename registry/{default => }/magicui/safari.tsx (99%) rename registry/{default => }/magicui/scratch-to-reveal.tsx (100%) rename registry/{default => }/magicui/script-copy-btn.tsx (100%) rename registry/{default => }/magicui/scroll-based-velocity.tsx (100%) rename registry/{default => }/magicui/scroll-progress.tsx (100%) rename registry/{default => }/magicui/shimmer-button.tsx (100%) rename registry/{default => }/magicui/shine-border.tsx (100%) rename registry/{default => }/magicui/shiny-button.tsx (100%) rename registry/{default => }/magicui/sparkles-text.tsx (100%) rename registry/{default => }/magicui/terminal.tsx (100%) rename registry/{default => }/magicui/text-animate.tsx (100%) rename registry/{default => }/magicui/text-reveal.tsx (100%) rename registry/{default => }/magicui/tweet-card.tsx (100%) rename registry/{default => }/magicui/typing-animation.tsx (100%) rename registry/{default => }/magicui/warp-background.tsx (100%) rename registry/{default => }/magicui/word-rotate.tsx (100%) delete mode 100644 registry/registry-base-colors.ts delete mode 100644 registry/registry-blocks.ts delete mode 100644 registry/registry-colors.ts delete mode 100644 registry/registry-hooks.ts delete mode 100644 registry/registry-lib.ts delete mode 100644 registry/registry-styles.ts delete mode 100644 registry/registry-themes.ts delete mode 100644 registry/schema.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2c00f8833..274444926 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,7 @@ To add a new component to MagicUI, you will need to modify several files. Follow ### 1. Create Component -Create the main component in `registry/default/magicui/example-component.tsx` +Create the main component in `registry/magicui/example-component.tsx` ```typescript import React from 'react' @@ -70,10 +70,10 @@ export default function ExampleComponent() { ### 2. Create Component Demo -Provide a basic example to showcase your component in `registry/default/example/example-component-demo.tsx` +Provide a basic example to showcase your component in `registry/example/example-component-demo.tsx` ```typescript -import ExampleComponent from '@/registry/default/magicui/example-component' +import ExampleComponent from '@/registry/magicui/example-component' export default function ExampleComponentDemo() { return ( diff --git a/app/(marketing)/showcase/page.tsx b/app/(marketing)/showcase/page.tsx index 63691414d..9f97d366a 100644 --- a/app/(marketing)/showcase/page.tsx +++ b/app/(marketing)/showcase/page.tsx @@ -1,7 +1,7 @@ import { allShowcases } from "content-collections"; import { ShowcaseCard } from "@/components/sections/showcase"; -import { BlurFade } from "@/registry/default/magicui/blur-fade"; +import { BlurFade } from "@/registry/magicui/blur-fade"; export default function Page() { return ( diff --git a/components/component-preview.tsx b/components/component-preview.tsx index f3650aeca..be2bf56ce 100644 --- a/components/component-preview.tsx +++ b/components/component-preview.tsx @@ -1,16 +1,17 @@ "use client"; -import * as React from "react"; -import { Index } from "__registry__"; +import Registry from "@/registry.json"; import { RotateCcw } from "lucide-react"; +import * as React from "react"; -import { useConfig } from "@/lib/use-config"; -import { cn } from "@/lib/utils"; +import { ComponentWrapper } from "@/components/component-wrapper"; +import { Icons } from "@/components/icons"; +import { OpenInV0Button } from "@/components/open-in-v0-button"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import ComponentWrapper from "@/components/component-wrapper"; -import { Icons } from "@/components/icons"; -import { styles } from "@/registry/registry-styles"; +// import { useConfig } from "@/lib/use-config"; +import { cn } from "@/lib/utils"; +// import { styles } from "@/registry/registry-styles"; interface ComponentPreviewProps extends React.HTMLAttributes { name: string; @@ -27,16 +28,13 @@ export function ComponentPreview({ ...props }: ComponentPreviewProps) { const [key, setKey] = React.useState(0); - const [config] = useConfig(); - const index = styles.findIndex((style) => style.name === config.style); - const Codes = React.Children.toArray(children) as React.ReactElement[]; - const Code = Codes[index]; + const Code = Codes[0]; const Preview = React.useMemo(() => { - const Component = Index[config.style][name]?.component; + const registryItem = Registry.items.find((item) => item.name === name); - if (!Component) { + if (!registryItem) { console.error(`Component with name "${name}" not found in registry.`); return (

@@ -49,8 +47,13 @@ export function ComponentPreview({ ); } + const Component = React.lazy(() => { + // Ensure we're using the correct path by removing any leading dots or slashes + const cleanPath = registryItem.files[0].path.replace(/^[./]+/, ""); + return import(`../../${cleanPath}`); + }); return ; - }, [name, config.style]); + }, [name]); return (

- +
+ + +
diff --git a/components/component-wrapper.tsx b/components/component-wrapper.tsx index c02e156b4..f02b437ec 100644 --- a/components/component-wrapper.tsx +++ b/components/component-wrapper.tsx @@ -4,7 +4,10 @@ interface ComponentWrapperProps { className?: string; children: any; } -const ComponentWrapper = ({ className, children }: ComponentWrapperProps) => { +export const ComponentWrapper = ({ + className, + children, +}: ComponentWrapperProps) => { return (
{
); }; - -export default ComponentWrapper; diff --git a/components/mdx-components.tsx b/components/mdx-components.tsx index 30162f5d4..756a87bad 100644 --- a/components/mdx-components.tsx +++ b/components/mdx-components.tsx @@ -11,7 +11,7 @@ import { import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Event } from "@/lib/events"; import { cn } from "@/lib/utils"; -import { TweetCard } from "@/registry/default/magicui/tweet-card"; +import { TweetCard } from "@/registry/magicui/tweet-card"; import { useMDXComponent } from "@content-collections/mdx/react"; import Image from "next/image"; import Link from "next/link"; diff --git a/components/open-in-v0-button.tsx b/components/open-in-v0-button.tsx new file mode 100644 index 000000000..9be7c8d1d --- /dev/null +++ b/components/open-in-v0-button.tsx @@ -0,0 +1,34 @@ +import { Button } from "@/components/ui/button"; + +export function OpenInV0Button({ url }: { url: string }) { + return ( + + ); +} diff --git a/components/sections/showcase.tsx b/components/sections/showcase.tsx index 434c1cafe..bef316f85 100644 --- a/components/sections/showcase.tsx +++ b/components/sections/showcase.tsx @@ -2,7 +2,7 @@ import { ChevronRightIcon } from "@radix-ui/react-icons"; import { allShowcases } from "content-collections"; import Link from "next/link"; -import { Marquee } from "@/registry/default/magicui/marquee"; +import { Marquee } from "@/registry/magicui/marquee"; export interface ShowcaseCardProps { title: string; diff --git a/components/sections/testimonials.tsx b/components/sections/testimonials.tsx index c66902741..618d8c9df 100644 --- a/components/sections/testimonials.tsx +++ b/components/sections/testimonials.tsx @@ -1,5 +1,5 @@ -import { Marquee } from "@/registry/default/magicui/marquee"; -import { TweetCard } from "@/registry/default/magicui/tweet-card"; +import { Marquee } from "@/registry/magicui/marquee"; +import { TweetCard } from "@/registry/magicui/tweet-card"; const tweets = [ "https://x.com/chronark_/status/1754781648262967323", diff --git a/components/sidebar-cta.tsx b/components/sidebar-cta.tsx index 0f3393f12..f495647ad 100644 --- a/components/sidebar-cta.tsx +++ b/components/sidebar-cta.tsx @@ -4,8 +4,8 @@ import { ChevronRight } from "lucide-react"; import Link from "next/link"; import posthog from "posthog-js"; -import { AnimatedShinyText } from "@/registry/default/magicui/animated-shiny-text"; -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { AnimatedShinyText } from "@/registry/magicui/animated-shiny-text"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function SidebarCTA() { return ( diff --git a/components/site-header.tsx b/components/site-header.tsx index ef97d6d05..fe1299791 100644 --- a/components/site-header.tsx +++ b/components/site-header.tsx @@ -9,7 +9,7 @@ import { ModeToggle } from "@/components/mode-toggle"; import { buttonVariants } from "@/components/ui/button"; import { siteConfig } from "@/config/site"; import { cn } from "@/lib/utils"; -import { NumberTicker } from "@/registry/default/magicui/number-ticker"; +import { NumberTicker } from "@/registry/magicui/number-ticker"; export async function SiteHeader() { let stars = 300; // Default value diff --git a/content/docs/components/android.mdx b/content/docs/components/android.mdx index 967af1fdd..63724dcff 100644 --- a/content/docs/components/android.mdx +++ b/content/docs/components/android.mdx @@ -1,7 +1,7 @@ --- title: Android date: 2024-12-20 -description: A mockup of the Android +description: A mockup of an Android device. author: dillionverma published: true --- diff --git a/content/docs/components/line-shadow-text.mdx b/content/docs/components/line-shadow-text.mdx index da3a0d599..419f1541c 100644 --- a/content/docs/components/line-shadow-text.mdx +++ b/content/docs/components/line-shadow-text.mdx @@ -1,7 +1,7 @@ --- title: Line Shadow Text date: 2025-01-11 -description: A line shadow text component for Magic UI +description: A text component with a moving line shadow. author: magicui published: true --- diff --git a/content/docs/components/warp-background.mdx b/content/docs/components/warp-background.mdx index bfc997ea8..39fb7bf58 100644 --- a/content/docs/components/warp-background.mdx +++ b/content/docs/components/warp-background.mdx @@ -1,7 +1,7 @@ --- title: Warp Background date: 2024-12-24 -description: A container component that applies a warp animation effect to its children +description: A card with a time warping background effect. author: magicui published: true --- diff --git a/lib/rehype-component.ts b/lib/rehype-component.ts index 9ca00ee05..a92e065ce 100644 --- a/lib/rehype-component.ts +++ b/lib/rehype-component.ts @@ -5,8 +5,16 @@ import { visit } from "unist-util-visit"; import { UnistNode, UnistTree } from "@/types/unist"; -import { Index } from "../__registry__"; -import { styles } from "../registry/registry-styles"; +import Registry from "../registry.json"; + +export const styles = [ + { + name: "default", + label: "Default", + }, +] as const; + +export type Style = (typeof styles)[number]; export function rehypeComponent() { return async (tree: UnistTree) => { @@ -24,70 +32,73 @@ export function rehypeComponent() { } try { - for (const style of styles) { - let src: string; - - if (srcPath) { - src = srcPath as string; - } else { - const component = Index[style.name][name]; - src = fileName - ? component.files.find((file: string) => { - return ( - file.endsWith(`${fileName}.tsx`) || - file.endsWith(`${fileName}.ts`) - ); - }) || component.files[0] - : component.files[0]; + let src: string; + + if (srcPath) { + src = srcPath as string; + } else { + const component = Registry.items.find((item) => item.name === name); + + if (!component) { + return null; } - // Read the source file. - const filePath = path.join(process.cwd(), src); - let source = fs.readFileSync(filePath, "utf8"); - - // Replace imports. - // TODO: Use @swc/core and a visitor to replace this. - // For now a simple regex should do. - source = source.replaceAll( - `@/registry/${style.name}/`, - "@/components/", - ); - source = source.replaceAll("export default", "export"); - - // Add code as children so that rehype can take over at build time. - node.children?.push( - u("element", { - tagName: "pre", - properties: { - __src__: src, - }, - attributes: [ - { - name: "styleName", - type: "mdxJsxAttribute", - value: style.name, + src = fileName + ? component.files.find((file) => { + return ( + file.path.endsWith(`${fileName}.tsx`) || + file.path.endsWith(`${fileName}.ts`) + ); + })?.path || component.files[0].path + : component.files[0].path; + } + + // Read the source file. + const filePath = path.join(process.cwd(), src); + let source = fs.readFileSync(filePath, "utf8"); + + // Replace imports. + // TODO: Use @swc/core and a visitor to replace this. + // For now a simple regex should do. + // source = source.replaceAll( + // `@/registry/${style.name}/`, + // "@/components/", + // ); + source = source.replaceAll("export default", "export"); + + // Add code as children so that rehype can take over at build time. + node.children?.push( + u("element", { + tagName: "pre", + properties: { + __src__: src, + }, + // attributes: [ + // { + // name: "styleName", + // type: "mdxJsxAttribute", + // value: style.name, + // }, + // ], + children: [ + u("element", { + tagName: "code", + properties: { + className: ["language-tsx"], }, - ], - children: [ - u("element", { - tagName: "code", - properties: { - className: ["language-tsx"], - }, - data: { - meta: `event="copy_source_code"`, + data: { + meta: `event="copy_source_code"`, + }, + children: [ + { + type: "text", + value: source, }, - children: [ - { - type: "text", - value: source, - }, - ], - }), - ], - }), - ); - } + ], + }), + ], + }), + ); } catch (error) { console.error(error); } @@ -101,50 +112,53 @@ export function rehypeComponent() { } try { - for (const style of styles) { - const component = Index[style.name][name]; - const src = component.files[0]; - - // Read the source file. - const filePath = path.join(process.cwd(), src); - let source = fs.readFileSync(filePath, "utf8"); - - // Replace imports. - // TODO: Use @swc/core and a visitor to replace this. - // For now a simple regex should do. - source = source.replaceAll( - `@/registry/${style.name}/`, - "@/components/", - ); - source = source.replaceAll("export default", "export"); - - // Add code as children so that rehype can take over at build time. - node.children?.push( - u("element", { - tagName: "pre", - properties: { - __src__: src, - }, - children: [ - u("element", { - tagName: "code", - properties: { - className: ["language-tsx"], - }, - data: { - meta: `event="copy_usage_code"`, - }, - children: [ - { - type: "text", - value: source, - }, - ], - }), - ], - }), - ); + const component = Registry.items.find((item) => item.name === name); + + if (!component) { + return null; } + + const src = component.files[0].path; + + // Read the source file. + const filePath = path.join(process.cwd(), src); + let source = fs.readFileSync(filePath, "utf8"); + + // Replace imports. + // TODO: Use @swc/core and a visitor to replace this. + // For now a simple regex should do. + // source = source.replaceAll( + // `@/registry/${style.name}/`, + // "@/components/", + // ); + source = source.replaceAll("export default", "export"); + + // Add code as children so that rehype can take over at build time. + node.children?.push( + u("element", { + tagName: "pre", + properties: { + __src__: src, + }, + children: [ + u("element", { + tagName: "code", + properties: { + className: ["language-tsx"], + }, + data: { + meta: `event="copy_usage_code"`, + }, + children: [ + { + type: "text", + value: source, + }, + ], + }), + ], + }), + ); } catch (error) { console.error(error); } diff --git a/lib/use-config.ts b/lib/use-config.ts deleted file mode 100644 index 48c54adc0..000000000 --- a/lib/use-config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useAtom } from "jotai"; -import { atomWithStorage } from "jotai/utils"; - -import { BaseColor } from "@/registry/registry-base-colors"; -import { Style } from "@/registry/registry-styles"; - -type Config = { - style: Style["name"]; - theme: BaseColor["name"]; - radius: number; -}; - -const configAtom = atomWithStorage("config", { - style: "default", - theme: "zinc", - radius: 0.5, -}); - -export function useConfig() { - return useAtom(configAtom); -} diff --git a/package.json b/package.json index 6fc777547..6f25fef72 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dev": "concurrently \"content-collections watch\" \"next dev\"", "prebuild": "pnpm build:docs && pnpm build:registry", "build": "next build", - "build:registry": "tsx --tsconfig ./tsconfig.scripts.json ./scripts/build-registry.mts && prettier --loglevel silent --write \"registry/**/*.{ts,tsx,mdx}\" --cache", + "build:registry": "shadcn build", "build:docs": "content-collections build", "typecheck": "pnpm build:docs && tsc --noEmit", "start": "next start", @@ -56,7 +56,6 @@ "date-fns": "^2.30.0", "geist": "^1.2.2", "gray-matter": "^4.0.3", - "jotai": "^2.10.0", "lodash.template": "^4.5.0", "lucide-react": "^0.401.0", "motion": "^11.15.0", @@ -71,6 +70,7 @@ "react-hook-form": "^7.50.1", "react-tweet": "^3.2.1", "schema-dts": "^1.1.2", + "shadcn": "2.2.0-canary.3", "sonner": "^1.5.0", "tailwind-merge": "^2.4.0", "ts-morph": "^23.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02b39ab4f..f77d9fadc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,9 +104,6 @@ importers: gray-matter: specifier: ^4.0.3 version: 4.0.3 - jotai: - specifier: ^2.10.0 - version: 2.10.0(@types/react@18.2.12)(react@18.3.1) lodash.template: specifier: ^4.5.0 version: 4.5.0 @@ -149,6 +146,9 @@ importers: schema-dts: specifier: ^1.1.2 version: 1.1.2(typescript@5.3.3) + shadcn: + specifier: 2.2.0-canary.3 + version: 2.2.0-canary.3(typescript@5.3.3) sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -294,10 +294,18 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@antfu/ni@0.21.12': + resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} + hasBin: true + '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.23.5': resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} @@ -310,10 +318,24 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-environment-visitor@7.22.20': resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} @@ -326,6 +348,10 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.6': resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} engines: {node: '>=6.9.0'} @@ -336,10 +362,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-simple-access@7.22.5': resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} @@ -348,10 +392,18 @@ packages: resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.6': resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.6': resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} @@ -369,6 +421,23 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.26.5': + resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.24.0': resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} engines: {node: '>=6.9.0'} @@ -377,14 +446,26 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.0': resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.6': resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + '@clerc/core@0.44.0': resolution: {integrity: sha512-o8RgXNcMRoHRujSw9OPDMxqrmoNk7HG0XAZkjZgOrSyIfRXCf85VLyHGBT3XmaOrPEGY964h02ZxMVFdp8RnNQ==} @@ -883,6 +964,10 @@ packages: resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -891,12 +976,19 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} '@jridgewell/trace-mapping@0.3.23': resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1925,6 +2017,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@ts-morph/common@0.19.0': + resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} + '@ts-morph/common@0.24.0': resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} @@ -2067,6 +2162,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + aggregate-error@5.0.0: resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} engines: {node: '>=18'} @@ -2168,6 +2267,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true @@ -2199,6 +2302,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} @@ -2206,6 +2312,9 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2231,6 +2340,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -2305,6 +2417,10 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -2316,6 +2432,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -2333,6 +2453,9 @@ packages: cobe@0.6.3: resolution: {integrity: sha512-WHr7X4o1ym94GZ96h7b1pNemZJacbOzd02dZtnVwuC4oWBaLg96PBmp2rIS1SAhUDhhC/QyS9WEqkpZIs/ZBTg==} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + code-block-writer@13.0.2: resolution: {integrity: sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==} @@ -2361,6 +2484,10 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -2408,6 +2535,15 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -2492,6 +2628,10 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -2519,6 +2659,13 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2820,6 +2967,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2862,6 +3013,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2907,6 +3062,10 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -2924,6 +3083,10 @@ packages: react-dom: optional: true + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2967,6 +3130,14 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3112,6 +3283,14 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + https-proxy-agent@6.2.1: + resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==} + engines: {node: '>= 14'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3121,6 +3300,9 @@ packages: engines: {node: '>=18'} hasBin: true + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -3244,6 +3426,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -3263,6 +3449,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -3281,6 +3471,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} @@ -3338,18 +3532,6 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - jotai@2.10.0: - resolution: {integrity: sha512-8W4u0aRlOIwGlLQ0sqfl/c6+eExl5D8lZgAUolirZLktyaj4WnxO/8a0HEPmtriQAB6X5LMhXzZVmw02X0P0qQ==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=17.0.0' - react: '>=17.0.0' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3366,6 +3548,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3393,6 +3580,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -3408,6 +3598,10 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -3509,6 +3703,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -3833,6 +4031,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3848,6 +4050,11 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -3924,6 +4131,14 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -4009,6 +4224,10 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4371,6 +4590,10 @@ packages: engines: {node: '>=14'} hasBin: true + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4464,10 +4687,18 @@ packages: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + reflect.getprototypeof@1.0.5: resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} engines: {node: '>= 0.4'} @@ -4642,6 +4873,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + shadcn@2.2.0-canary.3: + resolution: {integrity: sha512-P0adSoD8SY6W8JGqvTnOnUm26G2/u91XelxXs+JbMJWFhQz7JkGld0M9+BPAC9fO8JC4yVy4gdHWc52GhoXknA==} + hasBin: true + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -4675,6 +4910,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4701,6 +4939,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} @@ -4727,6 +4969,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4768,9 +5014,16 @@ packages: string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.3: resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4889,6 +5142,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.6: resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} engines: {node: '>=12.0.0'} @@ -4923,6 +5179,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-morph@18.0.0: + resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} + ts-morph@23.0.0: resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} @@ -4943,6 +5202,10 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -5054,6 +5317,10 @@ packages: universal-user-agent@7.0.2: resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + update-browserslist-db@1.0.13: resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -5127,9 +5394,16 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-vitals@4.2.1: resolution: {integrity: sha512-U6bAxeudnhDqcXNl50JC4hLlqox9DZnngxfISZm3DMZnonW35xtJOVUc091L+DOY+6hVZVpKXoiCP0RiT6339Q==} @@ -5232,11 +5506,19 @@ snapshots: '@jridgewell/gen-mapping': 0.3.4 '@jridgewell/trace-mapping': 0.3.23 + '@antfu/ni@0.21.12': {} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.0.1 + '@babel/compat-data@7.23.5': {} '@babel/core@7.24.0': @@ -5266,6 +5548,18 @@ snapshots: '@jridgewell/trace-mapping': 0.3.23 jsesc: 2.5.2 + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.5 + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.23.5 @@ -5274,6 +5568,19 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.24.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-environment-visitor@7.22.20': {} '@babel/helper-function-name@7.23.0': @@ -5285,6 +5592,13 @@ snapshots: dependencies: '@babel/types': 7.24.6 + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.24.6': dependencies: '@babel/types': 7.24.6 @@ -5298,18 +5612,44 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.5 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.24.6 '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.24.6': {} '@babel/helpers@7.24.0': @@ -5330,6 +5670,26 @@ snapshots: dependencies: '@babel/types': 7.24.6 + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typescript@7.26.5(@babel/core@7.24.0)': + dependencies: + '@babel/core': 7.24.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.24.0) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.24.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.24.0': dependencies: regenerator-runtime: 0.14.1 @@ -5340,6 +5700,12 @@ snapshots: '@babel/parser': 7.24.0 '@babel/types': 7.24.6 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@babel/traverse@7.24.0': dependencies: '@babel/code-frame': 7.23.5 @@ -5355,12 +5721,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.26.5': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.24.6': dependencies: '@babel/helper-string-parser': 7.24.6 '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@clerc/core@0.44.0': dependencies: '@clerc/utils': 0.44.0(@clerc/core@0.44.0) @@ -5808,10 +6191,18 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.23': @@ -5819,6 +6210,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -6890,6 +7286,13 @@ snapshots: '@trysound/sax@0.2.0': {} + '@ts-morph/common@0.19.0': + dependencies: + fast-glob: 3.3.2 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + '@ts-morph/common@0.24.0': dependencies: fast-glob: 3.3.2 @@ -7037,6 +7440,8 @@ snapshots: acorn@8.12.1: {} + agent-base@7.1.3: {} + aggregate-error@5.0.0: dependencies: clean-stack: 5.2.0 @@ -7166,6 +7571,10 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.16.1: + dependencies: + tslib: 2.6.2 + astring@1.8.6: {} asynciterator.prototype@1.0.0: @@ -7196,10 +7605,18 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + before-after-hook@3.0.2: {} binary-extensions@2.2.0: {} + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + boolbase@1.0.0: {} bottleneck@2.19.5: {} @@ -7228,6 +7645,11 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -7314,6 +7736,8 @@ snapshots: dependencies: restore-cursor: 4.0.0 + cli-spinners@2.9.2: {} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -7327,6 +7751,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@1.0.4: {} + clsx@1.2.1: {} clsx@2.1.1: {} @@ -7345,6 +7771,8 @@ snapshots: dependencies: phenomenon: 1.6.0 + code-block-writer@12.0.0: {} + code-block-writer@13.0.2: {} collapse-white-space@2.1.0: {} @@ -7367,6 +7795,8 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} + commander@12.1.0: {} commander@4.1.1: {} @@ -7414,6 +7844,15 @@ snapshots: jiti: 1.21.0 typescript: 5.3.3 + cosmiconfig@8.3.6(typescript@5.3.3): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.3.3 + cosmiconfig@9.0.0(typescript@5.3.3): dependencies: env-paths: 2.2.1 @@ -7531,6 +7970,8 @@ snapshots: dargs@8.1.0: {} + data-uri-to-buffer@4.0.1: {} + date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.0 @@ -7549,6 +7990,12 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -8030,6 +8477,18 @@ snapshots: eventemitter3@5.0.1: {} + execa@7.2.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -8076,6 +8535,11 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.4.8: {} figures@5.0.0: @@ -8125,6 +8589,10 @@ snapshots: format@0.2.2: {} + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fraction.js@4.3.7: {} framer-motion@11.15.0(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -8137,6 +8605,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -8173,6 +8647,10 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + + get-stream@6.0.1: {} + get-stream@8.0.1: {} get-symbol-description@1.0.2: @@ -8401,10 +8879,21 @@ snapshots: domutils: 3.1.0 entities: 4.5.0 + https-proxy-agent@6.2.1: + dependencies: + agent-base: 7.1.3 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-signals@4.3.1: {} + human-signals@5.0.0: {} husky@9.0.11: {} + ieee754@1.2.1: {} + ignore@5.3.1: {} import-fresh@3.3.0: @@ -8512,6 +9001,8 @@ snapshots: is-hexadecimal@2.0.1: {} + is-interactive@2.0.0: {} + is-map@2.0.2: {} is-negative-zero@2.0.3: {} @@ -8524,6 +9015,8 @@ snapshots: is-obj@2.0.0: {} + is-obj@3.0.0: {} + is-path-inside@3.0.3: {} is-plain-obj@4.1.0: {} @@ -8539,6 +9032,8 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regexp@3.1.0: {} + is-set@2.0.2: {} is-shared-array-buffer@1.0.3: @@ -8596,11 +9091,6 @@ snapshots: jiti@1.21.0: {} - jotai@2.10.0(@types/react@18.2.12)(react@18.3.1): - optionalDependencies: - '@types/react': 18.2.12 - react: 18.3.1 - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -8614,6 +9104,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -8632,6 +9124,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonparse@1.3.1: {} jsx-ast-utils@3.3.5: @@ -8647,6 +9145,8 @@ snapshots: kind-of@6.0.3: {} + kleur@3.0.3: {} + kleur@4.1.5: {} kons@0.7.1: @@ -8749,6 +9249,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@5.1.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + log-update@6.0.0: dependencies: ansi-escapes: 6.2.1 @@ -9457,6 +9962,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -9469,6 +9978,8 @@ snapshots: minipass@7.0.4: {} + mkdirp@2.1.6: {} + mkdirp@3.0.1: {} motion-dom@11.14.3: {} @@ -9535,6 +10046,14 @@ snapshots: node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-releases@2.0.14: {} normalize-package-data@2.5.0: @@ -9652,6 +10171,18 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + ora@6.3.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9972,6 +10503,11 @@ snapshots: prettier@3.3.3: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -10066,10 +10602,24 @@ snapshots: normalize-package-data: 2.5.0 path-type: 3.0.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + recast@0.23.9: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.6.2 + reflect.getprototypeof@1.0.5: dependencies: call-bind: 1.0.7 @@ -10332,6 +10882,35 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + shadcn@2.2.0-canary.3(typescript@5.3.3): + dependencies: + '@antfu/ni': 0.21.12 + '@babel/core': 7.24.0 + '@babel/parser': 7.24.0 + '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.24.0) + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.3.3) + deepmerge: 4.3.1 + diff: 5.2.0 + execa: 7.2.0 + fast-glob: 3.3.2 + fs-extra: 11.3.0 + https-proxy-agent: 6.2.1 + kleur: 4.1.5 + lodash.template: 4.5.0 + node-fetch: 3.3.2 + ora: 6.3.1 + postcss: 8.4.39 + prompts: 2.4.2 + recast: 0.23.9 + stringify-object: 5.0.0 + ts-morph: 18.0.0 + tsconfig-paths: 4.2.0 + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + - typescript + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -10366,6 +10945,8 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} slice-ansi@5.0.0: @@ -10387,6 +10968,8 @@ snapshots: source-map-js@1.2.0: {} + source-map@0.6.1: {} + source-map@0.7.4: {} space-separated-tokens@2.0.2: {} @@ -10409,6 +10992,10 @@ snapshots: sprintf-js@1.0.3: {} + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + streamsearch@1.1.0: {} string-argv@0.3.2: {} @@ -10473,11 +11060,21 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -10608,6 +11205,8 @@ snapshots: through@2.3.8: {} + tiny-invariant@1.3.3: {} + tinyglobby@0.2.6: dependencies: fdir: 6.3.0(picomatch@4.0.2) @@ -10638,6 +11237,11 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-morph@18.0.0: + dependencies: + '@ts-morph/common': 0.19.0 + code-block-writer: 12.0.0 + ts-morph@23.0.0: dependencies: '@ts-morph/common': 0.24.0 @@ -10669,6 +11273,12 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@1.14.1: {} tslib@2.6.2: {} @@ -10818,6 +11428,8 @@ snapshots: universal-user-agent@7.0.2: {} + universalify@2.0.1: {} + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 @@ -10905,8 +11517,14 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + web-vitals@4.2.1: {} which-boxed-primitive@1.0.2: diff --git a/public/r/android-demo-2.json b/public/r/android-demo-2.json new file mode 100644 index 000000000..3eda73661 --- /dev/null +++ b/public/r/android-demo-2.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "android-demo-2", + "type": "registry:component", + "registryDependencies": [ + "android" + ], + "files": [ + { + "path": "registry/example/android-demo-2.tsx", + "content": "import Android from \"@/registry/magicui/android\";\n\nexport default function AndroidDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/android-demo-3.json b/public/r/android-demo-3.json new file mode 100644 index 000000000..d33165a18 --- /dev/null +++ b/public/r/android-demo-3.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "android-demo-3", + "type": "registry:component", + "registryDependencies": [ + "android" + ], + "files": [ + { + "path": "registry/example/android-demo-3.tsx", + "content": "import Android from \"@/registry/magicui/android\";\n\nexport default function AndroidDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/android-demo.json b/public/r/android-demo.json new file mode 100644 index 000000000..17fbd377b --- /dev/null +++ b/public/r/android-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "android-demo", + "type": "registry:component", + "registryDependencies": [ + "android" + ], + "files": [ + { + "path": "registry/example/android-demo.tsx", + "content": "import Android from \"@/registry/magicui/android\";\n\nexport default function AndroidDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/android.json b/public/r/android.json similarity index 92% rename from public/r/styles/default/android.json rename to public/r/android.json index 43e4d9c23..43ed99035 100644 --- a/public/r/styles/default/android.json +++ b/public/r/android.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "android", - "type": "registry:ui", + "type": "registry:component", + "title": "Android", + "description": "A mockup of an Android device.", "files": [ { - "path": "magicui/android.tsx", + "path": "registry/magicui/android.tsx", "content": "import { SVGProps } from \"react\";\n\nexport interface AndroidProps extends SVGProps {\n width?: number;\n height?: number;\n src?: string;\n videoSrc?: string;\n}\n\nexport default function Android({\n width = 433,\n height = 882,\n src,\n videoSrc,\n ...props\n}: AndroidProps) {\n return (\n \n \n \n \n \n\n \n \n \n \n \n {src && (\n \n )}\n {videoSrc && (\n \n \n \n )}\n \n \n \n \n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/animated-beam-bidirectional.json b/public/r/animated-beam-bidirectional.json new file mode 100644 index 000000000..aa0e87808 --- /dev/null +++ b/public/r/animated-beam-bidirectional.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-beam-bidirectional", + "type": "registry:component", + "registryDependencies": [ + "animated-beam" + ], + "files": [ + { + "path": "registry/example/animated-beam-bidirectional.tsx", + "content": "\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\";\n\nconst Circle = forwardRef<\n HTMLDivElement,\n { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n return (\n \n {children}\n
\n );\n});\n\nCircle.displayName = \"Circle\";\n\nexport default function AnimatedBeamDemo() {\n const containerRef = useRef(null);\n const div1Ref = useRef(null);\n const div2Ref = useRef(null);\n\n return (\n \n
\n
\n \n \n \n \n \n \n
\n
\n\n \n \n \n );\n}\n\nconst Icons = {\n openai: () => (\n \n \n \n ),\n user: () => (\n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/animated-beam-demo.json b/public/r/animated-beam-demo.json new file mode 100644 index 000000000..51b99bd59 --- /dev/null +++ b/public/r/animated-beam-demo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-beam-demo", + "type": "registry:component", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "animated-beam" + ], + "files": [ + { + "path": "registry/example/animated-beam-demo.tsx", + "content": "\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\";\n\nconst Circle = forwardRef<\n HTMLDivElement,\n { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nCircle.displayName = \"Circle\";\n\nexport default function AnimatedBeamDemo() {\n const containerRef = useRef(null);\n const div1Ref = useRef(null);\n const div2Ref = useRef(null);\n const div3Ref = useRef(null);\n const div4Ref = useRef(null);\n const div5Ref = useRef(null);\n const div6Ref = useRef(null);\n const div7Ref = useRef(null);\n\n return (\n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n\n \n \n \n \n \n \n \n );\n}\n\nconst Icons = {\n notion: () => (\n \n \n \n \n ),\n openai: () => (\n \n \n \n ),\n googleDrive: () => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n googleDocs: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n zapier: () => (\n \n \n \n \n \n \n \n \n \n \n ),\n messenger: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/animated-beam-multiple-inputs.json b/public/r/animated-beam-multiple-inputs.json new file mode 100644 index 000000000..788bccbcb --- /dev/null +++ b/public/r/animated-beam-multiple-inputs.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-beam-multiple-inputs", + "type": "registry:component", + "registryDependencies": [ + "animated-beam" + ], + "files": [ + { + "path": "registry/example/animated-beam-multiple-inputs.tsx", + "content": "\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\";\n\nconst Circle = forwardRef<\n HTMLDivElement,\n { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nCircle.displayName = \"Circle\";\n\nexport default function AnimatedBeamMultipleOutputDemo({\n className,\n}: {\n className?: string;\n}) {\n const containerRef = useRef(null);\n const div1Ref = useRef(null);\n const div2Ref = useRef(null);\n const div3Ref = useRef(null);\n const div4Ref = useRef(null);\n const div5Ref = useRef(null);\n const div6Ref = useRef(null);\n const div7Ref = useRef(null);\n\n return (\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n\n \n \n \n \n \n \n \n );\n}\n\nconst Icons = {\n notion: () => (\n \n \n \n \n ),\n openai: () => (\n \n \n \n ),\n googleDrive: () => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n googleDocs: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n zapier: () => (\n \n \n \n \n \n \n \n \n \n \n ),\n messenger: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n user: () => (\n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/animated-beam-multiple-outputs.json b/public/r/animated-beam-multiple-outputs.json new file mode 100644 index 000000000..37fd6ae7e --- /dev/null +++ b/public/r/animated-beam-multiple-outputs.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-beam-multiple-outputs", + "type": "registry:component", + "registryDependencies": [ + "animated-beam" + ], + "files": [ + { + "path": "registry/example/animated-beam-multiple-outputs.tsx", + "content": "\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\";\n\nconst Circle = forwardRef<\n HTMLDivElement,\n { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nCircle.displayName = \"Circle\";\n\nexport default function AnimatedBeamMultipleOutputDemo({\n className,\n}: {\n className?: string;\n}) {\n const containerRef = useRef(null);\n const div1Ref = useRef(null);\n const div2Ref = useRef(null);\n const div3Ref = useRef(null);\n const div4Ref = useRef(null);\n const div5Ref = useRef(null);\n const div6Ref = useRef(null);\n const div7Ref = useRef(null);\n\n return (\n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n {/* AnimatedBeams */}\n \n \n \n \n \n \n \n );\n}\n\nconst Icons = {\n notion: () => (\n \n \n \n \n ),\n openai: () => (\n \n \n \n ),\n googleDrive: () => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n googleDocs: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n zapier: () => (\n \n \n \n \n \n \n \n \n \n \n ),\n messenger: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n user: () => (\n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/animated-beam-unidirectional.json b/public/r/animated-beam-unidirectional.json new file mode 100644 index 000000000..bd963ddf6 --- /dev/null +++ b/public/r/animated-beam-unidirectional.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-beam-unidirectional", + "type": "registry:component", + "registryDependencies": [ + "animated-beam" + ], + "files": [ + { + "path": "registry/example/animated-beam-unidirectional.tsx", + "content": "\"use client\";\n\nimport React, { forwardRef, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedBeam } from \"@/registry/magicui/animated-beam\";\n\nconst Circle = forwardRef<\n HTMLDivElement,\n { className?: string; children?: React.ReactNode }\n>(({ className, children }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nCircle.displayName = \"Circle\";\n\nexport default function AnimatedBeamDemo() {\n const containerRef = useRef(null);\n const div1Ref = useRef(null);\n const div2Ref = useRef(null);\n\n return (\n \n
\n
\n \n \n \n \n \n \n
\n
\n\n \n \n );\n}\n\nconst Icons = {\n openai: () => (\n \n \n \n ),\n user: () => (\n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-beam.json b/public/r/animated-beam.json similarity index 93% rename from public/r/styles/default/animated-beam.json rename to public/r/animated-beam.json index 77eba3615..0dba1c2a6 100644 --- a/public/r/styles/default/animated-beam.json +++ b/public/r/animated-beam.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-beam", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Beam", + "description": "An animated beam of light which travels along a path. Useful for showcasing the \"integration\" features of a website.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/animated-beam.tsx", + "path": "registry/magicui/animated-beam.tsx", "content": "\"use client\";\n\nimport { motion } from \"motion/react\";\nimport { RefObject, useEffect, useId, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface AnimatedBeamProps {\n className?: string;\n containerRef: RefObject; // Container ref\n fromRef: RefObject;\n toRef: RefObject;\n curvature?: number;\n reverse?: boolean;\n pathColor?: string;\n pathWidth?: number;\n pathOpacity?: number;\n gradientStartColor?: string;\n gradientStopColor?: string;\n delay?: number;\n duration?: number;\n startXOffset?: number;\n startYOffset?: number;\n endXOffset?: number;\n endYOffset?: number;\n}\n\nexport const AnimatedBeam: React.FC = ({\n className,\n containerRef,\n fromRef,\n toRef,\n curvature = 0,\n reverse = false, // Include the reverse prop\n duration = Math.random() * 3 + 4,\n delay = 0,\n pathColor = \"gray\",\n pathWidth = 2,\n pathOpacity = 0.2,\n gradientStartColor = \"#ffaa40\",\n gradientStopColor = \"#9c40ff\",\n startXOffset = 0,\n startYOffset = 0,\n endXOffset = 0,\n endYOffset = 0,\n}) => {\n const id = useId();\n const [pathD, setPathD] = useState(\"\");\n const [svgDimensions, setSvgDimensions] = useState({ width: 0, height: 0 });\n\n // Calculate the gradient coordinates based on the reverse prop\n const gradientCoordinates = reverse\n ? {\n x1: [\"90%\", \"-10%\"],\n x2: [\"100%\", \"0%\"],\n y1: [\"0%\", \"0%\"],\n y2: [\"0%\", \"0%\"],\n }\n : {\n x1: [\"10%\", \"110%\"],\n x2: [\"0%\", \"100%\"],\n y1: [\"0%\", \"0%\"],\n y2: [\"0%\", \"0%\"],\n };\n\n useEffect(() => {\n const updatePath = () => {\n if (containerRef.current && fromRef.current && toRef.current) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const rectA = fromRef.current.getBoundingClientRect();\n const rectB = toRef.current.getBoundingClientRect();\n\n const svgWidth = containerRect.width;\n const svgHeight = containerRect.height;\n setSvgDimensions({ width: svgWidth, height: svgHeight });\n\n const startX =\n rectA.left - containerRect.left + rectA.width / 2 + startXOffset;\n const startY =\n rectA.top - containerRect.top + rectA.height / 2 + startYOffset;\n const endX =\n rectB.left - containerRect.left + rectB.width / 2 + endXOffset;\n const endY =\n rectB.top - containerRect.top + rectB.height / 2 + endYOffset;\n\n const controlY = startY - curvature;\n const d = `M ${startX},${startY} Q ${\n (startX + endX) / 2\n },${controlY} ${endX},${endY}`;\n setPathD(d);\n }\n };\n\n // Initialize ResizeObserver\n const resizeObserver = new ResizeObserver((entries) => {\n // For all entries, recalculate the path\n for (let entry of entries) {\n updatePath();\n }\n });\n\n // Observe the container element\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n // Call the updatePath initially to set the initial path\n updatePath();\n\n // Clean up the observer on component unmount\n return () => {\n resizeObserver.disconnect();\n };\n }, [\n containerRef,\n fromRef,\n toRef,\n curvature,\n startXOffset,\n startYOffset,\n endXOffset,\n endYOffset,\n ]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/animated-circular-progress-bar-demo.json b/public/r/animated-circular-progress-bar-demo.json new file mode 100644 index 000000000..942d54197 --- /dev/null +++ b/public/r/animated-circular-progress-bar-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-circular-progress-bar-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/animated-circular-progress-bar-demo.tsx", + "content": "\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { AnimatedCircularProgressBar } from \"@/registry/magicui/animated-circular-progress-bar\";\n\nexport default function AnimatedCircularProgressBarDemo() {\n const [value, setValue] = useState(0);\n\n useEffect(() => {\n const handleIncrement = (prev: number) => {\n if (prev === 100) {\n return 0;\n }\n return prev + 10;\n };\n setValue(handleIncrement);\n const interval = setInterval(() => setValue(handleIncrement), 2000);\n return () => clearInterval(interval);\n }, []);\n\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-circular-progress-bar.json b/public/r/animated-circular-progress-bar.json similarity index 91% rename from public/r/styles/default/animated-circular-progress-bar.json rename to public/r/animated-circular-progress-bar.json index c9df30414..ae84ddce2 100644 --- a/public/r/styles/default/animated-circular-progress-bar.json +++ b/public/r/animated-circular-progress-bar.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-circular-progress-bar", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Circular Progress Bar", + "description": "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", "files": [ { - "path": "magicui/animated-circular-progress-bar.tsx", + "path": "registry/magicui/animated-circular-progress-bar.tsx", "content": "import { cn } from \"@/lib/utils\";\n\ninterface AnimatedCircularProgressBarProps {\n max: number;\n value: number;\n min: number;\n gaugePrimaryColor: string;\n gaugeSecondaryColor: string;\n className?: string;\n}\n\nexport function AnimatedCircularProgressBar({\n max = 100,\n min = 0,\n value = 0,\n gaugePrimaryColor,\n gaugeSecondaryColor,\n className,\n}: AnimatedCircularProgressBarProps) {\n const circumference = 2 * Math.PI * 45;\n const percentPx = circumference / 100;\n const currentPercent = Math.round(((value - min) / (max - min)) * 100);\n\n return (\n \n \n {currentPercent <= 90 && currentPercent >= 0 && (\n \n )}\n \n \n \n {currentPercent}\n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/animated-gradient-text-demo.json b/public/r/animated-gradient-text-demo.json new file mode 100644 index 000000000..33e5356cd --- /dev/null +++ b/public/r/animated-gradient-text-demo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-gradient-text-demo", + "type": "registry:component", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "animated-gradient-text" + ], + "files": [ + { + "path": "registry/example/animated-gradient-text-demo.tsx", + "content": "import { ChevronRight } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedGradientText } from \"@/registry/magicui/animated-gradient-text\";\n\nexport default async function AnimatedGradientTextDemo() {\n return (\n
\n \n 🎉
{\" \"}\n \n Introducing Magic UI\n \n \n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-gradient-text.json b/public/r/animated-gradient-text.json similarity index 82% rename from public/r/styles/default/animated-gradient-text.json rename to public/r/animated-gradient-text.json index d67090487..62c25a211 100644 --- a/public/r/styles/default/animated-gradient-text.json +++ b/public/r/animated-gradient-text.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-gradient-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Gradient Text", + "description": "An animated gradient background which transitions between colors for text.", "files": [ { - "path": "magicui/animated-gradient-text.tsx", + "path": "registry/magicui/animated-gradient-text.tsx", "content": "import { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface AnimatedGradientTextProps\n extends ComponentPropsWithoutRef<\"div\"> {\n children: ReactNode;\n}\n\nexport function AnimatedGradientText({\n children,\n className,\n ...props\n}: AnimatedGradientTextProps) {\n return (\n \n \n\n {children}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/animated-grid-pattern-demo.json b/public/r/animated-grid-pattern-demo.json new file mode 100644 index 000000000..16425faeb --- /dev/null +++ b/public/r/animated-grid-pattern-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-grid-pattern-demo", + "type": "registry:component", + "registryDependencies": [ + "animated-grid-pattern" + ], + "files": [ + { + "path": "registry/example/animated-grid-pattern-demo.tsx", + "content": "import { cn } from \"@/lib/utils\";\nimport { AnimatedGridPattern } from \"@/registry/magicui/animated-grid-pattern\";\n\nexport default function AnimatedGridPatternDemo() {\n return (\n
\n

\n Animated Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-grid-pattern.json b/public/r/animated-grid-pattern.json similarity index 92% rename from public/r/styles/default/animated-grid-pattern.json rename to public/r/animated-grid-pattern.json index 865bdb812..6d3fcb850 100644 --- a/public/r/styles/default/animated-grid-pattern.json +++ b/public/r/animated-grid-pattern.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-grid-pattern", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Grid Pattern", + "description": "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/animated-grid-pattern.tsx", + "path": "registry/magicui/animated-grid-pattern.tsx", "content": "\"use client\";\n\nimport { motion } from \"motion/react\";\nimport {\n ComponentPropsWithoutRef,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface AnimatedGridPatternProps\n extends ComponentPropsWithoutRef<\"svg\"> {\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n strokeDasharray?: any;\n numSquares?: number;\n maxOpacity?: number;\n duration?: number;\n repeatDelay?: number;\n}\n\nexport function AnimatedGridPattern({\n width = 40,\n height = 40,\n x = -1,\n y = -1,\n strokeDasharray = 0,\n numSquares = 50,\n className,\n maxOpacity = 0.5,\n duration = 4,\n repeatDelay = 0.5,\n ...props\n}: AnimatedGridPatternProps) {\n const id = useId();\n const containerRef = useRef(null);\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n const [squares, setSquares] = useState(() => generateSquares(numSquares));\n\n function getPos() {\n return [\n Math.floor((Math.random() * dimensions.width) / width),\n Math.floor((Math.random() * dimensions.height) / height),\n ];\n }\n\n // Adjust the generateSquares function to return objects with an id, x, and y\n function generateSquares(count: number) {\n return Array.from({ length: count }, (_, i) => ({\n id: i,\n pos: getPos(),\n }));\n }\n\n // Function to update a single square's position\n const updateSquarePosition = (id: number) => {\n setSquares((currentSquares) =>\n currentSquares.map((sq) =>\n sq.id === id\n ? {\n ...sq,\n pos: getPos(),\n }\n : sq,\n ),\n );\n };\n\n // Update squares to animate in\n useEffect(() => {\n if (dimensions.width && dimensions.height) {\n setSquares(generateSquares(numSquares));\n }\n }, [dimensions, numSquares]);\n\n // Resize observer to update container dimensions\n useEffect(() => {\n const resizeObserver = new ResizeObserver((entries) => {\n for (let entry of entries) {\n setDimensions({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n });\n }\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n if (containerRef.current) {\n resizeObserver.unobserve(containerRef.current);\n }\n };\n }, [containerRef]);\n\n return (\n \n \n \n \n \n \n \n \n {squares.map(({ pos: [x, y], id }, index) => (\n updateSquarePosition(id)}\n key={`${x}-${y}-${index}`}\n width={width - 1}\n height={height - 1}\n x={x * width + 1}\n y={y * height + 1}\n fill=\"currentColor\"\n strokeWidth=\"0\"\n />\n ))}\n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/animated-list-demo.json b/public/r/animated-list-demo.json new file mode 100644 index 000000000..555ef19b8 --- /dev/null +++ b/public/r/animated-list-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-list-demo", + "type": "registry:component", + "registryDependencies": [ + "animated-list" + ], + "files": [ + { + "path": "registry/example/animated-list-demo.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedList } from \"@/registry/magicui/animated-list\";\n\ninterface Item {\n name: string;\n description: string;\n icon: string;\n color: string;\n time: string;\n}\n\nlet notifications = [\n {\n name: \"Payment received\",\n description: \"Magic UI\",\n time: \"15m ago\",\n\n icon: \"💸\",\n color: \"#00C9A7\",\n },\n {\n name: \"User signed up\",\n description: \"Magic UI\",\n time: \"10m ago\",\n icon: \"👤\",\n color: \"#FFB800\",\n },\n {\n name: \"New message\",\n description: \"Magic UI\",\n time: \"5m ago\",\n icon: \"💬\",\n color: \"#FF3D71\",\n },\n {\n name: \"New event\",\n description: \"Magic UI\",\n time: \"2m ago\",\n icon: \"🗞️\",\n color: \"#1E86FF\",\n },\n];\n\nnotifications = Array.from({ length: 10 }, () => notifications).flat();\n\nconst Notification = ({ name, description, icon, color, time }: Item) => {\n return (\n \n
\n \n {icon}\n
\n
\n
\n {name}\n ·\n {time}\n
\n

\n {description}\n

\n
\n \n \n );\n};\n\nexport default function AnimatedListDemo({\n className,\n}: {\n className?: string;\n}) {\n return (\n \n \n {notifications.map((item, idx) => (\n \n ))}\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-list.json b/public/r/animated-list.json similarity index 85% rename from public/r/styles/default/animated-list.json rename to public/r/animated-list.json index b345672cc..c80773ded 100644 --- a/public/r/styles/default/animated-list.json +++ b/public/r/animated-list.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-list", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated List", + "description": "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/animated-list.tsx", + "path": "registry/magicui/animated-list.tsx", "content": "\"use client\";\n\nimport { AnimatePresence, motion } from \"motion/react\";\nimport React, {\n ComponentPropsWithoutRef,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nexport function AnimatedListItem({ children }: { children: React.ReactNode }) {\n const animations = {\n initial: { scale: 0, opacity: 0 },\n animate: { scale: 1, opacity: 1, originY: 0 },\n exit: { scale: 0, opacity: 0 },\n transition: { type: \"spring\", stiffness: 350, damping: 40 },\n };\n\n return (\n \n {children}\n \n );\n}\n\nexport interface AnimatedListProps extends ComponentPropsWithoutRef<\"div\"> {\n children: React.ReactNode;\n delay?: number;\n}\n\nexport const AnimatedList = React.memo(\n ({ children, className, delay = 1000, ...props }: AnimatedListProps) => {\n const [index, setIndex] = useState(0);\n const childrenArray = useMemo(\n () => React.Children.toArray(children),\n [children],\n );\n\n useEffect(() => {\n if (index < childrenArray.length - 1) {\n const timeout = setTimeout(() => {\n setIndex((prevIndex) => prevIndex + 1);\n }, delay);\n\n return () => clearTimeout(timeout);\n }\n }, [index, delay, childrenArray.length]);\n\n const itemsToShow = useMemo(() => {\n const result = childrenArray.slice(0, index + 1).reverse();\n return result;\n }, [index, childrenArray]);\n\n return (\n \n \n {itemsToShow.map((item) => (\n \n {item}\n \n ))}\n \n \n );\n },\n);\n\nAnimatedList.displayName = \"AnimatedList\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/animated-shiny-text-demo.json b/public/r/animated-shiny-text-demo.json new file mode 100644 index 000000000..a340749c4 --- /dev/null +++ b/public/r/animated-shiny-text-demo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-shiny-text-demo", + "type": "registry:component", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "animated-shiny-text" + ], + "files": [ + { + "path": "registry/example/animated-shiny-text-demo.tsx", + "content": "import { ArrowRightIcon } from \"@radix-ui/react-icons\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatedShinyText } from \"@/registry/magicui/animated-shiny-text\";\n\nexport default function AnimatedShinyTextDemo() {\n return (\n
\n \n \n ✨ Introducing Magic UI\n \n \n
\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-shiny-text.json b/public/r/animated-shiny-text.json similarity index 83% rename from public/r/styles/default/animated-shiny-text.json rename to public/r/animated-shiny-text.json index 84c5bcdbf..6aa8296d8 100644 --- a/public/r/styles/default/animated-shiny-text.json +++ b/public/r/animated-shiny-text.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-shiny-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Shiny Text", + "description": "A light glare effect which pans across text making it appear as if it is shimmering.", "files": [ { - "path": "magicui/animated-shiny-text.tsx", + "path": "registry/magicui/animated-shiny-text.tsx", "content": "import { ComponentPropsWithoutRef, CSSProperties, FC } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface AnimatedShinyTextProps\n extends ComponentPropsWithoutRef<\"span\"> {\n shimmerWidth?: number;\n}\n\nexport const AnimatedShinyText: FC = ({\n children,\n className,\n shimmerWidth = 100,\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/animated-subscribe-button-demo.json b/public/r/animated-subscribe-button-demo.json new file mode 100644 index 000000000..2c68c7018 --- /dev/null +++ b/public/r/animated-subscribe-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "animated-subscribe-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/animated-subscribe-button-demo.tsx", + "content": "import { AnimatedSubscribeButton } from \"@/registry/magicui/animated-subscribe-button\";\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\";\n\nexport default function AnimatedSubscribeButtonDemo() {\n return (\n \n \n Follow\n \n \n \n \n Subscribed\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/animated-subscribe-button.json b/public/r/animated-subscribe-button.json similarity index 90% rename from public/r/styles/default/animated-subscribe-button.json rename to public/r/animated-subscribe-button.json index 063c83934..50baf5506 100644 --- a/public/r/styles/default/animated-subscribe-button.json +++ b/public/r/animated-subscribe-button.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-subscribe-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Animated Subscribe Button", + "description": "An animated subscribe button useful for showing a micro animation from intial to final result.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/animated-subscribe-button.tsx", + "path": "registry/magicui/animated-subscribe-button.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport React, { useState } from \"react\";\n\ninterface AnimatedSubscribeButtonProps\n extends Omit, \"ref\"> {\n subscribeStatus?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const AnimatedSubscribeButton = React.forwardRef<\n HTMLButtonElement,\n AnimatedSubscribeButtonProps\n>(\n (\n { subscribeStatus = false, onClick, className, children, ...props },\n ref,\n ) => {\n const [isSubscribed, setIsSubscribed] = useState(subscribeStatus);\n\n if (\n React.Children.count(children) !== 2 ||\n !React.Children.toArray(children).every(\n (child) => React.isValidElement(child) && child.type === \"span\",\n )\n ) {\n throw new Error(\n \"AnimatedSubscribeButton expects two children, both of which must be elements.\",\n );\n }\n\n const childrenArray = React.Children.toArray(children);\n const initialChild = childrenArray[0];\n const changeChild = childrenArray[1];\n\n return (\n \n {isSubscribed ? (\n ) => {\n setIsSubscribed(false);\n onClick?.(e);\n }}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n {...props}\n >\n \n {changeChild} {/* Use children for subscribed state */}\n \n \n ) : (\n {\n setIsSubscribed(true);\n onClick?.(e);\n }}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n {...props}\n >\n \n {initialChild} {/* Use children for unsubscribed state */}\n \n \n )}\n \n );\n },\n);\n\nAnimatedSubscribeButton.displayName = \"AnimatedSubscribeButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/aurora-text-demo.json b/public/r/aurora-text-demo.json new file mode 100644 index 000000000..340366013 --- /dev/null +++ b/public/r/aurora-text-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "aurora-text-demo", + "type": "registry:component", + "registryDependencies": [ + "aurora-text" + ], + "files": [ + { + "path": "registry/example/aurora-text-demo.tsx", + "content": "import { AuroraText } from \"@/registry/magicui/aurora-text\";\n\nexport default function AuroraTextDemo() {\n return (\n

\n Ship beautiful\n

\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/aurora-text.json b/public/r/aurora-text.json similarity index 94% rename from public/r/styles/default/aurora-text.json rename to public/r/aurora-text.json index a0588adcf..ba15bdd9d 100644 --- a/public/r/styles/default/aurora-text.json +++ b/public/r/aurora-text.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "aurora-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Aurora Text", + "description": "A beautiful aurora text effect", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/aurora-text.tsx", + "path": "registry/magicui/aurora-text.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { motion, MotionProps } from \"motion/react\";\nimport React from \"react\";\n\ninterface AuroraTextProps\n extends Omit, keyof MotionProps> {\n className?: string;\n children: React.ReactNode;\n as?: React.ElementType;\n}\n\nexport function AuroraText({\n className,\n children,\n as: Component = \"span\",\n ...props\n}: AuroraTextProps) {\n const MotionComponent = motion.create(Component);\n\n return (\n \n {children}\n \n \n \n \n \n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/avatar-circles-demo.json b/public/r/avatar-circles-demo.json new file mode 100644 index 000000000..017ecf852 --- /dev/null +++ b/public/r/avatar-circles-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar-circles-demo", + "type": "registry:component", + "registryDependencies": [ + "avatar-circles" + ], + "files": [ + { + "path": "registry/example/avatar-circles-demo.tsx", + "content": "import { AvatarCircles } from \"@/registry/magicui/avatar-circles\";\n\nconst avatars = [\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/16860528\",\n profileUrl: \"https://github.com/dillionverma\",\n },\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/20110627\",\n profileUrl: \"https://github.com/tomonarifeehan\",\n },\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/106103625\",\n profileUrl: \"https://github.com/BankkRoll\",\n },\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/59228569\",\n profileUrl: \"https://github.com/safethecode\",\n },\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/59442788\",\n profileUrl: \"https://github.com/sanjay-mali\",\n },\n {\n imageUrl: \"https://avatars.githubusercontent.com/u/89768406\",\n profileUrl: \"https://github.com/itsarghyadas\",\n },\n];\n\nexport default function AvatarCirclesDemo() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/avatar-circles.json b/public/r/avatar-circles.json new file mode 100644 index 000000000..2c2c86707 --- /dev/null +++ b/public/r/avatar-circles.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "avatar-circles", + "type": "registry:component", + "title": "Avatar Circles", + "description": "Overlapping circles of avatars.", + "files": [ + { + "path": "registry/magicui/avatar-circles.tsx", + "content": "/* eslint-disable @next/next/no-img-element */\n\"use client\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface Avatar {\n imageUrl: string;\n profileUrl: string;\n}\ninterface AvatarCirclesProps {\n className?: string;\n numPeople?: number;\n avatarUrls: Avatar[];\n}\n\nexport const AvatarCircles = ({\n numPeople,\n className,\n avatarUrls,\n}: AvatarCirclesProps) => {\n return (\n
\n {avatarUrls.map((url, index) => (\n \n \n \n ))}\n {(numPeople ?? 0) > 0 && (\n \n +{numPeople}\n \n )}\n
\n );\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/bento-demo-vertical.json b/public/r/bento-demo-vertical.json new file mode 100644 index 000000000..9f7f0b854 --- /dev/null +++ b/public/r/bento-demo-vertical.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "bento-demo-vertical", + "type": "registry:component", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "bento-grid" + ], + "files": [ + { + "path": "registry/example/bento-demo-vertical.tsx", + "content": "import {\n BellIcon,\n CalendarIcon,\n FileTextIcon,\n GlobeIcon,\n InputIcon,\n} from \"@radix-ui/react-icons\";\n\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\";\n\nconst features = [\n {\n Icon: FileTextIcon,\n name: \"Save your files\",\n description: \"We automatically save your files as you type.\",\n href: \"/\",\n cta: \"Learn more\",\n background: ,\n className: \"lg:row-start-1 lg:row-end-4 lg:col-start-2 lg:col-end-3\",\n },\n {\n Icon: InputIcon,\n name: \"Full text search\",\n description: \"Search through all your files in one place.\",\n href: \"/\",\n cta: \"Learn more\",\n background: ,\n className: \"lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-3\",\n },\n {\n Icon: GlobeIcon,\n name: \"Multilingual\",\n description: \"Supports 100+ languages and counting.\",\n href: \"/\",\n cta: \"Learn more\",\n background: ,\n className: \"lg:col-start-1 lg:col-end-2 lg:row-start-3 lg:row-end-4\",\n },\n {\n Icon: CalendarIcon,\n name: \"Calendar\",\n description: \"Use the calendar to filter your files by date.\",\n href: \"/\",\n cta: \"Learn more\",\n background: ,\n className: \"lg:col-start-3 lg:col-end-3 lg:row-start-1 lg:row-end-2\",\n },\n {\n Icon: BellIcon,\n name: \"Notifications\",\n description:\n \"Get notified when someone shares a file or mentions you in a comment.\",\n href: \"/\",\n cta: \"Learn more\",\n background: ,\n className: \"lg:col-start-3 lg:col-end-3 lg:row-start-2 lg:row-end-4\",\n },\n];\n\nexport default function BentoDemo() {\n return (\n \n {features.map((feature) => (\n \n ))}\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/bento-demo.json b/public/r/bento-demo.json new file mode 100644 index 000000000..c57fc2bdd --- /dev/null +++ b/public/r/bento-demo.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "bento-demo", + "type": "registry:component", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "bento-grid", + "marquee", + "animated-list-demo", + "animated-beam-multiple-outputs", + "shadcn:command", + "shadcn:calendar" + ], + "files": [ + { + "path": "registry/example/bento-demo.tsx", + "content": "import { CalendarIcon, FileTextIcon } from \"@radix-ui/react-icons\";\nimport { BellIcon, Share2Icon } from \"lucide-react\";\n\nimport { Calendar } from \"@/components/ui/calendar\";\nimport { cn } from \"@/lib/utils\";\nimport AnimatedBeamMultipleOutputDemo from \"@/registry/example/animated-beam-multiple-outputs\";\nimport AnimatedListDemo from \"@/registry/example/animated-list-demo\";\nimport { BentoCard, BentoGrid } from \"@/registry/magicui/bento-grid\";\nimport { Marquee } from \"@/registry/magicui/marquee\";\n\nconst files = [\n {\n name: \"bitcoin.pdf\",\n body: \"Bitcoin is a cryptocurrency invented in 2008 by an unknown person or group of people using the name Satoshi Nakamoto.\",\n },\n {\n name: \"finances.xlsx\",\n body: \"A spreadsheet or worksheet is a file made of rows and columns that help sort data, arrange data easily, and calculate numerical data.\",\n },\n {\n name: \"logo.svg\",\n body: \"Scalable Vector Graphics is an Extensible Markup Language-based vector image format for two-dimensional graphics with support for interactivity and animation.\",\n },\n {\n name: \"keys.gpg\",\n body: \"GPG keys are used to encrypt and decrypt email, files, directories, and whole disk partitions and to authenticate messages.\",\n },\n {\n name: \"seed.txt\",\n body: \"A seed phrase, seed recovery phrase or backup seed phrase is a list of words which store all the information needed to recover Bitcoin funds on-chain.\",\n },\n];\n\nconst features = [\n {\n Icon: FileTextIcon,\n name: \"Save your files\",\n description: \"We automatically save your files as you type.\",\n href: \"#\",\n cta: \"Learn more\",\n className: \"col-span-3 lg:col-span-1\",\n background: (\n \n {files.map((f, idx) => (\n \n
\n
\n
\n {f.name}\n
\n
\n
\n
{f.body}
\n \n ))}\n \n ),\n },\n {\n Icon: BellIcon,\n name: \"Notifications\",\n description: \"Get notified when something happens.\",\n href: \"#\",\n cta: \"Learn more\",\n className: \"col-span-3 lg:col-span-2\",\n background: (\n \n ),\n },\n {\n Icon: Share2Icon,\n name: \"Integrations\",\n description: \"Supports 100+ integrations and counting.\",\n href: \"#\",\n cta: \"Learn more\",\n className: \"col-span-3 lg:col-span-2\",\n background: (\n \n ),\n },\n {\n Icon: CalendarIcon,\n name: \"Calendar\",\n description: \"Use the calendar to filter your files by date.\",\n className: \"col-span-3 lg:col-span-1\",\n href: \"#\",\n cta: \"Learn more\",\n background: (\n \n ),\n },\n];\n\nexport default function BentoDemo() {\n return (\n \n {features.map((feature, idx) => (\n \n ))}\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/bento-grid.json b/public/r/bento-grid.json similarity index 89% rename from public/r/styles/default/bento-grid.json rename to public/r/bento-grid.json index 985bea33c..b90d11ca3 100644 --- a/public/r/styles/default/bento-grid.json +++ b/public/r/bento-grid.json @@ -1,6 +1,9 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "bento-grid", - "type": "registry:ui", + "type": "registry:component", + "title": "Bento Grid", + "description": "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", "dependencies": [ "@radix-ui/react-icons" ], @@ -9,10 +12,9 @@ ], "files": [ { - "path": "magicui/bento-grid.tsx", + "path": "registry/magicui/bento-grid.tsx", "content": "import { ArrowRightIcon } from \"@radix-ui/react-icons\";\nimport { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\ninterface BentoGridProps extends ComponentPropsWithoutRef<\"div\"> {\n children: ReactNode;\n className?: string;\n}\n\ninterface BentoCardProps extends ComponentPropsWithoutRef<\"div\"> {\n name: string;\n className: string;\n background: ReactNode;\n Icon: React.ElementType;\n description: string;\n href: string;\n cta: string;\n}\n\nconst BentoGrid = ({ children, className, ...props }: BentoGridProps) => {\n return (\n \n {children}\n \n );\n};\n\nconst BentoCard = ({\n name,\n className,\n background,\n Icon,\n description,\n href,\n cta,\n ...props\n}: BentoCardProps) => (\n \n
{background}
\n
\n \n

\n {name}\n

\n

{description}

\n
\n\n \n \n \n
\n
\n);\n\nexport { BentoCard, BentoGrid };\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/blur-fade-demo.json b/public/r/blur-fade-demo.json new file mode 100644 index 000000000..946062a80 --- /dev/null +++ b/public/r/blur-fade-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "blur-fade-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/blur-fade-demo.tsx", + "content": "/* eslint-disable @next/next/no-img-element */\nimport { BlurFade } from \"@/registry/magicui/blur-fade\";\n\nconst images = Array.from({ length: 9 }, (_, i) => {\n const isLandscape = i % 2 === 0;\n const width = isLandscape ? 800 : 600;\n const height = isLandscape ? 600 : 800;\n return `https://picsum.photos/seed/${i + 1}/${width}/${height}`;\n});\n\nexport default function BlurFadeDemo() {\n return (\n
\n
\n {images.map((imageUrl, idx) => (\n \n \n \n ))}\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/blur-fade-text-demo.json b/public/r/blur-fade-text-demo.json new file mode 100644 index 000000000..02a1db2df --- /dev/null +++ b/public/r/blur-fade-text-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "blur-fade-text-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/blur-fade-text-demo.tsx", + "content": "import { BlurFade } from \"@/registry/magicui/blur-fade\";\n\nexport default function BlurFadeTextDemo() {\n return (\n
\n \n

\n Hello World 👋\n

\n
\n \n \n Nice to meet you\n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/blur-fade.json b/public/r/blur-fade.json similarity index 87% rename from public/r/styles/default/blur-fade.json rename to public/r/blur-fade.json index 2ffc1abc7..d58c4e1dc 100644 --- a/public/r/styles/default/blur-fade.json +++ b/public/r/blur-fade.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "blur-fade", - "type": "registry:ui", + "type": "registry:component", + "title": "Blur Fade", + "description": "Blur fade in and out animation. Used to smoothly fade in and out content.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/blur-fade.tsx", + "path": "registry/magicui/blur-fade.tsx", "content": "\"use client\";\n\nimport {\n AnimatePresence,\n motion,\n useInView,\n UseInViewOptions,\n Variants,\n} from \"motion/react\";\nimport { useRef } from \"react\";\n\ntype MarginType = UseInViewOptions[\"margin\"];\n\ninterface BlurFadeProps {\n children: React.ReactNode;\n className?: string;\n variant?: {\n hidden: { y: number };\n visible: { y: number };\n };\n duration?: number;\n delay?: number;\n offset?: number;\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n inView?: boolean;\n inViewMargin?: MarginType;\n blur?: string;\n}\n\nexport function BlurFade({\n children,\n className,\n variant,\n duration = 0.4,\n delay = 0,\n offset = 6,\n direction = \"down\",\n inView = false,\n inViewMargin = \"-50px\",\n blur = \"6px\",\n}: BlurFadeProps) {\n const ref = useRef(null);\n const inViewResult = useInView(ref, { once: true, margin: inViewMargin });\n const isInView = !inView || inViewResult;\n const defaultVariants: Variants = {\n hidden: {\n [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]:\n direction === \"right\" || direction === \"down\" ? -offset : offset,\n opacity: 0,\n filter: `blur(${blur})`,\n },\n visible: {\n [direction === \"left\" || direction === \"right\" ? \"x\" : \"y\"]: 0,\n opacity: 1,\n filter: `blur(0px)`,\n },\n };\n const combinedVariants = variant || defaultVariants;\n return (\n \n \n {children}\n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/border-beam-demo.json b/public/r/border-beam-demo.json new file mode 100644 index 000000000..5eb36c133 --- /dev/null +++ b/public/r/border-beam-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "border-beam-demo", + "type": "registry:component", + "registryDependencies": [ + "border-beam" + ], + "files": [ + { + "path": "registry/example/border-beam-demo.tsx", + "content": "import { BorderBeam } from \"@/registry/magicui/border-beam\";\n\nexport default function BorderBeamDemo() {\n return (\n
\n \n Border Beam\n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/border-beam.json b/public/r/border-beam.json similarity index 87% rename from public/r/styles/default/border-beam.json rename to public/r/border-beam.json index af7b73664..d60c014d6 100644 --- a/public/r/styles/default/border-beam.json +++ b/public/r/border-beam.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "border-beam", - "type": "registry:ui", + "type": "registry:component", + "title": "Border Beam", + "description": "An animated beam of light which travels along the border of its container.", "files": [ { - "path": "magicui/border-beam.tsx", + "path": "registry/magicui/border-beam.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { ComponentPropsWithoutRef } from \"react\";\n\ninterface BorderBeamProps extends ComponentPropsWithoutRef<\"div\"> {\n size?: number;\n duration?: number;\n borderWidth?: number;\n anchor?: number;\n colorFrom?: string;\n colorTo?: string;\n delay?: number;\n}\n\nexport const BorderBeam = ({\n className,\n size = 200,\n duration = 15,\n anchor = 90,\n borderWidth = 1.5,\n colorFrom = \"#ffaa40\",\n colorTo = \"#9c40ff\",\n delay = 0,\n ...props\n}: BorderBeamProps) => {\n return (\n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/box-reveal-demo.json b/public/r/box-reveal-demo.json new file mode 100644 index 000000000..2de498485 --- /dev/null +++ b/public/r/box-reveal-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "box-reveal-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/box-reveal-demo.tsx", + "content": "import { Button } from \"@/components/ui/button\";\nimport { BoxReveal } from \"@/registry/magicui/box-reveal\";\n\nexport default function BoxRevealDemo() {\n return (\n
\n \n

\n Magic UI.\n

\n
\n\n \n

\n UI library for{\" \"}\n Design Engineers\n

\n
\n\n \n
\n

\n -> 20+ free and open-source animated components built with\n React,\n Typescript,\n Tailwind CSS,\n and\n Framer Motion\n .
\n -> 100% open-source, and customizable.
\n

\n
\n
\n\n \n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/box-reveal.json b/public/r/box-reveal.json similarity index 86% rename from public/r/styles/default/box-reveal.json rename to public/r/box-reveal.json index 255fcbbf5..2ba1c46ad 100644 --- a/public/r/styles/default/box-reveal.json +++ b/public/r/box-reveal.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "box-reveal", - "type": "registry:ui", + "type": "registry:component", + "title": "Box Reveal Animation", + "description": "Sliding box animation that reveals text behind it.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/box-reveal.tsx", + "path": "registry/magicui/box-reveal.tsx", "content": "\"use client\";\n\nimport { motion, useAnimation, useInView } from \"motion/react\";\nimport { useEffect, useRef } from \"react\";\n\ninterface BoxRevealProps {\n children: JSX.Element;\n width?: \"fit-content\" | \"100%\";\n boxColor?: string;\n duration?: number;\n}\n\nexport const BoxReveal = ({\n children,\n width = \"fit-content\",\n boxColor = \"#5046e6\",\n duration,\n}: BoxRevealProps) => {\n const mainControls = useAnimation();\n const slideControls = useAnimation();\n\n const ref = useRef(null);\n const isInView = useInView(ref, { once: true });\n\n useEffect(() => {\n if (isInView) {\n slideControls.start(\"visible\");\n mainControls.start(\"visible\");\n } else {\n slideControls.start(\"hidden\");\n mainControls.start(\"hidden\");\n }\n }, [isInView, mainControls, slideControls]);\n\n return (\n
\n \n {children}\n \n\n \n
\n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/client-tweet-card.json b/public/r/client-tweet-card.json new file mode 100644 index 000000000..eea433949 --- /dev/null +++ b/public/r/client-tweet-card.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "client-tweet-card", + "type": "registry:component", + "title": "Client Tweet Card", + "description": "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", + "dependencies": [ + "react-tweet" + ], + "files": [ + { + "path": "registry/magicui/client-tweet-card.tsx", + "content": "\"use client\";\n\nimport { TweetProps, useTweet } from \"react-tweet\";\n\nimport {\n MagicTweet,\n TweetNotFound,\n TweetSkeleton,\n} from \"@/registry/magicui/tweet-card\";\n\nexport const ClientTweetCard = ({\n id,\n apiUrl,\n fallback = ,\n components,\n fetchOptions,\n onError,\n ...props\n}: TweetProps & { className?: string }) => {\n const { data, error, isLoading } = useTweet(id, apiUrl, fetchOptions);\n\n if (isLoading) return fallback;\n if (error || !data) {\n const NotFound = components?.TweetNotFound || TweetNotFound;\n return ;\n }\n\n return ;\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/code-comparison-demo.json b/public/r/code-comparison-demo.json new file mode 100644 index 000000000..c9ec1bb14 --- /dev/null +++ b/public/r/code-comparison-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "code-comparison-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/code-comparison-demo.tsx", + "content": "import CodeComparison from \"@/registry/magicui/code-comparison\";\n\nconst beforeCode = `import { NextRequest } from 'next/server';\n\nexport const middleware = async (req: NextRequest) => {\n let user = undefined;\n let team = undefined;\n const token = req.headers.get('token');\n\n if(req.nextUrl.pathname.startsWith('/auth')) {\n user = await getUserByToken(token);\n\n if(!user) {\n return NextResponse.redirect('/login');\n }\n }\n\n if(req.nextUrl.pathname.startsWith('/team')) {\n user = await getUserByToken(token);\n\n if(!user) {\n return NextResponse.redirect('/login');\n }\n\n const slug = req.nextUrl.query.slug;\n team = await getTeamBySlug(slug);\n\n if(!team) {\n return NextResponse.redirect('/');\n }\n }\n\n return NextResponse.next();\n}\n\nexport const config = {\n matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'],\n};`;\n\nconst afterCode = `import { createMiddleware, type MiddlewareFunctionProps } from '@app/(auth)/auth/_middleware';\nimport { auth } from '@app/(auth)/auth/_middleware';\nimport { team } from '@app/(team)/team/_middleware';\n\nconst middlewares = {\n '/auth{/:path?}': auth,\n '/team{/:slug?}': [ auth, team ],\n};\n\nexport const middleware = createMiddleware(middlewares);\n\nexport const config = {\n matcher: ['/((?!_next/|_static|_vercel|[\\\\w-]+\\\\.\\\\w+).*)'],\n};`;\n\nexport default function CodeComparisonDemo() {\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/code-comparison.json b/public/r/code-comparison.json similarity index 92% rename from public/r/styles/default/code-comparison.json rename to public/r/code-comparison.json index c7f7618f0..cb11483f0 100644 --- a/public/r/styles/default/code-comparison.json +++ b/public/r/code-comparison.json @@ -1,16 +1,18 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "code-comparison", - "type": "registry:ui", + "type": "registry:component", + "title": "Code Comparison", + "description": "A component which compares two code snippets.", "dependencies": [ "shiki", "next-themes" ], "files": [ { - "path": "magicui/code-comparison.tsx", + "path": "registry/magicui/code-comparison.tsx", "content": "\"use client\";\n\nimport { FileIcon } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useState } from \"react\";\nimport { codeToHtml } from \"shiki\";\n\ninterface CodeComparisonProps {\n beforeCode: string;\n afterCode: string;\n language: string;\n filename: string;\n lightTheme: string;\n darkTheme: string;\n}\n\nexport default function CodeComparison({\n beforeCode,\n afterCode,\n language,\n filename,\n lightTheme,\n darkTheme,\n}: CodeComparisonProps) {\n const { theme, systemTheme } = useTheme();\n const [highlightedBefore, setHighlightedBefore] = useState(\"\");\n const [highlightedAfter, setHighlightedAfter] = useState(\"\");\n\n useEffect(() => {\n const currentTheme = theme === \"system\" ? systemTheme : theme;\n const selectedTheme = currentTheme === \"dark\" ? darkTheme : lightTheme;\n\n async function highlightCode() {\n const before = await codeToHtml(beforeCode, {\n lang: language,\n theme: selectedTheme,\n });\n const after = await codeToHtml(afterCode, {\n lang: language,\n theme: selectedTheme,\n });\n setHighlightedBefore(before);\n setHighlightedAfter(after);\n }\n\n highlightCode();\n }, [\n theme,\n systemTheme,\n beforeCode,\n afterCode,\n language,\n lightTheme,\n darkTheme,\n ]);\n\n const renderCode = (code: string, highlighted: string) => {\n if (highlighted) {\n return (\n pre]:h-full [&>pre]:!bg-transparent [&>pre]:p-4 [&_code]:break-all\"\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n );\n } else {\n return (\n
\n          {code}\n        
\n );\n }\n };\n return (\n
\n
\n
\n
\n
\n \n {filename}\n before\n
\n {renderCode(beforeCode, highlightedBefore)}\n
\n
\n
\n \n {filename}\n after\n
\n {renderCode(afterCode, highlightedAfter)}\n
\n
\n
\n VS\n
\n
\n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/colors/gray.json b/public/r/colors/gray.json deleted file mode 100644 index 9cba353ed..000000000 --- a/public/r/colors/gray.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "inlineColors": { - "light": { - "background": "white", - "foreground": "gray-950", - "card": "white", - "card-foreground": "gray-950", - "popover": "white", - "popover-foreground": "gray-950", - "primary": "gray-900", - "primary-foreground": "gray-50", - "secondary": "gray-100", - "secondary-foreground": "gray-900", - "muted": "gray-100", - "muted-foreground": "gray-500", - "accent": "gray-100", - "accent-foreground": "gray-900", - "destructive": "red-500", - "destructive-foreground": "gray-50", - "border": "gray-200", - "input": "gray-200", - "ring": "gray-950" - }, - "dark": { - "background": "gray-950", - "foreground": "gray-50", - "card": "gray-950", - "card-foreground": "gray-50", - "popover": "gray-950", - "popover-foreground": "gray-50", - "primary": "gray-50", - "primary-foreground": "gray-900", - "secondary": "gray-800", - "secondary-foreground": "gray-50", - "muted": "gray-800", - "muted-foreground": "gray-400", - "accent": "gray-800", - "accent-foreground": "gray-50", - "destructive": "red-900", - "destructive-foreground": "gray-50", - "border": "gray-800", - "input": "gray-800", - "ring": "gray-300" - } - }, - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "224 71.4% 4.1%", - "card": "0 0% 100%", - "card-foreground": "224 71.4% 4.1%", - "popover": "0 0% 100%", - "popover-foreground": "224 71.4% 4.1%", - "primary": "220.9 39.3% 11%", - "primary-foreground": "210 20% 98%", - "secondary": "220 14.3% 95.9%", - "secondary-foreground": "220.9 39.3% 11%", - "muted": "220 14.3% 95.9%", - "muted-foreground": "220 8.9% 46.1%", - "accent": "220 14.3% 95.9%", - "accent-foreground": "220.9 39.3% 11%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "210 20% 98%", - "border": "220 13% 91%", - "input": "220 13% 91%", - "ring": "224 71.4% 4.1%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "224 71.4% 4.1%", - "foreground": "210 20% 98%", - "card": "224 71.4% 4.1%", - "card-foreground": "210 20% 98%", - "popover": "224 71.4% 4.1%", - "popover-foreground": "210 20% 98%", - "primary": "210 20% 98%", - "primary-foreground": "220.9 39.3% 11%", - "secondary": "215 27.9% 16.9%", - "secondary-foreground": "210 20% 98%", - "muted": "215 27.9% 16.9%", - "muted-foreground": "217.9 10.6% 64.9%", - "accent": "215 27.9% 16.9%", - "accent-foreground": "210 20% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "210 20% 98%", - "border": "215 27.9% 16.9%", - "input": "215 27.9% 16.9%", - "ring": "216 12.2% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - }, - "inlineColorsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n ", - "cssVarsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 224 71.4% 4.1%;\n --card: 0 0% 100%;\n --card-foreground: 224 71.4% 4.1%;\n --popover: 0 0% 100%;\n --popover-foreground: 224 71.4% 4.1%;\n --primary: 220.9 39.3% 11%;\n --primary-foreground: 210 20% 98%;\n --secondary: 220 14.3% 95.9%;\n --secondary-foreground: 220.9 39.3% 11%;\n --muted: 220 14.3% 95.9%;\n --muted-foreground: 220 8.9% 46.1%;\n --accent: 220 14.3% 95.9%;\n --accent-foreground: 220.9 39.3% 11%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 20% 98%;\n --border: 220 13% 91%;\n --input: 220 13% 91%;\n --ring: 224 71.4% 4.1%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 224 71.4% 4.1%;\n --foreground: 210 20% 98%;\n --card: 224 71.4% 4.1%;\n --card-foreground: 210 20% 98%;\n --popover: 224 71.4% 4.1%;\n --popover-foreground: 210 20% 98%;\n --primary: 210 20% 98%;\n --primary-foreground: 220.9 39.3% 11%;\n --secondary: 215 27.9% 16.9%;\n --secondary-foreground: 210 20% 98%;\n --muted: 215 27.9% 16.9%;\n --muted-foreground: 217.9 10.6% 64.9%;\n --accent: 215 27.9% 16.9%;\n --accent-foreground: 210 20% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 20% 98%;\n --border: 215 27.9% 16.9%;\n --input: 215 27.9% 16.9%;\n --ring: 216 12.2% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}" -} \ No newline at end of file diff --git a/public/r/colors/index.json b/public/r/colors/index.json deleted file mode 100644 index c25158efb..000000000 --- a/public/r/colors/index.json +++ /dev/null @@ -1,1999 +0,0 @@ -{ - "inherit": "inherit", - "current": "currentColor", - "transparent": "transparent", - "black": { - "hex": "#000000", - "rgb": "rgb(0,0,0)", - "hsl": "hsl(0,0%,0%)", - "rgbChannel": "0 0 0", - "hslChannel": "0 0% 0%" - }, - "white": { - "hex": "#ffffff", - "rgb": "rgb(255,255,255)", - "hsl": "hsl(0,0%,100%)", - "rgbChannel": "255 255 255", - "hslChannel": "0 0% 100%" - }, - "slate": [ - { - "scale": 50, - "hex": "#f8fafc", - "rgb": "rgb(248,250,252)", - "hsl": "hsl(210,40%,98%)", - "rgbChannel": "248 250 252", - "hslChannel": "210 40% 98%" - }, - { - "scale": 100, - "hex": "#f1f5f9", - "rgb": "rgb(241,245,249)", - "hsl": "hsl(210,40%,96.1%)", - "rgbChannel": "241 245 249", - "hslChannel": "210 40% 96.1%" - }, - { - "scale": 200, - "hex": "#e2e8f0", - "rgb": "rgb(226,232,240)", - "hsl": "hsl(214.3,31.8%,91.4%)", - "rgbChannel": "226 232 240", - "hslChannel": "214.3 31.8% 91.4%" - }, - { - "scale": 300, - "hex": "#cbd5e1", - "rgb": "rgb(203,213,225)", - "hsl": "hsl(212.7,26.8%,83.9%)", - "rgbChannel": "203 213 225", - "hslChannel": "212.7 26.8% 83.9%" - }, - { - "scale": 400, - "hex": "#94a3b8", - "rgb": "rgb(148,163,184)", - "hsl": "hsl(215,20.2%,65.1%)", - "rgbChannel": "148 163 184", - "hslChannel": "215 20.2% 65.1%" - }, - { - "scale": 500, - "hex": "#64748b", - "rgb": "rgb(100,116,139)", - "hsl": "hsl(215.4,16.3%,46.9%)", - "rgbChannel": "100 116 139", - "hslChannel": "215.4 16.3% 46.9%" - }, - { - "scale": 600, - "hex": "#475569", - "rgb": "rgb(71,85,105)", - "hsl": "hsl(215.3,19.3%,34.5%)", - "rgbChannel": "71 85 105", - "hslChannel": "215.3 19.3% 34.5%" - }, - { - "scale": 700, - "hex": "#334155", - "rgb": "rgb(51,65,85)", - "hsl": "hsl(215.3,25%,26.7%)", - "rgbChannel": "51 65 85", - "hslChannel": "215.3 25% 26.7%" - }, - { - "scale": 800, - "hex": "#1e293b", - "rgb": "rgb(30,41,59)", - "hsl": "hsl(217.2,32.6%,17.5%)", - "rgbChannel": "30 41 59", - "hslChannel": "217.2 32.6% 17.5%" - }, - { - "scale": 900, - "hex": "#0f172a", - "rgb": "rgb(15,23,42)", - "hsl": "hsl(222.2,47.4%,11.2%)", - "rgbChannel": "15 23 42", - "hslChannel": "222.2 47.4% 11.2%" - }, - { - "scale": 950, - "hex": "#020617", - "rgb": "rgb(2,6,23)", - "hsl": "hsl(222.2,84%,4.9%)", - "rgbChannel": "2 6 23", - "hslChannel": "222.2 84% 4.9%" - } - ], - "gray": [ - { - "scale": 50, - "hex": "#f9fafb", - "rgb": "rgb(249,250,251)", - "hsl": "hsl(210,20%,98%)", - "rgbChannel": "249 250 251", - "hslChannel": "210 20% 98%" - }, - { - "scale": 100, - "hex": "#f3f4f6", - "rgb": "rgb(243,244,246)", - "hsl": "hsl(220,14.3%,95.9%)", - "rgbChannel": "243 244 246", - "hslChannel": "220 14.3% 95.9%" - }, - { - "scale": 200, - "hex": "#e5e7eb", - "rgb": "rgb(229,231,235)", - "hsl": "hsl(220,13%,91%)", - "rgbChannel": "229 231 235", - "hslChannel": "220 13% 91%" - }, - { - "scale": 300, - "hex": "#d1d5db", - "rgb": "rgb(209,213,219)", - "hsl": "hsl(216,12.2%,83.9%)", - "rgbChannel": "209 213 219", - "hslChannel": "216 12.2% 83.9%" - }, - { - "scale": 400, - "hex": "#9ca3af", - "rgb": "rgb(156,163,175)", - "hsl": "hsl(217.9,10.6%,64.9%)", - "rgbChannel": "156 163 175", - "hslChannel": "217.9 10.6% 64.9%" - }, - { - "scale": 500, - "hex": "#6b7280", - "rgb": "rgb(107,114,128)", - "hsl": "hsl(220,8.9%,46.1%)", - "rgbChannel": "107 114 128", - "hslChannel": "220 8.9% 46.1%" - }, - { - "scale": 600, - "hex": "#4b5563", - "rgb": "rgb(75,85,99)", - "hsl": "hsl(215,13.8%,34.1%)", - "rgbChannel": "75 85 99", - "hslChannel": "215 13.8% 34.1%" - }, - { - "scale": 700, - "hex": "#374151", - "rgb": "rgb(55,65,81)", - "hsl": "hsl(216.9,19.1%,26.7%)", - "rgbChannel": "55 65 81", - "hslChannel": "216.9 19.1% 26.7%" - }, - { - "scale": 800, - "hex": "#1f2937", - "rgb": "rgb(31,41,55)", - "hsl": "hsl(215,27.9%,16.9%)", - "rgbChannel": "31 41 55", - "hslChannel": "215 27.9% 16.9%" - }, - { - "scale": 900, - "hex": "#111827", - "rgb": "rgb(17,24,39)", - "hsl": "hsl(220.9,39.3%,11%)", - "rgbChannel": "17 24 39", - "hslChannel": "220.9 39.3% 11%" - }, - { - "scale": 950, - "hex": "#030712", - "rgb": "rgb(3,7,18)", - "hsl": "hsl(224,71.4%,4.1%)", - "rgbChannel": "3 7 18", - "hslChannel": "224 71.4% 4.1%" - } - ], - "zinc": [ - { - "scale": 50, - "hex": "#fafafa", - "rgb": "rgb(250,250,250)", - "hsl": "hsl(0,0%,98%)", - "rgbChannel": "250 250 250", - "hslChannel": "0 0% 98%" - }, - { - "scale": 100, - "hex": "#f4f4f5", - "rgb": "rgb(244,244,245)", - "hsl": "hsl(240,4.8%,95.9%)", - "rgbChannel": "244 244 245", - "hslChannel": "240 4.8% 95.9%" - }, - { - "scale": 200, - "hex": "#e4e4e7", - "rgb": "rgb(228,228,231)", - "hsl": "hsl(240,5.9%,90%)", - "rgbChannel": "228 228 231", - "hslChannel": "240 5.9% 90%" - }, - { - "scale": 300, - "hex": "#d4d4d8", - "rgb": "rgb(212,212,216)", - "hsl": "hsl(240,4.9%,83.9%)", - "rgbChannel": "212 212 216", - "hslChannel": "240 4.9% 83.9%" - }, - { - "scale": 400, - "hex": "#a1a1aa", - "rgb": "rgb(161,161,170)", - "hsl": "hsl(240,5%,64.9%)", - "rgbChannel": "161 161 170", - "hslChannel": "240 5% 64.9%" - }, - { - "scale": 500, - "hex": "#71717a", - "rgb": "rgb(113,113,122)", - "hsl": "hsl(240,3.8%,46.1%)", - "rgbChannel": "113 113 122", - "hslChannel": "240 3.8% 46.1%" - }, - { - "scale": 600, - "hex": "#52525b", - "rgb": "rgb(82,82,91)", - "hsl": "hsl(240,5.2%,33.9%)", - "rgbChannel": "82 82 91", - "hslChannel": "240 5.2% 33.9%" - }, - { - "scale": 700, - "hex": "#3f3f46", - "rgb": "rgb(63,63,70)", - "hsl": "hsl(240,5.3%,26.1%)", - "rgbChannel": "63 63 70", - "hslChannel": "240 5.3% 26.1%" - }, - { - "scale": 800, - "hex": "#27272a", - "rgb": "rgb(39,39,42)", - "hsl": "hsl(240,3.7%,15.9%)", - "rgbChannel": "39 39 42", - "hslChannel": "240 3.7% 15.9%" - }, - { - "scale": 900, - "hex": "#18181b", - "rgb": "rgb(24,24,27)", - "hsl": "hsl(240,5.9%,10%)", - "rgbChannel": "24 24 27", - "hslChannel": "240 5.9% 10%" - }, - { - "scale": 950, - "hex": "#09090b", - "rgb": "rgb(9,9,11)", - "hsl": "hsl(240,10%,3.9%)", - "rgbChannel": "9 9 11", - "hslChannel": "240 10% 3.9%" - } - ], - "neutral": [ - { - "scale": 50, - "hex": "#fafafa", - "rgb": "rgb(250,250,250)", - "hsl": "hsl(0,0%,98%)", - "rgbChannel": "250 250 250", - "hslChannel": "0 0% 98%" - }, - { - "scale": 100, - "hex": "#f5f5f5", - "rgb": "rgb(245,245,245)", - "hsl": "hsl(0,0%,96.1%)", - "rgbChannel": "245 245 245", - "hslChannel": "0 0% 96.1%" - }, - { - "scale": 200, - "hex": "#e5e5e5", - "rgb": "rgb(229,229,229)", - "hsl": "hsl(0,0%,89.8%)", - "rgbChannel": "229 229 229", - "hslChannel": "0 0% 89.8%" - }, - { - "scale": 300, - "hex": "#d4d4d4", - "rgb": "rgb(212,212,212)", - "hsl": "hsl(0,0%,83.1%)", - "rgbChannel": "212 212 212", - "hslChannel": "0 0% 83.1%" - }, - { - "scale": 400, - "hex": "#a3a3a3", - "rgb": "rgb(163,163,163)", - "hsl": "hsl(0,0%,63.9%)", - "rgbChannel": "163 163 163", - "hslChannel": "0 0% 63.9%" - }, - { - "scale": 500, - "hex": "#737373", - "rgb": "rgb(115,115,115)", - "hsl": "hsl(0,0%,45.1%)", - "rgbChannel": "115 115 115", - "hslChannel": "0 0% 45.1%" - }, - { - "scale": 600, - "hex": "#525252", - "rgb": "rgb(82,82,82)", - "hsl": "hsl(0,0%,32.2%)", - "rgbChannel": "82 82 82", - "hslChannel": "0 0% 32.2%" - }, - { - "scale": 700, - "hex": "#404040", - "rgb": "rgb(64,64,64)", - "hsl": "hsl(0,0%,25.1%)", - "rgbChannel": "64 64 64", - "hslChannel": "0 0% 25.1%" - }, - { - "scale": 800, - "hex": "#262626", - "rgb": "rgb(38,38,38)", - "hsl": "hsl(0,0%,14.9%)", - "rgbChannel": "38 38 38", - "hslChannel": "0 0% 14.9%" - }, - { - "scale": 900, - "hex": "#171717", - "rgb": "rgb(23,23,23)", - "hsl": "hsl(0,0%,9%)", - "rgbChannel": "23 23 23", - "hslChannel": "0 0% 9%" - }, - { - "scale": 950, - "hex": "#0a0a0a", - "rgb": "rgb(10,10,10)", - "hsl": "hsl(0,0%,3.9%)", - "rgbChannel": "10 10 10", - "hslChannel": "0 0% 3.9%" - } - ], - "stone": [ - { - "scale": 50, - "hex": "#fafaf9", - "rgb": "rgb(250,250,249)", - "hsl": "hsl(60,9.1%,97.8%)", - "rgbChannel": "250 250 249", - "hslChannel": "60 9.1% 97.8%" - }, - { - "scale": 100, - "hex": "#f5f5f4", - "rgb": "rgb(245,245,244)", - "hsl": "hsl(60,4.8%,95.9%)", - "rgbChannel": "245 245 244", - "hslChannel": "60 4.8% 95.9%" - }, - { - "scale": 200, - "hex": "#e7e5e4", - "rgb": "rgb(231,229,228)", - "hsl": "hsl(20,5.9%,90%)", - "rgbChannel": "231 229 228", - "hslChannel": "20 5.9% 90%" - }, - { - "scale": 300, - "hex": "#d6d3d1", - "rgb": "rgb(214,211,209)", - "hsl": "hsl(24,5.7%,82.9%)", - "rgbChannel": "214 211 209", - "hslChannel": "24 5.7% 82.9%" - }, - { - "scale": 400, - "hex": "#a8a29e", - "rgb": "rgb(168,162,158)", - "hsl": "hsl(24,5.4%,63.9%)", - "rgbChannel": "168 162 158", - "hslChannel": "24 5.4% 63.9%" - }, - { - "scale": 500, - "hex": "#78716c", - "rgb": "rgb(120,113,108)", - "hsl": "hsl(25,5.3%,44.7%)", - "rgbChannel": "120 113 108", - "hslChannel": "25 5.3% 44.7%" - }, - { - "scale": 600, - "hex": "#57534e", - "rgb": "rgb(87,83,78)", - "hsl": "hsl(33.3,5.5%,32.4%)", - "rgbChannel": "87 83 78", - "hslChannel": "33.3 5.5% 32.4%" - }, - { - "scale": 700, - "hex": "#44403c", - "rgb": "rgb(68,64,60)", - "hsl": "hsl(30,6.3%,25.1%)", - "rgbChannel": "68 64 60", - "hslChannel": "30 6.3% 25.1%" - }, - { - "scale": 800, - "hex": "#292524", - "rgb": "rgb(41,37,36)", - "hsl": "hsl(12,6.5%,15.1%)", - "rgbChannel": "41 37 36", - "hslChannel": "12 6.5% 15.1%" - }, - { - "scale": 900, - "hex": "#1c1917", - "rgb": "rgb(28,25,23)", - "hsl": "hsl(24,9.8%,10%)", - "rgbChannel": "28 25 23", - "hslChannel": "24 9.8% 10%" - }, - { - "scale": 950, - "hex": "#0c0a09", - "rgb": "rgb(12,10,9)", - "hsl": "hsl(20,14.3%,4.1%)", - "rgbChannel": "12 10 9", - "hslChannel": "20 14.3% 4.1%" - } - ], - "red": [ - { - "scale": 50, - "hex": "#fef2f2", - "rgb": "rgb(254,242,242)", - "hsl": "hsl(0,85.7%,97.3%)", - "rgbChannel": "254 242 242", - "hslChannel": "0 85.7% 97.3%" - }, - { - "scale": 100, - "hex": "#fee2e2", - "rgb": "rgb(254,226,226)", - "hsl": "hsl(0,93.3%,94.1%)", - "rgbChannel": "254 226 226", - "hslChannel": "0 93.3% 94.1%" - }, - { - "scale": 200, - "hex": "#fecaca", - "rgb": "rgb(254,202,202)", - "hsl": "hsl(0,96.3%,89.4%)", - "rgbChannel": "254 202 202", - "hslChannel": "0 96.3% 89.4%" - }, - { - "scale": 300, - "hex": "#fca5a5", - "rgb": "rgb(252,165,165)", - "hsl": "hsl(0,93.5%,81.8%)", - "rgbChannel": "252 165 165", - "hslChannel": "0 93.5% 81.8%" - }, - { - "scale": 400, - "hex": "#f87171", - "rgb": "rgb(248,113,113)", - "hsl": "hsl(0,90.6%,70.8%)", - "rgbChannel": "248 113 113", - "hslChannel": "0 90.6% 70.8%" - }, - { - "scale": 500, - "hex": "#ef4444", - "rgb": "rgb(239,68,68)", - "hsl": "hsl(0,84.2%,60.2%)", - "rgbChannel": "239 68 68", - "hslChannel": "0 84.2% 60.2%" - }, - { - "scale": 600, - "hex": "#dc2626", - "rgb": "rgb(220,38,38)", - "hsl": "hsl(0,72.2%,50.6%)", - "rgbChannel": "220 38 38", - "hslChannel": "0 72.2% 50.6%" - }, - { - "scale": 700, - "hex": "#b91c1c", - "rgb": "rgb(185,28,28)", - "hsl": "hsl(0,73.7%,41.8%)", - "rgbChannel": "185 28 28", - "hslChannel": "0 73.7% 41.8%" - }, - { - "scale": 800, - "hex": "#991b1b", - "rgb": "rgb(153,27,27)", - "hsl": "hsl(0,70%,35.3%)", - "rgbChannel": "153 27 27", - "hslChannel": "0 70% 35.3%" - }, - { - "scale": 900, - "hex": "#7f1d1d", - "rgb": "rgb(127,29,29)", - "hsl": "hsl(0,62.8%,30.6%)", - "rgbChannel": "127 29 29", - "hslChannel": "0 62.8% 30.6%" - }, - { - "scale": 950, - "hex": "#450a0a", - "rgb": "rgb(69,10,10)", - "hsl": "hsl(0,74.7%,15.5%)", - "rgbChannel": "69 10 10", - "hslChannel": "0 74.7% 15.5%" - } - ], - "orange": [ - { - "scale": 50, - "hex": "#fff7ed", - "rgb": "rgb(255,247,237)", - "hsl": "hsl(33.3,100%,96.5%)", - "rgbChannel": "255 247 237", - "hslChannel": "33.3 100% 96.5%" - }, - { - "scale": 100, - "hex": "#ffedd5", - "rgb": "rgb(255,237,213)", - "hsl": "hsl(34.3,100%,91.8%)", - "rgbChannel": "255 237 213", - "hslChannel": "34.3 100% 91.8%" - }, - { - "scale": 200, - "hex": "#fed7aa", - "rgb": "rgb(254,215,170)", - "hsl": "hsl(32.1,97.7%,83.1%)", - "rgbChannel": "254 215 170", - "hslChannel": "32.1 97.7% 83.1%" - }, - { - "scale": 300, - "hex": "#fdba74", - "rgb": "rgb(253,186,116)", - "hsl": "hsl(30.7,97.2%,72.4%)", - "rgbChannel": "253 186 116", - "hslChannel": "30.7 97.2% 72.4%" - }, - { - "scale": 400, - "hex": "#fb923c", - "rgb": "rgb(251,146,60)", - "hsl": "hsl(27,96%,61%)", - "rgbChannel": "251 146 60", - "hslChannel": "27 96% 61%" - }, - { - "scale": 500, - "hex": "#f97316", - "rgb": "rgb(249,115,22)", - "hsl": "hsl(24.6,95%,53.1%)", - "rgbChannel": "249 115 22", - "hslChannel": "24.6 95% 53.1%" - }, - { - "scale": 600, - "hex": "#ea580c", - "rgb": "rgb(234,88,12)", - "hsl": "hsl(20.5,90.2%,48.2%)", - "rgbChannel": "234 88 12", - "hslChannel": "20.5 90.2% 48.2%" - }, - { - "scale": 700, - "hex": "#c2410c", - "rgb": "rgb(194,65,12)", - "hsl": "hsl(17.5,88.3%,40.4%)", - "rgbChannel": "194 65 12", - "hslChannel": "17.5 88.3% 40.4%" - }, - { - "scale": 800, - "hex": "#9a3412", - "rgb": "rgb(154,52,18)", - "hsl": "hsl(15,79.1%,33.7%)", - "rgbChannel": "154 52 18", - "hslChannel": "15 79.1% 33.7%" - }, - { - "scale": 900, - "hex": "#7c2d12", - "rgb": "rgb(124,45,18)", - "hsl": "hsl(15.3,74.6%,27.8%)", - "rgbChannel": "124 45 18", - "hslChannel": "15.3 74.6% 27.8%" - }, - { - "scale": 950, - "hex": "#431407", - "rgb": "rgb(67,20,7)", - "hsl": "hsl(13,81.1%,14.5%)", - "rgbChannel": "67 20 7", - "hslChannel": "13 81.1% 14.5%" - } - ], - "amber": [ - { - "scale": 50, - "hex": "#fffbeb", - "rgb": "rgb(255,251,235)", - "hsl": "hsl(48,100%,96.1%)", - "rgbChannel": "255 251 235", - "hslChannel": "48 100% 96.1%" - }, - { - "scale": 100, - "hex": "#fef3c7", - "rgb": "rgb(254,243,199)", - "hsl": "hsl(48,96.5%,88.8%)", - "rgbChannel": "254 243 199", - "hslChannel": "48 96.5% 88.8%" - }, - { - "scale": 200, - "hex": "#fde68a", - "rgb": "rgb(253,230,138)", - "hsl": "hsl(48,96.6%,76.7%)", - "rgbChannel": "253 230 138", - "hslChannel": "48 96.6% 76.7%" - }, - { - "scale": 300, - "hex": "#fcd34d", - "rgb": "rgb(252,211,77)", - "hsl": "hsl(45.9,96.7%,64.5%)", - "rgbChannel": "252 211 77", - "hslChannel": "45.9 96.7% 64.5%" - }, - { - "scale": 400, - "hex": "#fbbf24", - "rgb": "rgb(251,191,36)", - "hsl": "hsl(43.3,96.4%,56.3%)", - "rgbChannel": "251 191 36", - "hslChannel": "43.3 96.4% 56.3%" - }, - { - "scale": 500, - "hex": "#f59e0b", - "rgb": "rgb(245,158,11)", - "hsl": "hsl(37.7,92.1%,50.2%)", - "rgbChannel": "245 158 11", - "hslChannel": "37.7 92.1% 50.2%" - }, - { - "scale": 600, - "hex": "#d97706", - "rgb": "rgb(217,119,6)", - "hsl": "hsl(32.1,94.6%,43.7%)", - "rgbChannel": "217 119 6", - "hslChannel": "32.1 94.6% 43.7%" - }, - { - "scale": 700, - "hex": "#b45309", - "rgb": "rgb(180,83,9)", - "hsl": "hsl(26,90.5%,37.1%)", - "rgbChannel": "180 83 9", - "hslChannel": "26 90.5% 37.1%" - }, - { - "scale": 800, - "hex": "#92400e", - "rgb": "rgb(146,64,14)", - "hsl": "hsl(22.7,82.5%,31.4%)", - "rgbChannel": "146 64 14", - "hslChannel": "22.7 82.5% 31.4%" - }, - { - "scale": 900, - "hex": "#78350f", - "rgb": "rgb(120,53,15)", - "hsl": "hsl(21.7,77.8%,26.5%)", - "rgbChannel": "120 53 15", - "hslChannel": "21.7 77.8% 26.5%" - }, - { - "scale": 950, - "hex": "#451a03", - "rgb": "rgb(69,26,3)", - "hsl": "hsl(20.9,91.7%,14.1%)", - "rgbChannel": "69 26 3", - "hslChannel": "20.9 91.7% 14.1%" - } - ], - "yellow": [ - { - "scale": 50, - "hex": "#fefce8", - "rgb": "rgb(254,252,232)", - "hsl": "hsl(54.5,91.7%,95.3%)", - "rgbChannel": "254 252 232", - "hslChannel": "54.5 91.7% 95.3%" - }, - { - "scale": 100, - "hex": "#fef9c3", - "rgb": "rgb(254,249,195)", - "hsl": "hsl(54.9,96.7%,88%)", - "rgbChannel": "254 249 195", - "hslChannel": "54.9 96.7% 88%" - }, - { - "scale": 200, - "hex": "#fef08a", - "rgb": "rgb(254,240,138)", - "hsl": "hsl(52.8,98.3%,76.9%)", - "rgbChannel": "254 240 138", - "hslChannel": "52.8 98.3% 76.9%" - }, - { - "scale": 300, - "hex": "#fde047", - "rgb": "rgb(253,224,71)", - "hsl": "hsl(50.4,97.8%,63.5%)", - "rgbChannel": "253 224 71", - "hslChannel": "50.4 97.8% 63.5%" - }, - { - "scale": 400, - "hex": "#facc15", - "rgb": "rgb(250,204,21)", - "hsl": "hsl(47.9,95.8%,53.1%)", - "rgbChannel": "250 204 21", - "hslChannel": "47.9 95.8% 53.1%" - }, - { - "scale": 500, - "hex": "#eab308", - "rgb": "rgb(234,179,8)", - "hsl": "hsl(45.4,93.4%,47.5%)", - "rgbChannel": "234 179 8", - "hslChannel": "45.4 93.4% 47.5%" - }, - { - "scale": 600, - "hex": "#ca8a04", - "rgb": "rgb(202,138,4)", - "hsl": "hsl(40.6,96.1%,40.4%)", - "rgbChannel": "202 138 4", - "hslChannel": "40.6 96.1% 40.4%" - }, - { - "scale": 700, - "hex": "#a16207", - "rgb": "rgb(161,98,7)", - "hsl": "hsl(35.5,91.7%,32.9%)", - "rgbChannel": "161 98 7", - "hslChannel": "35.5 91.7% 32.9%" - }, - { - "scale": 800, - "hex": "#854d0e", - "rgb": "rgb(133,77,14)", - "hsl": "hsl(31.8,81%,28.8%)", - "rgbChannel": "133 77 14", - "hslChannel": "31.8 81% 28.8%" - }, - { - "scale": 900, - "hex": "#713f12", - "rgb": "rgb(113,63,18)", - "hsl": "hsl(28.4,72.5%,25.7%)", - "rgbChannel": "113 63 18", - "hslChannel": "28.4 72.5% 25.7%" - }, - { - "scale": 950, - "hex": "#422006", - "rgb": "rgb(66,32,6)", - "hsl": "hsl(26,83.3%,14.1%)", - "rgbChannel": "66 32 6", - "hslChannel": "26 83.3% 14.1%" - } - ], - "lime": [ - { - "scale": 50, - "hex": "#f7fee7", - "rgb": "rgb(247,254,231)", - "hsl": "hsl(78.3,92%,95.1%)", - "rgbChannel": "247 254 231", - "hslChannel": "78.3 92% 95.1%" - }, - { - "scale": 100, - "hex": "#ecfccb", - "rgb": "rgb(236,252,203)", - "hsl": "hsl(79.6,89.1%,89.2%)", - "rgbChannel": "236 252 203", - "hslChannel": "79.6 89.1% 89.2%" - }, - { - "scale": 200, - "hex": "#d9f99d", - "rgb": "rgb(217,249,157)", - "hsl": "hsl(80.9,88.5%,79.6%)", - "rgbChannel": "217 249 157", - "hslChannel": "80.9 88.5% 79.6%" - }, - { - "scale": 300, - "hex": "#bef264", - "rgb": "rgb(190,242,100)", - "hsl": "hsl(82,84.5%,67.1%)", - "rgbChannel": "190 242 100", - "hslChannel": "82 84.5% 67.1%" - }, - { - "scale": 400, - "hex": "#a3e635", - "rgb": "rgb(163,230,53)", - "hsl": "hsl(82.7,78%,55.5%)", - "rgbChannel": "163 230 53", - "hslChannel": "82.7 78% 55.5%" - }, - { - "scale": 500, - "hex": "#84cc16", - "rgb": "rgb(132,204,22)", - "hsl": "hsl(83.7,80.5%,44.3%)", - "rgbChannel": "132 204 22", - "hslChannel": "83.7 80.5% 44.3%" - }, - { - "scale": 600, - "hex": "#65a30d", - "rgb": "rgb(101,163,13)", - "hsl": "hsl(84.8,85.2%,34.5%)", - "rgbChannel": "101 163 13", - "hslChannel": "84.8 85.2% 34.5%" - }, - { - "scale": 700, - "hex": "#4d7c0f", - "rgb": "rgb(77,124,15)", - "hsl": "hsl(85.9,78.4%,27.3%)", - "rgbChannel": "77 124 15", - "hslChannel": "85.9 78.4% 27.3%" - }, - { - "scale": 800, - "hex": "#3f6212", - "rgb": "rgb(63,98,18)", - "hsl": "hsl(86.3,69%,22.7%)", - "rgbChannel": "63 98 18", - "hslChannel": "86.3 69% 22.7%" - }, - { - "scale": 900, - "hex": "#365314", - "rgb": "rgb(54,83,20)", - "hsl": "hsl(87.6,61.2%,20.2%)", - "rgbChannel": "54 83 20", - "hslChannel": "87.6 61.2% 20.2%" - }, - { - "scale": 950, - "hex": "#1a2e05", - "rgb": "rgb(26,46,5)", - "hsl": "hsl(89.3,80.4%,10%)", - "rgbChannel": "26 46 5", - "hslChannel": "89.3 80.4% 10%" - } - ], - "green": [ - { - "scale": 50, - "hex": "#f0fdf4", - "rgb": "rgb(240,253,244)", - "hsl": "hsl(138.5,76.5%,96.7%)", - "rgbChannel": "240 253 244", - "hslChannel": "138.5 76.5% 96.7%" - }, - { - "scale": 100, - "hex": "#dcfce7", - "rgb": "rgb(220,252,231)", - "hsl": "hsl(140.6,84.2%,92.5%)", - "rgbChannel": "220 252 231", - "hslChannel": "140.6 84.2% 92.5%" - }, - { - "scale": 200, - "hex": "#bbf7d0", - "rgb": "rgb(187,247,208)", - "hsl": "hsl(141,78.9%,85.1%)", - "rgbChannel": "187 247 208", - "hslChannel": "141 78.9% 85.1%" - }, - { - "scale": 300, - "hex": "#86efac", - "rgb": "rgb(134,239,172)", - "hsl": "hsl(141.7,76.6%,73.1%)", - "rgbChannel": "134 239 172", - "hslChannel": "141.7 76.6% 73.1%" - }, - { - "scale": 400, - "hex": "#4ade80", - "rgb": "rgb(74,222,128)", - "hsl": "hsl(141.9,69.2%,58%)", - "rgbChannel": "74 222 128", - "hslChannel": "141.9 69.2% 58%" - }, - { - "scale": 500, - "hex": "#22c55e", - "rgb": "rgb(34,197,94)", - "hsl": "hsl(142.1,70.6%,45.3%)", - "rgbChannel": "34 197 94", - "hslChannel": "142.1 70.6% 45.3%" - }, - { - "scale": 600, - "hex": "#16a34a", - "rgb": "rgb(22,163,74)", - "hsl": "hsl(142.1,76.2%,36.3%)", - "rgbChannel": "22 163 74", - "hslChannel": "142.1 76.2% 36.3%" - }, - { - "scale": 700, - "hex": "#15803d", - "rgb": "rgb(21,128,61)", - "hsl": "hsl(142.4,71.8%,29.2%)", - "rgbChannel": "21 128 61", - "hslChannel": "142.4 71.8% 29.2%" - }, - { - "scale": 800, - "hex": "#166534", - "rgb": "rgb(22,101,52)", - "hsl": "hsl(142.8,64.2%,24.1%)", - "rgbChannel": "22 101 52", - "hslChannel": "142.8 64.2% 24.1%" - }, - { - "scale": 900, - "hex": "#14532d", - "rgb": "rgb(20,83,45)", - "hsl": "hsl(143.8,61.2%,20.2%)", - "rgbChannel": "20 83 45", - "hslChannel": "143.8 61.2% 20.2%" - }, - { - "scale": 950, - "hex": "#052e16", - "rgb": "rgb(5,46,22)", - "hsl": "hsl(144.9,80.4%,10%)", - "rgbChannel": "5 46 22", - "hslChannel": "144.9 80.4% 10%" - } - ], - "emerald": [ - { - "scale": 50, - "hex": "#ecfdf5", - "rgb": "rgb(236,253,245)", - "hsl": "hsl(151.8,81%,95.9%)", - "rgbChannel": "236 253 245", - "hslChannel": "151.8 81% 95.9%" - }, - { - "scale": 100, - "hex": "#d1fae5", - "rgb": "rgb(209,250,229)", - "hsl": "hsl(149.3,80.4%,90%)", - "rgbChannel": "209 250 229", - "hslChannel": "149.3 80.4% 90%" - }, - { - "scale": 200, - "hex": "#a7f3d0", - "rgb": "rgb(167,243,208)", - "hsl": "hsl(152.4,76%,80.4%)", - "rgbChannel": "167 243 208", - "hslChannel": "152.4 76% 80.4%" - }, - { - "scale": 300, - "hex": "#6ee7b7", - "rgb": "rgb(110,231,183)", - "hsl": "hsl(156.2,71.6%,66.9%)", - "rgbChannel": "110 231 183", - "hslChannel": "156.2 71.6% 66.9%" - }, - { - "scale": 400, - "hex": "#34d399", - "rgb": "rgb(52,211,153)", - "hsl": "hsl(158.1,64.4%,51.6%)", - "rgbChannel": "52 211 153", - "hslChannel": "158.1 64.4% 51.6%" - }, - { - "scale": 500, - "hex": "#10b981", - "rgb": "rgb(16,185,129)", - "hsl": "hsl(160.1,84.1%,39.4%)", - "rgbChannel": "16 185 129", - "hslChannel": "160.1 84.1% 39.4%" - }, - { - "scale": 600, - "hex": "#059669", - "rgb": "rgb(5,150,105)", - "hsl": "hsl(161.4,93.5%,30.4%)", - "rgbChannel": "5 150 105", - "hslChannel": "161.4 93.5% 30.4%" - }, - { - "scale": 700, - "hex": "#047857", - "rgb": "rgb(4,120,87)", - "hsl": "hsl(162.9,93.5%,24.3%)", - "rgbChannel": "4 120 87", - "hslChannel": "162.9 93.5% 24.3%" - }, - { - "scale": 800, - "hex": "#065f46", - "rgb": "rgb(6,95,70)", - "hsl": "hsl(163.1,88.1%,19.8%)", - "rgbChannel": "6 95 70", - "hslChannel": "163.1 88.1% 19.8%" - }, - { - "scale": 900, - "hex": "#064e3b", - "rgb": "rgb(6,78,59)", - "hsl": "hsl(164.2,85.7%,16.5%)", - "rgbChannel": "6 78 59", - "hslChannel": "164.2 85.7% 16.5%" - }, - { - "scale": 950, - "hex": "#022c22", - "rgb": "rgb(2,44,34)", - "hsl": "hsl(165.7,91.3%,9%)", - "rgbChannel": "2 44 34", - "hslChannel": "165.7 91.3% 9%" - } - ], - "teal": [ - { - "scale": 50, - "hex": "#f0fdfa", - "rgb": "rgb(240,253,250)", - "hsl": "hsl(166.2,76.5%,96.7%)", - "rgbChannel": "240 253 250", - "hslChannel": "166.2 76.5% 96.7%" - }, - { - "scale": 100, - "hex": "#ccfbf1", - "rgb": "rgb(204,251,241)", - "hsl": "hsl(167.2,85.5%,89.2%)", - "rgbChannel": "204 251 241", - "hslChannel": "167.2 85.5% 89.2%" - }, - { - "scale": 200, - "hex": "#99f6e4", - "rgb": "rgb(153,246,228)", - "hsl": "hsl(168.4,83.8%,78.2%)", - "rgbChannel": "153 246 228", - "hslChannel": "168.4 83.8% 78.2%" - }, - { - "scale": 300, - "hex": "#5eead4", - "rgb": "rgb(94,234,212)", - "hsl": "hsl(170.6,76.9%,64.3%)", - "rgbChannel": "94 234 212", - "hslChannel": "170.6 76.9% 64.3%" - }, - { - "scale": 400, - "hex": "#2dd4bf", - "rgb": "rgb(45,212,191)", - "hsl": "hsl(172.5,66%,50.4%)", - "rgbChannel": "45 212 191", - "hslChannel": "172.5 66% 50.4%" - }, - { - "scale": 500, - "hex": "#14b8a6", - "rgb": "rgb(20,184,166)", - "hsl": "hsl(173.4,80.4%,40%)", - "rgbChannel": "20 184 166", - "hslChannel": "173.4 80.4% 40%" - }, - { - "scale": 600, - "hex": "#0d9488", - "rgb": "rgb(13,148,136)", - "hsl": "hsl(174.7,83.9%,31.6%)", - "rgbChannel": "13 148 136", - "hslChannel": "174.7 83.9% 31.6%" - }, - { - "scale": 700, - "hex": "#0f766e", - "rgb": "rgb(15,118,110)", - "hsl": "hsl(175.3,77.4%,26.1%)", - "rgbChannel": "15 118 110", - "hslChannel": "175.3 77.4% 26.1%" - }, - { - "scale": 800, - "hex": "#115e59", - "rgb": "rgb(17,94,89)", - "hsl": "hsl(176.1,69.4%,21.8%)", - "rgbChannel": "17 94 89", - "hslChannel": "176.1 69.4% 21.8%" - }, - { - "scale": 900, - "hex": "#134e4a", - "rgb": "rgb(19,78,74)", - "hsl": "hsl(175.9,60.8%,19%)", - "rgbChannel": "19 78 74", - "hslChannel": "175.9 60.8% 19%" - }, - { - "scale": 950, - "hex": "#042f2e", - "rgb": "rgb(4,47,46)", - "hsl": "hsl(178.6,84.3%,10%)", - "rgbChannel": "4 47 46", - "hslChannel": "178.6 84.3% 10%" - } - ], - "cyan": [ - { - "scale": 50, - "hex": "#ecfeff", - "rgb": "rgb(236,254,255)", - "hsl": "hsl(183.2,100%,96.3%)", - "rgbChannel": "236 254 255", - "hslChannel": "183.2 100% 96.3%" - }, - { - "scale": 100, - "hex": "#cffafe", - "rgb": "rgb(207,250,254)", - "hsl": "hsl(185.1,95.9%,90.4%)", - "rgbChannel": "207 250 254", - "hslChannel": "185.1 95.9% 90.4%" - }, - { - "scale": 200, - "hex": "#a5f3fc", - "rgb": "rgb(165,243,252)", - "hsl": "hsl(186.2,93.5%,81.8%)", - "rgbChannel": "165 243 252", - "hslChannel": "186.2 93.5% 81.8%" - }, - { - "scale": 300, - "hex": "#67e8f9", - "rgb": "rgb(103,232,249)", - "hsl": "hsl(187,92.4%,69%)", - "rgbChannel": "103 232 249", - "hslChannel": "187 92.4% 69%" - }, - { - "scale": 400, - "hex": "#22d3ee", - "rgb": "rgb(34,211,238)", - "hsl": "hsl(187.9,85.7%,53.3%)", - "rgbChannel": "34 211 238", - "hslChannel": "187.9 85.7% 53.3%" - }, - { - "scale": 500, - "hex": "#06b6d4", - "rgb": "rgb(6,182,212)", - "hsl": "hsl(188.7,94.5%,42.7%)", - "rgbChannel": "6 182 212", - "hslChannel": "188.7 94.5% 42.7%" - }, - { - "scale": 600, - "hex": "#0891b2", - "rgb": "rgb(8,145,178)", - "hsl": "hsl(191.6,91.4%,36.5%)", - "rgbChannel": "8 145 178", - "hslChannel": "191.6 91.4% 36.5%" - }, - { - "scale": 700, - "hex": "#0e7490", - "rgb": "rgb(14,116,144)", - "hsl": "hsl(192.9,82.3%,31%)", - "rgbChannel": "14 116 144", - "hslChannel": "192.9 82.3% 31%" - }, - { - "scale": 800, - "hex": "#155e75", - "rgb": "rgb(21,94,117)", - "hsl": "hsl(194.4,69.6%,27.1%)", - "rgbChannel": "21 94 117", - "hslChannel": "194.4 69.6% 27.1%" - }, - { - "scale": 900, - "hex": "#164e63", - "rgb": "rgb(22,78,99)", - "hsl": "hsl(196.4,63.6%,23.7%)", - "rgbChannel": "22 78 99", - "hslChannel": "196.4 63.6% 23.7%" - }, - { - "scale": 950, - "hex": "#083344", - "rgb": "rgb(8,51,68)", - "hsl": "hsl(197,78.9%,14.9%)", - "rgbChannel": "8 51 68", - "hslChannel": "197 78.9% 14.9%" - } - ], - "sky": [ - { - "scale": 50, - "hex": "#f0f9ff", - "rgb": "rgb(240,249,255)", - "hsl": "hsl(204,100%,97.1%)", - "rgbChannel": "240 249 255", - "hslChannel": "204 100% 97.1%" - }, - { - "scale": 100, - "hex": "#e0f2fe", - "rgb": "rgb(224,242,254)", - "hsl": "hsl(204,93.8%,93.7%)", - "rgbChannel": "224 242 254", - "hslChannel": "204 93.8% 93.7%" - }, - { - "scale": 200, - "hex": "#bae6fd", - "rgb": "rgb(186,230,253)", - "hsl": "hsl(200.6,94.4%,86.1%)", - "rgbChannel": "186 230 253", - "hslChannel": "200.6 94.4% 86.1%" - }, - { - "scale": 300, - "hex": "#7dd3fc", - "rgb": "rgb(125,211,252)", - "hsl": "hsl(199.4,95.5%,73.9%)", - "rgbChannel": "125 211 252", - "hslChannel": "199.4 95.5% 73.9%" - }, - { - "scale": 400, - "hex": "#38bdf8", - "rgb": "rgb(56,189,248)", - "hsl": "hsl(198.4,93.2%,59.6%)", - "rgbChannel": "56 189 248", - "hslChannel": "198.4 93.2% 59.6%" - }, - { - "scale": 500, - "hex": "#0ea5e9", - "rgb": "rgb(14,165,233)", - "hsl": "hsl(198.6,88.7%,48.4%)", - "rgbChannel": "14 165 233", - "hslChannel": "198.6 88.7% 48.4%" - }, - { - "scale": 600, - "hex": "#0284c7", - "rgb": "rgb(2,132,199)", - "hsl": "hsl(200.4,98%,39.4%)", - "rgbChannel": "2 132 199", - "hslChannel": "200.4 98% 39.4%" - }, - { - "scale": 700, - "hex": "#0369a1", - "rgb": "rgb(3,105,161)", - "hsl": "hsl(201.3,96.3%,32.2%)", - "rgbChannel": "3 105 161", - "hslChannel": "201.3 96.3% 32.2%" - }, - { - "scale": 800, - "hex": "#075985", - "rgb": "rgb(7,89,133)", - "hsl": "hsl(201,90%,27.5%)", - "rgbChannel": "7 89 133", - "hslChannel": "201 90% 27.5%" - }, - { - "scale": 900, - "hex": "#0c4a6e", - "rgb": "rgb(12,74,110)", - "hsl": "hsl(202,80.3%,23.9%)", - "rgbChannel": "12 74 110", - "hslChannel": "202 80.3% 23.9%" - }, - { - "scale": 950, - "hex": "#082f49", - "rgb": "rgb(8,47,73)", - "hsl": "hsl(204,80.2%,15.9%)", - "rgbChannel": "8 47 73", - "hslChannel": "204 80.2% 15.9%" - } - ], - "blue": [ - { - "scale": 50, - "hex": "#eff6ff", - "rgb": "rgb(239,246,255)", - "hsl": "hsl(213.8,100%,96.9%)", - "rgbChannel": "239 246 255", - "hslChannel": "213.8 100% 96.9%" - }, - { - "scale": 100, - "hex": "#dbeafe", - "rgb": "rgb(219,234,254)", - "hsl": "hsl(214.3,94.6%,92.7%)", - "rgbChannel": "219 234 254", - "hslChannel": "214.3 94.6% 92.7%" - }, - { - "scale": 200, - "hex": "#bfdbfe", - "rgb": "rgb(191,219,254)", - "hsl": "hsl(213.3,96.9%,87.3%)", - "rgbChannel": "191 219 254", - "hslChannel": "213.3 96.9% 87.3%" - }, - { - "scale": 300, - "hex": "#93c5fd", - "rgb": "rgb(147,197,253)", - "hsl": "hsl(211.7,96.4%,78.4%)", - "rgbChannel": "147 197 253", - "hslChannel": "211.7 96.4% 78.4%" - }, - { - "scale": 400, - "hex": "#60a5fa", - "rgb": "rgb(96,165,250)", - "hsl": "hsl(213.1,93.9%,67.8%)", - "rgbChannel": "96 165 250", - "hslChannel": "213.1 93.9% 67.8%" - }, - { - "scale": 500, - "hex": "#3b82f6", - "rgb": "rgb(59,130,246)", - "hsl": "hsl(217.2,91.2%,59.8%)", - "rgbChannel": "59 130 246", - "hslChannel": "217.2 91.2% 59.8%" - }, - { - "scale": 600, - "hex": "#2563eb", - "rgb": "rgb(37,99,235)", - "hsl": "hsl(221.2,83.2%,53.3%)", - "rgbChannel": "37 99 235", - "hslChannel": "221.2 83.2% 53.3%" - }, - { - "scale": 700, - "hex": "#1d4ed8", - "rgb": "rgb(29,78,216)", - "hsl": "hsl(224.3,76.3%,48%)", - "rgbChannel": "29 78 216", - "hslChannel": "224.3 76.3% 48%" - }, - { - "scale": 800, - "hex": "#1e40af", - "rgb": "rgb(30,64,175)", - "hsl": "hsl(225.9,70.7%,40.2%)", - "rgbChannel": "30 64 175", - "hslChannel": "225.9 70.7% 40.2%" - }, - { - "scale": 900, - "hex": "#1e3a8a", - "rgb": "rgb(30,58,138)", - "hsl": "hsl(224.4,64.3%,32.9%)", - "rgbChannel": "30 58 138", - "hslChannel": "224.4 64.3% 32.9%" - }, - { - "scale": 950, - "hex": "#172554", - "rgb": "rgb(23,37,84)", - "hsl": "hsl(226.2,57%,21%)", - "rgbChannel": "23 37 84", - "hslChannel": "226.2 57% 21%" - } - ], - "indigo": [ - { - "scale": 50, - "hex": "#eef2ff", - "rgb": "rgb(238,242,255)", - "hsl": "hsl(225.9,100%,96.7%)", - "rgbChannel": "238 242 255", - "hslChannel": "225.9 100% 96.7%" - }, - { - "scale": 100, - "hex": "#e0e7ff", - "rgb": "rgb(224,231,255)", - "hsl": "hsl(226.5,100%,93.9%)", - "rgbChannel": "224 231 255", - "hslChannel": "226.5 100% 93.9%" - }, - { - "scale": 200, - "hex": "#c7d2fe", - "rgb": "rgb(199,210,254)", - "hsl": "hsl(228,96.5%,88.8%)", - "rgbChannel": "199 210 254", - "hslChannel": "228 96.5% 88.8%" - }, - { - "scale": 300, - "hex": "#a5b4fc", - "rgb": "rgb(165,180,252)", - "hsl": "hsl(229.7,93.5%,81.8%)", - "rgbChannel": "165 180 252", - "hslChannel": "229.7 93.5% 81.8%" - }, - { - "scale": 400, - "hex": "#818cf8", - "rgb": "rgb(129,140,248)", - "hsl": "hsl(234.5,89.5%,73.9%)", - "rgbChannel": "129 140 248", - "hslChannel": "234.5 89.5% 73.9%" - }, - { - "scale": 500, - "hex": "#6366f1", - "rgb": "rgb(99,102,241)", - "hsl": "hsl(238.7,83.5%,66.7%)", - "rgbChannel": "99 102 241", - "hslChannel": "238.7 83.5% 66.7%" - }, - { - "scale": 600, - "hex": "#4f46e5", - "rgb": "rgb(79,70,229)", - "hsl": "hsl(243.4,75.4%,58.6%)", - "rgbChannel": "79 70 229", - "hslChannel": "243.4 75.4% 58.6%" - }, - { - "scale": 700, - "hex": "#4338ca", - "rgb": "rgb(67,56,202)", - "hsl": "hsl(244.5,57.9%,50.6%)", - "rgbChannel": "67 56 202", - "hslChannel": "244.5 57.9% 50.6%" - }, - { - "scale": 800, - "hex": "#3730a3", - "rgb": "rgb(55,48,163)", - "hsl": "hsl(243.7,54.5%,41.4%)", - "rgbChannel": "55 48 163", - "hslChannel": "243.7 54.5% 41.4%" - }, - { - "scale": 900, - "hex": "#312e81", - "rgb": "rgb(49,46,129)", - "hsl": "hsl(242.2,47.4%,34.3%)", - "rgbChannel": "49 46 129", - "hslChannel": "242.2 47.4% 34.3%" - }, - { - "scale": 950, - "hex": "#1e1b4b", - "rgb": "rgb(30,27,75)", - "hsl": "hsl(243.8,47.1%,20%)", - "rgbChannel": "30 27 75", - "hslChannel": "243.8 47.1% 20%" - } - ], - "violet": [ - { - "scale": 50, - "hex": "#f5f3ff", - "rgb": "rgb(245,243,255)", - "hsl": "hsl(250,100%,97.6%)", - "rgbChannel": "245 243 255", - "hslChannel": "250 100% 97.6%" - }, - { - "scale": 100, - "hex": "#ede9fe", - "rgb": "rgb(237,233,254)", - "hsl": "hsl(251.4,91.3%,95.5%)", - "rgbChannel": "237 233 254", - "hslChannel": "251.4 91.3% 95.5%" - }, - { - "scale": 200, - "hex": "#ddd6fe", - "rgb": "rgb(221,214,254)", - "hsl": "hsl(250.5,95.2%,91.8%)", - "rgbChannel": "221 214 254", - "hslChannel": "250.5 95.2% 91.8%" - }, - { - "scale": 300, - "hex": "#c4b5fd", - "rgb": "rgb(196,181,253)", - "hsl": "hsl(252.5,94.7%,85.1%)", - "rgbChannel": "196 181 253", - "hslChannel": "252.5 94.7% 85.1%" - }, - { - "scale": 400, - "hex": "#a78bfa", - "rgb": "rgb(167,139,250)", - "hsl": "hsl(255.1,91.7%,76.3%)", - "rgbChannel": "167 139 250", - "hslChannel": "255.1 91.7% 76.3%" - }, - { - "scale": 500, - "hex": "#8b5cf6", - "rgb": "rgb(139,92,246)", - "hsl": "hsl(258.3,89.5%,66.3%)", - "rgbChannel": "139 92 246", - "hslChannel": "258.3 89.5% 66.3%" - }, - { - "scale": 600, - "hex": "#7c3aed", - "rgb": "rgb(124,58,237)", - "hsl": "hsl(262.1,83.3%,57.8%)", - "rgbChannel": "124 58 237", - "hslChannel": "262.1 83.3% 57.8%" - }, - { - "scale": 700, - "hex": "#6d28d9", - "rgb": "rgb(109,40,217)", - "hsl": "hsl(263.4,70%,50.4%)", - "rgbChannel": "109 40 217", - "hslChannel": "263.4 70% 50.4%" - }, - { - "scale": 800, - "hex": "#5b21b6", - "rgb": "rgb(91,33,182)", - "hsl": "hsl(263.4,69.3%,42.2%)", - "rgbChannel": "91 33 182", - "hslChannel": "263.4 69.3% 42.2%" - }, - { - "scale": 900, - "hex": "#4c1d95", - "rgb": "rgb(76,29,149)", - "hsl": "hsl(263.5,67.4%,34.9%)", - "rgbChannel": "76 29 149", - "hslChannel": "263.5 67.4% 34.9%" - }, - { - "scale": 950, - "hex": "#1e1b4b", - "rgb": "rgb(46,16,101)", - "hsl": "hsl(261.2,72.6%,22.9%)", - "rgbChannel": "46 16 101", - "hslChannel": "261.2 72.6% 22.9%" - } - ], - "purple": [ - { - "scale": 50, - "hex": "#faf5ff", - "rgb": "rgb(250,245,255)", - "hsl": "hsl(270,100%,98%)", - "rgbChannel": "250 245 255", - "hslChannel": "270 100% 98%" - }, - { - "scale": 100, - "hex": "#f3e8ff", - "rgb": "rgb(243,232,255)", - "hsl": "hsl(268.7,100%,95.5%)", - "rgbChannel": "243 232 255", - "hslChannel": "268.7 100% 95.5%" - }, - { - "scale": 200, - "hex": "#e9d5ff", - "rgb": "rgb(233,213,255)", - "hsl": "hsl(268.6,100%,91.8%)", - "rgbChannel": "233 213 255", - "hslChannel": "268.6 100% 91.8%" - }, - { - "scale": 300, - "hex": "#d8b4fe", - "rgb": "rgb(216,180,254)", - "hsl": "hsl(269.2,97.4%,85.1%)", - "rgbChannel": "216 180 254", - "hslChannel": "269.2 97.4% 85.1%" - }, - { - "scale": 400, - "hex": "#c084fc", - "rgb": "rgb(192,132,252)", - "hsl": "hsl(270,95.2%,75.3%)", - "rgbChannel": "192 132 252", - "hslChannel": "270 95.2% 75.3%" - }, - { - "scale": 500, - "hex": "#a855f7", - "rgb": "rgb(168,85,247)", - "hsl": "hsl(270.7,91%,65.1%)", - "rgbChannel": "168 85 247", - "hslChannel": "270.7 91% 65.1%" - }, - { - "scale": 600, - "hex": "#9333ea", - "rgb": "rgb(147,51,234)", - "hsl": "hsl(271.5,81.3%,55.9%)", - "rgbChannel": "147 51 234", - "hslChannel": "271.5 81.3% 55.9%" - }, - { - "scale": 700, - "hex": "#7e22ce", - "rgb": "rgb(126,34,206)", - "hsl": "hsl(272.1,71.7%,47.1%)", - "rgbChannel": "126 34 206", - "hslChannel": "272.1 71.7% 47.1%" - }, - { - "scale": 800, - "hex": "#6b21a8", - "rgb": "rgb(107,33,168)", - "hsl": "hsl(272.9,67.2%,39.4%)", - "rgbChannel": "107 33 168", - "hslChannel": "272.9 67.2% 39.4%" - }, - { - "scale": 900, - "hex": "#581c87", - "rgb": "rgb(88,28,135)", - "hsl": "hsl(273.6,65.6%,32%)", - "rgbChannel": "88 28 135", - "hslChannel": "273.6 65.6% 32%" - }, - { - "scale": 950, - "hex": "#3b0764", - "rgb": "rgb(59,7,100)", - "hsl": "hsl(273.5,86.9%,21%)", - "rgbChannel": "59 7 100", - "hslChannel": "273.5 86.9% 21%" - } - ], - "fuchsia": [ - { - "scale": 50, - "hex": "#fdf4ff", - "rgb": "rgb(253,244,255)", - "hsl": "hsl(289.1,100%,97.8%)", - "rgbChannel": "253 244 255", - "hslChannel": "289.1 100% 97.8%" - }, - { - "scale": 100, - "hex": "#fae8ff", - "rgb": "rgb(250,232,255)", - "hsl": "hsl(287,100%,95.5%)", - "rgbChannel": "250 232 255", - "hslChannel": "287 100% 95.5%" - }, - { - "scale": 200, - "hex": "#f5d0fe", - "rgb": "rgb(245,208,254)", - "hsl": "hsl(288.3,95.8%,90.6%)", - "rgbChannel": "245 208 254", - "hslChannel": "288.3 95.8% 90.6%" - }, - { - "scale": 300, - "hex": "#f0abfc", - "rgb": "rgb(240,171,252)", - "hsl": "hsl(291.1,93.1%,82.9%)", - "rgbChannel": "240 171 252", - "hslChannel": "291.1 93.1% 82.9%" - }, - { - "scale": 400, - "hex": "#e879f9", - "rgb": "rgb(232,121,249)", - "hsl": "hsl(292,91.4%,72.5%)", - "rgbChannel": "232 121 249", - "hslChannel": "292 91.4% 72.5%" - }, - { - "scale": 500, - "hex": "#d946ef", - "rgb": "rgb(217,70,239)", - "hsl": "hsl(292.2,84.1%,60.6%)", - "rgbChannel": "217 70 239", - "hslChannel": "292.2 84.1% 60.6%" - }, - { - "scale": 600, - "hex": "#c026d3", - "rgb": "rgb(192,38,211)", - "hsl": "hsl(293.4,69.5%,48.8%)", - "rgbChannel": "192 38 211", - "hslChannel": "293.4 69.5% 48.8%" - }, - { - "scale": 700, - "hex": "#a21caf", - "rgb": "rgb(162,28,175)", - "hsl": "hsl(294.7,72.4%,39.8%)", - "rgbChannel": "162 28 175", - "hslChannel": "294.7 72.4% 39.8%" - }, - { - "scale": 800, - "hex": "#86198f", - "rgb": "rgb(134,25,143)", - "hsl": "hsl(295.4,70.2%,32.9%)", - "rgbChannel": "134 25 143", - "hslChannel": "295.4 70.2% 32.9%" - }, - { - "scale": 900, - "hex": "#701a75", - "rgb": "rgb(112,26,117)", - "hsl": "hsl(296.7,63.6%,28%)", - "rgbChannel": "112 26 117", - "hslChannel": "296.7 63.6% 28%" - }, - { - "scale": 950, - "hex": "#4a044e", - "rgb": "rgb(74,4,78)", - "hsl": "hsl(296.8,90.2%,16.1%)", - "rgbChannel": "74 4 78", - "hslChannel": "296.8 90.2% 16.1%" - } - ], - "pink": [ - { - "scale": 50, - "hex": "#fdf2f8", - "rgb": "rgb(253,242,248)", - "hsl": "hsl(327.3,73.3%,97.1%)", - "rgbChannel": "253 242 248", - "hslChannel": "327.3 73.3% 97.1%" - }, - { - "scale": 100, - "hex": "#fce7f3", - "rgb": "rgb(252,231,243)", - "hsl": "hsl(325.7,77.8%,94.7%)", - "rgbChannel": "252 231 243", - "hslChannel": "325.7 77.8% 94.7%" - }, - { - "scale": 200, - "hex": "#fbcfe8", - "rgb": "rgb(251,207,232)", - "hsl": "hsl(325.9,84.6%,89.8%)", - "rgbChannel": "251 207 232", - "hslChannel": "325.9 84.6% 89.8%" - }, - { - "scale": 300, - "hex": "#f9a8d4", - "rgb": "rgb(249,168,212)", - "hsl": "hsl(327.4,87.1%,81.8%)", - "rgbChannel": "249 168 212", - "hslChannel": "327.4 87.1% 81.8%" - }, - { - "scale": 400, - "hex": "#f472b6", - "rgb": "rgb(244,114,182)", - "hsl": "hsl(328.6,85.5%,70.2%)", - "rgbChannel": "244 114 182", - "hslChannel": "328.6 85.5% 70.2%" - }, - { - "scale": 500, - "hex": "#ec4899", - "rgb": "rgb(236,72,153)", - "hsl": "hsl(330.4,81.2%,60.4%)", - "rgbChannel": "236 72 153", - "hslChannel": "330.4 81.2% 60.4%" - }, - { - "scale": 600, - "hex": "#db2777", - "rgb": "rgb(219,39,119)", - "hsl": "hsl(333.3,71.4%,50.6%)", - "rgbChannel": "219 39 119", - "hslChannel": "333.3 71.4% 50.6%" - }, - { - "scale": 700, - "hex": "#be185d", - "rgb": "rgb(190,24,93)", - "hsl": "hsl(335.1,77.6%,42%)", - "rgbChannel": "190 24 93", - "hslChannel": "335.1 77.6% 42%" - }, - { - "scale": 800, - "hex": "#9d174d", - "rgb": "rgb(157,23,77)", - "hsl": "hsl(335.8,74.4%,35.3%)", - "rgbChannel": "157 23 77", - "hslChannel": "335.8 74.4% 35.3%" - }, - { - "scale": 900, - "hex": "#831843", - "rgb": "rgb(131,24,67)", - "hsl": "hsl(335.9,69%,30.4%)", - "rgbChannel": "131 24 67", - "hslChannel": "335.9 69% 30.4%" - }, - { - "scale": 950, - "hex": "#500724", - "rgb": "rgb(80,7,36)", - "hsl": "hsl(336.2,83.9%,17.1%)", - "rgbChannel": "80 7 36", - "hslChannel": "336.2 83.9% 17.1%" - } - ], - "rose": [ - { - "scale": 50, - "hex": "#fff1f2", - "rgb": "rgb(255,241,242)", - "hsl": "hsl(355.7,100%,97.3%)", - "rgbChannel": "255 241 242", - "hslChannel": "355.7 100% 97.3%" - }, - { - "scale": 100, - "hex": "#ffe4e6", - "rgb": "rgb(255,228,230)", - "hsl": "hsl(355.6,100%,94.7%)", - "rgbChannel": "255 228 230", - "hslChannel": "355.6 100% 94.7%" - }, - { - "scale": 200, - "hex": "#fecdd3", - "rgb": "rgb(254,205,211)", - "hsl": "hsl(352.7,96.1%,90%)", - "rgbChannel": "254 205 211", - "hslChannel": "352.7 96.1% 90%" - }, - { - "scale": 300, - "hex": "#fda4af", - "rgb": "rgb(253,164,175)", - "hsl": "hsl(352.6,95.7%,81.8%)", - "rgbChannel": "253 164 175", - "hslChannel": "352.6 95.7% 81.8%" - }, - { - "scale": 400, - "hex": "#fb7185", - "rgb": "rgb(251,113,133)", - "hsl": "hsl(351.3,94.5%,71.4%)", - "rgbChannel": "251 113 133", - "hslChannel": "351.3 94.5% 71.4%" - }, - { - "scale": 500, - "hex": "#f43f5e", - "rgb": "rgb(244,63,94)", - "hsl": "hsl(349.7,89.2%,60.2%)", - "rgbChannel": "244 63 94", - "hslChannel": "349.7 89.2% 60.2%" - }, - { - "scale": 600, - "hex": "#e11d48", - "rgb": "rgb(225,29,72)", - "hsl": "hsl(346.8,77.2%,49.8%)", - "rgbChannel": "225 29 72", - "hslChannel": "346.8 77.2% 49.8%" - }, - { - "scale": 700, - "hex": "#be123c", - "rgb": "rgb(190,18,60)", - "hsl": "hsl(345.3,82.7%,40.8%)", - "rgbChannel": "190 18 60", - "hslChannel": "345.3 82.7% 40.8%" - }, - { - "scale": 800, - "hex": "#9f1239", - "rgb": "rgb(159,18,57)", - "hsl": "hsl(343.4,79.7%,34.7%)", - "rgbChannel": "159 18 57", - "hslChannel": "343.4 79.7% 34.7%" - }, - { - "scale": 900, - "hex": "#881337", - "rgb": "rgb(136,19,55)", - "hsl": "hsl(341.5,75.5%,30.4%)", - "rgbChannel": "136 19 55", - "hslChannel": "341.5 75.5% 30.4%" - }, - { - "scale": 950, - "hex": "#4c0519", - "rgb": "rgb(76,5,25)", - "hsl": "hsl(343.1,87.7%,15.9%)", - "rgbChannel": "76 5 25", - "hslChannel": "343.1 87.7% 15.9%" - } - ] -} \ No newline at end of file diff --git a/public/r/colors/neutral.json b/public/r/colors/neutral.json deleted file mode 100644 index 71688eaf9..000000000 --- a/public/r/colors/neutral.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "inlineColors": { - "light": { - "background": "white", - "foreground": "neutral-950", - "card": "white", - "card-foreground": "neutral-950", - "popover": "white", - "popover-foreground": "neutral-950", - "primary": "neutral-900", - "primary-foreground": "neutral-50", - "secondary": "neutral-100", - "secondary-foreground": "neutral-900", - "muted": "neutral-100", - "muted-foreground": "neutral-500", - "accent": "neutral-100", - "accent-foreground": "neutral-900", - "destructive": "red-500", - "destructive-foreground": "neutral-50", - "border": "neutral-200", - "input": "neutral-200", - "ring": "neutral-950" - }, - "dark": { - "background": "neutral-950", - "foreground": "neutral-50", - "card": "neutral-950", - "card-foreground": "neutral-50", - "popover": "neutral-950", - "popover-foreground": "neutral-50", - "primary": "neutral-50", - "primary-foreground": "neutral-900", - "secondary": "neutral-800", - "secondary-foreground": "neutral-50", - "muted": "neutral-800", - "muted-foreground": "neutral-400", - "accent": "neutral-800", - "accent-foreground": "neutral-50", - "destructive": "red-900", - "destructive-foreground": "neutral-50", - "border": "neutral-800", - "input": "neutral-800", - "ring": "neutral-300" - } - }, - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "0 0% 3.9%", - "card": "0 0% 100%", - "card-foreground": "0 0% 3.9%", - "popover": "0 0% 100%", - "popover-foreground": "0 0% 3.9%", - "primary": "0 0% 9%", - "primary-foreground": "0 0% 98%", - "secondary": "0 0% 96.1%", - "secondary-foreground": "0 0% 9%", - "muted": "0 0% 96.1%", - "muted-foreground": "0 0% 45.1%", - "accent": "0 0% 96.1%", - "accent-foreground": "0 0% 9%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - "border": "0 0% 89.8%", - "input": "0 0% 89.8%", - "ring": "0 0% 3.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "0 0% 3.9%", - "foreground": "0 0% 98%", - "card": "0 0% 3.9%", - "card-foreground": "0 0% 98%", - "popover": "0 0% 3.9%", - "popover-foreground": "0 0% 98%", - "primary": "0 0% 98%", - "primary-foreground": "0 0% 9%", - "secondary": "0 0% 14.9%", - "secondary-foreground": "0 0% 98%", - "muted": "0 0% 14.9%", - "muted-foreground": "0 0% 63.9%", - "accent": "0 0% 14.9%", - "accent-foreground": "0 0% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - "border": "0 0% 14.9%", - "input": "0 0% 14.9%", - "ring": "0 0% 83.1%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - }, - "inlineColorsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n ", - "cssVarsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 0 0% 3.9%;\n --card: 0 0% 100%;\n --card-foreground: 0 0% 3.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 0 0% 3.9%;\n --primary: 0 0% 9%;\n --primary-foreground: 0 0% 98%;\n --secondary: 0 0% 96.1%;\n --secondary-foreground: 0 0% 9%;\n --muted: 0 0% 96.1%;\n --muted-foreground: 0 0% 45.1%;\n --accent: 0 0% 96.1%;\n --accent-foreground: 0 0% 9%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 0 0% 98%;\n --border: 0 0% 89.8%;\n --input: 0 0% 89.8%;\n --ring: 0 0% 3.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 0 0% 3.9%;\n --foreground: 0 0% 98%;\n --card: 0 0% 3.9%;\n --card-foreground: 0 0% 98%;\n --popover: 0 0% 3.9%;\n --popover-foreground: 0 0% 98%;\n --primary: 0 0% 98%;\n --primary-foreground: 0 0% 9%;\n --secondary: 0 0% 14.9%;\n --secondary-foreground: 0 0% 98%;\n --muted: 0 0% 14.9%;\n --muted-foreground: 0 0% 63.9%;\n --accent: 0 0% 14.9%;\n --accent-foreground: 0 0% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 0 0% 98%;\n --border: 0 0% 14.9%;\n --input: 0 0% 14.9%;\n --ring: 0 0% 83.1%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}" -} \ No newline at end of file diff --git a/public/r/colors/slate.json b/public/r/colors/slate.json deleted file mode 100644 index cb5f964c9..000000000 --- a/public/r/colors/slate.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "inlineColors": { - "light": { - "background": "white", - "foreground": "slate-950", - "card": "white", - "card-foreground": "slate-950", - "popover": "white", - "popover-foreground": "slate-950", - "primary": "slate-900", - "primary-foreground": "slate-50", - "secondary": "slate-100", - "secondary-foreground": "slate-900", - "muted": "slate-100", - "muted-foreground": "slate-500", - "accent": "slate-100", - "accent-foreground": "slate-900", - "destructive": "red-500", - "destructive-foreground": "slate-50", - "border": "slate-200", - "input": "slate-200", - "ring": "slate-950" - }, - "dark": { - "background": "slate-950", - "foreground": "slate-50", - "card": "slate-950", - "card-foreground": "slate-50", - "popover": "slate-950", - "popover-foreground": "slate-50", - "primary": "slate-50", - "primary-foreground": "slate-900", - "secondary": "slate-800", - "secondary-foreground": "slate-50", - "muted": "slate-800", - "muted-foreground": "slate-400", - "accent": "slate-800", - "accent-foreground": "slate-50", - "destructive": "red-900", - "destructive-foreground": "slate-50", - "border": "slate-800", - "input": "slate-800", - "ring": "slate-300" - } - }, - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "222.2 84% 4.9%", - "card": "0 0% 100%", - "card-foreground": "222.2 84% 4.9%", - "popover": "0 0% 100%", - "popover-foreground": "222.2 84% 4.9%", - "primary": "222.2 47.4% 11.2%", - "primary-foreground": "210 40% 98%", - "secondary": "210 40% 96.1%", - "secondary-foreground": "222.2 47.4% 11.2%", - "muted": "210 40% 96.1%", - "muted-foreground": "215.4 16.3% 46.9%", - "accent": "210 40% 96.1%", - "accent-foreground": "222.2 47.4% 11.2%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "210 40% 98%", - "border": "214.3 31.8% 91.4%", - "input": "214.3 31.8% 91.4%", - "ring": "222.2 84% 4.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "222.2 84% 4.9%", - "foreground": "210 40% 98%", - "card": "222.2 84% 4.9%", - "card-foreground": "210 40% 98%", - "popover": "222.2 84% 4.9%", - "popover-foreground": "210 40% 98%", - "primary": "210 40% 98%", - "primary-foreground": "222.2 47.4% 11.2%", - "secondary": "217.2 32.6% 17.5%", - "secondary-foreground": "210 40% 98%", - "muted": "217.2 32.6% 17.5%", - "muted-foreground": "215 20.2% 65.1%", - "accent": "217.2 32.6% 17.5%", - "accent-foreground": "210 40% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "210 40% 98%", - "border": "217.2 32.6% 17.5%", - "input": "217.2 32.6% 17.5%", - "ring": "212.7 26.8% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - }, - "inlineColorsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n ", - "cssVarsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}" -} \ No newline at end of file diff --git a/public/r/colors/stone.json b/public/r/colors/stone.json deleted file mode 100644 index 4a793b873..000000000 --- a/public/r/colors/stone.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "inlineColors": { - "light": { - "background": "white", - "foreground": "stone-950", - "card": "white", - "card-foreground": "stone-950", - "popover": "white", - "popover-foreground": "stone-950", - "primary": "stone-900", - "primary-foreground": "stone-50", - "secondary": "stone-100", - "secondary-foreground": "stone-900", - "muted": "stone-100", - "muted-foreground": "stone-500", - "accent": "stone-100", - "accent-foreground": "stone-900", - "destructive": "red-500", - "destructive-foreground": "stone-50", - "border": "stone-200", - "input": "stone-200", - "ring": "stone-950" - }, - "dark": { - "background": "stone-950", - "foreground": "stone-50", - "card": "stone-950", - "card-foreground": "stone-50", - "popover": "stone-950", - "popover-foreground": "stone-50", - "primary": "stone-50", - "primary-foreground": "stone-900", - "secondary": "stone-800", - "secondary-foreground": "stone-50", - "muted": "stone-800", - "muted-foreground": "stone-400", - "accent": "stone-800", - "accent-foreground": "stone-50", - "destructive": "red-900", - "destructive-foreground": "stone-50", - "border": "stone-800", - "input": "stone-800", - "ring": "stone-300" - } - }, - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "20 14.3% 4.1%", - "card": "0 0% 100%", - "card-foreground": "20 14.3% 4.1%", - "popover": "0 0% 100%", - "popover-foreground": "20 14.3% 4.1%", - "primary": "24 9.8% 10%", - "primary-foreground": "60 9.1% 97.8%", - "secondary": "60 4.8% 95.9%", - "secondary-foreground": "24 9.8% 10%", - "muted": "60 4.8% 95.9%", - "muted-foreground": "25 5.3% 44.7%", - "accent": "60 4.8% 95.9%", - "accent-foreground": "24 9.8% 10%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "60 9.1% 97.8%", - "border": "20 5.9% 90%", - "input": "20 5.9% 90%", - "ring": "20 14.3% 4.1%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "20 14.3% 4.1%", - "foreground": "60 9.1% 97.8%", - "card": "20 14.3% 4.1%", - "card-foreground": "60 9.1% 97.8%", - "popover": "20 14.3% 4.1%", - "popover-foreground": "60 9.1% 97.8%", - "primary": "60 9.1% 97.8%", - "primary-foreground": "24 9.8% 10%", - "secondary": "12 6.5% 15.1%", - "secondary-foreground": "60 9.1% 97.8%", - "muted": "12 6.5% 15.1%", - "muted-foreground": "24 5.4% 63.9%", - "accent": "12 6.5% 15.1%", - "accent-foreground": "60 9.1% 97.8%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "60 9.1% 97.8%", - "border": "12 6.5% 15.1%", - "input": "12 6.5% 15.1%", - "ring": "24 5.7% 82.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - }, - "inlineColorsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n ", - "cssVarsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 20 14.3% 4.1%;\n --card: 0 0% 100%;\n --card-foreground: 20 14.3% 4.1%;\n --popover: 0 0% 100%;\n --popover-foreground: 20 14.3% 4.1%;\n --primary: 24 9.8% 10%;\n --primary-foreground: 60 9.1% 97.8%;\n --secondary: 60 4.8% 95.9%;\n --secondary-foreground: 24 9.8% 10%;\n --muted: 60 4.8% 95.9%;\n --muted-foreground: 25 5.3% 44.7%;\n --accent: 60 4.8% 95.9%;\n --accent-foreground: 24 9.8% 10%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 60 9.1% 97.8%;\n --border: 20 5.9% 90%;\n --input: 20 5.9% 90%;\n --ring: 20 14.3% 4.1%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 20 14.3% 4.1%;\n --foreground: 60 9.1% 97.8%;\n --card: 20 14.3% 4.1%;\n --card-foreground: 60 9.1% 97.8%;\n --popover: 20 14.3% 4.1%;\n --popover-foreground: 60 9.1% 97.8%;\n --primary: 60 9.1% 97.8%;\n --primary-foreground: 24 9.8% 10%;\n --secondary: 12 6.5% 15.1%;\n --secondary-foreground: 60 9.1% 97.8%;\n --muted: 12 6.5% 15.1%;\n --muted-foreground: 24 5.4% 63.9%;\n --accent: 12 6.5% 15.1%;\n --accent-foreground: 60 9.1% 97.8%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 60 9.1% 97.8%;\n --border: 12 6.5% 15.1%;\n --input: 12 6.5% 15.1%;\n --ring: 24 5.7% 82.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}" -} \ No newline at end of file diff --git a/public/r/colors/zinc.json b/public/r/colors/zinc.json deleted file mode 100644 index c2f6a18e6..000000000 --- a/public/r/colors/zinc.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "inlineColors": { - "light": { - "background": "white", - "foreground": "zinc-950", - "card": "white", - "card-foreground": "zinc-950", - "popover": "white", - "popover-foreground": "zinc-950", - "primary": "zinc-900", - "primary-foreground": "zinc-50", - "secondary": "zinc-100", - "secondary-foreground": "zinc-900", - "muted": "zinc-100", - "muted-foreground": "zinc-500", - "accent": "zinc-100", - "accent-foreground": "zinc-900", - "destructive": "red-500", - "destructive-foreground": "zinc-50", - "border": "zinc-200", - "input": "zinc-200", - "ring": "zinc-950" - }, - "dark": { - "background": "zinc-950", - "foreground": "zinc-50", - "card": "zinc-950", - "card-foreground": "zinc-50", - "popover": "zinc-950", - "popover-foreground": "zinc-50", - "primary": "zinc-50", - "primary-foreground": "zinc-900", - "secondary": "zinc-800", - "secondary-foreground": "zinc-50", - "muted": "zinc-800", - "muted-foreground": "zinc-400", - "accent": "zinc-800", - "accent-foreground": "zinc-50", - "destructive": "red-900", - "destructive-foreground": "zinc-50", - "border": "zinc-800", - "input": "zinc-800", - "ring": "zinc-300" - } - }, - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "240 10% 3.9%", - "card": "0 0% 100%", - "card-foreground": "240 10% 3.9%", - "popover": "0 0% 100%", - "popover-foreground": "240 10% 3.9%", - "primary": "240 5.9% 10%", - "primary-foreground": "0 0% 98%", - "secondary": "240 4.8% 95.9%", - "secondary-foreground": "240 5.9% 10%", - "muted": "240 4.8% 95.9%", - "muted-foreground": "240 3.8% 46.1%", - "accent": "240 4.8% 95.9%", - "accent-foreground": "240 5.9% 10%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - "border": "240 5.9% 90%", - "input": "240 5.9% 90%", - "ring": "240 10% 3.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "240 10% 3.9%", - "foreground": "0 0% 98%", - "card": "240 10% 3.9%", - "card-foreground": "0 0% 98%", - "popover": "240 10% 3.9%", - "popover-foreground": "0 0% 98%", - "primary": "0 0% 98%", - "primary-foreground": "240 5.9% 10%", - "secondary": "240 3.7% 15.9%", - "secondary-foreground": "0 0% 98%", - "muted": "240 3.7% 15.9%", - "muted-foreground": "240 5% 64.9%", - "accent": "240 3.7% 15.9%", - "accent-foreground": "0 0% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - "border": "240 3.7% 15.9%", - "input": "240 3.7% 15.9%", - "ring": "240 4.9% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - }, - "inlineColorsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n ", - "cssVarsTemplate": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 240 10% 3.9%;\n --card: 0 0% 100%;\n --card-foreground: 240 10% 3.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 240 10% 3.9%;\n --primary: 240 5.9% 10%;\n --primary-foreground: 0 0% 98%;\n --secondary: 240 4.8% 95.9%;\n --secondary-foreground: 240 5.9% 10%;\n --muted: 240 4.8% 95.9%;\n --muted-foreground: 240 3.8% 46.1%;\n --accent: 240 4.8% 95.9%;\n --accent-foreground: 240 5.9% 10%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 0 0% 98%;\n --border: 240 5.9% 90%;\n --input: 240 5.9% 90%;\n --ring: 240 10% 3.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 240 10% 3.9%;\n --foreground: 0 0% 98%;\n --card: 240 10% 3.9%;\n --card-foreground: 0 0% 98%;\n --popover: 240 10% 3.9%;\n --popover-foreground: 0 0% 98%;\n --primary: 0 0% 98%;\n --primary-foreground: 240 5.9% 10%;\n --secondary: 240 3.7% 15.9%;\n --secondary-foreground: 0 0% 98%;\n --muted: 240 3.7% 15.9%;\n --muted-foreground: 240 5% 64.9%;\n --accent: 240 3.7% 15.9%;\n --accent-foreground: 0 0% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 0 0% 98%;\n --border: 240 3.7% 15.9%;\n --input: 240 3.7% 15.9%;\n --ring: 240 4.9% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}" -} \ No newline at end of file diff --git a/public/r/confetti-basic-cannon.json b/public/r/confetti-basic-cannon.json new file mode 100644 index 000000000..351388685 --- /dev/null +++ b/public/r/confetti-basic-cannon.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-basic-cannon", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-basic-cannon.tsx", + "content": "import { ConfettiButton } from \"@/registry/magicui/confetti\";\n\nexport default function ConfettiButtonDemo() {\n return (\n
\n Confetti 🎉\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-custom-shapes.json b/public/r/confetti-custom-shapes.json new file mode 100644 index 000000000..dc32b2de5 --- /dev/null +++ b/public/r/confetti-custom-shapes.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-custom-shapes", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-custom-shapes.tsx", + "content": "import confetti from \"canvas-confetti\";\n\nimport { Button } from \"@/components/ui/button\";\n\nexport default function ConfettiCustomShapes() {\n const handleClick = () => {\n const scalar = 2;\n const triangle = confetti.shapeFromPath({\n path: \"M0 10 L5 0 L10 10z\",\n });\n const square = confetti.shapeFromPath({\n path: \"M0 0 L10 0 L10 10 L0 10 Z\",\n });\n const coin = confetti.shapeFromPath({\n path: \"M5 0 A5 5 0 1 0 5 10 A5 5 0 1 0 5 0 Z\",\n });\n const tree = confetti.shapeFromPath({\n path: \"M5 0 L10 10 L0 10 Z\",\n });\n\n const defaults = {\n spread: 360,\n ticks: 60,\n gravity: 0,\n decay: 0.96,\n startVelocity: 20,\n shapes: [triangle, square, coin, tree],\n scalar,\n };\n\n const shoot = () => {\n confetti({\n ...defaults,\n particleCount: 30,\n });\n\n confetti({\n ...defaults,\n particleCount: 5,\n });\n\n confetti({\n ...defaults,\n particleCount: 15,\n scalar: scalar / 2,\n shapes: [\"circle\"],\n });\n };\n\n setTimeout(shoot, 0);\n setTimeout(shoot, 100);\n setTimeout(shoot, 200);\n };\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-demo.json b/public/r/confetti-demo.json new file mode 100644 index 000000000..610e2de3a --- /dev/null +++ b/public/r/confetti-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-demo.tsx", + "content": "\"use client\";\n\nimport { useRef } from \"react\";\n\nimport { Confetti, type ConfettiRef } from \"@/registry/magicui/confetti\";\n\nexport default function ConfettiDemo() {\n const confettiRef = useRef(null);\n\n return (\n
\n \n Confetti\n \n\n {\n confettiRef.current?.fire({});\n }}\n />\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-emoji.json b/public/r/confetti-emoji.json new file mode 100644 index 000000000..5208bde1f --- /dev/null +++ b/public/r/confetti-emoji.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-emoji", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-emoji.tsx", + "content": "import confetti from \"canvas-confetti\";\n\nimport { Button } from \"@/components/ui/button\";\n\nexport default function ConfettiEmoji() {\n const handleClick = () => {\n const scalar = 2;\n const unicorn = confetti.shapeFromText({ text: \"🦄\", scalar });\n\n const defaults = {\n spread: 360,\n ticks: 60,\n gravity: 0,\n decay: 0.96,\n startVelocity: 20,\n shapes: [unicorn],\n scalar,\n };\n\n const shoot = () => {\n confetti({\n ...defaults,\n particleCount: 30,\n });\n\n confetti({\n ...defaults,\n particleCount: 5,\n });\n\n confetti({\n ...defaults,\n particleCount: 15,\n scalar: scalar / 2,\n shapes: [\"circle\"],\n });\n };\n\n setTimeout(shoot, 0);\n setTimeout(shoot, 100);\n setTimeout(shoot, 200);\n };\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-fireworks.json b/public/r/confetti-fireworks.json new file mode 100644 index 000000000..b9b7604f2 --- /dev/null +++ b/public/r/confetti-fireworks.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-fireworks", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-fireworks.tsx", + "content": "import confetti from \"canvas-confetti\";\n\nimport { Button } from \"@/components/ui/button\";\n\nexport default function ConfettiFireworks() {\n const handleClick = () => {\n const duration = 5 * 1000;\n const animationEnd = Date.now() + duration;\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 };\n\n const randomInRange = (min: number, max: number) =>\n Math.random() * (max - min) + min;\n\n const interval = window.setInterval(() => {\n const timeLeft = animationEnd - Date.now();\n\n if (timeLeft <= 0) {\n return clearInterval(interval);\n }\n\n const particleCount = 50 * (timeLeft / duration);\n confetti({\n ...defaults,\n particleCount,\n origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n });\n confetti({\n ...defaults,\n particleCount,\n origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n });\n }, 250);\n };\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-random-direction.json b/public/r/confetti-random-direction.json new file mode 100644 index 000000000..1dadf7e31 --- /dev/null +++ b/public/r/confetti-random-direction.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-random-direction", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-random-direction.tsx", + "content": "import { ConfettiButton } from \"@/registry/magicui/confetti\";\n\nexport default function ConfettiButtonDemo() {\n return (\n
\n \n Random Confetti 🎉\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-side-cannons.json b/public/r/confetti-side-cannons.json new file mode 100644 index 000000000..6430e6528 --- /dev/null +++ b/public/r/confetti-side-cannons.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-side-cannons", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-side-cannons.tsx", + "content": "import confetti from \"canvas-confetti\";\n\nimport { Button } from \"@/components/ui/button\";\n\nexport default function ConfettiSideCannons() {\n const handleClick = () => {\n const end = Date.now() + 3 * 1000; // 3 seconds\n const colors = [\"#a786ff\", \"#fd8bbc\", \"#eca184\", \"#f8deb1\"];\n\n const frame = () => {\n if (Date.now() > end) return;\n\n confetti({\n particleCount: 2,\n angle: 60,\n spread: 55,\n startVelocity: 60,\n origin: { x: 0, y: 0.5 },\n colors: colors,\n });\n confetti({\n particleCount: 2,\n angle: 120,\n spread: 55,\n startVelocity: 60,\n origin: { x: 1, y: 0.5 },\n colors: colors,\n });\n\n requestAnimationFrame(frame);\n };\n\n frame();\n };\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/confetti-stars.json b/public/r/confetti-stars.json new file mode 100644 index 000000000..a89ad7fa4 --- /dev/null +++ b/public/r/confetti-stars.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "confetti-stars", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-stars.tsx", + "content": "import confetti from \"canvas-confetti\";\n\nimport { Button } from \"@/components/ui/button\";\n\nexport default function ConfettiStars() {\n const handleClick = () => {\n const defaults = {\n spread: 360,\n ticks: 50,\n gravity: 0,\n decay: 0.94,\n startVelocity: 30,\n colors: [\"#FFE400\", \"#FFBD00\", \"#E89400\", \"#FFCA6C\", \"#FDFFB8\"],\n };\n\n const shoot = () => {\n confetti({\n ...defaults,\n particleCount: 40,\n scalar: 1.2,\n shapes: [\"star\"],\n });\n\n confetti({\n ...defaults,\n particleCount: 10,\n scalar: 0.75,\n shapes: [\"circle\"],\n });\n };\n\n setTimeout(shoot, 0);\n setTimeout(shoot, 100);\n setTimeout(shoot, 200);\n };\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/confetti.json b/public/r/confetti.json similarity index 92% rename from public/r/styles/default/confetti.json rename to public/r/confetti.json index 08d33356b..c0369dbed 100644 --- a/public/r/styles/default/confetti.json +++ b/public/r/confetti.json @@ -1,6 +1,9 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "confetti", - "type": "registry:ui", + "type": "registry:component", + "title": "Confetti", + "description": "Confetti animations are best used to delight your users when something special happens", "dependencies": [ "canvas-confetti", "@types/canvas-confetti" @@ -10,10 +13,9 @@ ], "files": [ { - "path": "magicui/confetti.tsx", + "path": "registry/magicui/confetti.tsx", "content": "import type {\n GlobalOptions as ConfettiGlobalOptions,\n CreateTypes as ConfettiInstance,\n Options as ConfettiOptions,\n} from \"canvas-confetti\";\nimport confetti from \"canvas-confetti\";\nimport type { ReactNode } from \"react\";\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { Button, ButtonProps } from \"@/components/ui/button\";\n\ntype Api = {\n fire: (options?: ConfettiOptions) => void;\n};\n\ntype Props = React.ComponentPropsWithRef<\"canvas\"> & {\n options?: ConfettiOptions;\n globalOptions?: ConfettiGlobalOptions;\n manualstart?: boolean;\n children?: ReactNode;\n};\n\nexport type ConfettiRef = Api | null;\n\nconst ConfettiContext = createContext({} as Api);\n\n// Define component first\nconst ConfettiComponent = forwardRef((props, ref) => {\n const {\n options,\n globalOptions = { resize: true, useWorker: true },\n manualstart = false,\n children,\n ...rest\n } = props;\n const instanceRef = useRef(null);\n\n const canvasRef = useCallback(\n (node: HTMLCanvasElement) => {\n if (node !== null) {\n if (instanceRef.current) return;\n instanceRef.current = confetti.create(node, {\n ...globalOptions,\n resize: true,\n });\n } else {\n if (instanceRef.current) {\n instanceRef.current.reset();\n instanceRef.current = null;\n }\n }\n },\n [globalOptions],\n );\n\n const fire = useCallback(\n async (opts = {}) => {\n try {\n await instanceRef.current?.({ ...options, ...opts });\n } catch (error) {\n console.error(\"Confetti error:\", error);\n }\n },\n [options],\n );\n\n const api = useMemo(\n () => ({\n fire,\n }),\n [fire],\n );\n\n useImperativeHandle(ref, () => api, [api]);\n\n useEffect(() => {\n if (!manualstart) {\n (async () => {\n try {\n await fire();\n } catch (error) {\n console.error(\"Confetti effect error:\", error);\n }\n })();\n }\n }, [manualstart, fire]);\n\n return (\n \n \n {children}\n \n );\n});\n\n// Set display name immediately\nConfettiComponent.displayName = \"Confetti\";\n\n// Export as Confetti\nexport const Confetti = ConfettiComponent;\n\ninterface ConfettiButtonProps extends ButtonProps {\n options?: ConfettiOptions &\n ConfettiGlobalOptions & { canvas?: HTMLCanvasElement };\n children?: React.ReactNode;\n}\n\nconst ConfettiButtonComponent = ({\n options,\n children,\n ...props\n}: ConfettiButtonProps) => {\n const handleClick = async (event: React.MouseEvent) => {\n try {\n const rect = event.currentTarget.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n await confetti({\n ...options,\n origin: {\n x: x / window.innerWidth,\n y: y / window.innerHeight,\n },\n });\n } catch (error) {\n console.error(\"Confetti button error:\", error);\n }\n };\n\n return (\n \n );\n};\n\nConfettiButtonComponent.displayName = \"ConfettiButton\";\n\nexport const ConfettiButton = ConfettiButtonComponent;\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/cool-mode-custom.json b/public/r/cool-mode-custom.json new file mode 100644 index 000000000..47aea930c --- /dev/null +++ b/public/r/cool-mode-custom.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "cool-mode-custom", + "type": "registry:component", + "files": [ + { + "path": "registry/example/cool-mode-custom.tsx", + "content": "import { Button } from \"@/components/ui/button\";\nimport { CoolMode } from \"@/registry/magicui/cool-mode\";\n\nexport default function CoolModeCustom() {\n return (\n
\n \n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/cool-mode-demo.json b/public/r/cool-mode-demo.json new file mode 100644 index 000000000..4b35db44b --- /dev/null +++ b/public/r/cool-mode-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "cool-mode-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/cool-mode-demo.tsx", + "content": "import { Button } from \"@/components/ui/button\";\nimport { CoolMode } from \"@/registry/magicui/cool-mode\";\n\nexport default function CoolModeDemo() {\n return (\n
\n \n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/cool-mode.json b/public/r/cool-mode.json similarity index 96% rename from public/r/styles/default/cool-mode.json rename to public/r/cool-mode.json index c31624243..8a4cebfaf 100644 --- a/public/r/styles/default/cool-mode.json +++ b/public/r/cool-mode.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "cool-mode", - "type": "registry:ui", + "type": "registry:component", + "title": "Cool Mode", + "description": "Cool mode effect for buttons, links, and other DOMs", "files": [ { - "path": "magicui/cool-mode.tsx", + "path": "registry/magicui/cool-mode.tsx", "content": "import React, { ReactNode, RefObject, useEffect, useRef } from \"react\";\n\nexport interface BaseParticle {\n element: HTMLElement | SVGSVGElement;\n left: number;\n size: number;\n top: number;\n}\n\nexport interface BaseParticleOptions {\n particle?: string;\n size?: number;\n}\n\nexport interface CoolParticle extends BaseParticle {\n direction: number;\n speedHorz: number;\n speedUp: number;\n spinSpeed: number;\n spinVal: number;\n}\n\nexport interface CoolParticleOptions extends BaseParticleOptions {\n particleCount?: number;\n speedHorz?: number;\n speedUp?: number;\n}\n\nconst getContainer = () => {\n const id = \"_coolMode_effect\";\n let existingContainer = document.getElementById(id);\n\n if (existingContainer) {\n return existingContainer;\n }\n\n const container = document.createElement(\"div\");\n container.setAttribute(\"id\", id);\n container.setAttribute(\n \"style\",\n \"overflow:hidden; position:fixed; height:100%; top:0; left:0; right:0; bottom:0; pointer-events:none; z-index:2147483647\",\n );\n\n document.body.appendChild(container);\n\n return container;\n};\n\nlet instanceCounter = 0;\n\nconst applyParticleEffect = (\n element: HTMLElement,\n options?: CoolParticleOptions,\n): (() => void) => {\n instanceCounter++;\n\n const defaultParticle = \"circle\";\n const particleType = options?.particle || defaultParticle;\n const sizes = [15, 20, 25, 35, 45];\n const limit = 45;\n\n let particles: CoolParticle[] = [];\n let autoAddParticle = false;\n let mouseX = 0;\n let mouseY = 0;\n\n const container = getContainer();\n\n function generateParticle() {\n const size =\n options?.size || sizes[Math.floor(Math.random() * sizes.length)];\n const speedHorz = options?.speedHorz || Math.random() * 10;\n const speedUp = options?.speedUp || Math.random() * 25;\n const spinVal = Math.random() * 360;\n const spinSpeed = Math.random() * 35 * (Math.random() <= 0.5 ? -1 : 1);\n const top = mouseY - size / 2;\n const left = mouseX - size / 2;\n const direction = Math.random() <= 0.5 ? -1 : 1;\n\n const particle = document.createElement(\"div\");\n\n if (particleType === \"circle\") {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const circleSVG = document.createElementNS(svgNS, \"svg\");\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttributeNS(null, \"cx\", (size / 2).toString());\n circle.setAttributeNS(null, \"cy\", (size / 2).toString());\n circle.setAttributeNS(null, \"r\", (size / 2).toString());\n circle.setAttributeNS(\n null,\n \"fill\",\n `hsl(${Math.random() * 360}, 70%, 50%)`,\n );\n\n circleSVG.appendChild(circle);\n circleSVG.setAttribute(\"width\", size.toString());\n circleSVG.setAttribute(\"height\", size.toString());\n\n particle.appendChild(circleSVG);\n } else {\n particle.innerHTML = ``;\n }\n\n particle.style.position = \"absolute\";\n particle.style.transform = `translate3d(${left}px, ${top}px, 0px) rotate(${spinVal}deg)`;\n\n container.appendChild(particle);\n\n particles.push({\n direction,\n element: particle,\n left,\n size,\n speedHorz,\n speedUp,\n spinSpeed,\n spinVal,\n top,\n });\n }\n\n function refreshParticles() {\n particles.forEach((p) => {\n p.left = p.left - p.speedHorz * p.direction;\n p.top = p.top - p.speedUp;\n p.speedUp = Math.min(p.size, p.speedUp - 1);\n p.spinVal = p.spinVal + p.spinSpeed;\n\n if (\n p.top >=\n Math.max(window.innerHeight, document.body.clientHeight) + p.size\n ) {\n particles = particles.filter((o) => o !== p);\n p.element.remove();\n }\n\n p.element.setAttribute(\n \"style\",\n [\n \"position:absolute\",\n \"will-change:transform\",\n `top:${p.top}px`,\n `left:${p.left}px`,\n `transform:rotate(${p.spinVal}deg)`,\n ].join(\";\"),\n );\n });\n }\n\n let animationFrame: number | undefined;\n\n let lastParticleTimestamp = 0;\n const particleGenerationDelay = 30;\n\n function loop() {\n const currentTime = performance.now();\n if (\n autoAddParticle &&\n particles.length < limit &&\n currentTime - lastParticleTimestamp > particleGenerationDelay\n ) {\n generateParticle();\n lastParticleTimestamp = currentTime;\n }\n\n refreshParticles();\n animationFrame = requestAnimationFrame(loop);\n }\n\n loop();\n\n const isTouchInteraction = \"ontouchstart\" in window;\n\n const tap = isTouchInteraction ? \"touchstart\" : \"mousedown\";\n const tapEnd = isTouchInteraction ? \"touchend\" : \"mouseup\";\n const move = isTouchInteraction ? \"touchmove\" : \"mousemove\";\n\n const updateMousePosition = (e: MouseEvent | TouchEvent) => {\n if (\"touches\" in e) {\n mouseX = e.touches?.[0].clientX;\n mouseY = e.touches?.[0].clientY;\n } else {\n mouseX = e.clientX;\n mouseY = e.clientY;\n }\n };\n\n const tapHandler = (e: MouseEvent | TouchEvent) => {\n updateMousePosition(e);\n autoAddParticle = true;\n };\n\n const disableAutoAddParticle = () => {\n autoAddParticle = false;\n };\n\n element.addEventListener(move, updateMousePosition, { passive: true });\n element.addEventListener(tap, tapHandler, { passive: true });\n element.addEventListener(tapEnd, disableAutoAddParticle, { passive: true });\n element.addEventListener(\"mouseleave\", disableAutoAddParticle, {\n passive: true,\n });\n\n return () => {\n element.removeEventListener(move, updateMousePosition);\n element.removeEventListener(tap, tapHandler);\n element.removeEventListener(tapEnd, disableAutoAddParticle);\n element.removeEventListener(\"mouseleave\", disableAutoAddParticle);\n\n const interval = setInterval(() => {\n if (animationFrame && particles.length === 0) {\n cancelAnimationFrame(animationFrame);\n clearInterval(interval);\n\n if (--instanceCounter === 0) {\n container.remove();\n }\n }\n }, 500);\n };\n};\n\ninterface CoolModeProps {\n children: ReactNode;\n options?: CoolParticleOptions;\n}\n\nexport const CoolMode: React.FC = ({ children, options }) => {\n const ref = useRef(null);\n\n useEffect(() => {\n if (ref.current) {\n return applyParticleEffect(ref.current, options);\n }\n }, [options]);\n\n return React.cloneElement(children as React.ReactElement, { ref });\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/dock-demo-2.json b/public/r/dock-demo-2.json new file mode 100644 index 000000000..e07293ef3 --- /dev/null +++ b/public/r/dock-demo-2.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dock-demo-2", + "type": "registry:component", + "registryDependencies": [ + "dock" + ], + "files": [ + { + "path": "registry/example/dock-demo-2.tsx", + "content": "\"use client\";\n\nimport React from \"react\";\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\";\n\nexport type IconProps = React.HTMLAttributes;\n\nexport default function DockDemo() {\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nconst Icons = {\n gitHub: (props: IconProps) => (\n \n
\n \n ),\n notion: (props: IconProps) => (\n \n \n \n \n ),\n googleDrive: (props: IconProps) => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: (props: IconProps) => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/dock-demo-3.json b/public/r/dock-demo-3.json new file mode 100644 index 000000000..e9bfaf3cc --- /dev/null +++ b/public/r/dock-demo-3.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dock-demo-3", + "type": "registry:component", + "registryDependencies": [ + "dock" + ], + "files": [ + { + "path": "registry/example/dock-demo-3.tsx", + "content": "\"use client\";\n\nimport React from \"react\";\n\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\";\n\nexport type IconProps = React.HTMLAttributes;\n\nexport default function DockDemo() {\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nconst Icons = {\n gitHub: (props: IconProps) => (\n \n
\n \n ),\n notion: (props: IconProps) => (\n \n \n \n \n ),\n googleDrive: (props: IconProps) => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: (props: IconProps) => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/dock-demo.json b/public/r/dock-demo.json new file mode 100644 index 000000000..d3577b13c --- /dev/null +++ b/public/r/dock-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dock-demo", + "type": "registry:component", + "registryDependencies": [ + "dock" + ], + "files": [ + { + "path": "registry/example/dock-demo.tsx", + "content": "\"use client\";\n\nimport { CalendarIcon, HomeIcon, MailIcon, PencilIcon } from \"lucide-react\";\nimport Link from \"next/link\";\nimport React from \"react\";\n\nimport { ModeToggle } from \"@/components/mode-toggle\";\nimport { buttonVariants } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\nimport { Dock, DockIcon } from \"@/registry/magicui/dock\";\n\nexport type IconProps = React.HTMLAttributes;\n\nconst Icons = {\n calendar: (props: IconProps) => ,\n email: (props: IconProps) => ,\n linkedin: (props: IconProps) => (\n \n LinkedIn\n \n \n ),\n x: (props: IconProps) => (\n \n X\n \n \n ),\n youtube: (props: IconProps) => (\n \n youtube\n \n \n ),\n github: (props: IconProps) => (\n \n \n \n ),\n};\n\nconst DATA = {\n navbar: [\n { href: \"#\", icon: HomeIcon, label: \"Home\" },\n { href: \"#\", icon: PencilIcon, label: \"Blog\" },\n ],\n contact: {\n social: {\n GitHub: {\n name: \"GitHub\",\n url: \"#\",\n icon: Icons.github,\n },\n LinkedIn: {\n name: \"LinkedIn\",\n url: \"#\",\n icon: Icons.linkedin,\n },\n X: {\n name: \"X\",\n url: \"#\",\n icon: Icons.x,\n },\n email: {\n name: \"Send Email\",\n url: \"#\",\n icon: Icons.email,\n },\n },\n },\n};\n\nexport default function DockDemo() {\n return (\n
\n \n Dock\n \n \n \n {DATA.navbar.map((item) => (\n \n \n \n \n \n \n \n \n

{item.label}

\n
\n
\n
\n ))}\n \n {Object.entries(DATA.contact.social).map(([name, social]) => (\n \n \n \n \n \n \n \n \n

{name}

\n
\n
\n
\n ))}\n \n \n \n \n \n \n \n

Theme

\n
\n
\n
\n
\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/dock.json b/public/r/dock.json similarity index 92% rename from public/r/styles/default/dock.json rename to public/r/dock.json index 76c5190eb..e2bf7df79 100644 --- a/public/r/styles/default/dock.json +++ b/public/r/dock.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "dock", - "type": "registry:ui", + "type": "registry:component", + "title": "Dock", + "description": "An implementation of the MacOS dock using react + tailwindcss + framer motion", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/dock.tsx", + "path": "registry/magicui/dock.tsx", "content": "\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport {\n motion,\n MotionProps,\n MotionValue,\n useMotionValue,\n useSpring,\n useTransform,\n} from \"motion/react\";\nimport React, { PropsWithChildren, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface DockProps extends VariantProps {\n className?: string;\n iconSize?: number;\n iconMagnification?: number;\n iconDistance?: number;\n direction?: \"top\" | \"middle\" | \"bottom\";\n children: React.ReactNode;\n}\n\nconst DEFAULT_SIZE = 40;\nconst DEFAULT_MAGNIFICATION = 60;\nconst DEFAULT_DISTANCE = 140;\n\nconst dockVariants = cva(\n \"supports-backdrop-blur:bg-white/10 supports-backdrop-blur:dark:bg-black/10 mx-auto mt-8 flex h-[58px] w-max items-center justify-center gap-2 rounded-2xl border p-2 backdrop-blur-md\",\n);\n\nconst Dock = React.forwardRef(\n (\n {\n className,\n children,\n iconSize = DEFAULT_SIZE,\n iconMagnification = DEFAULT_MAGNIFICATION,\n iconDistance = DEFAULT_DISTANCE,\n direction = \"middle\",\n ...props\n },\n ref,\n ) => {\n const mouseX = useMotionValue(Infinity);\n\n const renderChildren = () => {\n return React.Children.map(children, (child) => {\n if (React.isValidElement(child) && child.type === DockIcon) {\n return React.cloneElement(child, {\n ...child.props,\n mouseX: mouseX,\n size: iconSize,\n magnification: iconMagnification,\n distance: iconDistance,\n });\n }\n return child;\n });\n };\n\n return (\n mouseX.set(e.pageX)}\n onMouseLeave={() => mouseX.set(Infinity)}\n {...props}\n className={cn(dockVariants({ className }), {\n \"items-start\": direction === \"top\",\n \"items-center\": direction === \"middle\",\n \"items-end\": direction === \"bottom\",\n })}\n >\n {renderChildren()}\n \n );\n },\n);\n\nDock.displayName = \"Dock\";\n\nexport interface DockIconProps\n extends Omit, \"children\"> {\n size?: number;\n magnification?: number;\n distance?: number;\n mouseX?: MotionValue;\n className?: string;\n children?: React.ReactNode;\n props?: PropsWithChildren;\n}\n\nconst DockIcon = ({\n size = DEFAULT_SIZE,\n magnification = DEFAULT_MAGNIFICATION,\n distance = DEFAULT_DISTANCE,\n mouseX,\n className,\n children,\n ...props\n}: DockIconProps) => {\n const ref = useRef(null);\n const padding = Math.max(6, size * 0.2);\n const defaultMouseX = useMotionValue(Infinity);\n\n const distanceCalc = useTransform(mouseX ?? defaultMouseX, (val: number) => {\n const bounds = ref.current?.getBoundingClientRect() ?? { x: 0, width: 0 };\n return val - bounds.x - bounds.width / 2;\n });\n\n const sizeTransform = useTransform(\n distanceCalc,\n [-distance, 0, distance],\n [size, magnification, size],\n );\n\n const scaleSize = useSpring(sizeTransform, {\n mass: 0.1,\n stiffness: 150,\n damping: 12,\n });\n\n return (\n \n {children}\n \n );\n};\n\nDockIcon.displayName = \"DockIcon\";\n\nexport { Dock, DockIcon, dockVariants };\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/dot-pattern-demo.json b/public/r/dot-pattern-demo.json new file mode 100644 index 000000000..864b486be --- /dev/null +++ b/public/r/dot-pattern-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dot-pattern-demo", + "type": "registry:component", + "registryDependencies": [ + "dot-pattern" + ], + "files": [ + { + "path": "registry/example/dot-pattern-demo.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\";\n\nexport default function DotPatternDemo() {\n return (\n
\n

\n Dot Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/dot-pattern-linear-gradient.json b/public/r/dot-pattern-linear-gradient.json new file mode 100644 index 000000000..abb8cf4b4 --- /dev/null +++ b/public/r/dot-pattern-linear-gradient.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "dot-pattern-linear-gradient", + "type": "registry:component", + "registryDependencies": [ + "dot-pattern" + ], + "files": [ + { + "path": "registry/example/dot-pattern-linear-gradient.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { DotPattern } from \"@/registry/magicui/dot-pattern\";\n\nexport default function DotPatternLinearGradient() {\n return (\n
\n

\n Dot Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/dot-pattern.json b/public/r/dot-pattern.json similarity index 80% rename from public/r/styles/default/dot-pattern.json rename to public/r/dot-pattern.json index ca945fdba..a06a3f0cb 100644 --- a/public/r/styles/default/dot-pattern.json +++ b/public/r/dot-pattern.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "dot-pattern", - "type": "registry:ui", + "type": "registry:component", + "title": "Dot Pattern", + "description": "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { - "path": "magicui/dot-pattern.tsx", + "path": "registry/magicui/dot-pattern.tsx", "content": "import { useId } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface DotPatternProps extends React.SVGProps {\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n cx?: number;\n cy?: number;\n cr?: number;\n className?: string;\n [key: string]: unknown;\n}\nexport function DotPattern({\n width = 16,\n height = 16,\n x = 0,\n y = 0,\n cx = 1,\n cy = 1,\n cr = 1,\n className,\n ...props\n}: DotPatternProps) {\n const id = useId();\n\n return (\n \n \n \n \n \n \n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/file-tree-demo.json b/public/r/file-tree-demo.json new file mode 100644 index 000000000..9a0465b41 --- /dev/null +++ b/public/r/file-tree-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "file-tree-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/file-tree-demo.tsx", + "content": "import { File, Folder, Tree } from \"@/registry/magicui/file-tree\";\n\nexport default function FileTreeDemo() {\n return (\n
\n \n \n \n \n

layout.tsx

\n
\n \n

page.tsx

\n
\n
\n \n \n \n

button.tsx

\n
\n
\n \n

header.tsx

\n
\n \n

footer.tsx

\n
\n
\n \n \n

utils.ts

\n
\n
\n
\n \n
\n );\n}\n\nconst ELEMENTS = [\n {\n id: \"1\",\n isSelectable: true,\n name: \"src\",\n children: [\n {\n id: \"2\",\n isSelectable: true,\n name: \"app\",\n children: [\n {\n id: \"3\",\n isSelectable: true,\n name: \"layout.tsx\",\n },\n {\n id: \"4\",\n isSelectable: true,\n name: \"page.tsx\",\n },\n ],\n },\n {\n id: \"5\",\n isSelectable: true,\n name: \"components\",\n children: [\n {\n id: \"6\",\n isSelectable: true,\n name: \"header.tsx\",\n },\n {\n id: \"7\",\n isSelectable: true,\n name: \"footer.tsx\",\n },\n ],\n },\n {\n id: \"8\",\n isSelectable: true,\n name: \"lib\",\n children: [\n {\n id: \"9\",\n isSelectable: true,\n name: \"utils.ts\",\n },\n ],\n },\n ],\n },\n];\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/file-tree.json b/public/r/file-tree.json similarity index 97% rename from public/r/styles/default/file-tree.json rename to public/r/file-tree.json index 0e2a4df5a..71cce05f0 100644 --- a/public/r/styles/default/file-tree.json +++ b/public/r/file-tree.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "file-tree", - "type": "registry:ui", + "type": "registry:component", + "title": "File Tree", + "description": "A component used to showcase the folder and file structure of a directory.", "files": [ { - "path": "magicui/file-tree.tsx", + "path": "registry/magicui/file-tree.tsx", "content": "\"use client\";\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport { FileIcon, FolderIcon, FolderOpenIcon } from \"lucide-react\";\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { cn } from \"@/lib/utils\";\n\ntype TreeViewElement = {\n id: string;\n name: string;\n isSelectable?: boolean;\n children?: TreeViewElement[];\n};\n\ntype TreeContextProps = {\n selectedId: string | undefined;\n expandedItems: string[] | undefined;\n indicator: boolean;\n handleExpand: (id: string) => void;\n selectItem: (id: string) => void;\n setExpandedItems?: React.Dispatch>;\n openIcon?: React.ReactNode;\n closeIcon?: React.ReactNode;\n direction: \"rtl\" | \"ltr\";\n};\n\nconst TreeContext = createContext(null);\n\nconst useTree = () => {\n const context = useContext(TreeContext);\n if (!context) {\n throw new Error(\"useTree must be used within a TreeProvider\");\n }\n return context;\n};\n\ninterface TreeViewComponentProps extends React.HTMLAttributes {}\n\ntype Direction = \"rtl\" | \"ltr\" | undefined;\n\ntype TreeViewProps = {\n initialSelectedId?: string;\n indicator?: boolean;\n elements?: TreeViewElement[];\n initialExpandedItems?: string[];\n openIcon?: React.ReactNode;\n closeIcon?: React.ReactNode;\n} & TreeViewComponentProps;\n\nconst Tree = forwardRef(\n (\n {\n className,\n elements,\n initialSelectedId,\n initialExpandedItems,\n children,\n indicator = true,\n openIcon,\n closeIcon,\n dir,\n ...props\n },\n ref,\n ) => {\n const [selectedId, setSelectedId] = useState(\n initialSelectedId,\n );\n const [expandedItems, setExpandedItems] = useState(\n initialExpandedItems,\n );\n\n const selectItem = useCallback((id: string) => {\n setSelectedId(id);\n }, []);\n\n const handleExpand = useCallback((id: string) => {\n setExpandedItems((prev) => {\n if (prev?.includes(id)) {\n return prev.filter((item) => item !== id);\n }\n return [...(prev ?? []), id];\n });\n }, []);\n\n const expandSpecificTargetedElements = useCallback(\n (elements?: TreeViewElement[], selectId?: string) => {\n if (!elements || !selectId) return;\n const findParent = (\n currentElement: TreeViewElement,\n currentPath: string[] = [],\n ) => {\n const isSelectable = currentElement.isSelectable ?? true;\n const newPath = [...currentPath, currentElement.id];\n if (currentElement.id === selectId) {\n if (isSelectable) {\n setExpandedItems((prev) => [...(prev ?? []), ...newPath]);\n } else {\n if (newPath.includes(currentElement.id)) {\n newPath.pop();\n setExpandedItems((prev) => [...(prev ?? []), ...newPath]);\n }\n }\n return;\n }\n if (\n isSelectable &&\n currentElement.children &&\n currentElement.children.length > 0\n ) {\n currentElement.children.forEach((child) => {\n findParent(child, newPath);\n });\n }\n };\n elements.forEach((element) => {\n findParent(element);\n });\n },\n [],\n );\n\n useEffect(() => {\n if (initialSelectedId) {\n expandSpecificTargetedElements(elements, initialSelectedId);\n }\n }, [initialSelectedId, elements]);\n\n const direction = dir === \"rtl\" ? \"rtl\" : \"ltr\";\n\n return (\n \n
\n \n \n setExpandedItems((prev) => [...(prev ?? []), value[0]])\n }\n dir={dir as Direction}\n >\n {children}\n \n \n
\n \n );\n },\n);\n\nTree.displayName = \"Tree\";\n\nconst TreeIndicator = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes\n>(({ className, ...props }, ref) => {\n const { direction } = useTree();\n\n return (\n \n );\n});\n\nTreeIndicator.displayName = \"TreeIndicator\";\n\ninterface FolderComponentProps\n extends React.ComponentPropsWithoutRef {}\n\ntype FolderProps = {\n expandedItems?: string[];\n element: string;\n isSelectable?: boolean;\n isSelect?: boolean;\n} & FolderComponentProps;\n\nconst Folder = forwardRef<\n HTMLDivElement,\n FolderProps & React.HTMLAttributes\n>(\n (\n {\n className,\n element,\n value,\n isSelectable = true,\n isSelect,\n children,\n ...props\n },\n ref,\n ) => {\n const {\n direction,\n handleExpand,\n expandedItems,\n indicator,\n setExpandedItems,\n openIcon,\n closeIcon,\n } = useTree();\n\n return (\n \n handleExpand(value)}\n >\n {expandedItems?.includes(value)\n ? (openIcon ?? )\n : (closeIcon ?? )}\n {element}\n \n \n {element && indicator && }\n {\n setExpandedItems?.((prev) => [...(prev ?? []), value[0]]);\n }}\n >\n {children}\n \n \n \n );\n },\n);\n\nFolder.displayName = \"Folder\";\n\nconst File = forwardRef<\n HTMLButtonElement,\n {\n value: string;\n handleSelect?: (id: string) => void;\n isSelectable?: boolean;\n isSelect?: boolean;\n fileIcon?: React.ReactNode;\n } & React.ButtonHTMLAttributes\n>(\n (\n {\n value,\n className,\n handleSelect,\n isSelectable = true,\n isSelect,\n fileIcon,\n children,\n ...props\n },\n ref,\n ) => {\n const { direction, selectedId, selectItem } = useTree();\n const isSelected = isSelect ?? selectedId === value;\n return (\n selectItem(value)}\n {...props}\n >\n {fileIcon ?? }\n {children}\n \n );\n },\n);\n\nFile.displayName = \"File\";\n\nconst CollapseButton = forwardRef<\n HTMLButtonElement,\n {\n elements: TreeViewElement[];\n expandAll?: boolean;\n } & React.HTMLAttributes\n>(({ className, elements, expandAll = false, children, ...props }, ref) => {\n const { expandedItems, setExpandedItems } = useTree();\n\n const expendAllTree = useCallback((elements: TreeViewElement[]) => {\n const expandTree = (element: TreeViewElement) => {\n const isSelectable = element.isSelectable ?? true;\n if (isSelectable && element.children && element.children.length > 0) {\n setExpandedItems?.((prev) => [...(prev ?? []), element.id]);\n element.children.forEach(expandTree);\n }\n };\n\n elements.forEach(expandTree);\n }, []);\n\n const closeAll = useCallback(() => {\n setExpandedItems?.([]);\n }, []);\n\n useEffect(() => {\n console.log(expandAll);\n if (expandAll) {\n expendAllTree(elements);\n }\n }, [expandAll]);\n\n return (\n 0\n ? closeAll\n : () => expendAllTree(elements)\n }\n ref={ref}\n {...props}\n >\n {children}\n Toggle\n \n );\n});\n\nCollapseButton.displayName = \"CollapseButton\";\n\nexport { CollapseButton, File, Folder, Tree, type TreeViewElement };\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/flickering-grid-demo.json b/public/r/flickering-grid-demo.json new file mode 100644 index 000000000..0ee254456 --- /dev/null +++ b/public/r/flickering-grid-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "flickering-grid-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/flickering-grid-demo.tsx", + "content": "import { FlickeringGrid } from \"@/registry/magicui/flickering-grid\";\n\nexport default function FlickeringGridDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/flickering-grid-rounded-demo.json b/public/r/flickering-grid-rounded-demo.json new file mode 100644 index 000000000..23055414f --- /dev/null +++ b/public/r/flickering-grid-rounded-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "flickering-grid-rounded-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/flickering-grid-rounded-demo.tsx", + "content": "import { FlickeringGrid } from \"@/registry/magicui/flickering-grid\";\n\nexport default function FlickeringGridRoundedDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/flickering-grid.json b/public/r/flickering-grid.json similarity index 94% rename from public/r/styles/default/flickering-grid.json rename to public/r/flickering-grid.json index 9a518812b..be6caef25 100644 --- a/public/r/styles/default/flickering-grid.json +++ b/public/r/flickering-grid.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "flickering-grid", - "type": "registry:ui", + "type": "registry:component", + "title": "Flickering Grid", + "description": "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", "files": [ { - "path": "magicui/flickering-grid.tsx", + "path": "registry/magicui/flickering-grid.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface FlickeringGridProps extends React.HTMLAttributes {\n squareSize?: number;\n gridGap?: number;\n flickerChance?: number;\n color?: string;\n width?: number;\n height?: number;\n className?: string;\n maxOpacity?: number;\n}\n\nexport const FlickeringGrid: React.FC = ({\n squareSize = 4,\n gridGap = 6,\n flickerChance = 0.3,\n color = \"rgb(0, 0, 0)\",\n width,\n height,\n className,\n maxOpacity = 0.3,\n ...props\n}) => {\n const canvasRef = useRef(null);\n const containerRef = useRef(null);\n const [isInView, setIsInView] = useState(false);\n const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0 });\n\n const memoizedColor = useMemo(() => {\n const toRGBA = (color: string) => {\n if (typeof window === \"undefined\") {\n return `rgba(0, 0, 0,`;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return \"rgba(255, 0, 0,\";\n ctx.fillStyle = color;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = Array.from(ctx.getImageData(0, 0, 1, 1).data);\n return `rgba(${r}, ${g}, ${b},`;\n };\n return toRGBA(color);\n }, [color]);\n\n const setupCanvas = useCallback(\n (canvas: HTMLCanvasElement, width: number, height: number) => {\n const dpr = window.devicePixelRatio || 1;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n const cols = Math.floor(width / (squareSize + gridGap));\n const rows = Math.floor(height / (squareSize + gridGap));\n\n const squares = new Float32Array(cols * rows);\n for (let i = 0; i < squares.length; i++) {\n squares[i] = Math.random() * maxOpacity;\n }\n\n return { cols, rows, squares, dpr };\n },\n [squareSize, gridGap, maxOpacity],\n );\n\n const updateSquares = useCallback(\n (squares: Float32Array, deltaTime: number) => {\n for (let i = 0; i < squares.length; i++) {\n if (Math.random() < flickerChance * deltaTime) {\n squares[i] = Math.random() * maxOpacity;\n }\n }\n },\n [flickerChance, maxOpacity],\n );\n\n const drawGrid = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n cols: number,\n rows: number,\n squares: Float32Array,\n dpr: number,\n ) => {\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = \"transparent\";\n ctx.fillRect(0, 0, width, height);\n\n for (let i = 0; i < cols; i++) {\n for (let j = 0; j < rows; j++) {\n const opacity = squares[i * rows + j];\n ctx.fillStyle = `${memoizedColor}${opacity})`;\n ctx.fillRect(\n i * (squareSize + gridGap) * dpr,\n j * (squareSize + gridGap) * dpr,\n squareSize * dpr,\n squareSize * dpr,\n );\n }\n }\n },\n [memoizedColor, squareSize, gridGap],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n if (!canvas || !container) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n let animationFrameId: number;\n let gridParams: ReturnType;\n\n const updateCanvasSize = () => {\n const newWidth = width || container.clientWidth;\n const newHeight = height || container.clientHeight;\n setCanvasSize({ width: newWidth, height: newHeight });\n gridParams = setupCanvas(canvas, newWidth, newHeight);\n };\n\n updateCanvasSize();\n\n let lastTime = 0;\n const animate = (time: number) => {\n if (!isInView) return;\n\n const deltaTime = (time - lastTime) / 1000;\n lastTime = time;\n\n updateSquares(gridParams.squares, deltaTime);\n drawGrid(\n ctx,\n canvas.width,\n canvas.height,\n gridParams.cols,\n gridParams.rows,\n gridParams.squares,\n gridParams.dpr,\n );\n animationFrameId = requestAnimationFrame(animate);\n };\n\n const resizeObserver = new ResizeObserver(() => {\n updateCanvasSize();\n });\n\n resizeObserver.observe(container);\n\n const intersectionObserver = new IntersectionObserver(\n ([entry]) => {\n setIsInView(entry.isIntersecting);\n },\n { threshold: 0 },\n );\n\n intersectionObserver.observe(canvas);\n\n if (isInView) {\n animationFrameId = requestAnimationFrame(animate);\n }\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n resizeObserver.disconnect();\n intersectionObserver.disconnect();\n };\n }, [setupCanvas, updateSquares, drawGrid, width, height, isInView]);\n\n return (\n \n \n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/flip-text-demo.json b/public/r/flip-text-demo.json new file mode 100644 index 000000000..4d9c462f0 --- /dev/null +++ b/public/r/flip-text-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "flip-text-demo", + "type": "registry:component", + "registryDependencies": [ + "flip-text" + ], + "files": [ + { + "path": "registry/example/flip-text-demo.tsx", + "content": "import { FlipText } from \"@/registry/magicui/flip-text\";\n\nexport default function FlipTextDemo() {\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/flip-text.json b/public/r/flip-text.json similarity index 82% rename from public/r/styles/default/flip-text.json rename to public/r/flip-text.json index 7fcefe739..372f0bfb4 100644 --- a/public/r/styles/default/flip-text.json +++ b/public/r/flip-text.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "flip-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Flip Text", + "description": "Text flipping character animation", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/flip-text.tsx", + "path": "registry/magicui/flip-text.tsx", "content": "\"use client\";\n\nimport { AnimatePresence, motion, Variants } from \"motion/react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface FlipTextProps {\n word: string;\n duration?: number;\n delayMultiple?: number;\n framerProps?: Variants;\n className?: string;\n}\n\nexport function FlipText({\n word,\n duration = 0.5,\n delayMultiple = 0.08,\n framerProps = {\n hidden: { rotateX: -90, opacity: 0 },\n visible: { rotateX: 0, opacity: 1 },\n },\n className,\n}: FlipTextProps) {\n return (\n
\n \n {word.split(\"\").map((char, i) => (\n \n {char}\n \n ))}\n \n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/globe-demo.json b/public/r/globe-demo.json new file mode 100644 index 000000000..26286f137 --- /dev/null +++ b/public/r/globe-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "globe-demo", + "type": "registry:component", + "registryDependencies": [ + "globe" + ], + "files": [ + { + "path": "registry/example/globe-demo.tsx", + "content": "import { Globe } from \"@/registry/magicui/globe\";\n\nexport default function GlobeDemo() {\n return (\n
\n \n Globe\n \n \n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/globe.json b/public/r/globe.json similarity index 92% rename from public/r/styles/default/globe.json rename to public/r/globe.json index a6a58a34f..b3bc0a8b9 100644 --- a/public/r/styles/default/globe.json +++ b/public/r/globe.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "globe", - "type": "registry:ui", + "type": "registry:component", + "title": "Globe", + "description": "An autorotating, interactive, and highly performant globe made using WebGL.", "dependencies": [ "cobe" ], "files": [ { - "path": "magicui/globe.tsx", + "path": "registry/magicui/globe.tsx", "content": "\"use client\";\n\nimport createGlobe, { COBEOptions } from \"cobe\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst GLOBE_CONFIG: COBEOptions = {\n width: 800,\n height: 800,\n onRender: () => {},\n devicePixelRatio: 2,\n phi: 0,\n theta: 0.3,\n dark: 0,\n diffuse: 0.4,\n mapSamples: 16000,\n mapBrightness: 1.2,\n baseColor: [1, 1, 1],\n markerColor: [251 / 255, 100 / 255, 21 / 255],\n glowColor: [1, 1, 1],\n markers: [\n { location: [14.5995, 120.9842], size: 0.03 },\n { location: [19.076, 72.8777], size: 0.1 },\n { location: [23.8103, 90.4125], size: 0.05 },\n { location: [30.0444, 31.2357], size: 0.07 },\n { location: [39.9042, 116.4074], size: 0.08 },\n { location: [-23.5505, -46.6333], size: 0.1 },\n { location: [19.4326, -99.1332], size: 0.1 },\n { location: [40.7128, -74.006], size: 0.1 },\n { location: [34.6937, 135.5022], size: 0.05 },\n { location: [41.0082, 28.9784], size: 0.06 },\n ],\n};\n\nexport function Globe({\n className,\n config = GLOBE_CONFIG,\n}: {\n className?: string;\n config?: COBEOptions;\n}) {\n let phi = 0;\n let width = 0;\n const canvasRef = useRef(null);\n const pointerInteracting = useRef(null);\n const pointerInteractionMovement = useRef(0);\n const [r, setR] = useState(0);\n\n const updatePointerInteraction = (value: any) => {\n pointerInteracting.current = value;\n if (canvasRef.current) {\n canvasRef.current.style.cursor = value ? \"grabbing\" : \"grab\";\n }\n };\n\n const updateMovement = (clientX: any) => {\n if (pointerInteracting.current !== null) {\n const delta = clientX - pointerInteracting.current;\n pointerInteractionMovement.current = delta;\n setR(delta / 200);\n }\n };\n\n const onRender = useCallback(\n (state: Record) => {\n if (!pointerInteracting.current) phi += 0.005;\n state.phi = phi + r;\n state.width = width * 2;\n state.height = width * 2;\n },\n [r],\n );\n\n const onResize = () => {\n if (canvasRef.current) {\n width = canvasRef.current.offsetWidth;\n }\n };\n\n useEffect(() => {\n window.addEventListener(\"resize\", onResize);\n onResize();\n\n const globe = createGlobe(canvasRef.current!, {\n ...config,\n width: width * 2,\n height: width * 2,\n onRender,\n });\n\n setTimeout(() => (canvasRef.current!.style.opacity = \"1\"));\n return () => globe.destroy();\n }, []);\n\n return (\n \n \n updatePointerInteraction(\n e.clientX - pointerInteractionMovement.current,\n )\n }\n onPointerUp={() => updatePointerInteraction(null)}\n onPointerOut={() => updatePointerInteraction(null)}\n onMouseMove={(e) => updateMovement(e.clientX)}\n onTouchMove={(e) =>\n e.touches[0] && updateMovement(e.touches[0].clientX)\n }\n />\n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/grid-pattern-dashed.json b/public/r/grid-pattern-dashed.json new file mode 100644 index 000000000..f7df01527 --- /dev/null +++ b/public/r/grid-pattern-dashed.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "grid-pattern-dashed", + "type": "registry:component", + "registryDependencies": [ + "grid-pattern" + ], + "files": [ + { + "path": "registry/example/grid-pattern-dashed.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\";\n\nexport default function GridPatternDashed() {\n return (\n
\n

\n Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/grid-pattern-demo.json b/public/r/grid-pattern-demo.json new file mode 100644 index 000000000..8cf6ba99e --- /dev/null +++ b/public/r/grid-pattern-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "grid-pattern-demo", + "type": "registry:component", + "registryDependencies": [ + "grid-pattern" + ], + "files": [ + { + "path": "registry/example/grid-pattern-demo.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\";\n\nexport default function GridPatternDemo() {\n return (\n
\n

\n Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/grid-pattern-linear-gradient.json b/public/r/grid-pattern-linear-gradient.json new file mode 100644 index 000000000..7507a01fb --- /dev/null +++ b/public/r/grid-pattern-linear-gradient.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "grid-pattern-linear-gradient", + "type": "registry:component", + "registryDependencies": [ + "grid-pattern" + ], + "files": [ + { + "path": "registry/example/grid-pattern-linear-gradient.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { GridPattern } from \"@/registry/magicui/grid-pattern\";\n\nexport default function GridPatternLinearGradient() {\n return (\n
\n

\n Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/grid-pattern.json b/public/r/grid-pattern.json similarity index 84% rename from public/r/styles/default/grid-pattern.json rename to public/r/grid-pattern.json index 933d7f1e0..9cbdab8ba 100644 --- a/public/r/styles/default/grid-pattern.json +++ b/public/r/grid-pattern.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "grid-pattern", - "type": "registry:ui", + "type": "registry:component", + "title": "Grid Pattern", + "description": "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { - "path": "magicui/grid-pattern.tsx", + "path": "registry/magicui/grid-pattern.tsx", "content": "import { useId } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface GridPatternProps extends React.SVGProps {\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n squares?: Array<[x: number, y: number]>;\n strokeDasharray?: string;\n className?: string;\n [key: string]: unknown;\n}\n\nexport function GridPattern({\n width = 40,\n height = 40,\n x = -1,\n y = -1,\n strokeDasharray = \"0\",\n squares,\n className,\n ...props\n}: GridPatternProps) {\n const id = useId();\n\n return (\n \n \n \n \n \n \n \n {squares && (\n \n {squares.map(([x, y]) => (\n \n ))}\n \n )}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/hero-video-dialog-demo-top-in-bottom-out.json b/public/r/hero-video-dialog-demo-top-in-bottom-out.json new file mode 100644 index 000000000..1e6fb950e --- /dev/null +++ b/public/r/hero-video-dialog-demo-top-in-bottom-out.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "hero-video-dialog-demo-top-in-bottom-out", + "type": "registry:component", + "files": [ + { + "path": "registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx", + "content": "import HeroVideoDialog from \"@/registry/magicui/hero-video-dialog\";\n\nexport default function HeroVideoDialogDemoTopInBottomOut() {\n return (\n
\n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/hero-video-dialog-demo.json b/public/r/hero-video-dialog-demo.json new file mode 100644 index 000000000..932c51be9 --- /dev/null +++ b/public/r/hero-video-dialog-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "hero-video-dialog-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/hero-video-dialog-demo.tsx", + "content": "import HeroVideoDialog from \"@/registry/magicui/hero-video-dialog\";\n\nexport default function HeroVideoDialogDemo() {\n return (\n
\n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/hero-video-dialog.json b/public/r/hero-video-dialog.json new file mode 100644 index 000000000..59682f52c --- /dev/null +++ b/public/r/hero-video-dialog.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "hero-video-dialog", + "type": "registry:component", + "title": "Hero Video Dialog", + "description": "A hero video dialog component.", + "dependencies": [ + "motion" + ], + "files": [ + { + "path": "registry/magicui/hero-video-dialog.tsx", + "content": "/* eslint-disable @next/next/no-img-element */\n\"use client\";\n\nimport { useState } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Play, XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype AnimationStyle =\n | \"from-bottom\"\n | \"from-center\"\n | \"from-top\"\n | \"from-left\"\n | \"from-right\"\n | \"fade\"\n | \"top-in-bottom-out\"\n | \"left-in-right-out\";\n\ninterface HeroVideoProps {\n animationStyle?: AnimationStyle;\n videoSrc: string;\n thumbnailSrc: string;\n thumbnailAlt?: string;\n className?: string;\n}\n\nconst animationVariants = {\n \"from-bottom\": {\n initial: { y: \"100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"100%\", opacity: 0 },\n },\n \"from-center\": {\n initial: { scale: 0.5, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.5, opacity: 0 },\n },\n \"from-top\": {\n initial: { y: \"-100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"-100%\", opacity: 0 },\n },\n \"from-left\": {\n initial: { x: \"-100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"-100%\", opacity: 0 },\n },\n \"from-right\": {\n initial: { x: \"100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"100%\", opacity: 0 },\n },\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n \"top-in-bottom-out\": {\n initial: { y: \"-100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"100%\", opacity: 0 },\n },\n \"left-in-right-out\": {\n initial: { x: \"-100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"100%\", opacity: 0 },\n },\n};\n\nexport default function HeroVideoDialog({\n animationStyle = \"from-center\",\n videoSrc,\n thumbnailSrc,\n thumbnailAlt = \"Video thumbnail\",\n className,\n}: HeroVideoProps) {\n const [isVideoOpen, setIsVideoOpen] = useState(false);\n const selectedAnimation = animationVariants[animationStyle];\n\n return (\n
\n setIsVideoOpen(true)}\n >\n \n
\n
\n \n \n
\n
\n
\n \n \n {isVideoOpen && (\n setIsVideoOpen(false)}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md\"\n >\n \n \n \n \n
\n \n
\n \n \n )}\n
\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/hyper-text-demo.json b/public/r/hyper-text-demo.json new file mode 100644 index 000000000..191624a9c --- /dev/null +++ b/public/r/hyper-text-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "hyper-text-demo", + "type": "registry:component", + "registryDependencies": [ + "hyper-text" + ], + "files": [ + { + "path": "registry/example/hyper-text-demo.tsx", + "content": "import { HyperText } from \"@/registry/magicui/hyper-text\";\n\nexport default function HyperTextDemo() {\n return Hover Me!;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/hyper-text.json b/public/r/hyper-text.json similarity index 93% rename from public/r/styles/default/hyper-text.json rename to public/r/hyper-text.json index 325d6bc07..250e2066e 100644 --- a/public/r/styles/default/hyper-text.json +++ b/public/r/hyper-text.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "hyper-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Hyper Text", + "description": "A text animation that scrambles letters before revealing the final text.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/hyper-text.tsx", + "path": "registry/magicui/hyper-text.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport { useEffect, useRef, useState } from \"react\";\n\ntype CharacterSet = string[] | readonly string[];\n\ninterface HyperTextProps extends MotionProps {\n /** The text content to be animated */\n children: string;\n /** Optional className for styling */\n className?: string;\n /** Duration of the animation in milliseconds */\n duration?: number;\n /** Delay before animation starts in milliseconds */\n delay?: number;\n /** Component to render as - defaults to div */\n as?: React.ElementType;\n /** Whether to start animation when element comes into view */\n startOnView?: boolean;\n /** Whether to trigger animation on hover */\n animateOnHover?: boolean;\n /** Custom character set for scramble effect. Defaults to uppercase alphabet */\n characterSet?: CharacterSet;\n}\n\nconst DEFAULT_CHARACTER_SET = Object.freeze(\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\"),\n) as readonly string[];\n\nconst getRandomInt = (max: number): number => Math.floor(Math.random() * max);\n\nexport function HyperText({\n children,\n className,\n duration = 800,\n delay = 0,\n as: Component = \"div\",\n startOnView = false,\n animateOnHover = true,\n characterSet = DEFAULT_CHARACTER_SET,\n ...props\n}: HyperTextProps) {\n const MotionComponent = motion.create(Component, {\n forwardMotionProps: true,\n });\n\n const [displayText, setDisplayText] = useState(() =>\n children.split(\"\"),\n );\n const [isAnimating, setIsAnimating] = useState(false);\n const iterationCount = useRef(0);\n const elementRef = useRef(null);\n\n const handleAnimationTrigger = () => {\n if (animateOnHover && !isAnimating) {\n iterationCount.current = 0;\n setIsAnimating(true);\n }\n };\n\n // Handle animation start based on view or delay\n useEffect(() => {\n if (!startOnView) {\n const startTimeout = setTimeout(() => {\n setIsAnimating(true);\n }, delay);\n return () => clearTimeout(startTimeout);\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n setIsAnimating(true);\n }, delay);\n observer.disconnect();\n }\n },\n { threshold: 0.1, rootMargin: \"-30% 0px -30% 0px\" },\n );\n\n if (elementRef.current) {\n observer.observe(elementRef.current);\n }\n\n return () => observer.disconnect();\n }, [delay, startOnView]);\n\n // Handle scramble animation\n useEffect(() => {\n if (!isAnimating) return;\n\n const intervalDuration = duration / (children.length * 10);\n const maxIterations = children.length;\n\n const interval = setInterval(() => {\n if (iterationCount.current < maxIterations) {\n setDisplayText((currentText) =>\n currentText.map((letter, index) =>\n letter === \" \"\n ? letter\n : index <= iterationCount.current\n ? children[index]\n : characterSet[getRandomInt(characterSet.length)],\n ),\n );\n iterationCount.current = iterationCount.current + 0.1;\n } else {\n setIsAnimating(false);\n clearInterval(interval);\n }\n }, intervalDuration);\n\n return () => clearInterval(interval);\n }, [children, duration, isAnimating, characterSet]);\n\n return (\n \n \n {displayText.map((letter, index) => (\n \n {letter.toUpperCase()}\n \n ))}\n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/icon-cloud-demo-2.json b/public/r/icon-cloud-demo-2.json new file mode 100644 index 000000000..5782e9372 --- /dev/null +++ b/public/r/icon-cloud-demo-2.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "icon-cloud-demo-2", + "type": "registry:component", + "registryDependencies": [ + "icon-cloud" + ], + "files": [ + { + "path": "registry/example/icon-cloud-demo-2.tsx", + "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\";\n\nconst images = [\n \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675553988173-a5249b5815fe?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675297844586-534b030564e0?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://plus.unsplash.com/premium_photo-1675555581018-7f1a352ff9a6?q=80&w=1964&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n \"https://images.unsplash.com/photo-1719937050517-68d4e2a1702e?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D\",\n];\n\nexport default function IconCloudDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/icon-cloud-demo-3.json b/public/r/icon-cloud-demo-3.json new file mode 100644 index 000000000..5387b87dd --- /dev/null +++ b/public/r/icon-cloud-demo-3.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "icon-cloud-demo-3", + "type": "registry:component", + "registryDependencies": [ + "icon-cloud" + ], + "files": [ + { + "path": "registry/example/icon-cloud-demo-3.tsx", + "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\";\n\nconst Icons = {\n gitHub: () => (\n \n \n \n ),\n notion: () => (\n \n \n \n \n ),\n openai: () => (\n \n \n \n ),\n googleDrive: () => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n};\n\nexport default function IconCloudDemo() {\n return (\n
\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ,\n ]}\n />\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/icon-cloud-demo.json b/public/r/icon-cloud-demo.json new file mode 100644 index 000000000..61f923769 --- /dev/null +++ b/public/r/icon-cloud-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "icon-cloud-demo", + "type": "registry:component", + "registryDependencies": [ + "icon-cloud" + ], + "files": [ + { + "path": "registry/example/icon-cloud-demo.tsx", + "content": "import { IconCloud } from \"@/registry/magicui/icon-cloud\";\n\nconst slugs = [\n \"typescript\",\n \"javascript\",\n \"dart\",\n \"java\",\n \"react\",\n \"flutter\",\n \"android\",\n \"html5\",\n \"css3\",\n \"nodedotjs\",\n \"express\",\n \"nextdotjs\",\n \"prisma\",\n \"amazonaws\",\n \"postgresql\",\n \"firebase\",\n \"nginx\",\n \"vercel\",\n \"testinglibrary\",\n \"jest\",\n \"cypress\",\n \"docker\",\n \"git\",\n \"jira\",\n \"github\",\n \"gitlab\",\n \"visualstudiocode\",\n \"androidstudio\",\n \"sonarqube\",\n \"figma\",\n];\n\nexport default function IconCloudDemo() {\n const images = slugs.map(\n (slug) => `https://cdn.simpleicons.org/${slug}/${slug}`,\n );\n\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/icon-cloud.json b/public/r/icon-cloud.json similarity index 97% rename from public/r/styles/default/icon-cloud.json rename to public/r/icon-cloud.json index f8524a336..edda983ee 100644 --- a/public/r/styles/default/icon-cloud.json +++ b/public/r/icon-cloud.json @@ -1,13 +1,15 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "icon-cloud", - "type": "registry:ui", + "type": "registry:component", + "title": "Icon Cloud", + "description": "An interactive 3D tag cloud component", "dependencies": [], "files": [ { - "path": "magicui/icon-cloud.tsx", + "path": "registry/magicui/icon-cloud.tsx", "content": "\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { renderToString } from \"react-dom/server\";\n\ninterface Icon {\n x: number;\n y: number;\n z: number;\n scale: number;\n opacity: number;\n id: number;\n}\n\ninterface IconCloudProps {\n icons?: React.ReactNode[];\n images?: string[];\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - Math.pow(1 - t, 3);\n}\n\nexport function IconCloud({ icons, images }: IconCloudProps) {\n const canvasRef = useRef(null);\n const [iconPositions, setIconPositions] = useState([]);\n const [rotation, setRotation] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const [lastMousePos, setLastMousePos] = useState({ x: 0, y: 0 });\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [targetRotation, setTargetRotation] = useState<{\n x: number;\n y: number;\n startX: number;\n startY: number;\n distance: number;\n startTime: number;\n duration: number;\n } | null>(null);\n const animationFrameRef = useRef();\n const rotationRef = useRef(rotation);\n const iconCanvasesRef = useRef([]);\n const imagesLoadedRef = useRef([]);\n\n // Create icon canvases once when icons/images change\n useEffect(() => {\n if (!icons && !images) return;\n\n const items = icons || images || [];\n imagesLoadedRef.current = new Array(items.length).fill(false);\n\n const newIconCanvases = items.map((item, index) => {\n const offscreen = document.createElement(\"canvas\");\n offscreen.width = 40;\n offscreen.height = 40;\n const offCtx = offscreen.getContext(\"2d\");\n\n if (offCtx) {\n if (images) {\n // Handle image URLs directly\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.src = items[index] as string;\n img.onload = () => {\n offCtx.clearRect(0, 0, offscreen.width, offscreen.height);\n\n // Create circular clipping path\n offCtx.beginPath();\n offCtx.arc(20, 20, 20, 0, Math.PI * 2);\n offCtx.closePath();\n offCtx.clip();\n\n // Draw the image\n offCtx.drawImage(img, 0, 0, 40, 40);\n\n imagesLoadedRef.current[index] = true;\n };\n } else {\n // Handle SVG icons\n offCtx.scale(0.4, 0.4);\n const svgString = renderToString(item as React.ReactElement);\n const img = new Image();\n img.src = \"data:image/svg+xml;base64,\" + btoa(svgString);\n img.onload = () => {\n offCtx.clearRect(0, 0, offscreen.width, offscreen.height);\n offCtx.drawImage(img, 0, 0);\n imagesLoadedRef.current[index] = true;\n };\n }\n }\n return offscreen;\n });\n\n iconCanvasesRef.current = newIconCanvases;\n }, [icons, images]);\n\n // Generate initial icon positions on a sphere\n useEffect(() => {\n const items = icons || images || [];\n const newIcons: Icon[] = [];\n const numIcons = items.length || 20;\n\n // Fibonacci sphere parameters\n const offset = 2 / numIcons;\n const increment = Math.PI * (3 - Math.sqrt(5));\n\n for (let i = 0; i < numIcons; i++) {\n const y = i * offset - 1 + offset / 2;\n const r = Math.sqrt(1 - y * y);\n const phi = i * increment;\n\n const x = Math.cos(phi) * r;\n const z = Math.sin(phi) * r;\n\n newIcons.push({\n x: x * 100,\n y: y * 100,\n z: z * 100,\n scale: 1,\n opacity: 1,\n id: i,\n });\n }\n setIconPositions(newIcons);\n }, [icons, images]);\n\n // Handle mouse events\n const handleMouseDown = (e: React.MouseEvent) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (!rect || !canvasRef.current) return;\n\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const ctx = canvasRef.current.getContext(\"2d\");\n if (!ctx) return;\n\n iconPositions.forEach((icon) => {\n const cosX = Math.cos(rotationRef.current.x);\n const sinX = Math.sin(rotationRef.current.x);\n const cosY = Math.cos(rotationRef.current.y);\n const sinY = Math.sin(rotationRef.current.y);\n\n const rotatedX = icon.x * cosY - icon.z * sinY;\n const rotatedZ = icon.x * sinY + icon.z * cosY;\n const rotatedY = icon.y * cosX + rotatedZ * sinX;\n\n const screenX = canvasRef.current!.width / 2 + rotatedX;\n const screenY = canvasRef.current!.height / 2 + rotatedY;\n\n const scale = (rotatedZ + 200) / 300;\n const radius = 20 * scale;\n const dx = x - screenX;\n const dy = y - screenY;\n\n if (dx * dx + dy * dy < radius * radius) {\n const targetX = -Math.atan2(\n icon.y,\n Math.sqrt(icon.x * icon.x + icon.z * icon.z),\n );\n const targetY = Math.atan2(icon.x, icon.z);\n\n const currentX = rotationRef.current.x;\n const currentY = rotationRef.current.y;\n const distance = Math.sqrt(\n Math.pow(targetX - currentX, 2) + Math.pow(targetY - currentY, 2),\n );\n\n const duration = Math.min(2000, Math.max(800, distance * 1000));\n\n setTargetRotation({\n x: targetX,\n y: targetY,\n startX: currentX,\n startY: currentY,\n distance,\n startTime: performance.now(),\n duration,\n });\n return;\n }\n });\n\n setIsDragging(true);\n setLastMousePos({ x: e.clientX, y: e.clientY });\n };\n\n const handleMouseMove = (e: React.MouseEvent) => {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setMousePos({ x, y });\n }\n\n if (isDragging) {\n const deltaX = e.clientX - lastMousePos.x;\n const deltaY = e.clientY - lastMousePos.y;\n\n rotationRef.current = {\n x: rotationRef.current.x + deltaY * 0.002,\n y: rotationRef.current.y + deltaX * 0.002,\n };\n\n setLastMousePos({ x: e.clientX, y: e.clientY });\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n\n // Animation and rendering\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n\n const animate = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY);\n const dx = mousePos.x - centerX;\n const dy = mousePos.y - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const speed = 0.003 + (distance / maxDistance) * 0.01;\n\n if (targetRotation) {\n const elapsed = performance.now() - targetRotation.startTime;\n const progress = Math.min(1, elapsed / targetRotation.duration);\n const easedProgress = easeOutCubic(progress);\n\n rotationRef.current = {\n x:\n targetRotation.startX +\n (targetRotation.x - targetRotation.startX) * easedProgress,\n y:\n targetRotation.startY +\n (targetRotation.y - targetRotation.startY) * easedProgress,\n };\n\n if (progress >= 1) {\n setTargetRotation(null);\n }\n } else if (!isDragging) {\n rotationRef.current = {\n x: rotationRef.current.x + (dy / canvas.height) * speed,\n y: rotationRef.current.y + (dx / canvas.width) * speed,\n };\n }\n\n iconPositions.forEach((icon, index) => {\n const cosX = Math.cos(rotationRef.current.x);\n const sinX = Math.sin(rotationRef.current.x);\n const cosY = Math.cos(rotationRef.current.y);\n const sinY = Math.sin(rotationRef.current.y);\n\n const rotatedX = icon.x * cosY - icon.z * sinY;\n const rotatedZ = icon.x * sinY + icon.z * cosY;\n const rotatedY = icon.y * cosX + rotatedZ * sinX;\n\n const scale = (rotatedZ + 200) / 300;\n const opacity = Math.max(0.2, Math.min(1, (rotatedZ + 150) / 200));\n\n ctx.save();\n ctx.translate(\n canvas.width / 2 + rotatedX,\n canvas.height / 2 + rotatedY,\n );\n ctx.scale(scale, scale);\n ctx.globalAlpha = opacity;\n\n if (icons || images) {\n // Only try to render icons/images if they exist\n if (\n iconCanvasesRef.current[index] &&\n imagesLoadedRef.current[index]\n ) {\n ctx.drawImage(iconCanvasesRef.current[index], -20, -20, 40, 40);\n }\n } else {\n // Show numbered circles if no icons/images are provided\n ctx.beginPath();\n ctx.arc(0, 0, 20, 0, Math.PI * 2);\n ctx.fillStyle = \"#4444ff\";\n ctx.fill();\n ctx.fillStyle = \"white\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = \"16px Arial\";\n ctx.fillText(`${icon.id + 1}`, 0, 0);\n }\n\n ctx.restore();\n });\n animationFrameRef.current = requestAnimationFrame(animate);\n };\n\n animate();\n\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, [icons, images, iconPositions, isDragging, mousePos, targetRotation]);\n\n return (\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/index.json b/public/r/index.json deleted file mode 100644 index 8d098da0f..000000000 --- a/public/r/index.json +++ /dev/null @@ -1,1166 +0,0 @@ -[ - { - "name": "magic-card", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/magic-card.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "android", - "type": "registry:ui", - "files": [ - { - "path": "magicui/android.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "warp-background", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/warp-background.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "line-shadow-text", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/line-shadow-text.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "terminal", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/terminal.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "aurora-text", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/aurora-text.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "colors": { - "color-1": "hsl(var(--color-1))", - "color-2": "hsl(var(--color-2))", - "color-3": "hsl(var(--color-3))", - "color-4": "hsl(var(--color-4))", - "color-5": "hsl(var(--color-5))" - }, - "keyframes": { - "aurora-border": { - "0%, 100%": { - "borderRadius": "37% 29% 27% 27% / 28% 25% 41% 37%" - }, - "25%": { - "borderRadius": "47% 29% 39% 49% / 61% 19% 66% 26%" - }, - "50%": { - "borderRadius": "57% 23% 47% 72% / 63% 17% 66% 33%" - }, - "75%": { - "borderRadius": "28% 49% 29% 100% / 93% 20% 64% 25%" - } - }, - "aurora-1": { - "0%, 100%": { - "top": "0", - "right": "0" - }, - "50%": { - "top": "50%", - "right": "25%" - }, - "75%": { - "top": "25%", - "right": "50%" - } - }, - "aurora-2": { - "0%, 100%": { - "top": "0", - "left": "0" - }, - "60%": { - "top": "75%", - "left": "25%" - }, - "85%": { - "top": "50%", - "left": "50%" - } - }, - "aurora-3": { - "0%, 100%": { - "bottom": "0", - "left": "0" - }, - "40%": { - "bottom": "50%", - "left": "25%" - }, - "65%": { - "bottom": "25%", - "left": "50%" - } - }, - "aurora-4": { - "0%, 100%": { - "bottom": "0", - "right": "0" - }, - "50%": { - "bottom": "25%", - "right": "40%" - }, - "90%": { - "bottom": "50%", - "right": "25%" - } - } - } - } - } - } - }, - "cssVars": { - "light": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - }, - "dark": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - } - } - }, - { - "name": "morphing-text", - "type": "registry:ui", - "files": [ - { - "path": "magicui/morphing-text.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "scroll-progress", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/scroll-progress.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "neon-gradient-card", - "type": "registry:ui", - "files": [ - { - "path": "magicui/neon-gradient-card.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "background-position-spin": "background-position-spin 3000ms infinite alternate" - }, - "keyframes": { - "background-position-spin": { - "0%": { - "backgroundPosition": "top center" - }, - "100%": { - "backgroundPosition": "bottom center" - } - } - } - } - } - } - } - }, - { - "name": "meteors", - "type": "registry:ui", - "files": [ - { - "path": "magicui/meteors.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "meteor": "meteor 5s linear infinite" - }, - "keyframes": { - "meteor": { - "0%": { - "transform": "rotate(215deg) translateX(0)", - "opacity": "1" - }, - "70%": { - "opacity": "1" - }, - "100%": { - "transform": "rotate(215deg) translateX(-500px)", - "opacity": "0" - } - } - } - } - } - } - } - }, - { - "name": "grid-pattern", - "type": "registry:ui", - "files": [ - { - "path": "magicui/grid-pattern.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "interactive-grid-pattern", - "type": "registry:ui", - "files": [ - { - "path": "magicui/interactive-grid-pattern.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "dot-pattern", - "type": "registry:ui", - "files": [ - { - "path": "magicui/dot-pattern.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "flickering-grid", - "type": "registry:ui", - "files": [ - { - "path": "magicui/flickering-grid.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "hero-video-dialog", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/hero-video-dialog.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "code-comparison", - "type": "registry:ui", - "dependencies": [ - "shiki", - "next-themes" - ], - "files": [ - { - "path": "magicui/code-comparison.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "script-copy-btn", - "type": "registry:ui", - "dependencies": [ - "motion", - "shiki", - "next-themes" - ], - "registryDependencies": [ - "button" - ], - "files": [ - { - "path": "magicui/script-copy-btn.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "marquee", - "type": "registry:ui", - "files": [ - { - "path": "magicui/marquee.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "keyframes": { - "marquee": { - "from": { - "transform": "translateX(0)" - }, - "to": { - "transform": "translateX(calc(-100% - var(--gap)))" - } - }, - "marquee-vertical": { - "from": { - "transform": "translateY(0)" - }, - "to": { - "transform": "translateY(calc(-100% - var(--gap)))" - } - } - }, - "animation": { - "marquee": "marquee var(--duration) infinite linear", - "marquee-vertical": "marquee-vertical var(--duration) linear infinite" - } - } - } - } - } - }, - { - "name": "globe", - "type": "registry:ui", - "dependencies": [ - "cobe" - ], - "files": [ - { - "path": "magicui/globe.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "shimmer-button", - "type": "registry:ui", - "files": [ - { - "path": "magicui/shimmer-button.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "shimmer-slide": "shimmer-slide var(--speed) ease-in-out infinite alternate", - "spin-around": "spin-around calc(var(--speed) * 2) infinite linear" - }, - "keyframes": { - "shimmer-slide": { - "to": { - "transform": "translate(calc(100cqw - 100%), 0)" - } - }, - "spin-around": { - "0%": { - "transform": "translateZ(0) rotate(0)" - }, - "15%, 35%": { - "transform": "translateZ(0) rotate(90deg)" - }, - "65%, 85%": { - "transform": "translateZ(0) rotate(270deg)" - }, - "100%": { - "transform": "translateZ(0) rotate(360deg)" - } - } - } - } - } - } - } - }, - { - "name": "tweet-card", - "type": "registry:ui", - "dependencies": [ - "react-tweet" - ], - "files": [ - { - "path": "magicui/tweet-card.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "client-tweet-card", - "type": "registry:ui", - "dependencies": [ - "react-tweet" - ], - "files": [ - { - "path": "magicui/client-tweet-card.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "bento-grid", - "type": "registry:ui", - "dependencies": [ - "@radix-ui/react-icons" - ], - "registryDependencies": [ - "button" - ], - "files": [ - { - "path": "magicui/bento-grid.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "particles", - "type": "registry:ui", - "files": [ - { - "path": "magicui/particles.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "number-ticker", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/number-ticker.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "ripple", - "type": "registry:ui", - "files": [ - { - "path": "magicui/ripple.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "ripple": "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite" - }, - "keyframes": { - "ripple": { - "0%, 100%": { - "transform": "translate(-50%, -50%) scale(1)" - }, - "50%": { - "transform": "translate(-50%, -50%) scale(0.9)" - } - } - } - } - } - } - } - }, - { - "name": "retro-grid", - "type": "registry:ui", - "files": [ - { - "path": "magicui/retro-grid.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "grid": "grid 15s linear infinite" - }, - "keyframes": { - "grid": { - "0%": { - "transform": "translateY(-50%)" - }, - "100%": { - "transform": "translateY(0)" - } - } - } - } - } - } - } - }, - { - "name": "animated-list", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/animated-list.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "animated-shiny-text", - "type": "registry:ui", - "files": [ - { - "path": "magicui/animated-shiny-text.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "shiny-text": "shiny-text 8s infinite" - }, - "keyframes": { - "shiny-text": { - "0%, 90%, 100%": { - "background-position": "calc(-100% - var(--shiny-width)) 0" - }, - "30%, 60%": { - "background-position": "calc(100% + var(--shiny-width)) 0" - } - } - } - } - } - } - } - }, - { - "name": "animated-grid-pattern", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/animated-grid-pattern.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "border-beam", - "type": "registry:ui", - "files": [ - { - "path": "magicui/border-beam.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "border-beam": "border-beam calc(var(--duration)*1s) infinite linear" - }, - "keyframes": { - "border-beam": { - "100%": { - "offset-distance": "100%" - } - } - } - } - } - } - } - }, - { - "name": "animated-beam", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/animated-beam.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "text-reveal", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/text-reveal.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "hyper-text", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/hyper-text.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "animated-gradient-text", - "type": "registry:ui", - "files": [ - { - "path": "magicui/animated-gradient-text.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "gradient": "gradient 8s linear infinite" - }, - "keyframes": { - "gradient": { - "to": { - "backgroundPosition": "var(--bg-size) 0" - } - } - } - } - } - } - } - }, - { - "name": "orbiting-circles", - "type": "registry:ui", - "files": [ - { - "path": "magicui/orbiting-circles.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "orbit": "orbit calc(var(--duration)*1s) linear infinite" - }, - "keyframes": { - "orbit": { - "0%": { - "transform": "rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))" - }, - "100%": { - "transform": "rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))" - } - } - } - } - } - } - } - }, - { - "name": "dock", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/dock.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "word-rotate", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/word-rotate.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "avatar-circles", - "type": "registry:ui", - "files": [ - { - "path": "magicui/avatar-circles.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "typing-animation", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/typing-animation.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "sparkles-text", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/sparkles-text.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "flip-text", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/flip-text.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "icon-cloud", - "type": "registry:ui", - "dependencies": [], - "files": [ - { - "path": "magicui/icon-cloud.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "text-animate", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/text-animate.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "scroll-based-velocity", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/scroll-based-velocity.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "scratch-to-reveal", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/scratch-to-reveal.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "shiny-button", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/shiny-button.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "box-reveal", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/box-reveal.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "shine-border", - "type": "registry:ui", - "files": [ - { - "path": "magicui/shine-border.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "shine": "shine var(--duration) infinite linear" - }, - "keyframes": { - "shine": { - "0%": { - "background-position": "0% 0%" - }, - "50%": { - "background-position": "100% 100%" - }, - "to": { - "background-position": "0% 0%" - } - } - } - } - } - } - } - }, - { - "name": "animated-circular-progress-bar", - "type": "registry:ui", - "files": [ - { - "path": "magicui/animated-circular-progress-bar.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "confetti", - "type": "registry:ui", - "dependencies": [ - "canvas-confetti", - "@types/canvas-confetti" - ], - "registryDependencies": [ - "button" - ], - "files": [ - { - "path": "magicui/confetti.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "animated-subscribe-button", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/animated-subscribe-button.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "cool-mode", - "type": "registry:ui", - "files": [ - { - "path": "magicui/cool-mode.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "pulsating-button", - "type": "registry:ui", - "files": [ - { - "path": "magicui/pulsating-button.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "pulse": "pulse var(--duration) ease-out infinite" - }, - "keyframes": { - "pulse": { - "0%, 100%": { - "boxShadow": "0 0 0 0 var(--pulse-color)" - }, - "50%": { - "boxShadow": "0 0 0 8px var(--pulse-color)" - } - } - } - } - } - } - } - }, - { - "name": "ripple-button", - "type": "registry:ui", - "files": [ - { - "path": "magicui/ripple-button.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "animation": { - "rippling": "rippling var(--duration) ease-out" - }, - "keyframes": { - "rippling": { - "0%": { - "opacity": "1" - }, - "100%": { - "transform": "scale(2)", - "opacity": "0" - } - } - } - } - } - } - } - }, - { - "name": "file-tree", - "type": "registry:ui", - "files": [ - { - "path": "magicui/file-tree.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "blur-fade", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/blur-fade.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "safari", - "type": "registry:ui", - "files": [ - { - "path": "magicui/safari.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "iphone-15-pro", - "type": "registry:ui", - "files": [ - { - "path": "magicui/iphone-15-pro.tsx", - "type": "registry:ui" - } - ] - }, - { - "name": "rainbow-button", - "type": "registry:ui", - "files": [ - { - "path": "magicui/rainbow-button.tsx", - "type": "registry:ui" - } - ], - "tailwind": { - "config": { - "theme": { - "extend": { - "colors": { - "color-1": "hsl(var(--color-1))", - "color-2": "hsl(var(--color-2))", - "color-3": "hsl(var(--color-3))", - "color-4": "hsl(var(--color-4))", - "color-5": "hsl(var(--color-5))" - }, - "animation": { - "rainbow": "rainbow var(--speed, 2s) infinite linear" - }, - "keyframes": { - "rainbow": { - "0%": { - "background-position": "0%" - }, - "100%": { - "background-position": "200%" - } - } - } - } - } - } - }, - "cssVars": { - "light": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - }, - "dark": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - } - } - }, - { - "name": "interactive-hover-button", - "type": "registry:ui", - "files": [ - { - "path": "magicui/interactive-hover-button.tsx", - "type": "registry:ui" - } - ] - } -] \ No newline at end of file diff --git a/public/r/interactive-grid-pattern-demo-2.json b/public/r/interactive-grid-pattern-demo-2.json new file mode 100644 index 000000000..5b73088d0 --- /dev/null +++ b/public/r/interactive-grid-pattern-demo-2.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "interactive-grid-pattern-demo-2", + "type": "registry:component", + "registryDependencies": [ + "interactive-grid-pattern" + ], + "files": [ + { + "path": "registry/example/interactive-grid-pattern-demo-2.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\";\n\nexport default function InteractiveGridPatternDemo() {\n return (\n
\n

\n Interactive Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/interactive-grid-pattern-demo.json b/public/r/interactive-grid-pattern-demo.json new file mode 100644 index 000000000..0c8e7852a --- /dev/null +++ b/public/r/interactive-grid-pattern-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "interactive-grid-pattern-demo", + "type": "registry:component", + "registryDependencies": [ + "interactive-grid-pattern" + ], + "files": [ + { + "path": "registry/example/interactive-grid-pattern-demo.tsx", + "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { InteractiveGridPattern } from \"@/registry/magicui/interactive-grid-pattern\";\n\nexport default function InteractiveGridPatternDemo() {\n return (\n
\n

\n Interactive Grid Pattern\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/interactive-grid-pattern.json b/public/r/interactive-grid-pattern.json similarity index 87% rename from public/r/styles/default/interactive-grid-pattern.json rename to public/r/interactive-grid-pattern.json index 9dcfcb8f5..066422d45 100644 --- a/public/r/styles/default/interactive-grid-pattern.json +++ b/public/r/interactive-grid-pattern.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "interactive-grid-pattern", - "type": "registry:ui", + "type": "registry:component", + "title": "Interactive Grid Pattern", + "description": "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { - "path": "magicui/interactive-grid-pattern.tsx", + "path": "registry/magicui/interactive-grid-pattern.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport React, { useState } from \"react\";\n\n/**\n * InteractiveGridPattern is a component that renders a grid pattern with interactive squares.\n *\n * @param width - The width of each square.\n * @param height - The height of each square.\n * @param squares - The number of squares in the grid. The first element is the number of horizontal squares, and the second element is the number of vertical squares.\n * @param className - The class name of the grid.\n * @param squaresClassName - The class name of the squares.\n */\ninterface InteractiveGridPatternProps extends React.SVGProps {\n width?: number;\n height?: number;\n squares?: [number, number]; // [horizontal, vertical]\n className?: string;\n squaresClassName?: string;\n}\n\n/**\n * The InteractiveGridPattern component.\n *\n * @see InteractiveGridPatternProps for the props interface.\n * @returns A React component.\n */\nexport function InteractiveGridPattern({\n width = 40,\n height = 40,\n squares = [24, 24],\n className,\n squaresClassName,\n ...props\n}: InteractiveGridPatternProps) {\n const [horizontal, vertical] = squares;\n const [hoveredSquare, setHoveredSquare] = useState(null);\n\n return (\n \n {Array.from({ length: horizontal * vertical }).map((_, index) => {\n const x = (index % horizontal) * width;\n const y = Math.floor(index / horizontal) * height;\n return (\n setHoveredSquare(index)}\n onMouseLeave={() => setHoveredSquare(null)}\n />\n );\n })}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/interactive-hover-button-demo.json b/public/r/interactive-hover-button-demo.json new file mode 100644 index 000000000..a68f10403 --- /dev/null +++ b/public/r/interactive-hover-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "interactive-hover-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/interactive-hover-button-demo.tsx", + "content": "import { InteractiveHoverButton } from \"@/registry/magicui/interactive-hover-button\";\n\nexport default function InteractiveHoverButtonDemo() {\n return Hover Me;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/interactive-hover-button.json b/public/r/interactive-hover-button.json similarity index 77% rename from public/r/styles/default/interactive-hover-button.json rename to public/r/interactive-hover-button.json index d7f5cec2d..171a7403a 100644 --- a/public/r/styles/default/interactive-hover-button.json +++ b/public/r/interactive-hover-button.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "interactive-hover-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Interactive Hover Button", + "description": "A visually engaging button component that responds to hover with dynamic transitions, adapting smoothly between light and dark modes for enhanced user interactivity.", "files": [ { - "path": "magicui/interactive-hover-button.tsx", + "path": "registry/magicui/interactive-hover-button.tsx", "content": "import React from \"react\";\nimport { ArrowRight } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\ninterface InteractiveHoverButtonProps\n extends React.ButtonHTMLAttributes {}\n\nexport const InteractiveHoverButton = React.forwardRef<\n HTMLButtonElement,\n InteractiveHoverButtonProps\n>(({ children, className, ...props }, ref) => {\n return (\n \n
\n
\n \n {children}\n \n
\n
\n {children}\n \n
\n \n );\n});\n\nInteractiveHoverButton.displayName = \"InteractiveHoverButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/iphone-15-pro-demo-2.json b/public/r/iphone-15-pro-demo-2.json new file mode 100644 index 000000000..ff6aa8976 --- /dev/null +++ b/public/r/iphone-15-pro-demo-2.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "iphone-15-pro-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo-2.tsx", + "content": "import Iphone15Pro from \"@/registry/magicui/iphone-15-pro\";\n\nexport default function Iphone15ProDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/iphone-15-pro-demo-3.json b/public/r/iphone-15-pro-demo-3.json new file mode 100644 index 000000000..3b582bf88 --- /dev/null +++ b/public/r/iphone-15-pro-demo-3.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "iphone-15-pro-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo-3.tsx", + "content": "import Iphone15Pro from \"@/registry/magicui/iphone-15-pro\";\n\nexport default function Iphone15ProDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/iphone-15-pro-demo.json b/public/r/iphone-15-pro-demo.json new file mode 100644 index 000000000..f275b5729 --- /dev/null +++ b/public/r/iphone-15-pro-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "iphone-15-pro-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo.tsx", + "content": "import Iphone15Pro from \"@/registry/magicui/iphone-15-pro\";\n\nexport default function Iphone15ProDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/iphone-15-pro.json b/public/r/iphone-15-pro.json similarity index 93% rename from public/r/styles/default/iphone-15-pro.json rename to public/r/iphone-15-pro.json index 1faac521d..3151a5e6d 100644 --- a/public/r/styles/default/iphone-15-pro.json +++ b/public/r/iphone-15-pro.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "iphone-15-pro", - "type": "registry:ui", + "type": "registry:component", + "title": "iPhone 15 Pro", + "description": "A mockup of the iPhone 15 Pro", "files": [ { - "path": "magicui/iphone-15-pro.tsx", + "path": "registry/magicui/iphone-15-pro.tsx", "content": "import { SVGProps } from \"react\";\n\nexport interface Iphone15ProProps extends SVGProps {\n width?: number;\n height?: number;\n src?: string;\n videoSrc?: string;\n}\n\nexport default function Iphone15Pro({\n width = 433,\n height = 882,\n src,\n videoSrc,\n ...props\n}: Iphone15ProProps) {\n return (\n \n \n \n \n \n \n \n \n \n\n {src && (\n \n )}\n {videoSrc && (\n \n \n \n )}\n \n \n \n \n \n \n \n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/line-shadow-text-demo.json b/public/r/line-shadow-text-demo.json new file mode 100644 index 000000000..c927783ff --- /dev/null +++ b/public/r/line-shadow-text-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "line-shadow-text-demo", + "type": "registry:component", + "registryDependencies": [ + "line-shadow-text" + ], + "files": [ + { + "path": "registry/example/line-shadow-text-demo.tsx", + "content": "import { LineShadowText } from \"@/registry/magicui/line-shadow-text\";\nimport { useTheme } from \"next-themes\";\n\nexport default function LineShadowTextDemo() {\n const theme = useTheme();\n const shadowColor = theme.resolvedTheme === \"dark\" ? \"white\" : \"black\";\n return (\n

\n Ship\n \n Fast\n \n

\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/line-shadow-text.json b/public/r/line-shadow-text.json similarity index 83% rename from public/r/styles/default/line-shadow-text.json rename to public/r/line-shadow-text.json index 3600cc9c4..4b19993eb 100644 --- a/public/r/styles/default/line-shadow-text.json +++ b/public/r/line-shadow-text.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "line-shadow-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Line Shadow Text", + "description": "A text component with a moving line shadow.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/line-shadow-text.tsx", + "path": "registry/magicui/line-shadow-text.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { motion, MotionProps } from \"motion/react\";\n\ninterface LineShadowTextProps\n extends Omit, keyof MotionProps>,\n MotionProps {\n shadowColor?: string;\n as?: React.ElementType;\n}\n\nexport function LineShadowText({\n children,\n shadowColor = \"black\",\n className,\n as: Component = \"span\",\n ...props\n}: LineShadowTextProps) {\n const MotionComponent = motion.create(Component);\n const content = typeof children === \"string\" ? children : null;\n\n if (!content) {\n throw new Error(\"LineShadowText only accepts string content\");\n }\n\n return (\n \n {content}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/magic-card-demo.json b/public/r/magic-card-demo.json new file mode 100644 index 000000000..3424b106c --- /dev/null +++ b/public/r/magic-card-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "magic-card-demo", + "type": "registry:component", + "registryDependencies": [ + "magic-card" + ], + "files": [ + { + "path": "registry/example/magic-card-demo.tsx", + "content": "import { useTheme } from \"next-themes\";\n\nimport { MagicCard } from \"@/registry/magicui/magic-card\";\n\nexport default function MagicCardDemo() {\n const { theme } = useTheme();\n return (\n \n \n Magic\n \n \n Card\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/magic-card.json b/public/r/magic-card.json similarity index 92% rename from public/r/styles/default/magic-card.json rename to public/r/magic-card.json index 74a8bad90..cf7ff4702 100644 --- a/public/r/styles/default/magic-card.json +++ b/public/r/magic-card.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "magic-card", - "type": "registry:ui", + "type": "registry:component", + "title": "Magic Card", + "description": "A spotlight effect that follows your mouse cursor and highlights borders on hover.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/magic-card.tsx", + "path": "registry/magicui/magic-card.tsx", "content": "\"use client\";\n\nimport { motion, useMotionTemplate, useMotionValue } from \"motion/react\";\nimport React, { useCallback, useEffect, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface MagicCardProps extends React.HTMLAttributes {\n gradientSize?: number;\n gradientColor?: string;\n gradientOpacity?: number;\n gradientFrom?: string;\n gradientTo?: string;\n}\n\nexport function MagicCard({\n children,\n className,\n gradientSize = 200,\n gradientColor = \"#262626\",\n gradientOpacity = 0.8,\n gradientFrom = \"#9E7AFF\",\n gradientTo = \"#FE8BBB\",\n}: MagicCardProps) {\n const cardRef = useRef(null);\n const mouseX = useMotionValue(-gradientSize);\n const mouseY = useMotionValue(-gradientSize);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (cardRef.current) {\n const { left, top } = cardRef.current.getBoundingClientRect();\n const clientX = e.clientX;\n const clientY = e.clientY;\n mouseX.set(clientX - left);\n mouseY.set(clientY - top);\n }\n },\n [mouseX, mouseY],\n );\n\n const handleMouseOut = useCallback(\n (e: MouseEvent) => {\n if (!e.relatedTarget) {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n mouseX.set(-gradientSize);\n mouseY.set(-gradientSize);\n }\n },\n [handleMouseMove, mouseX, gradientSize, mouseY],\n );\n\n const handleMouseEnter = useCallback(() => {\n document.addEventListener(\"mousemove\", handleMouseMove);\n mouseX.set(-gradientSize);\n mouseY.set(-gradientSize);\n }, [handleMouseMove, mouseX, gradientSize, mouseY]);\n\n useEffect(() => {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseout\", handleMouseOut);\n document.addEventListener(\"mouseenter\", handleMouseEnter);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseout\", handleMouseOut);\n document.removeEventListener(\"mouseenter\", handleMouseEnter);\n };\n }, [handleMouseEnter, handleMouseMove, handleMouseOut]);\n\n useEffect(() => {\n mouseX.set(-gradientSize);\n mouseY.set(-gradientSize);\n }, [gradientSize, mouseX, mouseY]);\n\n return (\n \n
\n
{children}
\n \n \n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/marquee-3d.json b/public/r/marquee-3d.json new file mode 100644 index 000000000..ecba0c8d0 --- /dev/null +++ b/public/r/marquee-3d.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "marquee-3d", + "type": "registry:component", + "registryDependencies": [ + "marquee" + ], + "files": [ + { + "path": "registry/example/marquee-3d.tsx", + "content": "import { Marquee } from \"@/registry/magicui/marquee\";\n\nconst logos = [\n {\n name: \"Microsoft\",\n img: \"https://picsum.photos/id/1/200/300\",\n },\n {\n name: \"Apple\",\n img: \"https://picsum.photos/id/2/200/300\",\n },\n {\n name: \"Google\",\n img: \"https://picsum.photos/id/3/200/300\",\n },\n {\n name: \"Facebook\",\n img: \"https://picsum.photos/id/4/200/300\",\n },\n {\n name: \"LinkedIn\",\n img: \"https://picsum.photos/id/5/200/300\",\n },\n {\n name: \"Twitter\",\n img: \"https://picsum.photos/id/6/200/300\",\n },\n];\n\nexport default function Marquee3D() {\n return (\n
\n
\n \n {logos.map((data, idx) => (\n \n ))}\n \n
\n\n
\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/marquee-demo-vertical.json b/public/r/marquee-demo-vertical.json new file mode 100644 index 000000000..aad8af9f6 --- /dev/null +++ b/public/r/marquee-demo-vertical.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "marquee-demo-vertical", + "type": "registry:component", + "registryDependencies": [ + "marquee" + ], + "files": [ + { + "path": "registry/example/marquee-demo-vertical.tsx", + "content": "import { cn } from \"@/lib/utils\";\nimport { Marquee } from \"@/registry/magicui/marquee\";\n\nconst reviews = [\n {\n name: \"Jack\",\n username: \"@jack\",\n body: \"I've never seen anything like this before. It's amazing. I love it.\",\n img: \"https://avatar.vercel.sh/jack\",\n },\n {\n name: \"Jill\",\n username: \"@jill\",\n body: \"I don't know what to say. I'm speechless. This is amazing.\",\n img: \"https://avatar.vercel.sh/jill\",\n },\n {\n name: \"John\",\n username: \"@john\",\n body: \"I'm at a loss for words. This is amazing. I love it.\",\n img: \"https://avatar.vercel.sh/john\",\n },\n];\n\nconst firstRow = reviews.slice(0, reviews.length / 2);\nconst secondRow = reviews.slice(reviews.length / 2);\n\nconst ReviewCard = ({\n img,\n name,\n username,\n body,\n}: {\n img: string;\n name: string;\n username: string;\n body: string;\n}) => {\n return (\n \n
\n \"\"\n
\n
\n {name}\n
\n

{username}

\n
\n
\n
{body}
\n \n );\n};\n\nexport default function MarqueeDemoVertical() {\n return (\n
\n \n {firstRow.map((review) => (\n \n ))}\n \n \n {secondRow.map((review) => (\n \n ))}\n \n
\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/marquee-demo.json b/public/r/marquee-demo.json new file mode 100644 index 000000000..54f61fdc0 --- /dev/null +++ b/public/r/marquee-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "marquee-demo", + "type": "registry:component", + "registryDependencies": [ + "marquee" + ], + "files": [ + { + "path": "registry/example/marquee-demo.tsx", + "content": "import { cn } from \"@/lib/utils\";\nimport { Marquee } from \"@/registry/magicui/marquee\";\n\nconst reviews = [\n {\n name: \"Jack\",\n username: \"@jack\",\n body: \"I've never seen anything like this before. It's amazing. I love it.\",\n img: \"https://avatar.vercel.sh/jack\",\n },\n {\n name: \"Jill\",\n username: \"@jill\",\n body: \"I don't know what to say. I'm speechless. This is amazing.\",\n img: \"https://avatar.vercel.sh/jill\",\n },\n {\n name: \"John\",\n username: \"@john\",\n body: \"I'm at a loss for words. This is amazing. I love it.\",\n img: \"https://avatar.vercel.sh/john\",\n },\n {\n name: \"Jane\",\n username: \"@jane\",\n body: \"I'm at a loss for words. This is amazing. I love it.\",\n img: \"https://avatar.vercel.sh/jane\",\n },\n {\n name: \"Jenny\",\n username: \"@jenny\",\n body: \"I'm at a loss for words. This is amazing. I love it.\",\n img: \"https://avatar.vercel.sh/jenny\",\n },\n {\n name: \"James\",\n username: \"@james\",\n body: \"I'm at a loss for words. This is amazing. I love it.\",\n img: \"https://avatar.vercel.sh/james\",\n },\n];\n\nconst firstRow = reviews.slice(0, reviews.length / 2);\nconst secondRow = reviews.slice(reviews.length / 2);\n\nconst ReviewCard = ({\n img,\n name,\n username,\n body,\n}: {\n img: string;\n name: string;\n username: string;\n body: string;\n}) => {\n return (\n \n
\n \"\"\n
\n
\n {name}\n
\n

{username}

\n
\n
\n
{body}
\n \n );\n};\n\nexport default function MarqueeDemo() {\n return (\n
\n \n {firstRow.map((review) => (\n \n ))}\n \n \n {secondRow.map((review) => (\n \n ))}\n \n
\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/marquee-logos.json b/public/r/marquee-logos.json new file mode 100644 index 000000000..0c1a00881 --- /dev/null +++ b/public/r/marquee-logos.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "marquee-logos", + "type": "registry:component", + "registryDependencies": [ + "marquee" + ], + "files": [ + { + "path": "registry/example/marquee-logos.tsx", + "content": "import { cn } from \"@/lib/utils\";\nimport { Marquee } from \"@/registry/magicui/marquee\";\n\nconst logos = [\n {\n name: \"Microsoft\",\n img: \"https://cdn.simpleicons.org/microsoft/000/fff\",\n },\n {\n name: \"Apple\",\n img: \"https://cdn.simpleicons.org/apple/000/fff\",\n },\n {\n name: \"Google\",\n img: \"https://cdn.simpleicons.org/google/000/fff\",\n },\n {\n name: \"Facebook\",\n img: \"https://cdn.simpleicons.org/facebook/000/fff\",\n },\n {\n name: \"LinkedIn\",\n img: \"https://cdn.simpleicons.org/linkedin/000/fff\",\n },\n {\n name: \"Twitter\",\n img: \"https://cdn.simpleicons.org/twitter/000/fff\",\n },\n];\n\nconst Logo = ({ name, img }: { name: string; img: string }) => {\n return (\n
\n {name}\n
\n );\n};\n\nexport default function MarqueeLogos() {\n return (\n
\n \n {logos.map((logo, idx) => (\n \n ))}\n \n
\n
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/marquee.json b/public/r/marquee.json similarity index 89% rename from public/r/styles/default/marquee.json rename to public/r/marquee.json index 6c47cd9eb..d59e6da1a 100644 --- a/public/r/styles/default/marquee.json +++ b/public/r/marquee.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "marquee", - "type": "registry:ui", + "type": "registry:component", + "title": "Marquee", + "description": "An infinite scrolling component that can be used to display text, images, or videos.", "files": [ { - "path": "magicui/marquee.tsx", + "path": "registry/magicui/marquee.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { ComponentPropsWithoutRef } from \"react\";\n\ninterface MarqueeProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Optional CSS class name to apply custom styles\n */\n className?: string;\n /**\n * Whether to reverse the animation direction\n * @default false\n */\n reverse?: boolean;\n /**\n * Whether to pause the animation on hover\n * @default false\n */\n pauseOnHover?: boolean;\n /**\n * Content to be displayed in the marquee\n */\n children: React.ReactNode;\n /**\n * Whether to animate vertically instead of horizontally\n * @default false\n */\n vertical?: boolean;\n /**\n * Number of times to repeat the content\n * @default 4\n */\n repeat?: number;\n}\n\nexport function Marquee({\n className,\n reverse = false,\n pauseOnHover = false,\n children,\n vertical = false,\n repeat = 4,\n ...props\n}: MarqueeProps) {\n return (\n \n {Array(repeat)\n .fill(0)\n .map((_, i) => (\n \n {children}\n \n ))}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/meteors-demo.json b/public/r/meteors-demo.json new file mode 100644 index 000000000..4f8139df7 --- /dev/null +++ b/public/r/meteors-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "meteors-demo", + "type": "registry:component", + "registryDependencies": [ + "meteors" + ], + "files": [ + { + "path": "registry/example/meteors-demo.tsx", + "content": "import { Meteors } from \"@/registry/magicui/meteors\";\n\nexport default function MeteorDemo() {\n return (\n
\n \n \n Meteors\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/meteors.json b/public/r/meteors.json similarity index 89% rename from public/r/styles/default/meteors.json rename to public/r/meteors.json index 85e645557..2d312f290 100644 --- a/public/r/styles/default/meteors.json +++ b/public/r/meteors.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "meteors", - "type": "registry:ui", + "type": "registry:component", + "title": "Meteors", + "description": "A meteor shower effect.", "files": [ { - "path": "magicui/meteors.tsx", + "path": "registry/magicui/meteors.tsx", "content": "\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface MeteorsProps extends React.HTMLAttributes {\n number?: number;\n}\nexport const Meteors = ({ number = 20, ...props }: MeteorsProps) => {\n const [meteorStyles, setMeteorStyles] = useState>(\n [],\n );\n\n useEffect(() => {\n const styles = [...new Array(number)].map(() => ({\n top: -5,\n left: Math.floor(Math.random() * window.innerWidth) + \"px\",\n animationDelay: Math.random() * 1 + 0.2 + \"s\",\n animationDuration: Math.floor(Math.random() * 8 + 2) + \"s\",\n }));\n setMeteorStyles(styles);\n }, [number]);\n\n return (\n <>\n {[...meteorStyles].map((style, idx) => (\n // Meteor Head\n \n {/* Meteor Tail */}\n
\n \n ))}\n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/morphing-text-demo.json b/public/r/morphing-text-demo.json new file mode 100644 index 000000000..5b36263f9 --- /dev/null +++ b/public/r/morphing-text-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "morphing-text-demo", + "type": "registry:component", + "registryDependencies": [ + "morphing-text" + ], + "files": [ + { + "path": "registry/example/morphing-text-demo.tsx", + "content": "import { MorphingText } from \"@/registry/magicui/morphing-text\";\n\nconst texts = [\n \"Hello\",\n \"Morphing\",\n \"Text\",\n \"Animation\",\n \"React\",\n \"Component\",\n \"Smooth\",\n \"Transition\",\n \"Engaging\",\n];\n\nexport default function MorphingTextDemo() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/morphing-text.json b/public/r/morphing-text.json similarity index 93% rename from public/r/styles/default/morphing-text.json rename to public/r/morphing-text.json index c347a5fe5..2845dd907 100644 --- a/public/r/styles/default/morphing-text.json +++ b/public/r/morphing-text.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "morphing-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Morphing Text", + "description": "A dynamic text morphing component for Magic UI.", "files": [ { - "path": "magicui/morphing-text.tsx", + "path": "registry/magicui/morphing-text.tsx", "content": "\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst morphTime = 1.5;\nconst cooldownTime = 0.5;\n\nconst useMorphingText = (texts: string[]) => {\n const textIndexRef = useRef(0);\n const morphRef = useRef(0);\n const cooldownRef = useRef(0);\n const timeRef = useRef(new Date());\n\n const text1Ref = useRef(null);\n const text2Ref = useRef(null);\n\n const setStyles = useCallback(\n (fraction: number) => {\n const [current1, current2] = [text1Ref.current, text2Ref.current];\n if (!current1 || !current2) return;\n\n current2.style.filter = `blur(${Math.min(8 / fraction - 8, 100)}px)`;\n current2.style.opacity = `${Math.pow(fraction, 0.4) * 100}%`;\n\n const invertedFraction = 1 - fraction;\n current1.style.filter = `blur(${Math.min(8 / invertedFraction - 8, 100)}px)`;\n current1.style.opacity = `${Math.pow(invertedFraction, 0.4) * 100}%`;\n\n current1.textContent = texts[textIndexRef.current % texts.length];\n current2.textContent = texts[(textIndexRef.current + 1) % texts.length];\n },\n [texts],\n );\n\n const doMorph = useCallback(() => {\n morphRef.current -= cooldownRef.current;\n cooldownRef.current = 0;\n\n let fraction = morphRef.current / morphTime;\n\n if (fraction > 1) {\n cooldownRef.current = cooldownTime;\n fraction = 1;\n }\n\n setStyles(fraction);\n\n if (fraction === 1) {\n textIndexRef.current++;\n }\n }, [setStyles]);\n\n const doCooldown = useCallback(() => {\n morphRef.current = 0;\n const [current1, current2] = [text1Ref.current, text2Ref.current];\n if (current1 && current2) {\n current2.style.filter = \"none\";\n current2.style.opacity = \"100%\";\n current1.style.filter = \"none\";\n current1.style.opacity = \"0%\";\n }\n }, []);\n\n useEffect(() => {\n let animationFrameId: number;\n\n const animate = () => {\n animationFrameId = requestAnimationFrame(animate);\n\n const newTime = new Date();\n const dt = (newTime.getTime() - timeRef.current.getTime()) / 1000;\n timeRef.current = newTime;\n\n cooldownRef.current -= dt;\n\n if (cooldownRef.current <= 0) doMorph();\n else doCooldown();\n };\n\n animate();\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [doMorph, doCooldown]);\n\n return { text1Ref, text2Ref };\n};\n\ninterface MorphingTextProps {\n className?: string;\n texts: string[];\n}\n\nconst Texts: React.FC> = ({ texts }) => {\n const { text1Ref, text2Ref } = useMorphingText(texts);\n return (\n <>\n \n \n \n );\n};\n\nconst SvgFilters: React.FC = () => (\n \n \n \n \n \n \n \n);\n\nexport const MorphingText: React.FC = ({\n texts,\n className,\n}) => (\n \n \n \n
\n);\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/neon-gradient-card-demo.json b/public/r/neon-gradient-card-demo.json new file mode 100644 index 000000000..9cfe9122e --- /dev/null +++ b/public/r/neon-gradient-card-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "neon-gradient-card-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/neon-gradient-card-demo.tsx", + "content": "import { NeonGradientCard } from \"@/registry/magicui/neon-gradient-card\";\n\nexport default function NeonGradientCardDemo() {\n return (\n \n \n Neon Gradient Card\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/neon-gradient-card.json b/public/r/neon-gradient-card.json similarity index 94% rename from public/r/styles/default/neon-gradient-card.json rename to public/r/neon-gradient-card.json index 29271d6c0..f68c88072 100644 --- a/public/r/styles/default/neon-gradient-card.json +++ b/public/r/neon-gradient-card.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "neon-gradient-card", - "type": "registry:ui", + "type": "registry:component", + "title": "Neon Gradient Card", + "description": "A beautiful neon card effect", "files": [ { - "path": "magicui/neon-gradient-card.tsx", + "path": "registry/magicui/neon-gradient-card.tsx", "content": "\"use client\";\n\nimport {\n CSSProperties,\n ReactElement,\n ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface NeonColorsProps {\n firstColor: string;\n secondColor: string;\n}\n\ninterface NeonGradientCardProps {\n /**\n * @default
\n * @type ReactElement\n * @description\n * The component to be rendered as the card\n * */\n as?: ReactElement;\n /**\n * @default \"\"\n * @type string\n * @description\n * The className of the card\n */\n className?: string;\n\n /**\n * @default \"\"\n * @type ReactNode\n * @description\n * The children of the card\n * */\n children?: ReactNode;\n\n /**\n * @default 5\n * @type number\n * @description\n * The size of the border in pixels\n * */\n borderSize?: number;\n\n /**\n * @default 20\n * @type number\n * @description\n * The size of the radius in pixels\n * */\n borderRadius?: number;\n\n /**\n * @default \"{ firstColor: '#ff00aa', secondColor: '#00FFF1' }\"\n * @type string\n * @description\n * The colors of the neon gradient\n * */\n neonColors?: NeonColorsProps;\n\n [key: string]: any;\n}\n\nexport const NeonGradientCard: React.FC = ({\n className,\n children,\n borderSize = 2,\n borderRadius = 20,\n neonColors = {\n firstColor: \"#ff00aa\",\n secondColor: \"#00FFF1\",\n },\n ...props\n}) => {\n const containerRef = useRef(null);\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const { offsetWidth, offsetHeight } = containerRef.current;\n setDimensions({ width: offsetWidth, height: offsetHeight });\n }\n };\n\n updateDimensions();\n window.addEventListener(\"resize\", updateDimensions);\n\n return () => {\n window.removeEventListener(\"resize\", updateDimensions);\n };\n }, []);\n\n useEffect(() => {\n if (containerRef.current) {\n const { offsetWidth, offsetHeight } = containerRef.current;\n setDimensions({ width: offsetWidth, height: offsetHeight });\n }\n }, [children]);\n\n return (\n \n \n {children}\n
\n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/number-ticker-decimal-demo.json b/public/r/number-ticker-decimal-demo.json new file mode 100644 index 000000000..909599e76 --- /dev/null +++ b/public/r/number-ticker-decimal-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "number-ticker-decimal-demo", + "type": "registry:component", + "registryDependencies": [ + "number-ticker" + ], + "files": [ + { + "path": "registry/example/number-ticker-decimal-demo.tsx", + "content": "import { NumberTicker } from \"@/registry/magicui/number-ticker\";\n\nexport default function NumberTickerDemo() {\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/number-ticker-demo.json b/public/r/number-ticker-demo.json new file mode 100644 index 000000000..3f2a1011a --- /dev/null +++ b/public/r/number-ticker-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "number-ticker-demo", + "type": "registry:component", + "registryDependencies": [ + "number-ticker" + ], + "files": [ + { + "path": "registry/example/number-ticker-demo.tsx", + "content": "import { NumberTicker } from \"@/registry/magicui/number-ticker\";\n\nexport default function NumberTickerDemo() {\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/number-ticker.json b/public/r/number-ticker.json similarity index 86% rename from public/r/styles/default/number-ticker.json rename to public/r/number-ticker.json index 125193319..38e07437e 100644 --- a/public/r/styles/default/number-ticker.json +++ b/public/r/number-ticker.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "number-ticker", - "type": "registry:ui", + "type": "registry:component", + "title": "Number Ticker", + "description": "Animate numbers to count up or down to a target number", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/number-ticker.tsx", + "path": "registry/magicui/number-ticker.tsx", "content": "\"use client\";\n\nimport { useInView, useMotionValue, useSpring } from \"motion/react\";\nimport { ComponentPropsWithoutRef, useEffect, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface NumberTickerProps extends ComponentPropsWithoutRef<\"span\"> {\n value: number;\n direction?: \"up\" | \"down\";\n delay?: number; // delay in s\n decimalPlaces?: number;\n}\n\nexport function NumberTicker({\n value,\n direction = \"up\",\n delay = 0,\n className,\n decimalPlaces = 0,\n ...props\n}: NumberTickerProps) {\n const ref = useRef(null);\n const motionValue = useMotionValue(direction === \"down\" ? value : 0);\n const springValue = useSpring(motionValue, {\n damping: 60,\n stiffness: 100,\n });\n const isInView = useInView(ref, { once: true, margin: \"0px\" });\n\n useEffect(() => {\n isInView &&\n setTimeout(() => {\n motionValue.set(direction === \"down\" ? 0 : value);\n }, delay * 1000);\n }, [motionValue, isInView, delay, value, direction]);\n\n useEffect(\n () =>\n springValue.on(\"change\", (latest) => {\n if (ref.current) {\n ref.current.textContent = Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces,\n }).format(Number(latest.toFixed(decimalPlaces)));\n }\n }),\n [springValue, decimalPlaces],\n );\n\n return (\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/orbiting-circles-demo.json b/public/r/orbiting-circles-demo.json new file mode 100644 index 000000000..d4ad7b812 --- /dev/null +++ b/public/r/orbiting-circles-demo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "orbiting-circles-demo", + "type": "registry:component", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "orbiting-circles" + ], + "files": [ + { + "path": "registry/example/orbiting-circles-demo.tsx", + "content": "import { OrbitingCircles } from \"@/registry/magicui/orbiting-circles\";\n\nexport default function OrbitingCirclesDemo() {\n return (\n
\n \n Circles\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nconst Icons = {\n gitHub: () => (\n \n \n \n ),\n notion: () => (\n \n \n \n \n ),\n openai: () => (\n \n \n \n ),\n googleDrive: () => (\n \n \n \n \n \n \n \n \n ),\n whatsapp: () => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ),\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/orbiting-circles.json b/public/r/orbiting-circles.json similarity index 89% rename from public/r/styles/default/orbiting-circles.json rename to public/r/orbiting-circles.json index bb443dca7..6ca6fb56a 100644 --- a/public/r/styles/default/orbiting-circles.json +++ b/public/r/orbiting-circles.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "orbiting-circles", - "type": "registry:ui", + "type": "registry:component", + "title": "Orbiting Circles", + "description": "A collection of circles which move in orbit along a circular path", "files": [ { - "path": "magicui/orbiting-circles.tsx", + "path": "registry/magicui/orbiting-circles.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport React from \"react\";\n\nexport interface OrbitingCirclesProps\n extends React.HTMLAttributes {\n className?: string;\n children?: React.ReactNode;\n reverse?: boolean;\n duration?: number;\n delay?: number;\n radius?: number;\n path?: boolean;\n iconSize?: number;\n speed?: number;\n}\n\nexport function OrbitingCircles({\n className,\n children,\n reverse,\n duration = 20,\n radius = 160,\n path = true,\n iconSize = 30,\n speed = 1,\n ...props\n}: OrbitingCirclesProps) {\n const calculatedDuration = duration / speed;\n return (\n <>\n {path && (\n \n \n \n )}\n {React.Children.map(children, (child, index) => {\n const angle = (360 / React.Children.count(children)) * index;\n return (\n \n {child}\n \n );\n })}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/particles-demo.json b/public/r/particles-demo.json new file mode 100644 index 000000000..0ccc35e4e --- /dev/null +++ b/public/r/particles-demo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "particles-demo", + "type": "registry:component", + "dependencies": [ + "next-themes" + ], + "registryDependencies": [ + "particles" + ], + "files": [ + { + "path": "registry/example/particles-demo.tsx", + "content": "\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useState } from \"react\";\n\nimport { Particles } from \"@/registry/magicui/particles\";\n\nexport default function ParticlesDemo() {\n const { resolvedTheme } = useTheme();\n const [color, setColor] = useState(\"#ffffff\");\n\n useEffect(() => {\n setColor(resolvedTheme === \"dark\" ? \"#ffffff\" : \"#000000\");\n }, [resolvedTheme]);\n\n return (\n
\n \n Particles\n \n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/particles.json b/public/r/particles.json similarity index 96% rename from public/r/styles/default/particles.json rename to public/r/particles.json index b44543442..0ee51c0af 100644 --- a/public/r/styles/default/particles.json +++ b/public/r/particles.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "particles", - "type": "registry:ui", + "type": "registry:component", + "title": "Particles", + "description": "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", "files": [ { - "path": "magicui/particles.tsx", + "path": "registry/magicui/particles.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport React, {\n ComponentPropsWithoutRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\ninterface MousePosition {\n x: number;\n y: number;\n}\n\nfunction MousePosition(): MousePosition {\n const [mousePosition, setMousePosition] = useState({\n x: 0,\n y: 0,\n });\n\n useEffect(() => {\n const handleMouseMove = (event: MouseEvent) => {\n setMousePosition({ x: event.clientX, y: event.clientY });\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n };\n }, []);\n\n return mousePosition;\n}\n\ninterface ParticlesProps extends ComponentPropsWithoutRef<\"div\"> {\n className?: string;\n quantity?: number;\n staticity?: number;\n ease?: number;\n size?: number;\n refresh?: boolean;\n color?: string;\n vx?: number;\n vy?: number;\n}\n\nfunction hexToRgb(hex: string): number[] {\n hex = hex.replace(\"#\", \"\");\n\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((char) => char + char)\n .join(\"\");\n }\n\n const hexInt = parseInt(hex, 16);\n const red = (hexInt >> 16) & 255;\n const green = (hexInt >> 8) & 255;\n const blue = hexInt & 255;\n return [red, green, blue];\n}\n\ntype Circle = {\n x: number;\n y: number;\n translateX: number;\n translateY: number;\n size: number;\n alpha: number;\n targetAlpha: number;\n dx: number;\n dy: number;\n magnetism: number;\n};\n\nexport const Particles: React.FC = ({\n className = \"\",\n quantity = 100,\n staticity = 50,\n ease = 50,\n size = 0.4,\n refresh = false,\n color = \"#ffffff\",\n vx = 0,\n vy = 0,\n ...props\n}) => {\n const canvasRef = useRef(null);\n const canvasContainerRef = useRef(null);\n const context = useRef(null);\n const circles = useRef([]);\n const mousePosition = MousePosition();\n const mouse = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const canvasSize = useRef<{ w: number; h: number }>({ w: 0, h: 0 });\n const dpr = typeof window !== \"undefined\" ? window.devicePixelRatio : 1;\n const rafID = useRef(null);\n const resizeTimeout = useRef();\n\n useEffect(() => {\n if (canvasRef.current) {\n context.current = canvasRef.current.getContext(\"2d\");\n }\n initCanvas();\n animate();\n\n const handleResize = () => {\n if (resizeTimeout.current) {\n clearTimeout(resizeTimeout.current);\n }\n resizeTimeout.current = setTimeout(() => {\n initCanvas();\n }, 200);\n };\n\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (rafID.current != null) {\n window.cancelAnimationFrame(rafID.current);\n }\n if (resizeTimeout.current) {\n clearTimeout(resizeTimeout.current);\n }\n window.removeEventListener(\"resize\", handleResize);\n };\n }, [color]);\n\n useEffect(() => {\n onMouseMove();\n }, [mousePosition.x, mousePosition.y]);\n\n useEffect(() => {\n initCanvas();\n }, [refresh]);\n\n const initCanvas = () => {\n resizeCanvas();\n drawParticles();\n };\n\n const onMouseMove = () => {\n if (canvasRef.current) {\n const rect = canvasRef.current.getBoundingClientRect();\n const { w, h } = canvasSize.current;\n const x = mousePosition.x - rect.left - w / 2;\n const y = mousePosition.y - rect.top - h / 2;\n const inside = x < w / 2 && x > -w / 2 && y < h / 2 && y > -h / 2;\n if (inside) {\n mouse.current.x = x;\n mouse.current.y = y;\n }\n }\n };\n\n const resizeCanvas = () => {\n if (canvasContainerRef.current && canvasRef.current && context.current) {\n canvasSize.current.w = canvasContainerRef.current.offsetWidth;\n canvasSize.current.h = canvasContainerRef.current.offsetHeight;\n\n canvasRef.current.width = canvasSize.current.w * dpr;\n canvasRef.current.height = canvasSize.current.h * dpr;\n canvasRef.current.style.width = `${canvasSize.current.w}px`;\n canvasRef.current.style.height = `${canvasSize.current.h}px`;\n context.current.scale(dpr, dpr);\n\n // Clear existing particles and create new ones with exact quantity\n circles.current = [];\n for (let i = 0; i < quantity; i++) {\n const circle = circleParams();\n drawCircle(circle);\n }\n }\n };\n\n const circleParams = (): Circle => {\n const x = Math.floor(Math.random() * canvasSize.current.w);\n const y = Math.floor(Math.random() * canvasSize.current.h);\n const translateX = 0;\n const translateY = 0;\n const pSize = Math.floor(Math.random() * 2) + size;\n const alpha = 0;\n const targetAlpha = parseFloat((Math.random() * 0.6 + 0.1).toFixed(1));\n const dx = (Math.random() - 0.5) * 0.1;\n const dy = (Math.random() - 0.5) * 0.1;\n const magnetism = 0.1 + Math.random() * 4;\n return {\n x,\n y,\n translateX,\n translateY,\n size: pSize,\n alpha,\n targetAlpha,\n dx,\n dy,\n magnetism,\n };\n };\n\n const rgb = hexToRgb(color);\n\n const drawCircle = (circle: Circle, update = false) => {\n if (context.current) {\n const { x, y, translateX, translateY, size, alpha } = circle;\n context.current.translate(translateX, translateY);\n context.current.beginPath();\n context.current.arc(x, y, size, 0, 2 * Math.PI);\n context.current.fillStyle = `rgba(${rgb.join(\", \")}, ${alpha})`;\n context.current.fill();\n context.current.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n if (!update) {\n circles.current.push(circle);\n }\n }\n };\n\n const clearContext = () => {\n if (context.current) {\n context.current.clearRect(\n 0,\n 0,\n canvasSize.current.w,\n canvasSize.current.h,\n );\n }\n };\n\n const drawParticles = () => {\n clearContext();\n const particleCount = quantity;\n for (let i = 0; i < particleCount; i++) {\n const circle = circleParams();\n drawCircle(circle);\n }\n };\n\n const remapValue = (\n value: number,\n start1: number,\n end1: number,\n start2: number,\n end2: number,\n ): number => {\n const remapped =\n ((value - start1) * (end2 - start2)) / (end1 - start1) + start2;\n return remapped > 0 ? remapped : 0;\n };\n\n const animate = () => {\n clearContext();\n circles.current.forEach((circle: Circle, i: number) => {\n // Handle the alpha value\n const edge = [\n circle.x + circle.translateX - circle.size, // distance from left edge\n canvasSize.current.w - circle.x - circle.translateX - circle.size, // distance from right edge\n circle.y + circle.translateY - circle.size, // distance from top edge\n canvasSize.current.h - circle.y - circle.translateY - circle.size, // distance from bottom edge\n ];\n const closestEdge = edge.reduce((a, b) => Math.min(a, b));\n const remapClosestEdge = parseFloat(\n remapValue(closestEdge, 0, 20, 0, 1).toFixed(2),\n );\n if (remapClosestEdge > 1) {\n circle.alpha += 0.02;\n if (circle.alpha > circle.targetAlpha) {\n circle.alpha = circle.targetAlpha;\n }\n } else {\n circle.alpha = circle.targetAlpha * remapClosestEdge;\n }\n circle.x += circle.dx + vx;\n circle.y += circle.dy + vy;\n circle.translateX +=\n (mouse.current.x / (staticity / circle.magnetism) - circle.translateX) /\n ease;\n circle.translateY +=\n (mouse.current.y / (staticity / circle.magnetism) - circle.translateY) /\n ease;\n\n drawCircle(circle, true);\n\n // circle gets out of the canvas\n if (\n circle.x < -circle.size ||\n circle.x > canvasSize.current.w + circle.size ||\n circle.y < -circle.size ||\n circle.y > canvasSize.current.h + circle.size\n ) {\n // remove the circle from the array\n circles.current.splice(i, 1);\n // create a new circle\n const newCircle = circleParams();\n drawCircle(newCircle);\n }\n });\n rafID.current = window.requestAnimationFrame(animate);\n };\n\n return (\n \n \n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/pulsating-button-demo.json b/public/r/pulsating-button-demo.json new file mode 100644 index 000000000..e58c699bb --- /dev/null +++ b/public/r/pulsating-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "pulsating-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/pulsating-button-demo.tsx", + "content": "import { PulsatingButton } from \"@/registry/magicui/pulsating-button\";\n\nexport default function PulsatingButtonDemo() {\n return Join Affiliate Program;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/pulsating-button.json b/public/r/pulsating-button.json similarity index 85% rename from public/r/styles/default/pulsating-button.json rename to public/r/pulsating-button.json index 2b77162b1..04629175b 100644 --- a/public/r/styles/default/pulsating-button.json +++ b/public/r/pulsating-button.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "pulsating-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Pulsating Button", + "description": "An animated pulsating button useful for capturing attention of users.", "files": [ { - "path": "magicui/pulsating-button.tsx", + "path": "registry/magicui/pulsating-button.tsx", "content": "import React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ninterface PulsatingButtonProps\n extends React.ButtonHTMLAttributes {\n pulseColor?: string;\n duration?: string;\n}\n\nexport const PulsatingButton = React.forwardRef<\n HTMLButtonElement,\n PulsatingButtonProps\n>(\n (\n {\n className,\n children,\n pulseColor = \"#0096ff\",\n duration = \"1.5s\",\n ...props\n },\n ref,\n ) => {\n return (\n \n
{children}
\n
\n \n );\n },\n);\n\nPulsatingButton.displayName = \"PulsatingButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/rainbow-button-demo.json b/public/r/rainbow-button-demo.json new file mode 100644 index 000000000..b51411ec5 --- /dev/null +++ b/public/r/rainbow-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "rainbow-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/rainbow-button-demo.tsx", + "content": "import { RainbowButton } from \"@/registry/magicui/rainbow-button\";\n\nexport default function RainbowButtonDemo() {\n return Get Unlimited Access;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/rainbow-button.json b/public/r/rainbow-button.json similarity index 91% rename from public/r/styles/default/rainbow-button.json rename to public/r/rainbow-button.json index 8421f148d..a7deb99f0 100644 --- a/public/r/styles/default/rainbow-button.json +++ b/public/r/rainbow-button.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "rainbow-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Rainbow Button", + "description": "An animated button with a rainbow effect.", "files": [ { - "path": "magicui/rainbow-button.tsx", + "path": "registry/magicui/rainbow-button.tsx", "content": "import React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ninterface RainbowButtonProps\n extends React.ButtonHTMLAttributes {}\n\nexport const RainbowButton = React.forwardRef<\n HTMLButtonElement,\n RainbowButtonProps\n>(({ children, className, ...props }, ref) => {\n return (\n \n {children}\n \n );\n});\n\nRainbowButton.displayName = \"RainbowButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/retro-grid-demo.json b/public/r/retro-grid-demo.json new file mode 100644 index 000000000..1cdf8c568 --- /dev/null +++ b/public/r/retro-grid-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "retro-grid-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/retro-grid-demo.tsx", + "content": "\"use client\";\n\nimport { RetroGrid } from \"@/registry/magicui/retro-grid\";\n\nexport default function RetroGridDemo() {\n return (\n
\n \n Retro Grid\n \n\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/retro-grid.json b/public/r/retro-grid.json similarity index 90% rename from public/r/styles/default/retro-grid.json rename to public/r/retro-grid.json index 9f56780c6..c4351e891 100644 --- a/public/r/styles/default/retro-grid.json +++ b/public/r/retro-grid.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "retro-grid", - "type": "registry:ui", + "type": "registry:component", + "title": "Retro Grid", + "description": "An animated scrolling retro grid effect", "files": [ { - "path": "magicui/retro-grid.tsx", + "path": "registry/magicui/retro-grid.tsx", "content": "import { cn } from \"@/lib/utils\";\n\ninterface RetroGridProps extends React.HTMLAttributes {\n /**\n * Additional CSS classes to apply to the grid container\n */\n className?: string;\n /**\n * Rotation angle of the grid in degrees\n * @default 65\n */\n angle?: number;\n /**\n * Grid cell size in pixels\n * @default 60\n */\n cellSize?: number;\n /**\n * Grid opacity value between 0 and 1\n * @default 0.5\n */\n opacity?: number;\n /**\n * Grid line color in light mode\n * @default \"gray\"\n */\n lightLineColor?: string;\n /**\n * Grid line color in dark mode\n * @default \"gray\"\n */\n darkLineColor?: string;\n}\n\nexport function RetroGrid({\n className,\n angle = 65,\n cellSize = 60,\n opacity = 0.5,\n lightLineColor = \"gray\",\n darkLineColor = \"gray\",\n ...props\n}: RetroGridProps) {\n const gridStyles = {\n \"--grid-angle\": `${angle}deg`,\n \"--cell-size\": `${cellSize}px`,\n \"--opacity\": opacity,\n \"--light-line\": lightLineColor,\n \"--dark-line\": darkLineColor,\n } as React.CSSProperties;\n\n return (\n \n
\n
\n
\n\n
\n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/ripple-button-demo.json b/public/r/ripple-button-demo.json new file mode 100644 index 000000000..c24c64891 --- /dev/null +++ b/public/r/ripple-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "ripple-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/ripple-button-demo.tsx", + "content": "import { RippleButton } from \"@/registry/magicui/ripple-button\";\n\nexport default function RippleButtonDemo() {\n return Click me;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/ripple-button.json b/public/r/ripple-button.json similarity index 91% rename from public/r/styles/default/ripple-button.json rename to public/r/ripple-button.json index 80ec50de7..b47135e44 100644 --- a/public/r/styles/default/ripple-button.json +++ b/public/r/ripple-button.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "ripple-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Ripple Button", + "description": "An animated button with ripple useful for user engagement.", "files": [ { - "path": "magicui/ripple-button.tsx", + "path": "registry/magicui/ripple-button.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport React, { MouseEvent, useEffect, useState } from \"react\";\n\ninterface RippleButtonProps\n extends React.ButtonHTMLAttributes {\n rippleColor?: string;\n duration?: string;\n}\n\nexport const RippleButton = React.forwardRef<\n HTMLButtonElement,\n RippleButtonProps\n>(\n (\n {\n className,\n children,\n rippleColor = \"#ffffff\",\n duration = \"600ms\",\n onClick,\n ...props\n },\n ref,\n ) => {\n const [buttonRipples, setButtonRipples] = useState<\n Array<{ x: number; y: number; size: number; key: number }>\n >([]);\n\n const handleClick = (event: MouseEvent) => {\n createRipple(event);\n onClick?.(event);\n };\n\n const createRipple = (event: MouseEvent) => {\n const button = event.currentTarget;\n const rect = button.getBoundingClientRect();\n const size = Math.max(rect.width, rect.height);\n const x = event.clientX - rect.left - size / 2;\n const y = event.clientY - rect.top - size / 2;\n\n const newRipple = { x, y, size, key: Date.now() };\n setButtonRipples((prevRipples) => [...prevRipples, newRipple]);\n };\n\n useEffect(() => {\n if (buttonRipples.length > 0) {\n const lastRipple = buttonRipples[buttonRipples.length - 1];\n const timeout = setTimeout(() => {\n setButtonRipples((prevRipples) =>\n prevRipples.filter((ripple) => ripple.key !== lastRipple.key),\n );\n }, parseInt(duration));\n return () => clearTimeout(timeout);\n }\n }, [buttonRipples, duration]);\n\n return (\n \n
{children}
\n \n {buttonRipples.map((ripple) => (\n \n ))}\n \n \n );\n },\n);\n\nRippleButton.displayName = \"RippleButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/ripple-demo.json b/public/r/ripple-demo.json new file mode 100644 index 000000000..1f4d03e2a --- /dev/null +++ b/public/r/ripple-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "ripple-demo", + "type": "registry:component", + "registryDependencies": [ + "ripple" + ], + "files": [ + { + "path": "registry/example/ripple-demo.tsx", + "content": "import { Ripple } from \"@/registry/magicui/ripple\";\n\nexport default function RippleDemo() {\n return (\n
\n

\n Ripple\n

\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/ripple.json b/public/r/ripple.json similarity index 88% rename from public/r/styles/default/ripple.json rename to public/r/ripple.json index 8da11229b..780f29a31 100644 --- a/public/r/styles/default/ripple.json +++ b/public/r/ripple.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "ripple", - "type": "registry:ui", + "type": "registry:component", + "title": "Ripple", + "description": "An animated ripple effect typically used behind elements to emphasize them.", "files": [ { - "path": "magicui/ripple.tsx", + "path": "registry/magicui/ripple.tsx", "content": "import React, { ComponentPropsWithoutRef, CSSProperties } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface RippleProps extends ComponentPropsWithoutRef<\"div\"> {\n mainCircleSize?: number;\n mainCircleOpacity?: number;\n numCircles?: number;\n}\n\nexport const Ripple = React.memo(function Ripple({\n mainCircleSize = 210,\n mainCircleOpacity = 0.24,\n numCircles = 8,\n className,\n ...props\n}: RippleProps) {\n return (\n \n {Array.from({ length: numCircles }, (_, i) => {\n const size = mainCircleSize + i * 70;\n const opacity = mainCircleOpacity - i * 0.03;\n const animationDelay = `${i * 0.06}s`;\n const borderStyle = i === numCircles - 1 ? \"dashed\" : \"solid\";\n const borderOpacity = 5 + i * 5;\n\n return (\n \n );\n })}\n
\n );\n});\n\nRipple.displayName = \"Ripple\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/safari-demo-2.json b/public/r/safari-demo-2.json new file mode 100644 index 000000000..0c94e9ffe --- /dev/null +++ b/public/r/safari-demo-2.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "safari-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-2.tsx", + "content": "import { Safari } from \"@/registry/magicui/safari\";\n\nexport default function SafariDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/safari-demo-3.json b/public/r/safari-demo-3.json new file mode 100644 index 000000000..29223b363 --- /dev/null +++ b/public/r/safari-demo-3.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "safari-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-3.tsx", + "content": "import { Safari } from \"@/registry/magicui/safari\";\n\nexport default function SafariDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/safari-demo-4.json b/public/r/safari-demo-4.json new file mode 100644 index 000000000..7993da39c --- /dev/null +++ b/public/r/safari-demo-4.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "safari-demo-4", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-4.tsx", + "content": "import { Safari } from \"@/registry/magicui/safari\";\n\nexport default function SafariDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/safari-demo.json b/public/r/safari-demo.json new file mode 100644 index 000000000..2eab87702 --- /dev/null +++ b/public/r/safari-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "safari-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo.tsx", + "content": "import { Safari } from \"@/registry/magicui/safari\";\n\nexport default function SafariDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/safari.json b/public/r/safari.json new file mode 100644 index 000000000..90427bba6 --- /dev/null +++ b/public/r/safari.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "safari", + "type": "registry:component", + "title": "Safari", + "description": "A safari browser mockup to showcase your website.", + "files": [ + { + "path": "registry/magicui/safari.tsx", + "content": "import { SVGProps } from \"react\";\n\ntype SafariMode = \"default\" | \"simple\";\n\nexport interface SafariProps extends SVGProps {\n url?: string;\n imageSrc?: string;\n videoSrc?: string;\n width?: number;\n height?: number;\n mode?: SafariMode;\n}\n\nexport function Safari({\n imageSrc,\n videoSrc,\n url,\n width = 1203,\n height = 753,\n mode = \"default\",\n ...props\n}: SafariProps) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {url}\n \n \n {mode === \"default\" ? (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {imageSrc && (\n \n )}\n {videoSrc && (\n \n \n \n )}\n \n \n \n \n \n \n \n \n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/scratch-to-reveal-demo.json b/public/r/scratch-to-reveal-demo.json new file mode 100644 index 000000000..5143c22a7 --- /dev/null +++ b/public/r/scratch-to-reveal-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "scratch-to-reveal-demo", + "type": "registry:component", + "registryDependencies": [ + "scratch-to-reveal" + ], + "files": [ + { + "path": "registry/example/scratch-to-reveal-demo.tsx", + "content": "import { ScratchToReveal } from \"@/registry/magicui/scratch-to-reveal\";\n\nconst ScratchToRevealDemo = () => {\n const handleComplete = () => {\n // Do Something\n };\n\n return (\n \n

😎

\n \n );\n};\n\nexport default ScratchToRevealDemo;\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/scratch-to-reveal.json b/public/r/scratch-to-reveal.json similarity index 93% rename from public/r/styles/default/scratch-to-reveal.json rename to public/r/scratch-to-reveal.json index f5ced0c5b..547198cd5 100644 --- a/public/r/styles/default/scratch-to-reveal.json +++ b/public/r/scratch-to-reveal.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "scratch-to-reveal", - "type": "registry:ui", + "type": "registry:component", + "title": "Scratch To Reveal", + "description": "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/scratch-to-reveal.tsx", + "path": "registry/magicui/scratch-to-reveal.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { motion, useAnimation } from \"motion/react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\ninterface ScratchToRevealProps {\n children: React.ReactNode;\n width: number;\n height: number;\n minScratchPercentage?: number;\n className?: string;\n onComplete?: () => void;\n gradientColors?: [string, string, string];\n}\n\nexport const ScratchToReveal: React.FC = ({\n width,\n height,\n minScratchPercentage = 50,\n onComplete,\n children,\n className,\n gradientColors = [\"#A97CF8\", \"#F38CB8\", \"#FDCC92\"],\n}) => {\n const canvasRef = useRef(null);\n const [isScratching, setIsScratching] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n\n const controls = useAnimation();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.fillStyle = \"#ccc\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n const gradient = ctx.createLinearGradient(\n 0,\n 0,\n canvas.width,\n canvas.height,\n );\n gradient.addColorStop(0, gradientColors[0]);\n gradient.addColorStop(0.5, gradientColors[1]);\n gradient.addColorStop(1, gradientColors[2]);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n }, [gradientColors]);\n\n useEffect(() => {\n const handleDocumentMouseMove = (event: MouseEvent) => {\n if (!isScratching) return;\n scratch(event.clientX, event.clientY);\n };\n\n const handleDocumentTouchMove = (event: TouchEvent) => {\n if (!isScratching) return;\n const touch = event.touches[0];\n scratch(touch.clientX, touch.clientY);\n };\n\n const handleDocumentMouseUp = () => {\n setIsScratching(false);\n checkCompletion();\n };\n\n const handleDocumentTouchEnd = () => {\n setIsScratching(false);\n checkCompletion();\n };\n\n document.addEventListener(\"mousedown\", handleDocumentMouseMove);\n document.addEventListener(\"mousemove\", handleDocumentMouseMove);\n document.addEventListener(\"touchstart\", handleDocumentTouchMove);\n document.addEventListener(\"touchmove\", handleDocumentTouchMove);\n document.addEventListener(\"mouseup\", handleDocumentMouseUp);\n document.addEventListener(\"touchend\", handleDocumentTouchEnd);\n document.addEventListener(\"touchcancel\", handleDocumentTouchEnd);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleDocumentMouseMove);\n document.removeEventListener(\"mousemove\", handleDocumentMouseMove);\n document.removeEventListener(\"touchstart\", handleDocumentTouchMove);\n document.removeEventListener(\"touchmove\", handleDocumentTouchMove);\n document.removeEventListener(\"mouseup\", handleDocumentMouseUp);\n document.removeEventListener(\"touchend\", handleDocumentTouchEnd);\n document.removeEventListener(\"touchcancel\", handleDocumentTouchEnd);\n };\n }, [isScratching]);\n\n const handleMouseDown = () => setIsScratching(true);\n\n const handleTouchStart = () => setIsScratching(true);\n\n const scratch = (clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n const rect = canvas.getBoundingClientRect();\n const x = clientX - rect.left + 16;\n const y = clientY - rect.top + 16;\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.beginPath();\n ctx.arc(x, y, 30, 0, Math.PI * 2);\n ctx.fill();\n }\n };\n\n const startAnimation = async () => {\n await controls.start({\n scale: [1, 1.5, 1],\n rotate: [0, 10, -10, 10, -10, 0],\n transition: { duration: 0.5 },\n });\n\n // Call onComplete after animation finishes\n if (onComplete) {\n onComplete();\n }\n };\n\n const checkCompletion = () => {\n if (isComplete) return;\n\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const pixels = imageData.data;\n const totalPixels = pixels.length / 4;\n let clearPixels = 0;\n\n for (let i = 3; i < pixels.length; i += 4) {\n if (pixels[i] === 0) clearPixels++;\n }\n\n const percentage = (clearPixels / totalPixels) * 100;\n\n if (percentage >= minScratchPercentage) {\n setIsComplete(true);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n startAnimation();\n }\n }\n };\n\n return (\n \n \n {children}\n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/script-copy-btn-demo.json b/public/r/script-copy-btn-demo.json new file mode 100644 index 000000000..600bcb672 --- /dev/null +++ b/public/r/script-copy-btn-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "script-copy-btn-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/script-copy-btn-demo.tsx", + "content": "import { ScriptCopyBtn } from \"@/registry/magicui/script-copy-btn\";\n\nexport default function ScriptCopyBtnDemo() {\n const customCommandMap = {\n npm: \"npm run shadcn add button\",\n yarn: \"yarn shadcn add button\",\n pnpm: \"pnpm dlx shadcn@latest add button\",\n bun: \"bun x shadcn@latest add button\",\n };\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/script-copy-btn.json b/public/r/script-copy-btn.json similarity index 95% rename from public/r/styles/default/script-copy-btn.json rename to public/r/script-copy-btn.json index c32243e1e..ad1b0c4ec 100644 --- a/public/r/styles/default/script-copy-btn.json +++ b/public/r/script-copy-btn.json @@ -1,6 +1,9 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "script-copy-btn", - "type": "registry:ui", + "type": "registry:component", + "title": "Script Copy Button", + "description": "Copy code to clipboard", "dependencies": [ "motion", "shiki", @@ -11,10 +14,9 @@ ], "files": [ { - "path": "magicui/script-copy-btn.tsx", + "path": "registry/magicui/script-copy-btn.tsx", "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { Check, Copy } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport { useTheme } from \"next-themes\";\nimport { HTMLAttributes, useEffect, useState } from \"react\";\nimport { codeToHtml } from \"shiki\";\n\ninterface ScriptCopyBtnProps extends HTMLAttributes {\n showMultiplePackageOptions?: boolean;\n codeLanguage: string;\n lightTheme: string;\n darkTheme: string;\n commandMap: Record;\n className?: string;\n}\n\nexport function ScriptCopyBtn({\n showMultiplePackageOptions = true,\n codeLanguage,\n lightTheme,\n darkTheme,\n commandMap,\n className,\n}: ScriptCopyBtnProps) {\n const packageManagers = Object.keys(commandMap);\n const [packageManager, setPackageManager] = useState(packageManagers[0]);\n const [copied, setCopied] = useState(false);\n const [highlightedCode, setHighlightedCode] = useState(\"\");\n const { theme } = useTheme();\n const command = commandMap[packageManager];\n\n useEffect(() => {\n async function loadHighlightedCode() {\n try {\n const highlighted = await codeToHtml(command, {\n lang: codeLanguage,\n themes: {\n light: lightTheme,\n dark: darkTheme,\n },\n defaultColor: theme === \"dark\" ? \"dark\" : \"light\",\n });\n setHighlightedCode(highlighted);\n } catch (error) {\n console.error(\"Error highlighting code:\", error);\n setHighlightedCode(`
${command}
`);\n }\n }\n\n loadHighlightedCode();\n }, [command, theme, codeLanguage, lightTheme, darkTheme]);\n\n const copyToClipboard = () => {\n navigator.clipboard.writeText(command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n \n
\n
\n {showMultiplePackageOptions && (\n
\n
\n {packageManagers.map((pm, index) => (\n
\n {index > 0 && (\n
\n )}\n setPackageManager(pm)}\n >\n {pm}\n {packageManager === pm && (\n \n )}\n \n
\n ))}\n
\n
\n )}\n
\n
\n
\n {highlightedCode ? (\n pre]:overflow-x-auto [&>pre]:rounded-md [&>pre]:p-2 [&>pre]:px-4 [&>pre]:font-mono ${\n theme === \"dark\" ? \"dark\" : \"light\"\n }`}\n dangerouslySetInnerHTML={{ __html: highlightedCode }}\n />\n ) : (\n
\n                {command}\n              
\n )}\n
\n \n {copied ? \"Copied\" : \"Copy\"}\n \n \n \n
\n
\n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/scroll-based-velocity-demo.json b/public/r/scroll-based-velocity-demo.json new file mode 100644 index 000000000..4ff793fd4 --- /dev/null +++ b/public/r/scroll-based-velocity-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "scroll-based-velocity-demo", + "type": "registry:component", + "registryDependencies": [ + "scroll-based-velocity" + ], + "files": [ + { + "path": "registry/example/scroll-based-velocity-demo.tsx", + "content": "import { VelocityScroll } from \"@/registry/magicui/scroll-based-velocity\";\n\nexport default function ScrollBasedVelocityDemo() {\n return Velocity Scroll;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/scroll-based-velocity.json b/public/r/scroll-based-velocity.json similarity index 92% rename from public/r/styles/default/scroll-based-velocity.json rename to public/r/scroll-based-velocity.json index 964e3ef16..a48866052 100644 --- a/public/r/styles/default/scroll-based-velocity.json +++ b/public/r/scroll-based-velocity.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "scroll-based-velocity", - "type": "registry:ui", + "type": "registry:component", + "title": "Scroll Based Velocity", + "description": "Scrolling text whose speed changes based on scroll speed", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/scroll-based-velocity.tsx", + "path": "registry/magicui/scroll-based-velocity.tsx", "content": "\"use client\";\n\nimport {\n motion,\n useAnimationFrame,\n useMotionValue,\n useScroll,\n useSpring,\n useTransform,\n useVelocity,\n} from \"motion/react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface VelocityScrollProps extends React.HTMLAttributes {\n defaultVelocity?: number;\n className?: string;\n numRows?: number;\n}\n\ninterface ParallaxProps extends React.HTMLAttributes {\n children: React.ReactNode;\n baseVelocity: number;\n}\n\nexport const wrap = (min: number, max: number, v: number) => {\n const rangeSize = max - min;\n return ((((v - min) % rangeSize) + rangeSize) % rangeSize) + min;\n};\n\nfunction ParallaxText({\n children,\n baseVelocity = 100,\n ...props\n}: ParallaxProps) {\n const baseX = useMotionValue(0);\n const { scrollY } = useScroll();\n const scrollVelocity = useVelocity(scrollY);\n const smoothVelocity = useSpring(scrollVelocity, {\n damping: 50,\n stiffness: 400,\n });\n\n const velocityFactor = useTransform(smoothVelocity, [0, 1000], [0, 5], {\n clamp: false,\n });\n\n const [repetitions, setRepetitions] = useState(1);\n const containerRef = useRef(null);\n const textRef = useRef(null);\n\n useEffect(() => {\n const calculateRepetitions = () => {\n if (containerRef.current && textRef.current) {\n const containerWidth = containerRef.current.offsetWidth;\n const textWidth = textRef.current.offsetWidth;\n const newRepetitions = Math.ceil(containerWidth / textWidth) + 2;\n setRepetitions(newRepetitions);\n }\n };\n\n calculateRepetitions();\n\n window.addEventListener(\"resize\", calculateRepetitions);\n return () => window.removeEventListener(\"resize\", calculateRepetitions);\n }, [children]);\n\n const x = useTransform(baseX, (v) => `${wrap(-100 / repetitions, 0, v)}%`);\n\n const directionFactor = React.useRef(1);\n useAnimationFrame((t, delta) => {\n let moveBy = directionFactor.current * baseVelocity * (delta / 1000);\n\n if (velocityFactor.get() < 0) {\n directionFactor.current = -1;\n } else if (velocityFactor.get() > 0) {\n directionFactor.current = 1;\n }\n\n moveBy += directionFactor.current * moveBy * velocityFactor.get();\n\n baseX.set(baseX.get() + moveBy);\n });\n\n return (\n \n \n {Array.from({ length: repetitions }).map((_, i) => (\n \n {children}{\" \"}\n \n ))}\n \n
\n );\n}\n\nexport function VelocityScroll({\n defaultVelocity = 5,\n numRows = 2,\n children,\n className,\n ...props\n}: VelocityScrollProps) {\n return (\n \n {Array.from({ length: numRows }).map((_, i) => (\n \n {children}\n \n ))}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/scroll-progress-demo.json b/public/r/scroll-progress-demo.json new file mode 100644 index 000000000..2659b7589 --- /dev/null +++ b/public/r/scroll-progress-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "scroll-progress-demo", + "type": "registry:component", + "registryDependencies": [ + "scroll-progress" + ], + "files": [ + { + "path": "registry/example/scroll-progress-demo.tsx", + "content": "import { ScrollProgress } from \"@/registry/magicui/scroll-progress\";\n\nexport default function ScrollProgressDemo() {\n return (\n
\n \n

\n Note: The scroll progress is shown below the navbar of the page.\n

\n

\n Magic UI is a collection of re-usable components that you can copy and\n paste into your web apps. It primarily features components, blocks, and\n templates geared towards creating landing pages and user-facing\n marketing materials.\n

\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/scroll-progress.json b/public/r/scroll-progress.json similarity index 78% rename from public/r/styles/default/scroll-progress.json rename to public/r/scroll-progress.json index 9417bf62c..5dce3ec2f 100644 --- a/public/r/styles/default/scroll-progress.json +++ b/public/r/scroll-progress.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "scroll-progress", - "type": "registry:ui", + "type": "registry:component", + "title": "Scroll Progress", + "description": "Animated Scroll Progress for your pages", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/scroll-progress.tsx", + "path": "registry/magicui/scroll-progress.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { motion, MotionProps, useScroll, useSpring } from \"motion/react\";\nimport React from \"react\";\ninterface ScrollProgressProps\n extends Omit, keyof MotionProps> {}\n\nexport const ScrollProgress = React.forwardRef<\n HTMLDivElement,\n ScrollProgressProps\n>(({ className, ...props }, ref) => {\n const { scrollYProgress } = useScroll();\n\n const scaleX = useSpring(scrollYProgress, {\n stiffness: 200,\n damping: 50,\n restDelta: 0.001,\n });\n\n return (\n \n );\n});\n\nScrollProgress.displayName = \"ScrollProgress\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/shimmer-button-demo.json b/public/r/shimmer-button-demo.json new file mode 100644 index 000000000..4d5fbd673 --- /dev/null +++ b/public/r/shimmer-button-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "shimmer-button-demo", + "type": "registry:component", + "registryDependencies": [ + "shimmer-button" + ], + "files": [ + { + "path": "registry/example/shimmer-button-demo.tsx", + "content": "import { ShimmerButton } from \"@/registry/magicui/shimmer-button\";\n\nexport default function ShimmerButtonDemo() {\n return (\n \n \n Shimmer Button\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/shimmer-button.json b/public/r/shimmer-button.json similarity index 93% rename from public/r/styles/default/shimmer-button.json rename to public/r/shimmer-button.json index 7583713d1..55fb459cf 100644 --- a/public/r/styles/default/shimmer-button.json +++ b/public/r/shimmer-button.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "shimmer-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Shimmer Button", + "description": "A button with a shimmering light which travels around the perimeter.", "files": [ { - "path": "magicui/shimmer-button.tsx", + "path": "registry/magicui/shimmer-button.tsx", "content": "import React, { CSSProperties, ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface ShimmerButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n shimmerColor?: string;\n shimmerSize?: string;\n borderRadius?: string;\n shimmerDuration?: string;\n background?: string;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ShimmerButton = React.forwardRef<\n HTMLButtonElement,\n ShimmerButtonProps\n>(\n (\n {\n shimmerColor = \"#ffffff\",\n shimmerSize = \"0.05em\",\n shimmerDuration = \"3s\",\n borderRadius = \"100px\",\n background = \"rgba(0, 0, 0, 1)\",\n className,\n children,\n ...props\n },\n ref,\n ) => {\n return (\n \n {/* spark container */}\n \n {/* spark */}\n
\n {/* spark before */}\n
\n
\n
\n {children}\n\n {/* Highlight */}\n \n\n {/* backdrop */}\n \n \n );\n },\n);\n\nShimmerButton.displayName = \"ShimmerButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/shine-border-demo-2.json b/public/r/shine-border-demo-2.json new file mode 100644 index 000000000..bf43b5ab3 --- /dev/null +++ b/public/r/shine-border-demo-2.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "shine-border-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shine-border-demo-2.tsx", + "content": "import { useTheme } from \"next-themes\";\n\nimport { ShineBorder } from \"@/registry/magicui/shine-border\";\n\nexport default function ShineBorderDemo() {\n const theme = useTheme();\n return (\n \n Shine Border\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/shine-border-demo.json b/public/r/shine-border-demo.json new file mode 100644 index 000000000..123b892cd --- /dev/null +++ b/public/r/shine-border-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "shine-border-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shine-border-demo.tsx", + "content": "import { ShineBorder } from \"@/registry/magicui/shine-border\";\n\nexport default function ShineBorderDemo() {\n return (\n \n \n Shine Border\n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/shine-border.json b/public/r/shine-border.json similarity index 91% rename from public/r/styles/default/shine-border.json rename to public/r/shine-border.json index 369020a92..b8db413c3 100644 --- a/public/r/styles/default/shine-border.json +++ b/public/r/shine-border.json @@ -1,12 +1,14 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "shine-border", - "type": "registry:ui", + "type": "registry:component", + "title": "Shine Border", + "description": "Shine border is an animated background border effect.", "files": [ { - "path": "magicui/shine-border.tsx", + "path": "registry/magicui/shine-border.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype TColorProp = string | string[];\n\ninterface ShineBorderProps {\n borderRadius?: number;\n borderWidth?: number;\n duration?: number;\n color?: TColorProp;\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * @name Shine Border\n * @description It is an animated background border effect component with easy to use and configurable props.\n * @param borderRadius defines the radius of the border.\n * @param borderWidth defines the width of the border.\n * @param duration defines the animation duration to be applied on the shining border\n * @param color a string or string array to define border color.\n * @param className defines the class name to be applied to the component\n * @param children contains react node elements.\n */\nexport function ShineBorder({\n borderRadius = 8,\n borderWidth = 1,\n duration = 14,\n color = \"#000000\",\n className,\n children,\n}: ShineBorderProps) {\n return (\n \n \n {children}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ], "tailwind": { diff --git a/public/r/shiny-button-demo.json b/public/r/shiny-button-demo.json new file mode 100644 index 000000000..3774aaa8e --- /dev/null +++ b/public/r/shiny-button-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "shiny-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shiny-button-demo.tsx", + "content": "import { ShinyButton } from \"@/registry/magicui/shiny-button\";\n\nexport default function ShinyButtonDemo() {\n return Shiny Button;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/shiny-button.json b/public/r/shiny-button.json similarity index 88% rename from public/r/styles/default/shiny-button.json rename to public/r/shiny-button.json index d8bad36b9..c81b4b9bc 100644 --- a/public/r/styles/default/shiny-button.json +++ b/public/r/shiny-button.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "shiny-button", - "type": "registry:ui", + "type": "registry:component", + "title": "Shiny Button", + "description": "A shiny button component with dynamic styles in the dark mode or light mode.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/shiny-button.tsx", + "path": "registry/magicui/shiny-button.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { motion, MotionProps, type AnimationProps } from \"motion/react\";\nimport React from \"react\";\n\nconst animationProps = {\n initial: { \"--x\": \"100%\", scale: 0.8 },\n animate: { \"--x\": \"-100%\", scale: 1 },\n whileTap: { scale: 0.95 },\n transition: {\n repeat: Infinity,\n repeatType: \"loop\",\n repeatDelay: 1,\n type: \"spring\",\n stiffness: 20,\n damping: 15,\n mass: 2,\n scale: {\n type: \"spring\",\n stiffness: 200,\n damping: 5,\n mass: 0.5,\n },\n },\n} as AnimationProps;\n\ninterface ShinyButtonProps\n extends Omit, keyof MotionProps>,\n MotionProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const ShinyButton = React.forwardRef<\n HTMLButtonElement,\n ShinyButtonProps\n>(({ children, className, ...props }, ref) => {\n return (\n \n \n {children}\n \n \n \n );\n});\n\nShinyButton.displayName = \"ShinyButton\";\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/sparkles-text-demo.json b/public/r/sparkles-text-demo.json new file mode 100644 index 000000000..529a321d6 --- /dev/null +++ b/public/r/sparkles-text-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "sparkles-text-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/sparkles-text-demo.tsx", + "content": "import { SparklesText } from \"@/registry/magicui/sparkles-text\";\n\nexport default function SparklesTextDemo() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/sparkles-text.json b/public/r/sparkles-text.json similarity index 92% rename from public/r/styles/default/sparkles-text.json rename to public/r/sparkles-text.json index 3c2a1fb2f..796b1ea65 100644 --- a/public/r/styles/default/sparkles-text.json +++ b/public/r/sparkles-text.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "sparkles-text", - "type": "registry:ui", + "type": "registry:component", + "title": "Sparkles Text", + "description": "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/sparkles-text.tsx", + "path": "registry/magicui/sparkles-text.tsx", "content": "\"use client\";\n\nimport { motion } from \"motion/react\";\nimport { CSSProperties, ReactElement, useEffect, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface Sparkle {\n id: string;\n x: string;\n y: string;\n color: string;\n delay: number;\n scale: number;\n lifespan: number;\n}\n\nconst Sparkle: React.FC = ({ id, x, y, color, delay, scale }) => {\n return (\n \n \n \n );\n};\n\ninterface SparklesTextProps {\n /**\n * @default
\n * @type ReactElement\n * @description\n * The component to be rendered as the text\n * */\n as?: ReactElement;\n\n /**\n * @default \"\"\n * @type string\n * @description\n * The className of the text\n */\n className?: string;\n\n /**\n * @required\n * @type string\n * @description\n * The text to be displayed\n * */\n text: string;\n\n /**\n * @default 10\n * @type number\n * @description\n * The count of sparkles\n * */\n sparklesCount?: number;\n\n /**\n * @default \"{first: '#9E7AFF', second: '#FE8BBB'}\"\n * @type string\n * @description\n * The colors of the sparkles\n * */\n colors?: {\n first: string;\n second: string;\n };\n}\n\nexport const SparklesText: React.FC = ({\n text,\n colors = { first: \"#9E7AFF\", second: \"#FE8BBB\" },\n className,\n sparklesCount = 10,\n ...props\n}) => {\n const [sparkles, setSparkles] = useState([]);\n\n useEffect(() => {\n const generateStar = (): Sparkle => {\n const starX = `${Math.random() * 100}%`;\n const starY = `${Math.random() * 100}%`;\n const color = Math.random() > 0.5 ? colors.first : colors.second;\n const delay = Math.random() * 2;\n const scale = Math.random() * 1 + 0.3;\n const lifespan = Math.random() * 10 + 5;\n const id = `${starX}-${starY}-${Date.now()}`;\n return { id, x: starX, y: starY, color, delay, scale, lifespan };\n };\n\n const initializeStars = () => {\n const newSparkles = Array.from({ length: sparklesCount }, generateStar);\n setSparkles(newSparkles);\n };\n\n const updateStars = () => {\n setSparkles((currentSparkles) =>\n currentSparkles.map((star) => {\n if (star.lifespan <= 0) {\n return generateStar();\n } else {\n return { ...star, lifespan: star.lifespan - 0.1 };\n }\n }),\n );\n };\n\n initializeStars();\n const interval = setInterval(updateStars, 100);\n\n return () => clearInterval(interval);\n }, [colors.first, colors.second, sparklesCount]);\n\n return (\n \n \n {sparkles.map((sparkle) => (\n \n ))}\n {text}\n \n
\n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/styles/default/avatar-circles.json b/public/r/styles/default/avatar-circles.json deleted file mode 100644 index 1a026669c..000000000 --- a/public/r/styles/default/avatar-circles.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "avatar-circles", - "type": "registry:ui", - "files": [ - { - "path": "magicui/avatar-circles.tsx", - "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface Avatar {\n imageUrl: string;\n profileUrl: string;\n}\ninterface AvatarCirclesProps {\n className?: string;\n numPeople?: number;\n avatarUrls: Avatar[];\n}\n\nexport const AvatarCircles = ({\n numPeople,\n className,\n avatarUrls,\n}: AvatarCirclesProps) => {\n return (\n
\n {avatarUrls.map((url, index) => (\n \n \n \n ))}\n {(numPeople ?? 0) > 0 && (\n \n +{numPeople}\n \n )}\n
\n );\n};\n", - "type": "registry:ui", - "target": "" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/default/client-tweet-card.json b/public/r/styles/default/client-tweet-card.json deleted file mode 100644 index 828dd2878..000000000 --- a/public/r/styles/default/client-tweet-card.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "client-tweet-card", - "type": "registry:ui", - "dependencies": [ - "react-tweet" - ], - "files": [ - { - "path": "magicui/client-tweet-card.tsx", - "content": "\"use client\";\n\nimport { TweetProps, useTweet } from \"react-tweet\";\n\nimport {\n MagicTweet,\n TweetNotFound,\n TweetSkeleton,\n} from \"@/registry/default/magicui/tweet-card\";\n\nexport const ClientTweetCard = ({\n id,\n apiUrl,\n fallback = ,\n components,\n fetchOptions,\n onError,\n ...props\n}: TweetProps & { className?: string }) => {\n const { data, error, isLoading } = useTweet(id, apiUrl, fetchOptions);\n\n if (isLoading) return fallback;\n if (error || !data) {\n const NotFound = components?.TweetNotFound || TweetNotFound;\n return ;\n }\n\n return ;\n};\n", - "type": "registry:ui", - "target": "" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/default/hero-video-dialog.json b/public/r/styles/default/hero-video-dialog.json deleted file mode 100644 index 897659d30..000000000 --- a/public/r/styles/default/hero-video-dialog.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "hero-video-dialog", - "type": "registry:ui", - "dependencies": [ - "motion" - ], - "files": [ - { - "path": "magicui/hero-video-dialog.tsx", - "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Play, XIcon } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype AnimationStyle =\n | \"from-bottom\"\n | \"from-center\"\n | \"from-top\"\n | \"from-left\"\n | \"from-right\"\n | \"fade\"\n | \"top-in-bottom-out\"\n | \"left-in-right-out\";\n\ninterface HeroVideoProps {\n animationStyle?: AnimationStyle;\n videoSrc: string;\n thumbnailSrc: string;\n thumbnailAlt?: string;\n className?: string;\n}\n\nconst animationVariants = {\n \"from-bottom\": {\n initial: { y: \"100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"100%\", opacity: 0 },\n },\n \"from-center\": {\n initial: { scale: 0.5, opacity: 0 },\n animate: { scale: 1, opacity: 1 },\n exit: { scale: 0.5, opacity: 0 },\n },\n \"from-top\": {\n initial: { y: \"-100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"-100%\", opacity: 0 },\n },\n \"from-left\": {\n initial: { x: \"-100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"-100%\", opacity: 0 },\n },\n \"from-right\": {\n initial: { x: \"100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"100%\", opacity: 0 },\n },\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n \"top-in-bottom-out\": {\n initial: { y: \"-100%\", opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: \"100%\", opacity: 0 },\n },\n \"left-in-right-out\": {\n initial: { x: \"-100%\", opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: \"100%\", opacity: 0 },\n },\n};\n\nexport default function HeroVideoDialog({\n animationStyle = \"from-center\",\n videoSrc,\n thumbnailSrc,\n thumbnailAlt = \"Video thumbnail\",\n className,\n}: HeroVideoProps) {\n const [isVideoOpen, setIsVideoOpen] = useState(false);\n const selectedAnimation = animationVariants[animationStyle];\n\n return (\n
\n setIsVideoOpen(true)}\n >\n \n
\n
\n \n \n
\n
\n
\n \n \n {isVideoOpen && (\n setIsVideoOpen(false)}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-md\"\n >\n \n \n \n \n
\n \n
\n \n \n )}\n
\n \n );\n}\n", - "type": "registry:ui", - "target": "" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/default/index.json b/public/r/styles/default/index.json deleted file mode 100644 index d13e4c820..000000000 --- a/public/r/styles/default/index.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "default", - "type": "registry:style", - "dependencies": [ - "tailwindcss-animate", - "class-variance-authority", - "lucide-react" - ], - "registryDependencies": [ - "utils" - ], - "tailwind": { - "config": { - "plugins": [ - "require(\"tailwindcss-animate\")" - ] - } - }, - "cssVars": {}, - "files": [] -} \ No newline at end of file diff --git a/public/r/styles/default/safari.json b/public/r/styles/default/safari.json deleted file mode 100644 index c80101a6e..000000000 --- a/public/r/styles/default/safari.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "safari", - "type": "registry:ui", - "files": [ - { - "path": "magicui/safari.tsx", - "content": "import { SVGProps } from \"react\";\n\ntype SafariMode = \"default\" | \"simple\";\n\nexport interface SafariProps extends SVGProps {\n url?: string;\n imageSrc?: string;\n videoSrc?: string;\n width?: number;\n height?: number;\n mode?: SafariMode;\n}\n\nexport default function Safari({\n imageSrc,\n videoSrc,\n url,\n width = 1203,\n height = 753,\n mode = \"default\",\n ...props\n}: SafariProps) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {url}\n \n \n {mode === \"default\" ? (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {imageSrc && (\n \n )}\n {videoSrc && (\n \n \n \n )}\n \n \n \n \n \n \n \n \n \n \n );\n}\n", - "type": "registry:ui", - "target": "" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/default/tweet-card.json b/public/r/styles/default/tweet-card.json deleted file mode 100644 index c6967c602..000000000 --- a/public/r/styles/default/tweet-card.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "tweet-card", - "type": "registry:ui", - "dependencies": [ - "react-tweet" - ], - "files": [ - { - "path": "magicui/tweet-card.tsx", - "content": "import { Suspense } from \"react\";\nimport {\n enrichTweet,\n type EnrichedTweet,\n type TweetProps,\n type TwitterComponents,\n} from \"react-tweet\";\nimport { getTweet, type Tweet } from \"react-tweet/api\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface TwitterIconProps {\n className?: string;\n [key: string]: unknown;\n}\nconst Twitter = ({ className, ...props }: TwitterIconProps) => (\n \n \n \n \n \n \n);\n\nconst Verified = ({ className, ...props }: TwitterIconProps) => (\n \n \n \n \n \n);\n\nexport const truncate = (str: string | null, length: number) => {\n if (!str || str.length <= length) return str;\n return `${str.slice(0, length - 3)}...`;\n};\n\nconst Skeleton = ({\n className,\n ...props\n}: React.HTMLAttributes) => {\n return (\n
\n );\n};\n\nexport const TweetSkeleton = ({\n className,\n ...props\n}: {\n className?: string;\n [key: string]: unknown;\n}) => (\n \n
\n \n \n
\n \n
\n);\n\nexport const TweetNotFound = ({\n className,\n ...props\n}: {\n className?: string;\n [key: string]: unknown;\n}) => (\n \n

Tweet not found

\n \n);\n\nexport const TweetHeader = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n
\n \n \n \n
\n \n {truncate(tweet.user.name, 20)}\n {tweet.user.verified ||\n (tweet.user.is_blue_verified && (\n \n ))}\n \n
\n \n @{truncate(tweet.user.screen_name, 16)}\n \n
\n
\n
\n \n Link to tweet\n \n \n
\n);\n\nexport const TweetBody = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n {tweet.entities.map((entity, idx) => {\n switch (entity.type) {\n case \"url\":\n case \"symbol\":\n case \"hashtag\":\n case \"mention\":\n return (\n \n {entity.text}\n \n );\n case \"text\":\n return (\n \n );\n }\n })}\n
\n);\n\nexport const TweetMedia = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n {tweet.video && (\n \n \n Your browser does not support the video tag.\n \n )}\n {tweet.photos && (\n
\n
\n {tweet.photos.map((photo) => (\n \n ))}\n
\n
\n )}\n {!tweet.video &&\n !tweet.photos &&\n // @ts-ignore\n tweet?.card?.binding_values?.thumbnail_image_large?.image_value.url && (\n \n )}\n
\n);\n\nexport const MagicTweet = ({\n tweet,\n components,\n className,\n ...props\n}: {\n tweet: Tweet;\n components?: TwitterComponents;\n className?: string;\n}) => {\n const enrichedTweet = enrichTweet(tweet);\n return (\n \n \n \n \n
\n );\n};\n\n/**\n * TweetCard (Server Side Only)\n */\nexport const TweetCard = async ({\n id,\n components,\n fallback = ,\n onError,\n ...props\n}: TweetProps & {\n className?: string;\n}) => {\n const tweet = id\n ? await getTweet(id).catch((err) => {\n if (onError) {\n onError(err);\n } else {\n console.error(err);\n }\n })\n : undefined;\n\n if (!tweet) {\n const NotFound = components?.TweetNotFound || TweetNotFound;\n return ;\n }\n\n return (\n \n \n \n );\n};\n", - "type": "registry:ui", - "target": "" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/default/utils.json b/public/r/styles/default/utils.json deleted file mode 100644 index 95a1139ef..000000000 --- a/public/r/styles/default/utils.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "utils", - "type": "registry:lib", - "dependencies": [ - "clsx", - "tailwind-merge" - ], - "files": [ - { - "path": "lib/utils.ts", - "content": "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n", - "type": "registry:lib" - } - ] -} \ No newline at end of file diff --git a/public/r/styles/index.json b/public/r/styles/index.json deleted file mode 100644 index e4116ca9e..000000000 --- a/public/r/styles/index.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "name": "default", - "label": "Default" - } -] \ No newline at end of file diff --git a/public/r/styles/default/terminal.json b/public/r/terminal.json similarity index 100% rename from public/r/styles/default/terminal.json rename to public/r/terminal.json diff --git a/public/r/text-animate-demo-2.json b/public/r/text-animate-demo-2.json new file mode 100644 index 000000000..31d6b783e --- /dev/null +++ b/public/r/text-animate-demo-2.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-2.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo2() {\n return (\n \n Blur in text\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/text-animate-demo-3.json b/public/r/text-animate-demo-3.json new file mode 100644 index 000000000..ad0e2f992 --- /dev/null +++ b/public/r/text-animate-demo-3.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-3.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo3() {\n return (\n \n Slide up by word\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/text-animate-demo-4.json b/public/r/text-animate-demo-4.json new file mode 100644 index 000000000..7a5b4ff39 --- /dev/null +++ b/public/r/text-animate-demo-4.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo-4", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-4.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo4() {\n return (\n \n Scale up by text\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/text-animate-demo-5.json b/public/r/text-animate-demo-5.json new file mode 100644 index 000000000..7e515859f --- /dev/null +++ b/public/r/text-animate-demo-5.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo-5", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-5.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo5() {\n return (\n \n {`Fade in by line as paragraph\\n\\nFade in by line as paragraph\\n\\nFade in by line as paragraph`}\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/text-animate-demo-6.json b/public/r/text-animate-demo-6.json new file mode 100644 index 000000000..ae5e7f4f3 --- /dev/null +++ b/public/r/text-animate-demo-6.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo-6", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-6.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo6() {\n return (\n \n Slide left by character\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/text-animate-demo.json b/public/r/text-animate-demo.json new file mode 100644 index 000000000..36feea9a7 --- /dev/null +++ b/public/r/text-animate-demo.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-animate-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo.tsx", + "content": "import { TextAnimate } from \"@/registry/magicui/text-animate\";\n\nexport default function TextAnimateDemo() {\n return (\n \n Blur in by character\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/text-animate.json b/public/r/text-animate.json similarity index 96% rename from public/r/styles/default/text-animate.json rename to public/r/text-animate.json index 4a30a3514..19155b4fb 100644 --- a/public/r/styles/default/text-animate.json +++ b/public/r/text-animate.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "text-animate", - "type": "registry:ui", + "type": "registry:component", + "title": "Text Animate", + "description": "A text animation component that animates text using a variety of different animations.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/text-animate.tsx", + "path": "registry/magicui/text-animate.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { AnimatePresence, motion, MotionProps, Variants } from \"motion/react\";\nimport { ElementType } from \"react\";\n\ntype AnimationType = \"text\" | \"word\" | \"character\" | \"line\";\ntype AnimationVariant =\n | \"fadeIn\"\n | \"blurIn\"\n | \"blurInUp\"\n | \"blurInDown\"\n | \"slideUp\"\n | \"slideDown\"\n | \"slideLeft\"\n | \"slideRight\"\n | \"scaleUp\"\n | \"scaleDown\";\n\ninterface TextAnimateProps extends MotionProps {\n /**\n * The text content to animate\n */\n children: string;\n /**\n * The class name to be applied to the component\n */\n className?: string;\n /**\n * The class name to be applied to each segment\n */\n segmentClassName?: string;\n /**\n * The delay before the animation starts\n */\n delay?: number;\n /**\n * The duration of the animation\n */\n duration?: number;\n /**\n * Custom motion variants for the animation\n */\n variants?: Variants;\n /**\n * The element type to render\n */\n as?: ElementType;\n /**\n * How to split the text (\"text\", \"word\", \"character\")\n */\n by?: AnimationType;\n /**\n * Whether to start animation when component enters viewport\n */\n startOnView?: boolean;\n /**\n * Whether to animate only once\n */\n once?: boolean;\n /**\n * The animation preset to use\n */\n animation?: AnimationVariant;\n}\n\nconst staggerTimings: Record = {\n text: 0.06,\n word: 0.05,\n character: 0.03,\n line: 0.06,\n};\n\nconst defaultContainerVariants = {\n hidden: { opacity: 1 },\n show: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n staggerChildren: 0.05,\n staggerDirection: -1,\n },\n },\n};\n\nconst defaultItemVariants: Variants = {\n hidden: { opacity: 0 },\n show: {\n opacity: 1,\n },\n exit: {\n opacity: 0,\n },\n};\n\nconst defaultItemAnimationVariants: Record<\n AnimationVariant,\n { container: Variants; item: Variants }\n> = {\n fadeIn: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, y: 20 },\n show: (delay: number) => ({\n opacity: 1,\n y: 0,\n transition: {\n delay,\n duration: 0.3,\n },\n }),\n exit: {\n opacity: 0,\n y: 20,\n transition: { duration: 0.3 },\n },\n },\n },\n blurIn: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, filter: \"blur(10px)\" },\n show: (i: number) => ({\n opacity: 1,\n filter: \"blur(0px)\",\n transition: {\n delay: i * 0.1,\n duration: 0.3,\n },\n }),\n exit: {\n opacity: 0,\n filter: \"blur(10px)\",\n transition: { duration: 0.3 },\n },\n },\n },\n blurInUp: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, filter: \"blur(10px)\", y: 20 },\n show: (delay: number) => ({\n opacity: 1,\n filter: \"blur(0px)\",\n y: 0,\n transition: {\n y: { duration: 0.3 },\n opacity: { duration: 0.4 },\n filter: { duration: 0.3 },\n },\n }),\n exit: {\n opacity: 0,\n filter: \"blur(10px)\",\n y: 20,\n transition: {\n y: { duration: 0.3 },\n opacity: { duration: 0.4 },\n filter: { duration: 0.3 },\n },\n },\n },\n },\n blurInDown: {\n container: defaultContainerVariants,\n item: {\n hidden: { opacity: 0, filter: \"blur(10px)\", y: -20 },\n show: (delay: number) => ({\n opacity: 1,\n filter: \"blur(0px)\",\n y: 0,\n transition: {\n y: { duration: 0.3 },\n opacity: { duration: 0.4 },\n filter: { duration: 0.3 },\n },\n }),\n },\n },\n slideUp: {\n container: defaultContainerVariants,\n item: {\n hidden: { y: 20, opacity: 0 },\n show: (delay: number) => ({\n y: 0,\n opacity: 1,\n transition: {\n delay,\n duration: 0.3,\n },\n }),\n exit: {\n y: -20,\n opacity: 0,\n transition: {\n duration: 0.3,\n },\n },\n },\n },\n slideDown: {\n container: defaultContainerVariants,\n item: {\n hidden: { y: -20, opacity: 0 },\n show: {\n y: 0,\n opacity: 1,\n transition: { duration: 0.3 },\n },\n exit: {\n y: 20,\n opacity: 0,\n transition: { duration: 0.3 },\n },\n },\n },\n slideLeft: {\n container: defaultContainerVariants,\n item: {\n hidden: { x: 20, opacity: 0 },\n show: {\n x: 0,\n opacity: 1,\n transition: { duration: 0.3 },\n },\n exit: {\n x: -20,\n opacity: 0,\n transition: { duration: 0.3 },\n },\n },\n },\n slideRight: {\n container: defaultContainerVariants,\n item: {\n hidden: { x: -20, opacity: 0 },\n show: {\n x: 0,\n opacity: 1,\n transition: { duration: 0.3 },\n },\n exit: {\n x: 20,\n opacity: 0,\n transition: { duration: 0.3 },\n },\n },\n },\n scaleUp: {\n container: defaultContainerVariants,\n item: {\n hidden: { scale: 0.5, opacity: 0 },\n show: {\n scale: 1,\n opacity: 1,\n transition: {\n duration: 0.3,\n scale: {\n type: \"spring\",\n damping: 15,\n stiffness: 300,\n },\n },\n },\n exit: {\n scale: 0.5,\n opacity: 0,\n transition: { duration: 0.3 },\n },\n },\n },\n scaleDown: {\n container: defaultContainerVariants,\n item: {\n hidden: { scale: 1.5, opacity: 0 },\n show: (delay: number) => ({\n scale: 1,\n opacity: 1,\n transition: {\n delay,\n duration: 0.3,\n scale: {\n type: \"spring\",\n damping: 15,\n stiffness: 300,\n },\n },\n }),\n exit: {\n scale: 1.5,\n opacity: 0,\n transition: { duration: 0.3 },\n },\n },\n },\n};\n\nexport function TextAnimate({\n children,\n delay = 0,\n duration = 0.3,\n variants,\n className,\n segmentClassName,\n as: Component = \"p\",\n startOnView = true,\n once = false,\n by = \"word\",\n animation = \"fadeIn\",\n ...props\n}: TextAnimateProps) {\n const MotionComponent = motion.create(Component);\n\n // Use provided variants or default variants based on animation type\n const finalVariants = animation\n ? {\n container: {\n ...defaultItemAnimationVariants[animation].container,\n show: {\n ...defaultItemAnimationVariants[animation].container.show,\n transition: {\n staggerChildren: staggerTimings[by],\n },\n },\n exit: {\n ...defaultItemAnimationVariants[animation].container.exit,\n transition: {\n staggerChildren: staggerTimings[by],\n staggerDirection: -1,\n },\n },\n },\n item: defaultItemAnimationVariants[animation].item,\n }\n : { container: defaultContainerVariants, item: defaultItemVariants };\n\n let segments: string[] = [];\n switch (by) {\n case \"word\":\n segments = children.split(/(\\s+)/);\n break;\n case \"character\":\n segments = children.split(\"\");\n break;\n case \"line\":\n segments = children.split(\"\\n\");\n break;\n case \"text\":\n default:\n segments = [children];\n break;\n }\n\n return (\n \n \n {segments.map((segment, i) => (\n \n {segment}\n \n ))}\n \n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/text-reveal-demo.json b/public/r/text-reveal-demo.json new file mode 100644 index 000000000..fef39bcb4 --- /dev/null +++ b/public/r/text-reveal-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "text-reveal-demo", + "type": "registry:component", + "registryDependencies": [ + "text-reveal" + ], + "files": [ + { + "path": "registry/example/text-reveal-demo.tsx", + "content": "import { TextReveal } from \"@/registry/magicui/text-reveal\";\n\nexport default function TextRevealDemo() {\n return (\n
\n \n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/text-reveal.json b/public/r/text-reveal.json similarity index 88% rename from public/r/styles/default/text-reveal.json rename to public/r/text-reveal.json index a55fdaca4..7b7babd86 100644 --- a/public/r/styles/default/text-reveal.json +++ b/public/r/text-reveal.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "text-reveal", - "type": "registry:ui", + "type": "registry:component", + "title": "Text Reveal", + "description": "Fade in text as you scroll down the page.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/text-reveal.tsx", + "path": "registry/magicui/text-reveal.tsx", "content": "\"use client\";\n\nimport { motion, MotionValue, useScroll, useTransform } from \"motion/react\";\nimport { ComponentPropsWithoutRef, FC, ReactNode, useRef } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface TextRevealProps extends ComponentPropsWithoutRef<\"div\"> {\n text: string;\n}\n\nexport const TextReveal: FC = ({ text, className }) => {\n const targetRef = useRef(null);\n\n const { scrollYProgress } = useScroll({\n target: targetRef,\n });\n const words = text.split(\" \");\n\n return (\n
\n \n \n {words.map((word, i) => {\n const start = i / words.length;\n const end = start + 1 / words.length;\n return (\n \n {word}\n \n );\n })}\n

\n
\n
\n );\n};\n\ninterface WordProps {\n children: ReactNode;\n progress: MotionValue;\n range: [number, number];\n}\n\nconst Word: FC = ({ children, progress, range }) => {\n const opacity = useTransform(progress, range, [0, 1]);\n return (\n \n {children}\n \n {children}\n \n \n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/themes.css b/public/r/themes.css deleted file mode 100644 index f953bb054..000000000 --- a/public/r/themes.css +++ /dev/null @@ -1,768 +0,0 @@ - -.theme-zinc { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 240 5.9% 10%; - - --radius: 0.5rem; -} - -.dark .theme-zinc { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; - - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; - - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 240 4.9% 83.9%; -} - -.theme-slate { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --ring: 222.2 84% 4.9%; - - --radius: 0.5rem; -} - -.dark .theme-slate { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --ring: 212.7 26.8% 83.9; -} - -.theme-stone { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 24 9.8% 10%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20 14.3% 4.1%; - - --radius: 0.95rem; -} - -.dark .theme-stone { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 60 9.1% 97.8%; - --primary-foreground: 24 9.8% 10%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 24 5.7% 82.9%; -} - -.theme-gray { - --background: 0 0% 100%; - --foreground: 224 71.4% 4.1%; - - --muted: 220 14.3% 95.9%; - --muted-foreground: 220 8.9% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 224 71.4% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 224 71.4% 4.1%; - - --border: 220 13% 91%; - --input: 220 13% 91%; - - --primary: 220.9 39.3% 11%; - --primary-foreground: 210 20% 98%; - - --secondary: 220 14.3% 95.9%; - --secondary-foreground: 220.9 39.3% 11%; - - --accent: 220 14.3% 95.9%; - --accent-foreground: 220.9 39.3% 11%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 20% 98%; - - --ring: 224 71.4% 4.1%; - - --radius: 0.35rem; -} - -.dark .theme-gray { - --background: 224 71.4% 4.1%; - --foreground: 210 20% 98%; - - --muted: 215 27.9% 16.9%; - --muted-foreground: 217.9 10.6% 64.9%; - - --popover: 224 71.4% 4.1%; - --popover-foreground: 210 20% 98%; - - --card: 224 71.4% 4.1%; - --card-foreground: 210 20% 98%; - - --border: 215 27.9% 16.9%; - --input: 215 27.9% 16.9%; - - --primary: 210 20% 98%; - --primary-foreground: 220.9 39.3% 11%; - - --secondary: 215 27.9% 16.9%; - --secondary-foreground: 210 20% 98%; - - --accent: 215 27.9% 16.9%; - --accent-foreground: 210 20% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 20% 98%; - - --ring: 216 12.2% 83.9%; -} - -.theme-neutral { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 0% 3.9%; - - --radius: ; -} - -.dark .theme-neutral { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 0% 83.1%; -} - -.theme-red { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - - --primary: 0 72.2% 50.6%; - --primary-foreground: 0 85.7% 97.3%; - - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 72.2% 50.6%; - - --radius: 0.4rem; -} - -.dark .theme-red { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - - --primary: 0 72.2% 50.6%; - --primary-foreground: 0 85.7% 97.3%; - - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - - --ring: 0 72.2% 50.6%; -} - -.theme-rose { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 346.8 77.2% 49.8%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 346.8 77.2% 49.8%; - - --radius: 0.5rem; -} - -.dark .theme-rose { - --background: 20 14.3% 4.1%; - --foreground: 0 0% 95%; - - --muted: 0 0% 15%; - --muted-foreground: 240 5% 64.9%; - - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - - --card: 24 9.8% 10%; - --card-foreground: 0 0% 95%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 346.8 77.2% 49.8%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - - --ring: 346.8 77.2% 49.8%; -} - -.theme-orange { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 24.6 95% 53.1%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 24.6 95% 53.1%; - - --radius: 0.95rem; -} - -.dark .theme-orange { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 20.5 90.2% 48.2%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 72.2% 50.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20.5 90.2% 48.2%; -} - -.theme-green { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - - --primary: 142.1 76.2% 36.3%; - --primary-foreground: 355.7 100% 97.3%; - - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - - --ring: 142.1 76.2% 36.3%; - - --radius: ; -} - -.dark .theme-green { - --background: 20 14.3% 4.1%; - --foreground: 0 0% 95%; - - --muted: 0 0% 15%; - --muted-foreground: 240 5% 64.9%; - - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - - --card: 24 9.8% 10%; - --card-foreground: 0 0% 95%; - - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - - --primary: 142.1 70.6% 45.3%; - --primary-foreground: 144.9 80.4% 10%; - - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 0 0% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - - --ring: 142.4 71.8% 29.2%; -} - -.theme-blue { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - - --primary: 221.2 83.2% 53.3%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --ring: 221.2 83.2% 53.3%; - - --radius: ; -} - -.dark .theme-blue { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - - --primary: 217.2 91.2% 59.8%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --ring: 224.3 76.3% 48%; -} - -.theme-yellow { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - - --primary: 47.9 95.8% 53.1%; - --primary-foreground: 26 83.3% 14.1%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 20 14.3% 4.1%; - - --radius: 0.95rem; -} - -.dark .theme-yellow { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - - --primary: 47.9 95.8% 53.1%; - --primary-foreground: 26 83.3% 14.1%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --ring: 35.5 91.7% 32.9%; -} - -.theme-violet { - --background: 0 0% 100%; - --foreground: 224 71.4% 4.1%; - - --muted: 220 14.3% 95.9%; - --muted-foreground: 220 8.9% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 224 71.4% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 224 71.4% 4.1%; - - --border: 220 13% 91%; - --input: 220 13% 91%; - - --primary: 262.1 83.3% 57.8%; - --primary-foreground: 210 20% 98%; - - --secondary: 220 14.3% 95.9%; - --secondary-foreground: 220.9 39.3% 11%; - - --accent: 220 14.3% 95.9%; - --accent-foreground: 220.9 39.3% 11%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 20% 98%; - - --ring: 262.1 83.3% 57.8%; - - --radius: ; -} - -.dark .theme-violet { - --background: 224 71.4% 4.1%; - --foreground: 210 20% 98%; - - --muted: 215 27.9% 16.9%; - --muted-foreground: 217.9 10.6% 64.9%; - - --popover: 224 71.4% 4.1%; - --popover-foreground: 210 20% 98%; - - --card: 224 71.4% 4.1%; - --card-foreground: 210 20% 98%; - - --border: 215 27.9% 16.9%; - --input: 215 27.9% 16.9%; - - --primary: 263.4 70% 50.4%; - --primary-foreground: 210 20% 98%; - - --secondary: 215 27.9% 16.9%; - --secondary-foreground: 210 20% 98%; - - --accent: 215 27.9% 16.9%; - --accent-foreground: 210 20% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 20% 98%; - - --ring: 263.4 70% 50.4%; -} \ No newline at end of file diff --git a/public/r/themes/gray.json b/public/r/themes/gray.json deleted file mode 100644 index a7f4d7498..000000000 --- a/public/r/themes/gray.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "gray", - "label": "Gray", - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "224 71.4% 4.1%", - "card": "0 0% 100%", - "card-foreground": "224 71.4% 4.1%", - "popover": "0 0% 100%", - "popover-foreground": "224 71.4% 4.1%", - "primary": "220.9 39.3% 11%", - "primary-foreground": "210 20% 98%", - "secondary": "220 14.3% 95.9%", - "secondary-foreground": "220.9 39.3% 11%", - "muted": "220 14.3% 95.9%", - "muted-foreground": "220 8.9% 46.1%", - "accent": "220 14.3% 95.9%", - "accent-foreground": "220.9 39.3% 11%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "210 20% 98%", - "border": "220 13% 91%", - "input": "220 13% 91%", - "ring": "224 71.4% 4.1%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "224 71.4% 4.1%", - "foreground": "210 20% 98%", - "card": "224 71.4% 4.1%", - "card-foreground": "210 20% 98%", - "popover": "224 71.4% 4.1%", - "popover-foreground": "210 20% 98%", - "primary": "210 20% 98%", - "primary-foreground": "220.9 39.3% 11%", - "secondary": "215 27.9% 16.9%", - "secondary-foreground": "210 20% 98%", - "muted": "215 27.9% 16.9%", - "muted-foreground": "217.9 10.6% 64.9%", - "accent": "215 27.9% 16.9%", - "accent-foreground": "210 20% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "210 20% 98%", - "border": "215 27.9% 16.9%", - "input": "215 27.9% 16.9%", - "ring": "216 12.2% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - } -} \ No newline at end of file diff --git a/public/r/themes/neutral.json b/public/r/themes/neutral.json deleted file mode 100644 index 775f929bc..000000000 --- a/public/r/themes/neutral.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "neutral", - "label": "Neutral", - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "0 0% 3.9%", - "card": "0 0% 100%", - "card-foreground": "0 0% 3.9%", - "popover": "0 0% 100%", - "popover-foreground": "0 0% 3.9%", - "primary": "0 0% 9%", - "primary-foreground": "0 0% 98%", - "secondary": "0 0% 96.1%", - "secondary-foreground": "0 0% 9%", - "muted": "0 0% 96.1%", - "muted-foreground": "0 0% 45.1%", - "accent": "0 0% 96.1%", - "accent-foreground": "0 0% 9%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - "border": "0 0% 89.8%", - "input": "0 0% 89.8%", - "ring": "0 0% 3.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "0 0% 3.9%", - "foreground": "0 0% 98%", - "card": "0 0% 3.9%", - "card-foreground": "0 0% 98%", - "popover": "0 0% 3.9%", - "popover-foreground": "0 0% 98%", - "primary": "0 0% 98%", - "primary-foreground": "0 0% 9%", - "secondary": "0 0% 14.9%", - "secondary-foreground": "0 0% 98%", - "muted": "0 0% 14.9%", - "muted-foreground": "0 0% 63.9%", - "accent": "0 0% 14.9%", - "accent-foreground": "0 0% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - "border": "0 0% 14.9%", - "input": "0 0% 14.9%", - "ring": "0 0% 83.1%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - } -} \ No newline at end of file diff --git a/public/r/themes/slate.json b/public/r/themes/slate.json deleted file mode 100644 index 17db98cb2..000000000 --- a/public/r/themes/slate.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "slate", - "label": "Slate", - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "222.2 84% 4.9%", - "card": "0 0% 100%", - "card-foreground": "222.2 84% 4.9%", - "popover": "0 0% 100%", - "popover-foreground": "222.2 84% 4.9%", - "primary": "222.2 47.4% 11.2%", - "primary-foreground": "210 40% 98%", - "secondary": "210 40% 96.1%", - "secondary-foreground": "222.2 47.4% 11.2%", - "muted": "210 40% 96.1%", - "muted-foreground": "215.4 16.3% 46.9%", - "accent": "210 40% 96.1%", - "accent-foreground": "222.2 47.4% 11.2%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "210 40% 98%", - "border": "214.3 31.8% 91.4%", - "input": "214.3 31.8% 91.4%", - "ring": "222.2 84% 4.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "222.2 84% 4.9%", - "foreground": "210 40% 98%", - "card": "222.2 84% 4.9%", - "card-foreground": "210 40% 98%", - "popover": "222.2 84% 4.9%", - "popover-foreground": "210 40% 98%", - "primary": "210 40% 98%", - "primary-foreground": "222.2 47.4% 11.2%", - "secondary": "217.2 32.6% 17.5%", - "secondary-foreground": "210 40% 98%", - "muted": "217.2 32.6% 17.5%", - "muted-foreground": "215 20.2% 65.1%", - "accent": "217.2 32.6% 17.5%", - "accent-foreground": "210 40% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "210 40% 98%", - "border": "217.2 32.6% 17.5%", - "input": "217.2 32.6% 17.5%", - "ring": "212.7 26.8% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - } -} \ No newline at end of file diff --git a/public/r/themes/stone.json b/public/r/themes/stone.json deleted file mode 100644 index 9b2babe0b..000000000 --- a/public/r/themes/stone.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "stone", - "label": "Stone", - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "20 14.3% 4.1%", - "card": "0 0% 100%", - "card-foreground": "20 14.3% 4.1%", - "popover": "0 0% 100%", - "popover-foreground": "20 14.3% 4.1%", - "primary": "24 9.8% 10%", - "primary-foreground": "60 9.1% 97.8%", - "secondary": "60 4.8% 95.9%", - "secondary-foreground": "24 9.8% 10%", - "muted": "60 4.8% 95.9%", - "muted-foreground": "25 5.3% 44.7%", - "accent": "60 4.8% 95.9%", - "accent-foreground": "24 9.8% 10%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "60 9.1% 97.8%", - "border": "20 5.9% 90%", - "input": "20 5.9% 90%", - "ring": "20 14.3% 4.1%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "20 14.3% 4.1%", - "foreground": "60 9.1% 97.8%", - "card": "20 14.3% 4.1%", - "card-foreground": "60 9.1% 97.8%", - "popover": "20 14.3% 4.1%", - "popover-foreground": "60 9.1% 97.8%", - "primary": "60 9.1% 97.8%", - "primary-foreground": "24 9.8% 10%", - "secondary": "12 6.5% 15.1%", - "secondary-foreground": "60 9.1% 97.8%", - "muted": "12 6.5% 15.1%", - "muted-foreground": "24 5.4% 63.9%", - "accent": "12 6.5% 15.1%", - "accent-foreground": "60 9.1% 97.8%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "60 9.1% 97.8%", - "border": "12 6.5% 15.1%", - "input": "12 6.5% 15.1%", - "ring": "24 5.7% 82.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - } -} \ No newline at end of file diff --git a/public/r/themes/zinc.json b/public/r/themes/zinc.json deleted file mode 100644 index 669fc8d3c..000000000 --- a/public/r/themes/zinc.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "zinc", - "label": "Zinc", - "cssVars": { - "light": { - "background": "0 0% 100%", - "foreground": "240 10% 3.9%", - "card": "0 0% 100%", - "card-foreground": "240 10% 3.9%", - "popover": "0 0% 100%", - "popover-foreground": "240 10% 3.9%", - "primary": "240 5.9% 10%", - "primary-foreground": "0 0% 98%", - "secondary": "240 4.8% 95.9%", - "secondary-foreground": "240 5.9% 10%", - "muted": "240 4.8% 95.9%", - "muted-foreground": "240 3.8% 46.1%", - "accent": "240 4.8% 95.9%", - "accent-foreground": "240 5.9% 10%", - "destructive": "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - "border": "240 5.9% 90%", - "input": "240 5.9% 90%", - "ring": "240 10% 3.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%" - }, - "dark": { - "background": "240 10% 3.9%", - "foreground": "0 0% 98%", - "card": "240 10% 3.9%", - "card-foreground": "0 0% 98%", - "popover": "240 10% 3.9%", - "popover-foreground": "0 0% 98%", - "primary": "0 0% 98%", - "primary-foreground": "240 5.9% 10%", - "secondary": "240 3.7% 15.9%", - "secondary-foreground": "0 0% 98%", - "muted": "240 3.7% 15.9%", - "muted-foreground": "240 5% 64.9%", - "accent": "240 3.7% 15.9%", - "accent-foreground": "0 0% 98%", - "destructive": "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - "border": "240 3.7% 15.9%", - "input": "240 3.7% 15.9%", - "ring": "240 4.9% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%" - } - } -} \ No newline at end of file diff --git a/public/r/tweet-card-demo.json b/public/r/tweet-card-demo.json new file mode 100644 index 000000000..014837e58 --- /dev/null +++ b/public/r/tweet-card-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tweet-card-demo", + "type": "registry:component", + "registryDependencies": [ + "tweet-card" + ], + "files": [ + { + "path": "registry/example/tweet-card-demo.tsx", + "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\";\n\n/**\n * (Server Side Only)\n * (Client Side Only)\n */\nexport default function TweetDemo() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/tweet-card-images.json b/public/r/tweet-card-images.json new file mode 100644 index 000000000..599b50b83 --- /dev/null +++ b/public/r/tweet-card-images.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tweet-card-images", + "type": "registry:component", + "registryDependencies": [ + "tweet-card" + ], + "files": [ + { + "path": "registry/example/tweet-card-images.tsx", + "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\";\n\nexport default function TweetImages() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/tweet-card-meta-preview.json b/public/r/tweet-card-meta-preview.json new file mode 100644 index 000000000..79943802e --- /dev/null +++ b/public/r/tweet-card-meta-preview.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tweet-card-meta-preview", + "type": "registry:component", + "registryDependencies": [ + "tweet-card" + ], + "files": [ + { + "path": "registry/example/tweet-card-meta-preview.tsx", + "content": "import { ClientTweetCard } from \"@/registry/magicui/client-tweet-card\";\n\nexport default function TweetMetaPreview() {\n return ;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/tweet-card.json b/public/r/tweet-card.json new file mode 100644 index 000000000..c51ca4ef7 --- /dev/null +++ b/public/r/tweet-card.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "tweet-card", + "type": "registry:component", + "title": "Tweet Card", + "description": "A card that displays a tweet with the author's name, handle, and profile picture.", + "dependencies": [ + "react-tweet" + ], + "files": [ + { + "path": "registry/magicui/tweet-card.tsx", + "content": "/* eslint-disable @next/next/no-img-element */\nimport { Suspense } from \"react\";\nimport {\n enrichTweet,\n type EnrichedTweet,\n type TweetProps,\n type TwitterComponents,\n} from \"react-tweet\";\nimport { getTweet, type Tweet } from \"react-tweet/api\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface TwitterIconProps {\n className?: string;\n [key: string]: unknown;\n}\nconst Twitter = ({ className, ...props }: TwitterIconProps) => (\n \n \n \n \n \n \n);\n\nconst Verified = ({ className, ...props }: TwitterIconProps) => (\n \n \n \n \n \n);\n\nexport const truncate = (str: string | null, length: number) => {\n if (!str || str.length <= length) return str;\n return `${str.slice(0, length - 3)}...`;\n};\n\nconst Skeleton = ({\n className,\n ...props\n}: React.HTMLAttributes) => {\n return (\n
\n );\n};\n\nexport const TweetSkeleton = ({\n className,\n ...props\n}: {\n className?: string;\n [key: string]: unknown;\n}) => (\n \n
\n \n \n
\n \n
\n);\n\nexport const TweetNotFound = ({\n className,\n ...props\n}: {\n className?: string;\n [key: string]: unknown;\n}) => (\n \n

Tweet not found

\n \n);\n\nexport const TweetHeader = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n
\n \n \n \n
\n \n {truncate(tweet.user.name, 20)}\n {tweet.user.verified ||\n (tweet.user.is_blue_verified && (\n \n ))}\n \n
\n \n @{truncate(tweet.user.screen_name, 16)}\n \n
\n
\n
\n \n Link to tweet\n \n \n
\n);\n\nexport const TweetBody = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n {tweet.entities.map((entity, idx) => {\n switch (entity.type) {\n case \"url\":\n case \"symbol\":\n case \"hashtag\":\n case \"mention\":\n return (\n \n {entity.text}\n \n );\n case \"text\":\n return (\n \n );\n }\n })}\n
\n);\n\nexport const TweetMedia = ({ tweet }: { tweet: EnrichedTweet }) => (\n
\n {tweet.video && (\n \n \n Your browser does not support the video tag.\n \n )}\n {tweet.photos && (\n
\n
\n {tweet.photos.map((photo) => (\n \n ))}\n
\n
\n )}\n {!tweet.video &&\n !tweet.photos &&\n // @ts-ignore\n tweet?.card?.binding_values?.thumbnail_image_large?.image_value.url && (\n \n )}\n
\n);\n\nexport const MagicTweet = ({\n tweet,\n components,\n className,\n ...props\n}: {\n tweet: Tweet;\n components?: TwitterComponents;\n className?: string;\n}) => {\n const enrichedTweet = enrichTweet(tweet);\n return (\n \n \n \n \n
\n );\n};\n\n/**\n * TweetCard (Server Side Only)\n */\nexport const TweetCard = async ({\n id,\n components,\n fallback = ,\n onError,\n ...props\n}: TweetProps & {\n className?: string;\n}) => {\n const tweet = id\n ? await getTweet(id).catch((err) => {\n if (onError) {\n onError(err);\n } else {\n console.error(err);\n }\n })\n : undefined;\n\n if (!tweet) {\n const NotFound = components?.TweetNotFound || TweetNotFound;\n return ;\n }\n\n return (\n \n \n \n );\n};\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/typing-animation-demo.json b/public/r/typing-animation-demo.json new file mode 100644 index 000000000..c50739998 --- /dev/null +++ b/public/r/typing-animation-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "typing-animation-demo", + "type": "registry:component", + "registryDependencies": [ + "typing-animation" + ], + "files": [ + { + "path": "registry/example/typing-animation-demo.tsx", + "content": "import { TypingAnimation } from \"@/registry/magicui/typing-animation\";\n\nexport default function TypingAnimationDemo() {\n return Typing Animation;\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/typing-animation.json b/public/r/typing-animation.json similarity index 89% rename from public/r/styles/default/typing-animation.json rename to public/r/typing-animation.json index e898a6f9a..eb51ae437 100644 --- a/public/r/styles/default/typing-animation.json +++ b/public/r/typing-animation.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "typing-animation", - "type": "registry:ui", + "type": "registry:component", + "title": "Typing Animation", + "description": "Characters appearing in typed animation", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/typing-animation.tsx", + "path": "registry/magicui/typing-animation.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { motion, MotionProps } from \"motion/react\";\nimport { useEffect, useRef, useState } from \"react\";\n\ninterface TypingAnimationProps extends MotionProps {\n children: string;\n className?: string;\n duration?: number;\n delay?: number;\n as?: React.ElementType;\n startOnView?: boolean;\n}\n\nexport function TypingAnimation({\n children,\n className,\n duration = 100,\n delay = 0,\n as: Component = \"div\",\n startOnView = false,\n ...props\n}: TypingAnimationProps) {\n const MotionComponent = motion.create(Component, {\n forwardMotionProps: true,\n });\n\n const [displayedText, setDisplayedText] = useState(\"\");\n const [started, setStarted] = useState(false);\n const elementRef = useRef(null);\n\n useEffect(() => {\n if (!startOnView) {\n const startTimeout = setTimeout(() => {\n setStarted(true);\n }, delay);\n return () => clearTimeout(startTimeout);\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n setStarted(true);\n }, delay);\n observer.disconnect();\n }\n },\n { threshold: 0.1 },\n );\n\n if (elementRef.current) {\n observer.observe(elementRef.current);\n }\n\n return () => observer.disconnect();\n }, [delay, startOnView]);\n\n useEffect(() => {\n if (!started) return;\n\n let i = 0;\n const typingEffect = setInterval(() => {\n if (i < children.length) {\n setDisplayedText(children.substring(0, i + 1));\n i++;\n } else {\n clearInterval(typingEffect);\n }\n }, duration);\n\n return () => {\n clearInterval(typingEffect);\n };\n }, [children, duration, started]);\n\n return (\n \n {displayedText}\n \n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/warp-background-demo.json b/public/r/warp-background-demo.json new file mode 100644 index 000000000..66748088e --- /dev/null +++ b/public/r/warp-background-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "warp-background-demo", + "type": "registry:component", + "registryDependencies": [ + "warp-background" + ], + "files": [ + { + "path": "registry/example/warp-background-demo.tsx", + "content": "import {\n Card,\n CardContent,\n CardDescription,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { WarpBackground } from \"@/registry/magicui/warp-background\";\n\nexport default function ExampleComponentDemo() {\n return (\n \n \n \n Congratulations on Your Promotion!\n \n Your hard work and dedication have paid off. We're thrilled to\n see you take this next step in your career. Keep up the fantastic\n work!\n \n \n \n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/warp-background.json b/public/r/warp-background.json similarity index 95% rename from public/r/styles/default/warp-background.json rename to public/r/warp-background.json index 508f9b7ba..6f5b36ea3 100644 --- a/public/r/styles/default/warp-background.json +++ b/public/r/warp-background.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "warp-background", - "type": "registry:ui", + "type": "registry:component", + "title": "Warp Background", + "description": "A card with a time warping background effect.", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/warp-background.tsx", + "path": "registry/magicui/warp-background.tsx", "content": "import { cn } from \"@/lib/utils\";\nimport { motion } from \"motion/react\";\nimport React, { HTMLAttributes, useCallback, useMemo } from \"react\";\n\ninterface WarpBackgroundProps extends HTMLAttributes {\n children: React.ReactNode;\n perspective?: number;\n beamsPerSide?: number;\n beamSize?: number;\n beamDelayMax?: number;\n beamDelayMin?: number;\n beamDuration?: number;\n gridColor?: string;\n}\n\nconst Beam = ({\n width,\n x,\n delay,\n duration,\n}: {\n width: string | number;\n x: string | number;\n delay: number;\n duration: number;\n}) => {\n const hue = Math.floor(Math.random() * 360);\n const ar = Math.floor(Math.random() * 10) + 1;\n\n return (\n \n );\n};\n\nexport const WarpBackground: React.FC = ({\n children,\n perspective = 100,\n className,\n beamsPerSide = 3,\n beamSize = 5,\n beamDelayMax = 3,\n beamDelayMin = 0,\n beamDuration = 3,\n gridColor = \"hsl(var(--border))\",\n ...props\n}) => {\n const generateBeams = useCallback(() => {\n const beams = [];\n const cellsPerSide = Math.floor(100 / beamSize);\n const step = cellsPerSide / beamsPerSide;\n\n for (let i = 0; i < beamsPerSide; i++) {\n const x = Math.floor(i * step);\n const delay =\n Math.random() * (beamDelayMax - beamDelayMin) + beamDelayMin;\n beams.push({ x, delay });\n }\n return beams;\n }, [beamsPerSide, beamSize, beamDelayMax, beamDelayMin]);\n\n const topBeams = useMemo(() => generateBeams(), [generateBeams]);\n const rightBeams = useMemo(() => generateBeams(), [generateBeams]);\n const bottomBeams = useMemo(() => generateBeams(), [generateBeams]);\n const leftBeams = useMemo(() => generateBeams(), [generateBeams]);\n\n return (\n
\n \n {/* top side */}\n
\n {topBeams.map((beam, index) => (\n \n ))}\n
\n {/* bottom side */}\n
\n {bottomBeams.map((beam, index) => (\n \n ))}\n
\n {/* left side */}\n
\n {leftBeams.map((beam, index) => (\n \n ))}\n
\n {/* right side */}\n
\n {rightBeams.map((beam, index) => (\n \n ))}\n
\n
\n
{children}
\n
\n );\n};\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/public/r/word-rotate-demo.json b/public/r/word-rotate-demo.json new file mode 100644 index 000000000..f0b250c2d --- /dev/null +++ b/public/r/word-rotate-demo.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "word-rotate-demo", + "type": "registry:component", + "registryDependencies": [ + "word-rotate" + ], + "files": [ + { + "path": "registry/example/word-rotate-demo.tsx", + "content": "import { WordRotate } from \"@/registry/magicui/word-rotate\";\n\nexport default function WordRotateDemo() {\n return (\n \n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/r/styles/default/word-rotate.json b/public/r/word-rotate.json similarity index 83% rename from public/r/styles/default/word-rotate.json rename to public/r/word-rotate.json index 7e00b1a36..3bc8a0084 100644 --- a/public/r/styles/default/word-rotate.json +++ b/public/r/word-rotate.json @@ -1,15 +1,17 @@ { + "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "word-rotate", - "type": "registry:ui", + "type": "registry:component", + "title": "Word Rotate", + "description": "A vertical rotation of words", "dependencies": [ "motion" ], "files": [ { - "path": "magicui/word-rotate.tsx", + "path": "registry/magicui/word-rotate.tsx", "content": "\"use client\";\n\nimport { AnimatePresence, motion, MotionProps } from \"motion/react\";\nimport { useEffect, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\ninterface WordRotateProps {\n words: string[];\n duration?: number;\n motionProps?: MotionProps;\n className?: string;\n}\n\nexport function WordRotate({\n words,\n duration = 2500,\n motionProps = {\n initial: { opacity: 0, y: -50 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 50 },\n transition: { duration: 0.25, ease: \"easeOut\" },\n },\n className,\n}: WordRotateProps) {\n const [index, setIndex] = useState(0);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setIndex((prevIndex) => (prevIndex + 1) % words.length);\n }, duration);\n\n // Clean up interval on unmount\n return () => clearInterval(interval);\n }, [words, duration]);\n\n return (\n
\n \n \n {words[index]}\n \n \n
\n );\n}\n", - "type": "registry:ui", - "target": "" + "type": "registry:component" } ] } \ No newline at end of file diff --git a/registry.json b/registry.json new file mode 100644 index 000000000..3703ad056 --- /dev/null +++ b/registry.json @@ -0,0 +1,2214 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "magicui", + "homepage": "https://magicui.design", + "items": [ + { + "name": "magic-card", + "type": "registry:component", + "title": "Magic Card", + "description": "A spotlight effect that follows your mouse cursor and highlights borders on hover.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/magic-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "android", + "type": "registry:component", + "title": "Android", + "description": "A mockup of an Android device.", + "files": [ + { "path": "registry/magicui/android.tsx", "type": "registry:component" } + ] + }, + { + "name": "warp-background", + "type": "registry:component", + "title": "Warp Background", + "description": "A card with a time warping background effect.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/warp-background.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "line-shadow-text", + "type": "registry:component", + "title": "Line Shadow Text", + "description": "A text component with a moving line shadow.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/line-shadow-text.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "aurora-text", + "type": "registry:component", + "title": "Aurora Text", + "description": "A beautiful aurora text effect", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/aurora-text.tsx", + "type": "registry:component" + } + ], + "cssVars": { + "light": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + }, + "dark": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + } + }, + "tailwind": { + "config": { + "theme": { + "extend": { + "colors": { + "color-1": "hsl(var(--color-1))", + "color-2": "hsl(var(--color-2))", + "color-3": "hsl(var(--color-3))", + "color-4": "hsl(var(--color-4))", + "color-5": "hsl(var(--color-5))" + }, + "keyframes": { + "aurora-border": { + "0%, 100%": { + "borderRadius": "37% 29% 27% 27% / 28% 25% 41% 37%" + }, + "25%": { + "borderRadius": "47% 29% 39% 49% / 61% 19% 66% 26%" + }, + "50%": { + "borderRadius": "57% 23% 47% 72% / 63% 17% 66% 33%" + }, + "75%": { + "borderRadius": "28% 49% 29% 100% / 93% 20% 64% 25%" + } + }, + "aurora-1": { + "0%, 100%": { "top": "0", "right": "0" }, + "50%": { "top": "50%", "right": "25%" }, + "75%": { "top": "25%", "right": "50%" } + }, + "aurora-2": { + "0%, 100%": { "top": "0", "left": "0" }, + "60%": { "top": "75%", "left": "25%" }, + "85%": { "top": "50%", "left": "50%" } + }, + "aurora-3": { + "0%, 100%": { "bottom": "0", "left": "0" }, + "40%": { "bottom": "50%", "left": "25%" }, + "65%": { "bottom": "25%", "left": "50%" } + }, + "aurora-4": { + "0%, 100%": { "bottom": "0", "right": "0" }, + "50%": { "bottom": "25%", "right": "40%" }, + "90%": { "bottom": "50%", "right": "25%" } + } + } + } + } + } + } + }, + { + "name": "morphing-text", + "type": "registry:component", + "title": "Morphing Text", + "description": "A dynamic text morphing component for Magic UI.", + "files": [ + { + "path": "registry/magicui/morphing-text.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scroll-progress", + "type": "registry:component", + "title": "Scroll Progress", + "description": "Animated Scroll Progress for your pages", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/scroll-progress.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "neon-gradient-card", + "type": "registry:component", + "title": "Neon Gradient Card", + "description": "A beautiful neon card effect", + "files": [ + { + "path": "registry/magicui/neon-gradient-card.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "background-position-spin": "background-position-spin 3000ms infinite alternate" + }, + "keyframes": { + "background-position-spin": { + "0%": { "backgroundPosition": "top center" }, + "100%": { "backgroundPosition": "bottom center" } + } + } + } + } + } + } + }, + { + "name": "meteors", + "type": "registry:component", + "title": "Meteors", + "description": "A meteor shower effect.", + "files": [ + { "path": "registry/magicui/meteors.tsx", "type": "registry:component" } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "meteor": "meteor 5s linear infinite" + }, + "keyframes": { + "meteor": { + "0%": { + "transform": "rotate(215deg) translateX(0)", + "opacity": "1" + }, + "70%": { "opacity": "1" }, + "100%": { + "transform": "rotate(215deg) translateX(-500px)", + "opacity": "0" + } + } + } + } + } + } + } + }, + { + "name": "grid-pattern", + "type": "registry:component", + "title": "Grid Pattern", + "description": "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", + "files": [ + { + "path": "registry/magicui/grid-pattern.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "interactive-grid-pattern", + "type": "registry:component", + "title": "Interactive Grid Pattern", + "description": "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", + "files": [ + { + "path": "registry/magicui/interactive-grid-pattern.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dot-pattern", + "type": "registry:component", + "title": "Dot Pattern", + "description": "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", + "files": [ + { + "path": "registry/magicui/dot-pattern.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "flickering-grid", + "type": "registry:component", + "title": "Flickering Grid", + "description": "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", + "files": [ + { + "path": "registry/magicui/flickering-grid.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "hero-video-dialog", + "type": "registry:component", + "title": "Hero Video Dialog", + "description": "A hero video dialog component.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/hero-video-dialog.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "code-comparison", + "type": "registry:component", + "title": "Code Comparison", + "description": "A component which compares two code snippets.", + "dependencies": ["shiki", "next-themes"], + "files": [ + { + "path": "registry/magicui/code-comparison.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "script-copy-btn", + "type": "registry:component", + "title": "Script Copy Button", + "description": "Copy code to clipboard", + "dependencies": ["motion", "shiki", "next-themes"], + "registryDependencies": ["button"], + "files": [ + { + "path": "registry/magicui/script-copy-btn.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "marquee", + "type": "registry:component", + "title": "Marquee", + "description": "An infinite scrolling component that can be used to display text, images, or videos.", + "files": [ + { "path": "registry/magicui/marquee.tsx", "type": "registry:component" } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "keyframes": { + "marquee": { + "from": { "transform": "translateX(0)" }, + "to": { "transform": "translateX(calc(-100% - var(--gap)))" } + }, + "marquee-vertical": { + "from": { "transform": "translateY(0)" }, + "to": { "transform": "translateY(calc(-100% - var(--gap)))" } + } + }, + "animation": { + "marquee": "marquee var(--duration) infinite linear", + "marquee-vertical": "marquee-vertical var(--duration) linear infinite" + } + } + } + } + } + }, + { + "name": "globe", + "type": "registry:component", + "title": "Globe", + "description": "An autorotating, interactive, and highly performant globe made using WebGL.", + "dependencies": ["cobe"], + "files": [ + { "path": "registry/magicui/globe.tsx", "type": "registry:component" } + ] + }, + { + "name": "shimmer-button", + "type": "registry:component", + "title": "Shimmer Button", + "description": "A button with a shimmering light which travels around the perimeter.", + "files": [ + { + "path": "registry/magicui/shimmer-button.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "shimmer-slide": "shimmer-slide var(--speed) ease-in-out infinite alternate", + "spin-around": "spin-around calc(var(--speed) * 2) infinite linear" + }, + "keyframes": { + "shimmer-slide": { + "to": { + "transform": "translate(calc(100cqw - 100%), 0)" + } + }, + "spin-around": { + "0%": { + "transform": "translateZ(0) rotate(0)" + }, + "15%, 35%": { + "transform": "translateZ(0) rotate(90deg)" + }, + "65%, 85%": { + "transform": "translateZ(0) rotate(270deg)" + }, + "100%": { + "transform": "translateZ(0) rotate(360deg)" + } + } + } + } + } + } + } + }, + { + "name": "tweet-card", + "type": "registry:component", + "title": "Tweet Card", + "description": "A card that displays a tweet with the author's name, handle, and profile picture.", + "dependencies": ["react-tweet"], + "files": [ + { + "path": "registry/magicui/tweet-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "client-tweet-card", + "type": "registry:component", + "title": "Client Tweet Card", + "description": "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", + "dependencies": ["react-tweet"], + "files": [ + { + "path": "registry/magicui/client-tweet-card.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "bento-grid", + "type": "registry:component", + "title": "Bento Grid", + "description": "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", + "dependencies": ["@radix-ui/react-icons"], + "registryDependencies": ["button"], + "files": [ + { + "path": "registry/magicui/bento-grid.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "particles", + "type": "registry:component", + "title": "Particles", + "description": "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", + "files": [ + { + "path": "registry/magicui/particles.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "number-ticker", + "type": "registry:component", + "title": "Number Ticker", + "description": "Animate numbers to count up or down to a target number", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/number-ticker.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "ripple", + "type": "registry:component", + "title": "Ripple", + "description": "An animated ripple effect typically used behind elements to emphasize them.", + "files": [ + { "path": "registry/magicui/ripple.tsx", "type": "registry:component" } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "ripple": "ripple var(--duration,2s) ease calc(var(--i, 0)*.2s) infinite" + }, + "keyframes": { + "ripple": { + "0%, 100%": { + "transform": "translate(-50%, -50%) scale(1)" + }, + "50%": { + "transform": "translate(-50%, -50%) scale(0.9)" + } + } + } + } + } + } + } + }, + { + "name": "retro-grid", + "type": "registry:component", + "title": "Retro Grid", + "description": "An animated scrolling retro grid effect", + "files": [ + { + "path": "registry/magicui/retro-grid.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "grid": "grid 15s linear infinite" + }, + "keyframes": { + "grid": { + "0%": { "transform": "translateY(-50%)" }, + "100%": { "transform": "translateY(0)" } + } + } + } + } + } + } + }, + { + "name": "animated-list", + "type": "registry:component", + "title": "Animated List", + "description": "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/animated-list.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-shiny-text", + "type": "registry:component", + "title": "Animated Shiny Text", + "description": "A light glare effect which pans across text making it appear as if it is shimmering.", + "files": [ + { + "path": "registry/magicui/animated-shiny-text.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "shiny-text": "shiny-text 8s infinite" + }, + "keyframes": { + "shiny-text": { + "0%, 90%, 100%": { + "background-position": "calc(-100% - var(--shiny-width)) 0" + }, + "30%, 60%": { + "background-position": "calc(100% + var(--shiny-width)) 0" + } + } + } + } + } + } + } + }, + { + "name": "animated-grid-pattern", + "type": "registry:component", + "title": "Animated Grid Pattern", + "description": "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/animated-grid-pattern.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "border-beam", + "type": "registry:component", + "title": "Border Beam", + "description": "An animated beam of light which travels along the border of its container.", + "files": [ + { + "path": "registry/magicui/border-beam.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "border-beam": "border-beam calc(var(--duration)*1s) infinite linear" + }, + "keyframes": { + "border-beam": { + "100%": { + "offset-distance": "100%" + } + } + } + } + } + } + } + }, + { + "name": "animated-beam", + "type": "registry:component", + "title": "Animated Beam", + "description": "An animated beam of light which travels along a path. Useful for showcasing the \"integration\" features of a website.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/animated-beam.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-reveal", + "type": "registry:component", + "title": "Text Reveal", + "description": "Fade in text as you scroll down the page.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/text-reveal.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "hyper-text", + "type": "registry:component", + "title": "Hyper Text", + "description": "A text animation that scrambles letters before revealing the final text.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/hyper-text.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-gradient-text", + "type": "registry:component", + "title": "Animated Gradient Text", + "description": "An animated gradient background which transitions between colors for text.", + "files": [ + { + "path": "registry/magicui/animated-gradient-text.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "gradient": "gradient 8s linear infinite" + }, + "keyframes": { + "gradient": { + "to": { + "backgroundPosition": "var(--bg-size) 0" + } + } + } + } + } + } + } + }, + { + "name": "orbiting-circles", + "type": "registry:component", + "title": "Orbiting Circles", + "description": "A collection of circles which move in orbit along a circular path", + "files": [ + { + "path": "registry/magicui/orbiting-circles.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "orbit": "orbit calc(var(--duration)*1s) linear infinite" + }, + "keyframes": { + "orbit": { + "0%": { + "transform": "rotate(calc(var(--angle) * 1deg)) translateY(calc(var(--radius) * 1px)) rotate(calc(var(--angle) * -1deg))" + }, + "100%": { + "transform": "rotate(calc(var(--angle) * 1deg + 360deg)) translateY(calc(var(--radius) * 1px)) rotate(calc((var(--angle) * -1deg) - 360deg))" + } + } + } + } + } + } + } + }, + { + "name": "dock", + "type": "registry:component", + "title": "Dock", + "description": "An implementation of the MacOS dock using react + tailwindcss + framer motion", + "dependencies": ["motion"], + "files": [ + { "path": "registry/magicui/dock.tsx", "type": "registry:component" } + ] + }, + { + "name": "word-rotate", + "type": "registry:component", + "title": "Word Rotate", + "description": "A vertical rotation of words", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/word-rotate.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "avatar-circles", + "type": "registry:component", + "title": "Avatar Circles", + "description": "Overlapping circles of avatars.", + "files": [ + { + "path": "registry/magicui/avatar-circles.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "typing-animation", + "type": "registry:component", + "title": "Typing Animation", + "description": "Characters appearing in typed animation", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/typing-animation.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sparkles-text", + "type": "registry:component", + "title": "Sparkles Text", + "description": "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/sparkles-text.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "flip-text", + "type": "registry:component", + "title": "Flip Text", + "description": "Text flipping character animation", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/flip-text.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "icon-cloud", + "type": "registry:component", + "title": "Icon Cloud", + "description": "An interactive 3D tag cloud component", + "dependencies": [], + "files": [ + { + "path": "registry/magicui/icon-cloud.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate", + "type": "registry:component", + "title": "Text Animate", + "description": "A text animation component that animates text using a variety of different animations.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/text-animate.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scroll-based-velocity", + "type": "registry:component", + "title": "Scroll Based Velocity", + "description": "Scrolling text whose speed changes based on scroll speed", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/scroll-based-velocity.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scratch-to-reveal", + "type": "registry:component", + "title": "Scratch To Reveal", + "description": "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/scratch-to-reveal.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shiny-button", + "type": "registry:component", + "title": "Shiny Button", + "description": "A shiny button component with dynamic styles in the dark mode or light mode.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/shiny-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "box-reveal", + "type": "registry:component", + "title": "Box Reveal Animation", + "description": "Sliding box animation that reveals text behind it.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/box-reveal.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shine-border", + "type": "registry:component", + "title": "Shine Border", + "description": "Shine border is an animated background border effect.", + "files": [ + { + "path": "registry/magicui/shine-border.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "shine": "shine var(--duration) infinite linear" + }, + "keyframes": { + "shine": { + "0%": { + "background-position": "0% 0%" + }, + "50%": { + "background-position": "100% 100%" + }, + "to": { + "background-position": "0% 0%" + } + } + } + } + } + } + } + }, + { + "name": "animated-circular-progress-bar", + "type": "registry:component", + "title": "Animated Circular Progress Bar", + "description": "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", + "files": [ + { + "path": "registry/magicui/animated-circular-progress-bar.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti", + "type": "registry:component", + "title": "Confetti", + "description": "Confetti animations are best used to delight your users when something special happens", + "dependencies": ["canvas-confetti", "@types/canvas-confetti"], + "registryDependencies": ["button"], + "files": [ + { + "path": "registry/magicui/confetti.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-subscribe-button", + "type": "registry:component", + "title": "Animated Subscribe Button", + "description": "An animated subscribe button useful for showing a micro animation from intial to final result.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/animated-subscribe-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "cool-mode", + "type": "registry:component", + "title": "Cool Mode", + "description": "Cool mode effect for buttons, links, and other DOMs", + "files": [ + { + "path": "registry/magicui/cool-mode.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "pulsating-button", + "type": "registry:component", + "title": "Pulsating Button", + "description": "An animated pulsating button useful for capturing attention of users.", + "files": [ + { + "path": "registry/magicui/pulsating-button.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "pulse": "pulse var(--duration) ease-out infinite" + }, + "keyframes": { + "pulse": { + "0%, 100%": { "boxShadow": "0 0 0 0 var(--pulse-color)" }, + "50%": { "boxShadow": "0 0 0 8px var(--pulse-color)" } + } + } + } + } + } + } + }, + { + "name": "ripple-button", + "type": "registry:component", + "title": "Ripple Button", + "description": "An animated button with ripple useful for user engagement.", + "files": [ + { + "path": "registry/magicui/ripple-button.tsx", + "type": "registry:component" + } + ], + "tailwind": { + "config": { + "theme": { + "extend": { + "animation": { + "rippling": "rippling var(--duration) ease-out" + }, + "keyframes": { + "rippling": { + "0%": { + "opacity": "1" + }, + "100%": { + "transform": "scale(2)", + "opacity": "0" + } + } + } + } + } + } + } + }, + { + "name": "file-tree", + "type": "registry:component", + "title": "File Tree", + "description": "A component used to showcase the folder and file structure of a directory.", + "files": [ + { + "path": "registry/magicui/file-tree.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "blur-fade", + "type": "registry:component", + "title": "Blur Fade", + "description": "Blur fade in and out animation. Used to smoothly fade in and out content.", + "dependencies": ["motion"], + "files": [ + { + "path": "registry/magicui/blur-fade.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "safari", + "type": "registry:component", + "title": "Safari", + "description": "A safari browser mockup to showcase your website.", + "files": [ + { "path": "registry/magicui/safari.tsx", "type": "registry:component" } + ] + }, + { + "name": "iphone-15-pro", + "type": "registry:component", + "title": "iPhone 15 Pro", + "description": "A mockup of the iPhone 15 Pro", + "files": [ + { + "path": "registry/magicui/iphone-15-pro.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "rainbow-button", + "type": "registry:component", + "title": "Rainbow Button", + "description": "An animated button with a rainbow effect.", + "files": [ + { + "path": "registry/magicui/rainbow-button.tsx", + "type": "registry:component" + } + ], + "cssVars": { + "light": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + }, + "dark": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + } + }, + "tailwind": { + "config": { + "theme": { + "extend": { + "colors": { + "color-1": "hsl(var(--color-1))", + "color-2": "hsl(var(--color-2))", + "color-3": "hsl(var(--color-3))", + "color-4": "hsl(var(--color-4))", + "color-5": "hsl(var(--color-5))" + }, + "animation": { + "rainbow": "rainbow var(--speed, 2s) infinite linear" + }, + "keyframes": { + "rainbow": { + "0%": { "background-position": "0%" }, + "100%": { "background-position": "200%" } + } + } + } + } + } + } + }, + { + "name": "interactive-hover-button", + "type": "registry:component", + "title": "Interactive Hover Button", + "description": "A visually engaging button component that responds to hover with dynamic transitions, adapting smoothly between light and dark modes for enhanced user interactivity.", + "files": [ + { + "path": "registry/magicui/interactive-hover-button.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "magic-card-demo", + "type": "registry:component", + "registryDependencies": ["magic-card"], + "files": [ + { + "path": "registry/example/magic-card-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "android-demo", + "type": "registry:component", + "registryDependencies": ["android"], + "files": [ + { + "path": "registry/example/android-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "android-demo-2", + "type": "registry:component", + "registryDependencies": ["android"], + "files": [ + { + "path": "registry/example/android-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "android-demo-3", + "type": "registry:component", + "registryDependencies": ["android"], + "files": [ + { + "path": "registry/example/android-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "warp-background-demo", + "type": "registry:component", + "registryDependencies": ["warp-background"], + "files": [ + { + "path": "registry/example/warp-background-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "line-shadow-text-demo", + "type": "registry:component", + "registryDependencies": ["line-shadow-text"], + "files": [ + { + "path": "registry/example/line-shadow-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "aurora-text-demo", + "type": "registry:component", + "registryDependencies": ["aurora-text"], + "files": [ + { + "path": "registry/example/aurora-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "morphing-text-demo", + "type": "registry:component", + "registryDependencies": ["morphing-text"], + "files": [ + { + "path": "registry/example/morphing-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scroll-progress-demo", + "type": "registry:component", + "registryDependencies": ["scroll-progress"], + "files": [ + { + "path": "registry/example/scroll-progress-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "neon-gradient-card-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/neon-gradient-card-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "meteors-demo", + "type": "registry:component", + "registryDependencies": ["meteors"], + "files": [ + { + "path": "registry/example/meteors-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "grid-pattern-demo", + "type": "registry:component", + "registryDependencies": ["grid-pattern"], + "files": [ + { + "path": "registry/example/grid-pattern-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "grid-pattern-linear-gradient", + "type": "registry:component", + "registryDependencies": ["grid-pattern"], + "files": [ + { + "path": "registry/example/grid-pattern-linear-gradient.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "grid-pattern-dashed", + "type": "registry:component", + "registryDependencies": ["grid-pattern"], + "files": [ + { + "path": "registry/example/grid-pattern-dashed.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dot-pattern-demo", + "type": "registry:component", + "registryDependencies": ["dot-pattern"], + "files": [ + { + "path": "registry/example/dot-pattern-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dot-pattern-linear-gradient", + "type": "registry:component", + "registryDependencies": ["dot-pattern"], + "files": [ + { + "path": "registry/example/dot-pattern-linear-gradient.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "flickering-grid-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/flickering-grid-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "flickering-grid-rounded-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/flickering-grid-rounded-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "hero-video-dialog-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/hero-video-dialog-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "hero-video-dialog-demo-top-in-bottom-out", + "type": "registry:component", + "files": [ + { + "path": "registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "code-comparison-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/code-comparison-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "script-copy-btn-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/script-copy-btn-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "marquee-demo", + "type": "registry:component", + "registryDependencies": ["marquee"], + "files": [ + { + "path": "registry/example/marquee-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "marquee-demo-vertical", + "type": "registry:component", + "registryDependencies": ["marquee"], + "files": [ + { + "path": "registry/example/marquee-demo-vertical.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "marquee-logos", + "type": "registry:component", + "registryDependencies": ["marquee"], + "files": [ + { + "path": "registry/example/marquee-logos.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "marquee-3d", + "type": "registry:component", + "registryDependencies": ["marquee"], + "files": [ + { + "path": "registry/example/marquee-3d.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "globe-demo", + "type": "registry:component", + "registryDependencies": ["globe"], + "files": [ + { + "path": "registry/example/globe-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "tweet-card-demo", + "type": "registry:component", + "registryDependencies": ["tweet-card"], + "files": [ + { + "path": "registry/example/tweet-card-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "tweet-card-images", + "type": "registry:component", + "registryDependencies": ["tweet-card"], + "files": [ + { + "path": "registry/example/tweet-card-images.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "tweet-card-meta-preview", + "type": "registry:component", + "registryDependencies": ["tweet-card"], + "files": [ + { + "path": "registry/example/tweet-card-meta-preview.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shimmer-button-demo", + "type": "registry:component", + "registryDependencies": ["shimmer-button"], + "files": [ + { + "path": "registry/example/shimmer-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "bento-demo", + "type": "registry:component", + "registryDependencies": [ + "bento-grid", + "marquee", + "animated-list-demo", + "animated-beam-multiple-outputs", + "shadcn:command", + "shadcn:calendar" + ], + "dependencies": ["@radix-ui/react-icons"], + "files": [ + { + "path": "registry/example/bento-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "bento-demo-vertical", + "type": "registry:component", + "registryDependencies": ["bento-grid"], + "dependencies": ["@radix-ui/react-icons"], + "files": [ + { + "path": "registry/example/bento-demo-vertical.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "number-ticker-demo", + "type": "registry:component", + "registryDependencies": ["number-ticker"], + "files": [ + { + "path": "registry/example/number-ticker-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "number-ticker-decimal-demo", + "type": "registry:component", + "registryDependencies": ["number-ticker"], + "files": [ + { + "path": "registry/example/number-ticker-decimal-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "ripple-demo", + "type": "registry:component", + "registryDependencies": ["ripple"], + "files": [ + { + "path": "registry/example/ripple-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "retro-grid-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/retro-grid-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-list-demo", + "type": "registry:component", + "registryDependencies": ["animated-list"], + "files": [ + { + "path": "registry/example/animated-list-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-shiny-text-demo", + "type": "registry:component", + "registryDependencies": ["animated-shiny-text"], + "dependencies": ["@radix-ui/react-icons"], + "files": [ + { + "path": "registry/example/animated-shiny-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "particles-demo", + "type": "registry:component", + "registryDependencies": ["particles"], + "dependencies": ["next-themes"], + "files": [ + { + "path": "registry/example/particles-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-grid-pattern-demo", + "type": "registry:component", + "registryDependencies": ["animated-grid-pattern"], + "files": [ + { + "path": "registry/example/animated-grid-pattern-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "interactive-grid-pattern-demo", + "type": "registry:component", + "registryDependencies": ["interactive-grid-pattern"], + "files": [ + { + "path": "registry/example/interactive-grid-pattern-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "interactive-grid-pattern-demo-2", + "type": "registry:component", + "registryDependencies": ["interactive-grid-pattern"], + "files": [ + { + "path": "registry/example/interactive-grid-pattern-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "border-beam-demo", + "type": "registry:component", + "registryDependencies": ["border-beam"], + "files": [ + { + "path": "registry/example/border-beam-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-beam-demo", + "type": "registry:component", + "registryDependencies": ["animated-beam"], + "dependencies": ["@radix-ui/react-icons"], + "files": [ + { + "path": "registry/example/animated-beam-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-beam-unidirectional", + "type": "registry:component", + "registryDependencies": ["animated-beam"], + "files": [ + { + "path": "registry/example/animated-beam-unidirectional.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-beam-bidirectional", + "type": "registry:component", + "registryDependencies": ["animated-beam"], + "files": [ + { + "path": "registry/example/animated-beam-bidirectional.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-beam-multiple-inputs", + "type": "registry:component", + "registryDependencies": ["animated-beam"], + "files": [ + { + "path": "registry/example/animated-beam-multiple-inputs.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-beam-multiple-outputs", + "type": "registry:component", + "registryDependencies": ["animated-beam"], + "files": [ + { + "path": "registry/example/animated-beam-multiple-outputs.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-reveal-demo", + "type": "registry:component", + "registryDependencies": ["text-reveal"], + "files": [ + { + "path": "registry/example/text-reveal-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-gradient-text-demo", + "type": "registry:component", + "registryDependencies": ["animated-gradient-text"], + "dependencies": ["lucide-react"], + "files": [ + { + "path": "registry/example/animated-gradient-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "orbiting-circles-demo", + "type": "registry:component", + "registryDependencies": ["orbiting-circles"], + "dependencies": ["@radix-ui/react-icons"], + "files": [ + { + "path": "registry/example/orbiting-circles-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dock-demo", + "type": "registry:component", + "registryDependencies": ["dock"], + "files": [ + { + "path": "registry/example/dock-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dock-demo-2", + "type": "registry:component", + "registryDependencies": ["dock"], + "files": [ + { + "path": "registry/example/dock-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "dock-demo-3", + "type": "registry:component", + "registryDependencies": ["dock"], + "files": [ + { + "path": "registry/example/dock-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "word-rotate-demo", + "type": "registry:component", + "registryDependencies": ["word-rotate"], + "files": [ + { + "path": "registry/example/word-rotate-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "hyper-text-demo", + "type": "registry:component", + "registryDependencies": ["hyper-text"], + "files": [ + { + "path": "registry/example/hyper-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "avatar-circles-demo", + "type": "registry:component", + "registryDependencies": ["avatar-circles"], + "files": [ + { + "path": "registry/example/avatar-circles-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "typing-animation-demo", + "type": "registry:component", + "registryDependencies": ["typing-animation"], + "files": [ + { + "path": "registry/example/typing-animation-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scroll-based-velocity-demo", + "type": "registry:component", + "registryDependencies": ["scroll-based-velocity"], + "files": [ + { + "path": "registry/example/scroll-based-velocity-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "scratch-to-reveal-demo", + "type": "registry:component", + "registryDependencies": ["scratch-to-reveal"], + "files": [ + { + "path": "registry/example/scratch-to-reveal-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "flip-text-demo", + "type": "registry:component", + "registryDependencies": ["flip-text"], + "files": [ + { + "path": "registry/example/flip-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "sparkles-text-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/sparkles-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "icon-cloud-demo", + "type": "registry:component", + "registryDependencies": ["icon-cloud"], + "files": [ + { + "path": "registry/example/icon-cloud-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "icon-cloud-demo-2", + "type": "registry:component", + "registryDependencies": ["icon-cloud"], + "files": [ + { + "path": "registry/example/icon-cloud-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "icon-cloud-demo-3", + "type": "registry:component", + "registryDependencies": ["icon-cloud"], + "files": [ + { + "path": "registry/example/icon-cloud-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo-4", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-4.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo-5", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-5.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "text-animate-demo-6", + "type": "registry:component", + "files": [ + { + "path": "registry/example/text-animate-demo-6.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shiny-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shiny-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "box-reveal-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/box-reveal-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-circular-progress-bar-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/animated-circular-progress-bar-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shine-border-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shine-border-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "shine-border-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/shine-border-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-basic-cannon", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-basic-cannon.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-random-direction", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-random-direction.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-fireworks", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-fireworks.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-stars", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-stars.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-side-cannons", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-side-cannons.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-custom-shapes", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-custom-shapes.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "confetti-emoji", + "type": "registry:component", + "files": [ + { + "path": "registry/example/confetti-emoji.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "animated-subscribe-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/animated-subscribe-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "cool-mode-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/cool-mode-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "cool-mode-custom", + "type": "registry:component", + "files": [ + { + "path": "registry/example/cool-mode-custom.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "pulsating-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/pulsating-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "ripple-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/ripple-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "file-tree-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/file-tree-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "blur-fade-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/blur-fade-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "blur-fade-text-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/blur-fade-text-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "safari-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "safari-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "safari-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "safari-demo-4", + "type": "registry:component", + "files": [ + { + "path": "registry/example/safari-demo-4.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "iphone-15-pro-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "iphone-15-pro-demo-2", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo-2.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "iphone-15-pro-demo-3", + "type": "registry:component", + "files": [ + { + "path": "registry/example/iphone-15-pro-demo-3.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "rainbow-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/rainbow-button-demo.tsx", + "type": "registry:component" + } + ] + }, + { + "name": "interactive-hover-button-demo", + "type": "registry:component", + "files": [ + { + "path": "registry/example/interactive-hover-button-demo.tsx", + "type": "registry:component" + } + ] + } + ] +} diff --git a/registry/default/example/android-demo-2.tsx b/registry/example/android-demo-2.tsx similarity index 85% rename from registry/default/example/android-demo-2.tsx rename to registry/example/android-demo-2.tsx index 609ae2f4c..d5fa9561d 100644 --- a/registry/default/example/android-demo-2.tsx +++ b/registry/example/android-demo-2.tsx @@ -1,4 +1,4 @@ -import Android from "@/registry/default/magicui/android"; +import Android from "@/registry/magicui/android"; export default function AndroidDemo() { return ( diff --git a/registry/default/example/android-demo-3.tsx b/registry/example/android-demo-3.tsx similarity index 81% rename from registry/default/example/android-demo-3.tsx rename to registry/example/android-demo-3.tsx index d37922d20..64660c8ac 100644 --- a/registry/default/example/android-demo-3.tsx +++ b/registry/example/android-demo-3.tsx @@ -1,4 +1,4 @@ -import Android from "@/registry/default/magicui/android"; +import Android from "@/registry/magicui/android"; export default function AndroidDemo() { return ( diff --git a/registry/default/example/android-demo.tsx b/registry/example/android-demo.tsx similarity index 70% rename from registry/default/example/android-demo.tsx rename to registry/example/android-demo.tsx index c211df940..45cdb60ba 100644 --- a/registry/default/example/android-demo.tsx +++ b/registry/example/android-demo.tsx @@ -1,4 +1,4 @@ -import Android from "@/registry/default/magicui/android"; +import Android from "@/registry/magicui/android"; export default function AndroidDemo() { return ( diff --git a/registry/default/example/animated-beam-bidirectional.tsx b/registry/example/animated-beam-bidirectional.tsx similarity index 98% rename from registry/default/example/animated-beam-bidirectional.tsx rename to registry/example/animated-beam-bidirectional.tsx index 324f02435..a076e18fc 100644 --- a/registry/default/example/animated-beam-bidirectional.tsx +++ b/registry/example/animated-beam-bidirectional.tsx @@ -3,7 +3,7 @@ import React, { forwardRef, useRef } from "react"; import { cn } from "@/lib/utils"; -import { AnimatedBeam } from "@/registry/default/magicui/animated-beam"; +import { AnimatedBeam } from "@/registry/magicui/animated-beam"; const Circle = forwardRef< HTMLDivElement, diff --git a/registry/default/example/animated-beam-demo.tsx b/registry/example/animated-beam-demo.tsx similarity index 99% rename from registry/default/example/animated-beam-demo.tsx rename to registry/example/animated-beam-demo.tsx index d65da0316..decacd331 100644 --- a/registry/default/example/animated-beam-demo.tsx +++ b/registry/example/animated-beam-demo.tsx @@ -3,7 +3,7 @@ import React, { forwardRef, useRef } from "react"; import { cn } from "@/lib/utils"; -import { AnimatedBeam } from "@/registry/default/magicui/animated-beam"; +import { AnimatedBeam } from "@/registry/magicui/animated-beam"; const Circle = forwardRef< HTMLDivElement, @@ -39,7 +39,7 @@ export default function AnimatedBeamDemo() { className="relative flex h-[500px] w-full items-center justify-center overflow-hidden rounded-lg border bg-background p-10 md:shadow-xl" ref={containerRef} > -
+
diff --git a/registry/default/example/animated-beam-multiple-inputs.tsx b/registry/example/animated-beam-multiple-inputs.tsx similarity index 99% rename from registry/default/example/animated-beam-multiple-inputs.tsx rename to registry/example/animated-beam-multiple-inputs.tsx index d43693f57..a728f8f17 100644 --- a/registry/default/example/animated-beam-multiple-inputs.tsx +++ b/registry/example/animated-beam-multiple-inputs.tsx @@ -3,7 +3,7 @@ import React, { forwardRef, useRef } from "react"; import { cn } from "@/lib/utils"; -import { AnimatedBeam } from "@/registry/default/magicui/animated-beam"; +import { AnimatedBeam } from "@/registry/magicui/animated-beam"; const Circle = forwardRef< HTMLDivElement, @@ -46,7 +46,7 @@ export default function AnimatedBeamMultipleOutputDemo({ )} ref={containerRef} > -
+
diff --git a/registry/default/example/animated-beam-multiple-outputs.tsx b/registry/example/animated-beam-multiple-outputs.tsx similarity index 99% rename from registry/default/example/animated-beam-multiple-outputs.tsx rename to registry/example/animated-beam-multiple-outputs.tsx index e13afbd82..e92d5c2a5 100644 --- a/registry/default/example/animated-beam-multiple-outputs.tsx +++ b/registry/example/animated-beam-multiple-outputs.tsx @@ -3,7 +3,7 @@ import React, { forwardRef, useRef } from "react"; import { cn } from "@/lib/utils"; -import { AnimatedBeam } from "@/registry/default/magicui/animated-beam"; +import { AnimatedBeam } from "@/registry/magicui/animated-beam"; const Circle = forwardRef< HTMLDivElement, diff --git a/registry/default/example/animated-beam-unidirectional.tsx b/registry/example/animated-beam-unidirectional.tsx similarity index 97% rename from registry/default/example/animated-beam-unidirectional.tsx rename to registry/example/animated-beam-unidirectional.tsx index 130ace07a..31277dc08 100644 --- a/registry/default/example/animated-beam-unidirectional.tsx +++ b/registry/example/animated-beam-unidirectional.tsx @@ -3,7 +3,7 @@ import React, { forwardRef, useRef } from "react"; import { cn } from "@/lib/utils"; -import { AnimatedBeam } from "@/registry/default/magicui/animated-beam"; +import { AnimatedBeam } from "@/registry/magicui/animated-beam"; const Circle = forwardRef< HTMLDivElement, diff --git a/registry/default/example/animated-circular-progress-bar-demo.tsx b/registry/example/animated-circular-progress-bar-demo.tsx similarity index 86% rename from registry/default/example/animated-circular-progress-bar-demo.tsx rename to registry/example/animated-circular-progress-bar-demo.tsx index 7b67729ef..5c85ec69f 100644 --- a/registry/default/example/animated-circular-progress-bar-demo.tsx +++ b/registry/example/animated-circular-progress-bar-demo.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; -import { AnimatedCircularProgressBar } from "@/registry/default/magicui/animated-circular-progress-bar"; +import { AnimatedCircularProgressBar } from "@/registry/magicui/animated-circular-progress-bar"; export default function AnimatedCircularProgressBarDemo() { const [value, setValue] = useState(0); diff --git a/registry/default/example/animated-gradient-text-demo.tsx b/registry/example/animated-gradient-text-demo.tsx similarity index 89% rename from registry/default/example/animated-gradient-text-demo.tsx rename to registry/example/animated-gradient-text-demo.tsx index 5c78185c1..a9e87dbf9 100644 --- a/registry/default/example/animated-gradient-text-demo.tsx +++ b/registry/example/animated-gradient-text-demo.tsx @@ -1,7 +1,7 @@ import { ChevronRight } from "lucide-react"; import { cn } from "@/lib/utils"; -import { AnimatedGradientText } from "@/registry/default/magicui/animated-gradient-text"; +import { AnimatedGradientText } from "@/registry/magicui/animated-gradient-text"; export default async function AnimatedGradientTextDemo() { return ( diff --git a/registry/default/example/animated-grid-pattern-demo.tsx b/registry/example/animated-grid-pattern-demo.tsx similarity index 89% rename from registry/default/example/animated-grid-pattern-demo.tsx rename to registry/example/animated-grid-pattern-demo.tsx index 8810d96b6..5509358ee 100644 --- a/registry/default/example/animated-grid-pattern-demo.tsx +++ b/registry/example/animated-grid-pattern-demo.tsx @@ -1,5 +1,5 @@ import { cn } from "@/lib/utils"; -import { AnimatedGridPattern } from "@/registry/default/magicui/animated-grid-pattern"; +import { AnimatedGridPattern } from "@/registry/magicui/animated-grid-pattern"; export default function AnimatedGridPatternDemo() { return ( diff --git a/registry/default/example/animated-list-demo.tsx b/registry/example/animated-list-demo.tsx similarity index 97% rename from registry/default/example/animated-list-demo.tsx rename to registry/example/animated-list-demo.tsx index a065e8f8c..f4ac14ebf 100644 --- a/registry/default/example/animated-list-demo.tsx +++ b/registry/example/animated-list-demo.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { AnimatedList } from "@/registry/default/magicui/animated-list"; +import { AnimatedList } from "@/registry/magicui/animated-list"; interface Item { name: string; diff --git a/registry/default/example/animated-shiny-text-demo.tsx b/registry/example/animated-shiny-text-demo.tsx similarity index 91% rename from registry/default/example/animated-shiny-text-demo.tsx rename to registry/example/animated-shiny-text-demo.tsx index 3171c7b0b..f05dd780e 100644 --- a/registry/default/example/animated-shiny-text-demo.tsx +++ b/registry/example/animated-shiny-text-demo.tsx @@ -1,7 +1,7 @@ import { ArrowRightIcon } from "@radix-ui/react-icons"; import { cn } from "@/lib/utils"; -import { AnimatedShinyText } from "@/registry/default/magicui/animated-shiny-text"; +import { AnimatedShinyText } from "@/registry/magicui/animated-shiny-text"; export default function AnimatedShinyTextDemo() { return ( diff --git a/registry/default/example/animated-subscribe-button-demo.tsx b/registry/example/animated-subscribe-button-demo.tsx similarity index 85% rename from registry/default/example/animated-subscribe-button-demo.tsx rename to registry/example/animated-subscribe-button-demo.tsx index de1c01f52..7185f15c9 100644 --- a/registry/default/example/animated-subscribe-button-demo.tsx +++ b/registry/example/animated-subscribe-button-demo.tsx @@ -1,5 +1,5 @@ +import { AnimatedSubscribeButton } from "@/registry/magicui/animated-subscribe-button"; import { CheckIcon, ChevronRightIcon } from "lucide-react"; -import { AnimatedSubscribeButton } from "@/registry/default/magicui/animated-subscribe-button"; export default function AnimatedSubscribeButtonDemo() { return ( diff --git a/registry/default/example/aurora-text-demo.tsx b/registry/example/aurora-text-demo.tsx similarity index 74% rename from registry/default/example/aurora-text-demo.tsx rename to registry/example/aurora-text-demo.tsx index 08305036a..0efc7f36c 100644 --- a/registry/default/example/aurora-text-demo.tsx +++ b/registry/example/aurora-text-demo.tsx @@ -1,4 +1,4 @@ -import { AuroraText } from "@/registry/default/magicui/aurora-text"; +import { AuroraText } from "@/registry/magicui/aurora-text"; export default function AuroraTextDemo() { return ( diff --git a/registry/default/example/avatar-circles-demo.tsx b/registry/example/avatar-circles-demo.tsx similarity index 92% rename from registry/default/example/avatar-circles-demo.tsx rename to registry/example/avatar-circles-demo.tsx index ebf55609f..9f91fe264 100644 --- a/registry/default/example/avatar-circles-demo.tsx +++ b/registry/example/avatar-circles-demo.tsx @@ -1,4 +1,4 @@ -import { AvatarCircles } from "@/registry/default/magicui/avatar-circles"; +import { AvatarCircles } from "@/registry/magicui/avatar-circles"; const avatars = [ { diff --git a/registry/default/example/bento-demo-vertical.tsx b/registry/example/bento-demo-vertical.tsx similarity index 96% rename from registry/default/example/bento-demo-vertical.tsx rename to registry/example/bento-demo-vertical.tsx index 68e8a575f..09c4e09ba 100644 --- a/registry/default/example/bento-demo-vertical.tsx +++ b/registry/example/bento-demo-vertical.tsx @@ -6,7 +6,7 @@ import { InputIcon, } from "@radix-ui/react-icons"; -import { BentoCard, BentoGrid } from "@/registry/default/magicui/bento-grid"; +import { BentoCard, BentoGrid } from "@/registry/magicui/bento-grid"; const features = [ { diff --git a/registry/default/example/bento-demo.tsx b/registry/example/bento-demo.tsx similarity index 92% rename from registry/default/example/bento-demo.tsx rename to registry/example/bento-demo.tsx index 97a3029c6..a87874dc4 100644 --- a/registry/default/example/bento-demo.tsx +++ b/registry/example/bento-demo.tsx @@ -3,10 +3,10 @@ import { BellIcon, Share2Icon } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { cn } from "@/lib/utils"; -import AnimatedBeamMultipleOutputDemo from "@/registry/default/example/animated-beam-multiple-outputs"; -import AnimatedListDemo from "@/registry/default/example/animated-list-demo"; -import { BentoCard, BentoGrid } from "@/registry/default/magicui/bento-grid"; -import { Marquee } from "@/registry/default/magicui/marquee"; +import AnimatedBeamMultipleOutputDemo from "@/registry/example/animated-beam-multiple-outputs"; +import AnimatedListDemo from "@/registry/example/animated-list-demo"; +import { BentoCard, BentoGrid } from "@/registry/magicui/bento-grid"; +import { Marquee } from "@/registry/magicui/marquee"; const files = [ { diff --git a/registry/default/example/blur-fade-demo.tsx b/registry/example/blur-fade-demo.tsx similarity index 92% rename from registry/default/example/blur-fade-demo.tsx rename to registry/example/blur-fade-demo.tsx index e966c865e..ad97fa6aa 100644 --- a/registry/default/example/blur-fade-demo.tsx +++ b/registry/example/blur-fade-demo.tsx @@ -1,5 +1,5 @@ /* eslint-disable @next/next/no-img-element */ -import { BlurFade } from "@/registry/default/magicui/blur-fade"; +import { BlurFade } from "@/registry/magicui/blur-fade"; const images = Array.from({ length: 9 }, (_, i) => { const isLandscape = i % 2 === 0; diff --git a/registry/default/example/blur-fade-text-demo.tsx b/registry/example/blur-fade-text-demo.tsx similarity index 88% rename from registry/default/example/blur-fade-text-demo.tsx rename to registry/example/blur-fade-text-demo.tsx index fa5a76940..999ff601b 100644 --- a/registry/default/example/blur-fade-text-demo.tsx +++ b/registry/example/blur-fade-text-demo.tsx @@ -1,4 +1,4 @@ -import { BlurFade } from "@/registry/default/magicui/blur-fade"; +import { BlurFade } from "@/registry/magicui/blur-fade"; export default function BlurFadeTextDemo() { return ( diff --git a/registry/default/example/border-beam-demo-2.tsx b/registry/example/border-beam-demo-2.tsx similarity index 50% rename from registry/default/example/border-beam-demo-2.tsx rename to registry/example/border-beam-demo-2.tsx index 815f8a9bf..e158b30e1 100644 --- a/registry/default/example/border-beam-demo-2.tsx +++ b/registry/example/border-beam-demo-2.tsx @@ -1,4 +1,4 @@ -import { BorderBeam } from "@/registry/default/magicui/border-beam"; +import { BorderBeam } from "@/registry/magicui/border-beam"; export default function BorderBeamDemo() { return ( @@ -6,12 +6,12 @@ export default function BorderBeamDemo() { Hero Image Hero Image diff --git a/registry/default/example/border-beam-demo.tsx b/registry/example/border-beam-demo.tsx similarity index 88% rename from registry/default/example/border-beam-demo.tsx rename to registry/example/border-beam-demo.tsx index afd186018..6d1d514a7 100644 --- a/registry/default/example/border-beam-demo.tsx +++ b/registry/example/border-beam-demo.tsx @@ -1,4 +1,4 @@ -import { BorderBeam } from "@/registry/default/magicui/border-beam"; +import { BorderBeam } from "@/registry/magicui/border-beam"; export default function BorderBeamDemo() { return ( diff --git a/registry/default/example/box-reveal-demo.tsx b/registry/example/box-reveal-demo.tsx similarity index 95% rename from registry/default/example/box-reveal-demo.tsx rename to registry/example/box-reveal-demo.tsx index 4cd71947d..56392f41c 100644 --- a/registry/default/example/box-reveal-demo.tsx +++ b/registry/example/box-reveal-demo.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { BoxReveal } from "@/registry/default/magicui/box-reveal"; +import { BoxReveal } from "@/registry/magicui/box-reveal"; export default function BoxRevealDemo() { return ( diff --git a/registry/default/example/code-comparison-demo.tsx b/registry/example/code-comparison-demo.tsx similarity index 95% rename from registry/default/example/code-comparison-demo.tsx rename to registry/example/code-comparison-demo.tsx index fa39600a0..5555b575a 100644 --- a/registry/default/example/code-comparison-demo.tsx +++ b/registry/example/code-comparison-demo.tsx @@ -1,4 +1,4 @@ -import CodeComparison from "@/registry/default/magicui/code-comparison"; +import CodeComparison from "@/registry/magicui/code-comparison"; const beforeCode = `import { NextRequest } from 'next/server'; diff --git a/registry/default/example/confetti-basic-cannon.tsx b/registry/example/confetti-basic-cannon.tsx similarity index 69% rename from registry/default/example/confetti-basic-cannon.tsx rename to registry/example/confetti-basic-cannon.tsx index e0e04d198..724939c43 100644 --- a/registry/default/example/confetti-basic-cannon.tsx +++ b/registry/example/confetti-basic-cannon.tsx @@ -1,4 +1,4 @@ -import { ConfettiButton } from "@/registry/default/magicui/confetti"; +import { ConfettiButton } from "@/registry/magicui/confetti"; export default function ConfettiButtonDemo() { return ( diff --git a/registry/default/example/confetti-custom-shapes.tsx b/registry/example/confetti-custom-shapes.tsx similarity index 100% rename from registry/default/example/confetti-custom-shapes.tsx rename to registry/example/confetti-custom-shapes.tsx diff --git a/registry/default/example/confetti-demo.tsx b/registry/example/confetti-demo.tsx similarity index 89% rename from registry/default/example/confetti-demo.tsx rename to registry/example/confetti-demo.tsx index 478019bf0..87056eca6 100644 --- a/registry/default/example/confetti-demo.tsx +++ b/registry/example/confetti-demo.tsx @@ -2,10 +2,7 @@ import { useRef } from "react"; -import { - Confetti, - type ConfettiRef, -} from "@/registry/default/magicui/confetti"; +import { Confetti, type ConfettiRef } from "@/registry/magicui/confetti"; export default function ConfettiDemo() { const confettiRef = useRef(null); diff --git a/registry/default/example/confetti-emoji.tsx b/registry/example/confetti-emoji.tsx similarity index 100% rename from registry/default/example/confetti-emoji.tsx rename to registry/example/confetti-emoji.tsx diff --git a/registry/default/example/confetti-fireworks.tsx b/registry/example/confetti-fireworks.tsx similarity index 100% rename from registry/default/example/confetti-fireworks.tsx rename to registry/example/confetti-fireworks.tsx diff --git a/registry/default/example/confetti-random-direction.tsx b/registry/example/confetti-random-direction.tsx similarity index 80% rename from registry/default/example/confetti-random-direction.tsx rename to registry/example/confetti-random-direction.tsx index 129714593..1c50489ec 100644 --- a/registry/default/example/confetti-random-direction.tsx +++ b/registry/example/confetti-random-direction.tsx @@ -1,4 +1,4 @@ -import { ConfettiButton } from "@/registry/default/magicui/confetti"; +import { ConfettiButton } from "@/registry/magicui/confetti"; export default function ConfettiButtonDemo() { return ( diff --git a/registry/default/example/confetti-side-cannons.tsx b/registry/example/confetti-side-cannons.tsx similarity index 100% rename from registry/default/example/confetti-side-cannons.tsx rename to registry/example/confetti-side-cannons.tsx diff --git a/registry/default/example/confetti-stars.tsx b/registry/example/confetti-stars.tsx similarity index 100% rename from registry/default/example/confetti-stars.tsx rename to registry/example/confetti-stars.tsx diff --git a/registry/default/example/cool-mode-custom.tsx b/registry/example/cool-mode-custom.tsx similarity index 85% rename from registry/default/example/cool-mode-custom.tsx rename to registry/example/cool-mode-custom.tsx index d8ac77a4f..0c3f24663 100644 --- a/registry/default/example/cool-mode-custom.tsx +++ b/registry/example/cool-mode-custom.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { CoolMode } from "@/registry/default/magicui/cool-mode"; +import { CoolMode } from "@/registry/magicui/cool-mode"; export default function CoolModeCustom() { return ( diff --git a/registry/default/example/cool-mode-demo.tsx b/registry/example/cool-mode-demo.tsx similarity index 78% rename from registry/default/example/cool-mode-demo.tsx rename to registry/example/cool-mode-demo.tsx index 87f0d575c..7c704dc4f 100644 --- a/registry/default/example/cool-mode-demo.tsx +++ b/registry/example/cool-mode-demo.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { CoolMode } from "@/registry/default/magicui/cool-mode"; +import { CoolMode } from "@/registry/magicui/cool-mode"; export default function CoolModeDemo() { return ( diff --git a/registry/default/example/dock-demo-2.tsx b/registry/example/dock-demo-2.tsx similarity index 99% rename from registry/default/example/dock-demo-2.tsx rename to registry/example/dock-demo-2.tsx index fbb3a5c80..951a9739a 100644 --- a/registry/default/example/dock-demo-2.tsx +++ b/registry/example/dock-demo-2.tsx @@ -2,7 +2,7 @@ import React from "react"; -import { Dock, DockIcon } from "@/registry/default/magicui/dock"; +import { Dock, DockIcon } from "@/registry/magicui/dock"; export type IconProps = React.HTMLAttributes; diff --git a/registry/default/example/dock-demo-3.tsx b/registry/example/dock-demo-3.tsx similarity index 99% rename from registry/default/example/dock-demo-3.tsx rename to registry/example/dock-demo-3.tsx index 70fc7ca08..890998715 100644 --- a/registry/default/example/dock-demo-3.tsx +++ b/registry/example/dock-demo-3.tsx @@ -2,7 +2,7 @@ import React from "react"; -import { Dock, DockIcon } from "@/registry/default/magicui/dock"; +import { Dock, DockIcon } from "@/registry/magicui/dock"; export type IconProps = React.HTMLAttributes; diff --git a/registry/default/example/dock-demo.tsx b/registry/example/dock-demo.tsx similarity index 99% rename from registry/default/example/dock-demo.tsx rename to registry/example/dock-demo.tsx index 609cedd7f..b39c86d1d 100644 --- a/registry/default/example/dock-demo.tsx +++ b/registry/example/dock-demo.tsx @@ -14,7 +14,7 @@ import { TooltipTrigger, } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; -import { Dock, DockIcon } from "@/registry/default/magicui/dock"; +import { Dock, DockIcon } from "@/registry/magicui/dock"; export type IconProps = React.HTMLAttributes; diff --git a/registry/default/example/dot-pattern-demo.tsx b/registry/example/dot-pattern-demo.tsx similarity index 89% rename from registry/default/example/dot-pattern-demo.tsx rename to registry/example/dot-pattern-demo.tsx index 1fafc9d12..345966985 100644 --- a/registry/default/example/dot-pattern-demo.tsx +++ b/registry/example/dot-pattern-demo.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { DotPattern } from "@/registry/default/magicui/dot-pattern"; +import { DotPattern } from "@/registry/magicui/dot-pattern"; export default function DotPatternDemo() { return ( diff --git a/registry/default/example/dot-pattern-linear-gradient.tsx b/registry/example/dot-pattern-linear-gradient.tsx similarity index 90% rename from registry/default/example/dot-pattern-linear-gradient.tsx rename to registry/example/dot-pattern-linear-gradient.tsx index 8759baaff..c0a12cbd9 100644 --- a/registry/default/example/dot-pattern-linear-gradient.tsx +++ b/registry/example/dot-pattern-linear-gradient.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { DotPattern } from "@/registry/default/magicui/dot-pattern"; +import { DotPattern } from "@/registry/magicui/dot-pattern"; export default function DotPatternLinearGradient() { return ( diff --git a/registry/default/example/file-tree-demo.tsx b/registry/example/file-tree-demo.tsx similarity index 96% rename from registry/default/example/file-tree-demo.tsx rename to registry/example/file-tree-demo.tsx index fbfeb38d8..09521f9d7 100644 --- a/registry/default/example/file-tree-demo.tsx +++ b/registry/example/file-tree-demo.tsx @@ -1,4 +1,4 @@ -import { File, Folder, Tree } from "@/registry/default/magicui/file-tree"; +import { File, Folder, Tree } from "@/registry/magicui/file-tree"; export default function FileTreeDemo() { return ( diff --git a/registry/default/example/flickering-grid-demo.tsx b/registry/example/flickering-grid-demo.tsx similarity index 84% rename from registry/default/example/flickering-grid-demo.tsx rename to registry/example/flickering-grid-demo.tsx index c617caa41..08a4241a8 100644 --- a/registry/default/example/flickering-grid-demo.tsx +++ b/registry/example/flickering-grid-demo.tsx @@ -1,4 +1,4 @@ -import { FlickeringGrid } from "@/registry/default/magicui/flickering-grid"; +import { FlickeringGrid } from "@/registry/magicui/flickering-grid"; export default function FlickeringGridDemo() { return ( diff --git a/registry/default/example/flickering-grid-rounded-demo.tsx b/registry/example/flickering-grid-rounded-demo.tsx similarity index 86% rename from registry/default/example/flickering-grid-rounded-demo.tsx rename to registry/example/flickering-grid-rounded-demo.tsx index 2b96f2477..1e68c5969 100644 --- a/registry/default/example/flickering-grid-rounded-demo.tsx +++ b/registry/example/flickering-grid-rounded-demo.tsx @@ -1,4 +1,4 @@ -import { FlickeringGrid } from "@/registry/default/magicui/flickering-grid"; +import { FlickeringGrid } from "@/registry/magicui/flickering-grid"; export default function FlickeringGridRoundedDemo() { return ( diff --git a/registry/default/example/flip-text-demo.tsx b/registry/example/flip-text-demo.tsx similarity index 76% rename from registry/default/example/flip-text-demo.tsx rename to registry/example/flip-text-demo.tsx index 33f2132e5..b2cf1763a 100644 --- a/registry/default/example/flip-text-demo.tsx +++ b/registry/example/flip-text-demo.tsx @@ -1,4 +1,4 @@ -import { FlipText } from "@/registry/default/magicui/flip-text"; +import { FlipText } from "@/registry/magicui/flip-text"; export default function FlipTextDemo() { return ( diff --git a/registry/default/example/globe-demo.tsx b/registry/example/globe-demo.tsx similarity index 92% rename from registry/default/example/globe-demo.tsx rename to registry/example/globe-demo.tsx index b5f29c74e..6aa33c4a6 100644 --- a/registry/default/example/globe-demo.tsx +++ b/registry/example/globe-demo.tsx @@ -1,4 +1,4 @@ -import { Globe } from "@/registry/default/magicui/globe"; +import { Globe } from "@/registry/magicui/globe"; export default function GlobeDemo() { return ( diff --git a/registry/default/example/grid-pattern-dashed.tsx b/registry/example/grid-pattern-dashed.tsx similarity index 90% rename from registry/default/example/grid-pattern-dashed.tsx rename to registry/example/grid-pattern-dashed.tsx index a56fa23eb..5dbc84966 100644 --- a/registry/default/example/grid-pattern-dashed.tsx +++ b/registry/example/grid-pattern-dashed.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { GridPattern } from "@/registry/default/magicui/grid-pattern"; +import { GridPattern } from "@/registry/magicui/grid-pattern"; export default function GridPatternDashed() { return ( diff --git a/registry/default/example/grid-pattern-demo.tsx b/registry/example/grid-pattern-demo.tsx similarity index 92% rename from registry/default/example/grid-pattern-demo.tsx rename to registry/example/grid-pattern-demo.tsx index d67d33427..07b4386b7 100644 --- a/registry/default/example/grid-pattern-demo.tsx +++ b/registry/example/grid-pattern-demo.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { GridPattern } from "@/registry/default/magicui/grid-pattern"; +import { GridPattern } from "@/registry/magicui/grid-pattern"; export default function GridPatternDemo() { return ( diff --git a/registry/default/example/grid-pattern-linear-gradient.tsx b/registry/example/grid-pattern-linear-gradient.tsx similarity index 90% rename from registry/default/example/grid-pattern-linear-gradient.tsx rename to registry/example/grid-pattern-linear-gradient.tsx index fd5d7f5cd..7263c9265 100644 --- a/registry/default/example/grid-pattern-linear-gradient.tsx +++ b/registry/example/grid-pattern-linear-gradient.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { GridPattern } from "@/registry/default/magicui/grid-pattern"; +import { GridPattern } from "@/registry/magicui/grid-pattern"; export default function GridPatternLinearGradient() { return ( diff --git a/registry/default/example/hero-video-dialog-demo-top-in-bottom-out.tsx b/registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx similarity index 85% rename from registry/default/example/hero-video-dialog-demo-top-in-bottom-out.tsx rename to registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx index df0e9a706..f02c1594c 100644 --- a/registry/default/example/hero-video-dialog-demo-top-in-bottom-out.tsx +++ b/registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx @@ -1,10 +1,10 @@ -import HeroVideoDialog from "@/registry/default/magicui/hero-video-dialog"; +import HeroVideoDialog from "@/registry/magicui/hero-video-dialog"; export default function HeroVideoDialogDemoTopInBottomOut() { return (
Hover Me!; diff --git a/registry/default/example/icon-cloud-demo-2.tsx b/registry/example/icon-cloud-demo-2.tsx similarity index 97% rename from registry/default/example/icon-cloud-demo-2.tsx rename to registry/example/icon-cloud-demo-2.tsx index a2cd8dbe9..be9385e7a 100644 --- a/registry/default/example/icon-cloud-demo-2.tsx +++ b/registry/example/icon-cloud-demo-2.tsx @@ -1,4 +1,4 @@ -import { IconCloud } from "@/registry/default/magicui/icon-cloud"; +import { IconCloud } from "@/registry/magicui/icon-cloud"; const images = [ "https://images.unsplash.com/photo-1720048171230-c60d162f93a0?q=80&w=1974&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", diff --git a/registry/default/example/icon-cloud-demo-3.tsx b/registry/example/icon-cloud-demo-3.tsx similarity index 99% rename from registry/default/example/icon-cloud-demo-3.tsx rename to registry/example/icon-cloud-demo-3.tsx index ff6ef149b..b8519cdd0 100644 --- a/registry/default/example/icon-cloud-demo-3.tsx +++ b/registry/example/icon-cloud-demo-3.tsx @@ -1,4 +1,4 @@ -import { IconCloud } from "@/registry/default/magicui/icon-cloud"; +import { IconCloud } from "@/registry/magicui/icon-cloud"; const Icons = { gitHub: () => ( diff --git a/registry/default/example/icon-cloud-demo.tsx b/registry/example/icon-cloud-demo.tsx similarity index 91% rename from registry/default/example/icon-cloud-demo.tsx rename to registry/example/icon-cloud-demo.tsx index 85f92b4d0..d62ceb228 100644 --- a/registry/default/example/icon-cloud-demo.tsx +++ b/registry/example/icon-cloud-demo.tsx @@ -1,4 +1,4 @@ -import { IconCloud } from "@/registry/default/magicui/icon-cloud"; +import { IconCloud } from "@/registry/magicui/icon-cloud"; const slugs = [ "typescript", diff --git a/registry/default/example/interactive-grid-pattern-demo-2.tsx b/registry/example/interactive-grid-pattern-demo-2.tsx similarity index 88% rename from registry/default/example/interactive-grid-pattern-demo-2.tsx rename to registry/example/interactive-grid-pattern-demo-2.tsx index a72aafa5f..34da9a60a 100644 --- a/registry/default/example/interactive-grid-pattern-demo-2.tsx +++ b/registry/example/interactive-grid-pattern-demo-2.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { InteractiveGridPattern } from "@/registry/default/magicui/interactive-grid-pattern"; +import { InteractiveGridPattern } from "@/registry/magicui/interactive-grid-pattern"; export default function InteractiveGridPatternDemo() { return ( diff --git a/registry/default/example/interactive-grid-pattern-demo.tsx b/registry/example/interactive-grid-pattern-demo.tsx similarity index 87% rename from registry/default/example/interactive-grid-pattern-demo.tsx rename to registry/example/interactive-grid-pattern-demo.tsx index 7f98b84c2..f8daa544d 100644 --- a/registry/default/example/interactive-grid-pattern-demo.tsx +++ b/registry/example/interactive-grid-pattern-demo.tsx @@ -1,7 +1,7 @@ "use client"; import { cn } from "@/lib/utils"; -import { InteractiveGridPattern } from "@/registry/default/magicui/interactive-grid-pattern"; +import { InteractiveGridPattern } from "@/registry/magicui/interactive-grid-pattern"; export default function InteractiveGridPatternDemo() { return ( diff --git a/registry/default/example/interactive-hover-button-demo.tsx b/registry/example/interactive-hover-button-demo.tsx similarity index 57% rename from registry/default/example/interactive-hover-button-demo.tsx rename to registry/example/interactive-hover-button-demo.tsx index ba214d8f6..5aa51a7bc 100644 --- a/registry/default/example/interactive-hover-button-demo.tsx +++ b/registry/example/interactive-hover-button-demo.tsx @@ -1,4 +1,4 @@ -import { InteractiveHoverButton } from "@/registry/default/magicui/interactive-hover-button"; +import { InteractiveHoverButton } from "@/registry/magicui/interactive-hover-button"; export default function InteractiveHoverButtonDemo() { return Hover Me; diff --git a/registry/default/example/iphone-15-pro-demo-2.tsx b/registry/example/iphone-15-pro-demo-2.tsx similarity index 75% rename from registry/default/example/iphone-15-pro-demo-2.tsx rename to registry/example/iphone-15-pro-demo-2.tsx index b8cdd408c..b2e05672c 100644 --- a/registry/default/example/iphone-15-pro-demo-2.tsx +++ b/registry/example/iphone-15-pro-demo-2.tsx @@ -1,4 +1,4 @@ -import Iphone15Pro from "@/registry/default/magicui/iphone-15-pro"; +import Iphone15Pro from "@/registry/magicui/iphone-15-pro"; export default function Iphone15ProDemo() { return ( diff --git a/registry/default/example/iphone-15-pro-demo-3.tsx b/registry/example/iphone-15-pro-demo-3.tsx similarity index 79% rename from registry/default/example/iphone-15-pro-demo-3.tsx rename to registry/example/iphone-15-pro-demo-3.tsx index e706fe7ea..c72b94cc6 100644 --- a/registry/default/example/iphone-15-pro-demo-3.tsx +++ b/registry/example/iphone-15-pro-demo-3.tsx @@ -1,4 +1,4 @@ -import Iphone15Pro from "@/registry/default/magicui/iphone-15-pro"; +import Iphone15Pro from "@/registry/magicui/iphone-15-pro"; export default function Iphone15ProDemo() { return ( diff --git a/registry/default/example/iphone-15-pro-demo.tsx b/registry/example/iphone-15-pro-demo.tsx similarity index 68% rename from registry/default/example/iphone-15-pro-demo.tsx rename to registry/example/iphone-15-pro-demo.tsx index fee4a9e08..d73c6efb2 100644 --- a/registry/default/example/iphone-15-pro-demo.tsx +++ b/registry/example/iphone-15-pro-demo.tsx @@ -1,4 +1,4 @@ -import Iphone15Pro from "@/registry/default/magicui/iphone-15-pro"; +import Iphone15Pro from "@/registry/magicui/iphone-15-pro"; export default function Iphone15ProDemo() { return ( diff --git a/registry/default/example/line-shadow-text-demo.tsx b/registry/example/line-shadow-text-demo.tsx similarity index 85% rename from registry/default/example/line-shadow-text-demo.tsx rename to registry/example/line-shadow-text-demo.tsx index f9b15e724..5fc4aea69 100644 --- a/registry/default/example/line-shadow-text-demo.tsx +++ b/registry/example/line-shadow-text-demo.tsx @@ -1,4 +1,4 @@ -import { LineShadowText } from "@/registry/default/magicui/line-shadow-text"; +import { LineShadowText } from "@/registry/magicui/line-shadow-text"; import { useTheme } from "next-themes"; export default function LineShadowTextDemo() { diff --git a/registry/default/example/magic-card-demo.tsx b/registry/example/magic-card-demo.tsx similarity index 91% rename from registry/default/example/magic-card-demo.tsx rename to registry/example/magic-card-demo.tsx index 5c3c77e15..b5c9ae99c 100644 --- a/registry/default/example/magic-card-demo.tsx +++ b/registry/example/magic-card-demo.tsx @@ -1,6 +1,6 @@ import { useTheme } from "next-themes"; -import { MagicCard } from "@/registry/default/magicui/magic-card"; +import { MagicCard } from "@/registry/magicui/magic-card"; export default function MagicCardDemo() { const { theme } = useTheme(); diff --git a/registry/default/example/marquee-3d.tsx b/registry/example/marquee-3d.tsx similarity index 96% rename from registry/default/example/marquee-3d.tsx rename to registry/example/marquee-3d.tsx index a6a5a81fb..22bedb406 100644 --- a/registry/default/example/marquee-3d.tsx +++ b/registry/example/marquee-3d.tsx @@ -1,4 +1,4 @@ -import { Marquee } from "@/registry/default/magicui/marquee"; +import { Marquee } from "@/registry/magicui/marquee"; const logos = [ { diff --git a/registry/default/example/marquee-demo-vertical.tsx b/registry/example/marquee-demo-vertical.tsx similarity index 97% rename from registry/default/example/marquee-demo-vertical.tsx rename to registry/example/marquee-demo-vertical.tsx index 498e914b8..61e1458d0 100644 --- a/registry/default/example/marquee-demo-vertical.tsx +++ b/registry/example/marquee-demo-vertical.tsx @@ -1,5 +1,5 @@ import { cn } from "@/lib/utils"; -import { Marquee } from "@/registry/default/magicui/marquee"; +import { Marquee } from "@/registry/magicui/marquee"; const reviews = [ { diff --git a/registry/default/example/marquee-demo.tsx b/registry/example/marquee-demo.tsx similarity index 97% rename from registry/default/example/marquee-demo.tsx rename to registry/example/marquee-demo.tsx index de2bdbc4b..82b009c84 100644 --- a/registry/default/example/marquee-demo.tsx +++ b/registry/example/marquee-demo.tsx @@ -1,5 +1,5 @@ import { cn } from "@/lib/utils"; -import { Marquee } from "@/registry/default/magicui/marquee"; +import { Marquee } from "@/registry/magicui/marquee"; const reviews = [ { diff --git a/registry/default/example/marquee-logos.tsx b/registry/example/marquee-logos.tsx similarity index 95% rename from registry/default/example/marquee-logos.tsx rename to registry/example/marquee-logos.tsx index 837189aa5..87c7bcedb 100644 --- a/registry/default/example/marquee-logos.tsx +++ b/registry/example/marquee-logos.tsx @@ -1,5 +1,5 @@ import { cn } from "@/lib/utils"; -import { Marquee } from "@/registry/default/magicui/marquee"; +import { Marquee } from "@/registry/magicui/marquee"; const logos = [ { diff --git a/registry/default/example/meteors-demo.tsx b/registry/example/meteors-demo.tsx similarity index 89% rename from registry/default/example/meteors-demo.tsx rename to registry/example/meteors-demo.tsx index 787fa2259..4d2beaad4 100644 --- a/registry/default/example/meteors-demo.tsx +++ b/registry/example/meteors-demo.tsx @@ -1,4 +1,4 @@ -import { Meteors } from "@/registry/default/magicui/meteors"; +import { Meteors } from "@/registry/magicui/meteors"; export default function MeteorDemo() { return ( diff --git a/registry/default/example/morphing-text-demo.tsx b/registry/example/morphing-text-demo.tsx similarity index 75% rename from registry/default/example/morphing-text-demo.tsx rename to registry/example/morphing-text-demo.tsx index 703d5237a..0a74245ee 100644 --- a/registry/default/example/morphing-text-demo.tsx +++ b/registry/example/morphing-text-demo.tsx @@ -1,4 +1,4 @@ -import { MorphingText } from "@/registry/default/magicui/morphing-text"; +import { MorphingText } from "@/registry/magicui/morphing-text"; const texts = [ "Hello", diff --git a/registry/default/example/neon-gradient-card-demo.tsx b/registry/example/neon-gradient-card-demo.tsx similarity index 85% rename from registry/default/example/neon-gradient-card-demo.tsx rename to registry/example/neon-gradient-card-demo.tsx index 691bf3b54..c503e46cd 100644 --- a/registry/default/example/neon-gradient-card-demo.tsx +++ b/registry/example/neon-gradient-card-demo.tsx @@ -1,4 +1,4 @@ -import { NeonGradientCard } from "@/registry/default/magicui/neon-gradient-card"; +import { NeonGradientCard } from "@/registry/magicui/neon-gradient-card"; export default function NeonGradientCardDemo() { return ( diff --git a/registry/default/example/number-ticker-decimal-demo.tsx b/registry/example/number-ticker-decimal-demo.tsx similarity index 76% rename from registry/default/example/number-ticker-decimal-demo.tsx rename to registry/example/number-ticker-decimal-demo.tsx index af982c842..dfef2f069 100644 --- a/registry/default/example/number-ticker-decimal-demo.tsx +++ b/registry/example/number-ticker-decimal-demo.tsx @@ -1,4 +1,4 @@ -import { NumberTicker } from "@/registry/default/magicui/number-ticker"; +import { NumberTicker } from "@/registry/magicui/number-ticker"; export default function NumberTickerDemo() { return ( diff --git a/registry/default/example/number-ticker-demo.tsx b/registry/example/number-ticker-demo.tsx similarity index 74% rename from registry/default/example/number-ticker-demo.tsx rename to registry/example/number-ticker-demo.tsx index 91ba3e4f7..983095c6c 100644 --- a/registry/default/example/number-ticker-demo.tsx +++ b/registry/example/number-ticker-demo.tsx @@ -1,4 +1,4 @@ -import { NumberTicker } from "@/registry/default/magicui/number-ticker"; +import { NumberTicker } from "@/registry/magicui/number-ticker"; export default function NumberTickerDemo() { return ( diff --git a/registry/default/example/orbiting-circles-demo.tsx b/registry/example/orbiting-circles-demo.tsx similarity index 99% rename from registry/default/example/orbiting-circles-demo.tsx rename to registry/example/orbiting-circles-demo.tsx index c8ef44ef5..8c93a3945 100644 --- a/registry/default/example/orbiting-circles-demo.tsx +++ b/registry/example/orbiting-circles-demo.tsx @@ -1,4 +1,4 @@ -import { OrbitingCircles } from "@/registry/default/magicui/orbiting-circles"; +import { OrbitingCircles } from "@/registry/magicui/orbiting-circles"; export default function OrbitingCirclesDemo() { return ( diff --git a/registry/default/example/particles-demo.tsx b/registry/example/particles-demo.tsx similarity index 92% rename from registry/default/example/particles-demo.tsx rename to registry/example/particles-demo.tsx index 2e7f38170..9d11ae8c9 100644 --- a/registry/default/example/particles-demo.tsx +++ b/registry/example/particles-demo.tsx @@ -3,7 +3,7 @@ import { useTheme } from "next-themes"; import { useEffect, useState } from "react"; -import { Particles } from "@/registry/default/magicui/particles"; +import { Particles } from "@/registry/magicui/particles"; export default function ParticlesDemo() { const { resolvedTheme } = useTheme(); diff --git a/registry/default/example/pulsating-button-demo.tsx b/registry/example/pulsating-button-demo.tsx similarity index 60% rename from registry/default/example/pulsating-button-demo.tsx rename to registry/example/pulsating-button-demo.tsx index 8163d0e3b..d5cf3b2b6 100644 --- a/registry/default/example/pulsating-button-demo.tsx +++ b/registry/example/pulsating-button-demo.tsx @@ -1,4 +1,4 @@ -import { PulsatingButton } from "@/registry/default/magicui/pulsating-button"; +import { PulsatingButton } from "@/registry/magicui/pulsating-button"; export default function PulsatingButtonDemo() { return Join Affiliate Program; diff --git a/registry/default/example/rainbow-button-demo.tsx b/registry/example/rainbow-button-demo.tsx similarity index 59% rename from registry/default/example/rainbow-button-demo.tsx rename to registry/example/rainbow-button-demo.tsx index 18441790d..5ed2f022b 100644 --- a/registry/default/example/rainbow-button-demo.tsx +++ b/registry/example/rainbow-button-demo.tsx @@ -1,4 +1,4 @@ -import { RainbowButton } from "@/registry/default/magicui/rainbow-button"; +import { RainbowButton } from "@/registry/magicui/rainbow-button"; export default function RainbowButtonDemo() { return Get Unlimited Access; diff --git a/registry/default/example/retro-grid-demo.tsx b/registry/example/retro-grid-demo.tsx similarity index 88% rename from registry/default/example/retro-grid-demo.tsx rename to registry/example/retro-grid-demo.tsx index 618cec35c..5f0a1007d 100644 --- a/registry/default/example/retro-grid-demo.tsx +++ b/registry/example/retro-grid-demo.tsx @@ -1,6 +1,6 @@ "use client"; -import { RetroGrid } from "@/registry/default/magicui/retro-grid"; +import { RetroGrid } from "@/registry/magicui/retro-grid"; export default function RetroGridDemo() { return ( diff --git a/registry/default/example/ripple-button-demo.tsx b/registry/example/ripple-button-demo.tsx similarity index 61% rename from registry/default/example/ripple-button-demo.tsx rename to registry/example/ripple-button-demo.tsx index a575c4390..6b1a84430 100644 --- a/registry/default/example/ripple-button-demo.tsx +++ b/registry/example/ripple-button-demo.tsx @@ -1,4 +1,4 @@ -import { RippleButton } from "@/registry/default/magicui/ripple-button"; +import { RippleButton } from "@/registry/magicui/ripple-button"; export default function RippleButtonDemo() { return Click me; diff --git a/registry/default/example/ripple-demo.tsx b/registry/example/ripple-demo.tsx similarity index 86% rename from registry/default/example/ripple-demo.tsx rename to registry/example/ripple-demo.tsx index 682f15100..048a0034d 100644 --- a/registry/default/example/ripple-demo.tsx +++ b/registry/example/ripple-demo.tsx @@ -1,4 +1,4 @@ -import { Ripple } from "@/registry/default/magicui/ripple"; +import { Ripple } from "@/registry/magicui/ripple"; export default function RippleDemo() { return ( diff --git a/registry/default/example/safari-demo-2.tsx b/registry/example/safari-demo-2.tsx similarity index 80% rename from registry/default/example/safari-demo-2.tsx rename to registry/example/safari-demo-2.tsx index d024c32d7..35af08898 100644 --- a/registry/default/example/safari-demo-2.tsx +++ b/registry/example/safari-demo-2.tsx @@ -1,4 +1,4 @@ -import Safari from "@/registry/default/magicui/safari"; +import { Safari } from "@/registry/magicui/safari"; export default function SafariDemo() { return ( diff --git a/registry/default/example/safari-demo-3.tsx b/registry/example/safari-demo-3.tsx similarity index 83% rename from registry/default/example/safari-demo-3.tsx rename to registry/example/safari-demo-3.tsx index 297d8be97..17be67dde 100644 --- a/registry/default/example/safari-demo-3.tsx +++ b/registry/example/safari-demo-3.tsx @@ -1,4 +1,4 @@ -import Safari from "@/registry/default/magicui/safari"; +import { Safari } from "@/registry/magicui/safari"; export default function SafariDemo() { return ( diff --git a/registry/default/example/safari-demo-4.tsx b/registry/example/safari-demo-4.tsx similarity index 75% rename from registry/default/example/safari-demo-4.tsx rename to registry/example/safari-demo-4.tsx index f81d9b7a7..55661d5da 100644 --- a/registry/default/example/safari-demo-4.tsx +++ b/registry/example/safari-demo-4.tsx @@ -1,4 +1,4 @@ -import Safari from "@/registry/default/magicui/safari"; +import { Safari } from "@/registry/magicui/safari"; export default function SafariDemo() { return ( diff --git a/registry/default/example/safari-demo.tsx b/registry/example/safari-demo.tsx similarity index 74% rename from registry/default/example/safari-demo.tsx rename to registry/example/safari-demo.tsx index d0ed945dc..d116518ec 100644 --- a/registry/default/example/safari-demo.tsx +++ b/registry/example/safari-demo.tsx @@ -1,4 +1,4 @@ -import Safari from "@/registry/default/magicui/safari"; +import { Safari } from "@/registry/magicui/safari"; export default function SafariDemo() { return ( diff --git a/registry/default/example/scratch-to-reveal-demo.tsx b/registry/example/scratch-to-reveal-demo.tsx similarity index 86% rename from registry/default/example/scratch-to-reveal-demo.tsx rename to registry/example/scratch-to-reveal-demo.tsx index e7c067d02..91ab86419 100644 --- a/registry/default/example/scratch-to-reveal-demo.tsx +++ b/registry/example/scratch-to-reveal-demo.tsx @@ -1,4 +1,4 @@ -import { ScratchToReveal } from "@/registry/default/magicui/scratch-to-reveal"; +import { ScratchToReveal } from "@/registry/magicui/scratch-to-reveal"; const ScratchToRevealDemo = () => { const handleComplete = () => { diff --git a/registry/default/example/script-copy-btn-demo.tsx b/registry/example/script-copy-btn-demo.tsx similarity index 85% rename from registry/default/example/script-copy-btn-demo.tsx rename to registry/example/script-copy-btn-demo.tsx index acfd3e4e3..1d419dac5 100644 --- a/registry/default/example/script-copy-btn-demo.tsx +++ b/registry/example/script-copy-btn-demo.tsx @@ -1,4 +1,4 @@ -import { ScriptCopyBtn } from "@/registry/default/magicui/script-copy-btn"; +import { ScriptCopyBtn } from "@/registry/magicui/script-copy-btn"; export default function ScriptCopyBtnDemo() { const customCommandMap = { diff --git a/registry/default/example/scroll-based-velocity-demo.tsx b/registry/example/scroll-based-velocity-demo.tsx similarity index 57% rename from registry/default/example/scroll-based-velocity-demo.tsx rename to registry/example/scroll-based-velocity-demo.tsx index 0fdb45b60..06cacbb28 100644 --- a/registry/default/example/scroll-based-velocity-demo.tsx +++ b/registry/example/scroll-based-velocity-demo.tsx @@ -1,4 +1,4 @@ -import { VelocityScroll } from "@/registry/default/magicui/scroll-based-velocity"; +import { VelocityScroll } from "@/registry/magicui/scroll-based-velocity"; export default function ScrollBasedVelocityDemo() { return Velocity Scroll; diff --git a/registry/default/example/scroll-progress-demo.tsx b/registry/example/scroll-progress-demo.tsx similarity index 88% rename from registry/default/example/scroll-progress-demo.tsx rename to registry/example/scroll-progress-demo.tsx index 1f4dc76ab..80b39effe 100644 --- a/registry/default/example/scroll-progress-demo.tsx +++ b/registry/example/scroll-progress-demo.tsx @@ -1,4 +1,4 @@ -import { ScrollProgress } from "@/registry/default/magicui/scroll-progress"; +import { ScrollProgress } from "@/registry/magicui/scroll-progress"; export default function ScrollProgressDemo() { return ( diff --git a/registry/default/example/shimmer-button-demo.tsx b/registry/example/shimmer-button-demo.tsx similarity index 81% rename from registry/default/example/shimmer-button-demo.tsx rename to registry/example/shimmer-button-demo.tsx index 6f0a2045d..c44d42914 100644 --- a/registry/default/example/shimmer-button-demo.tsx +++ b/registry/example/shimmer-button-demo.tsx @@ -1,4 +1,4 @@ -import { ShimmerButton } from "@/registry/default/magicui/shimmer-button"; +import { ShimmerButton } from "@/registry/magicui/shimmer-button"; export default function ShimmerButtonDemo() { return ( diff --git a/registry/default/example/shine-border-demo-2.tsx b/registry/example/shine-border-demo-2.tsx similarity index 81% rename from registry/default/example/shine-border-demo-2.tsx rename to registry/example/shine-border-demo-2.tsx index 7e6437b70..efe1275b4 100644 --- a/registry/default/example/shine-border-demo-2.tsx +++ b/registry/example/shine-border-demo-2.tsx @@ -1,6 +1,6 @@ import { useTheme } from "next-themes"; -import { ShineBorder } from "@/registry/default/magicui/shine-border"; +import { ShineBorder } from "@/registry/magicui/shine-border"; export default function ShineBorderDemo() { const theme = useTheme(); diff --git a/registry/default/example/shine-border-demo.tsx b/registry/example/shine-border-demo.tsx similarity index 88% rename from registry/default/example/shine-border-demo.tsx rename to registry/example/shine-border-demo.tsx index 2c48e2d75..331a596a2 100644 --- a/registry/default/example/shine-border-demo.tsx +++ b/registry/example/shine-border-demo.tsx @@ -1,4 +1,4 @@ -import { ShineBorder } from "@/registry/default/magicui/shine-border"; +import { ShineBorder } from "@/registry/magicui/shine-border"; export default function ShineBorderDemo() { return ( diff --git a/registry/default/example/shiny-button-demo.tsx b/registry/example/shiny-button-demo.tsx similarity index 57% rename from registry/default/example/shiny-button-demo.tsx rename to registry/example/shiny-button-demo.tsx index 3ce1d8666..f234e4001 100644 --- a/registry/default/example/shiny-button-demo.tsx +++ b/registry/example/shiny-button-demo.tsx @@ -1,4 +1,4 @@ -import { ShinyButton } from "@/registry/default/magicui/shiny-button"; +import { ShinyButton } from "@/registry/magicui/shiny-button"; export default function ShinyButtonDemo() { return Shiny Button; diff --git a/registry/default/example/sparkles-text-demo.tsx b/registry/example/sparkles-text-demo.tsx similarity index 55% rename from registry/default/example/sparkles-text-demo.tsx rename to registry/example/sparkles-text-demo.tsx index 9db7c8b6e..51bb4f822 100644 --- a/registry/default/example/sparkles-text-demo.tsx +++ b/registry/example/sparkles-text-demo.tsx @@ -1,4 +1,4 @@ -import { SparklesText } from "@/registry/default/magicui/sparkles-text"; +import { SparklesText } from "@/registry/magicui/sparkles-text"; export default function SparklesTextDemo() { return ; diff --git a/registry/default/example/terminal-demo.tsx b/registry/example/terminal-demo.tsx similarity index 100% rename from registry/default/example/terminal-demo.tsx rename to registry/example/terminal-demo.tsx diff --git a/registry/default/example/text-animate-demo-2.tsx b/registry/example/text-animate-demo-2.tsx similarity index 67% rename from registry/default/example/text-animate-demo-2.tsx rename to registry/example/text-animate-demo-2.tsx index b014075bc..f8ecf9fd6 100644 --- a/registry/default/example/text-animate-demo-2.tsx +++ b/registry/example/text-animate-demo-2.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo2() { return ( diff --git a/registry/default/example/text-animate-demo-3.tsx b/registry/example/text-animate-demo-3.tsx similarity index 68% rename from registry/default/example/text-animate-demo-3.tsx rename to registry/example/text-animate-demo-3.tsx index 91e83384e..9dc23dc73 100644 --- a/registry/default/example/text-animate-demo-3.tsx +++ b/registry/example/text-animate-demo-3.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo3() { return ( diff --git a/registry/default/example/text-animate-demo-4.tsx b/registry/example/text-animate-demo-4.tsx similarity index 68% rename from registry/default/example/text-animate-demo-4.tsx rename to registry/example/text-animate-demo-4.tsx index fde4dc24c..8d330e151 100644 --- a/registry/default/example/text-animate-demo-4.tsx +++ b/registry/example/text-animate-demo-4.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo4() { return ( diff --git a/registry/default/example/text-animate-demo-5.tsx b/registry/example/text-animate-demo-5.tsx similarity index 77% rename from registry/default/example/text-animate-demo-5.tsx rename to registry/example/text-animate-demo-5.tsx index 62ab155a3..32676c49d 100644 --- a/registry/default/example/text-animate-demo-5.tsx +++ b/registry/example/text-animate-demo-5.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo5() { return ( diff --git a/registry/default/example/text-animate-demo-6.tsx b/registry/example/text-animate-demo-6.tsx similarity index 70% rename from registry/default/example/text-animate-demo-6.tsx rename to registry/example/text-animate-demo-6.tsx index 9bcdb5481..853829fdc 100644 --- a/registry/default/example/text-animate-demo-6.tsx +++ b/registry/example/text-animate-demo-6.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo6() { return ( diff --git a/registry/default/example/text-animate-demo.tsx b/registry/example/text-animate-demo.tsx similarity index 69% rename from registry/default/example/text-animate-demo.tsx rename to registry/example/text-animate-demo.tsx index 61feb6050..731d79664 100644 --- a/registry/default/example/text-animate-demo.tsx +++ b/registry/example/text-animate-demo.tsx @@ -1,4 +1,4 @@ -import { TextAnimate } from "@/registry/default/magicui/text-animate"; +import { TextAnimate } from "@/registry/magicui/text-animate"; export default function TextAnimateDemo() { return ( diff --git a/registry/default/example/text-reveal-demo.tsx b/registry/example/text-reveal-demo.tsx similarity index 78% rename from registry/default/example/text-reveal-demo.tsx rename to registry/example/text-reveal-demo.tsx index d47232e6f..9202f572c 100644 --- a/registry/default/example/text-reveal-demo.tsx +++ b/registry/example/text-reveal-demo.tsx @@ -1,4 +1,4 @@ -import { TextReveal } from "@/registry/default/magicui/text-reveal"; +import { TextReveal } from "@/registry/magicui/text-reveal"; export default function TextRevealDemo() { return ( diff --git a/registry/default/example/tweet-card-demo.tsx b/registry/example/tweet-card-demo.tsx similarity index 71% rename from registry/default/example/tweet-card-demo.tsx rename to registry/example/tweet-card-demo.tsx index 0b8a72705..e37faea65 100644 --- a/registry/default/example/tweet-card-demo.tsx +++ b/registry/example/tweet-card-demo.tsx @@ -1,4 +1,4 @@ -import { ClientTweetCard } from "@/registry/default/magicui/client-tweet-card"; +import { ClientTweetCard } from "@/registry/magicui/client-tweet-card"; /** * (Server Side Only) diff --git a/registry/default/example/tweet-card-images.tsx b/registry/example/tweet-card-images.tsx similarity index 60% rename from registry/default/example/tweet-card-images.tsx rename to registry/example/tweet-card-images.tsx index 2984539ac..fea10b15f 100644 --- a/registry/default/example/tweet-card-images.tsx +++ b/registry/example/tweet-card-images.tsx @@ -1,4 +1,4 @@ -import { ClientTweetCard } from "@/registry/default/magicui/client-tweet-card"; +import { ClientTweetCard } from "@/registry/magicui/client-tweet-card"; export default function TweetImages() { return ; diff --git a/registry/default/example/tweet-card-meta-preview.tsx b/registry/example/tweet-card-meta-preview.tsx similarity index 61% rename from registry/default/example/tweet-card-meta-preview.tsx rename to registry/example/tweet-card-meta-preview.tsx index 31a2f1ed1..cb74c3a4b 100644 --- a/registry/default/example/tweet-card-meta-preview.tsx +++ b/registry/example/tweet-card-meta-preview.tsx @@ -1,4 +1,4 @@ -import { ClientTweetCard } from "@/registry/default/magicui/client-tweet-card"; +import { ClientTweetCard } from "@/registry/magicui/client-tweet-card"; export default function TweetMetaPreview() { return ; diff --git a/registry/default/example/typing-animation-demo.tsx b/registry/example/typing-animation-demo.tsx similarity index 58% rename from registry/default/example/typing-animation-demo.tsx rename to registry/example/typing-animation-demo.tsx index 54fb584b1..807ee7688 100644 --- a/registry/default/example/typing-animation-demo.tsx +++ b/registry/example/typing-animation-demo.tsx @@ -1,4 +1,4 @@ -import { TypingAnimation } from "@/registry/default/magicui/typing-animation"; +import { TypingAnimation } from "@/registry/magicui/typing-animation"; export default function TypingAnimationDemo() { return Typing Animation; diff --git a/registry/default/example/warp-background-demo.tsx b/registry/example/warp-background-demo.tsx similarity index 89% rename from registry/default/example/warp-background-demo.tsx rename to registry/example/warp-background-demo.tsx index 46b708cd5..ee5632a5d 100644 --- a/registry/default/example/warp-background-demo.tsx +++ b/registry/example/warp-background-demo.tsx @@ -1,10 +1,10 @@ -import { WarpBackground } from "@/components/magicui/warp-background"; import { Card, CardContent, CardDescription, CardTitle, } from "@/components/ui/card"; +import { WarpBackground } from "@/registry/magicui/warp-background"; export default function ExampleComponentDemo() { return ( diff --git a/registry/default/example/word-rotate-demo.tsx b/registry/example/word-rotate-demo.tsx similarity index 72% rename from registry/default/example/word-rotate-demo.tsx rename to registry/example/word-rotate-demo.tsx index 446803ab2..a3afb8a5c 100644 --- a/registry/default/example/word-rotate-demo.tsx +++ b/registry/example/word-rotate-demo.tsx @@ -1,4 +1,4 @@ -import { WordRotate } from "@/registry/default/magicui/word-rotate"; +import { WordRotate } from "@/registry/magicui/word-rotate"; export default function WordRotateDemo() { return ( diff --git a/registry/index.tsx b/registry/index.tsx deleted file mode 100644 index 79c1667eb..000000000 --- a/registry/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { blocks } from "./registry-blocks"; -import { examples } from "./registry-examples"; -import { hooks } from "./registry-hooks"; -import { lib } from "./registry-lib"; -import { themes } from "./registry-themes"; -import { ui } from "./registry-ui"; -import { Registry } from "./schema"; - -export const registry: Registry = [ - ...ui, - ...examples, - ...blocks, - ...lib, - ...hooks, - ...themes, -]; diff --git a/registry/default/lib/utils.ts b/registry/lib/utils.ts similarity index 100% rename from registry/default/lib/utils.ts rename to registry/lib/utils.ts diff --git a/registry/default/magicui/android.tsx b/registry/magicui/android.tsx similarity index 100% rename from registry/default/magicui/android.tsx rename to registry/magicui/android.tsx diff --git a/registry/default/magicui/animated-beam.tsx b/registry/magicui/animated-beam.tsx similarity index 100% rename from registry/default/magicui/animated-beam.tsx rename to registry/magicui/animated-beam.tsx diff --git a/registry/default/magicui/animated-circular-progress-bar.tsx b/registry/magicui/animated-circular-progress-bar.tsx similarity index 100% rename from registry/default/magicui/animated-circular-progress-bar.tsx rename to registry/magicui/animated-circular-progress-bar.tsx diff --git a/registry/default/magicui/animated-gradient-text.tsx b/registry/magicui/animated-gradient-text.tsx similarity index 100% rename from registry/default/magicui/animated-gradient-text.tsx rename to registry/magicui/animated-gradient-text.tsx diff --git a/registry/default/magicui/animated-grid-pattern.tsx b/registry/magicui/animated-grid-pattern.tsx similarity index 100% rename from registry/default/magicui/animated-grid-pattern.tsx rename to registry/magicui/animated-grid-pattern.tsx diff --git a/registry/default/magicui/animated-list.tsx b/registry/magicui/animated-list.tsx similarity index 100% rename from registry/default/magicui/animated-list.tsx rename to registry/magicui/animated-list.tsx diff --git a/registry/default/magicui/animated-shiny-text.tsx b/registry/magicui/animated-shiny-text.tsx similarity index 100% rename from registry/default/magicui/animated-shiny-text.tsx rename to registry/magicui/animated-shiny-text.tsx diff --git a/registry/default/magicui/animated-subscribe-button.tsx b/registry/magicui/animated-subscribe-button.tsx similarity index 100% rename from registry/default/magicui/animated-subscribe-button.tsx rename to registry/magicui/animated-subscribe-button.tsx diff --git a/registry/default/magicui/aurora-text.tsx b/registry/magicui/aurora-text.tsx similarity index 100% rename from registry/default/magicui/aurora-text.tsx rename to registry/magicui/aurora-text.tsx diff --git a/registry/default/magicui/avatar-circles.tsx b/registry/magicui/avatar-circles.tsx similarity index 100% rename from registry/default/magicui/avatar-circles.tsx rename to registry/magicui/avatar-circles.tsx diff --git a/registry/default/magicui/bento-grid.tsx b/registry/magicui/bento-grid.tsx similarity index 100% rename from registry/default/magicui/bento-grid.tsx rename to registry/magicui/bento-grid.tsx diff --git a/registry/default/magicui/blur-fade.tsx b/registry/magicui/blur-fade.tsx similarity index 100% rename from registry/default/magicui/blur-fade.tsx rename to registry/magicui/blur-fade.tsx diff --git a/registry/default/magicui/border-beam.tsx b/registry/magicui/border-beam.tsx similarity index 100% rename from registry/default/magicui/border-beam.tsx rename to registry/magicui/border-beam.tsx diff --git a/registry/default/magicui/box-reveal.tsx b/registry/magicui/box-reveal.tsx similarity index 100% rename from registry/default/magicui/box-reveal.tsx rename to registry/magicui/box-reveal.tsx diff --git a/registry/default/magicui/client-tweet-card.tsx b/registry/magicui/client-tweet-card.tsx similarity index 93% rename from registry/default/magicui/client-tweet-card.tsx rename to registry/magicui/client-tweet-card.tsx index 214c888d4..68d218bf2 100644 --- a/registry/default/magicui/client-tweet-card.tsx +++ b/registry/magicui/client-tweet-card.tsx @@ -6,7 +6,7 @@ import { MagicTweet, TweetNotFound, TweetSkeleton, -} from "@/registry/default/magicui/tweet-card"; +} from "@/registry/magicui/tweet-card"; export const ClientTweetCard = ({ id, diff --git a/registry/default/magicui/code-comparison.tsx b/registry/magicui/code-comparison.tsx similarity index 100% rename from registry/default/magicui/code-comparison.tsx rename to registry/magicui/code-comparison.tsx diff --git a/registry/default/magicui/confetti-button.tsx b/registry/magicui/confetti-button.tsx similarity index 100% rename from registry/default/magicui/confetti-button.tsx rename to registry/magicui/confetti-button.tsx diff --git a/registry/default/magicui/confetti.tsx b/registry/magicui/confetti.tsx similarity index 100% rename from registry/default/magicui/confetti.tsx rename to registry/magicui/confetti.tsx diff --git a/registry/default/magicui/cool-mode.tsx b/registry/magicui/cool-mode.tsx similarity index 100% rename from registry/default/magicui/cool-mode.tsx rename to registry/magicui/cool-mode.tsx diff --git a/registry/default/magicui/dock.tsx b/registry/magicui/dock.tsx similarity index 100% rename from registry/default/magicui/dock.tsx rename to registry/magicui/dock.tsx diff --git a/registry/default/magicui/dot-pattern.tsx b/registry/magicui/dot-pattern.tsx similarity index 100% rename from registry/default/magicui/dot-pattern.tsx rename to registry/magicui/dot-pattern.tsx diff --git a/registry/default/magicui/file-tree.tsx b/registry/magicui/file-tree.tsx similarity index 100% rename from registry/default/magicui/file-tree.tsx rename to registry/magicui/file-tree.tsx diff --git a/registry/default/magicui/flickering-grid.tsx b/registry/magicui/flickering-grid.tsx similarity index 100% rename from registry/default/magicui/flickering-grid.tsx rename to registry/magicui/flickering-grid.tsx diff --git a/registry/default/magicui/flip-text.tsx b/registry/magicui/flip-text.tsx similarity index 100% rename from registry/default/magicui/flip-text.tsx rename to registry/magicui/flip-text.tsx diff --git a/registry/default/magicui/globe.tsx b/registry/magicui/globe.tsx similarity index 100% rename from registry/default/magicui/globe.tsx rename to registry/magicui/globe.tsx diff --git a/registry/default/magicui/grid-pattern.tsx b/registry/magicui/grid-pattern.tsx similarity index 100% rename from registry/default/magicui/grid-pattern.tsx rename to registry/magicui/grid-pattern.tsx diff --git a/registry/default/magicui/hero-video-dialog.tsx b/registry/magicui/hero-video-dialog.tsx similarity index 100% rename from registry/default/magicui/hero-video-dialog.tsx rename to registry/magicui/hero-video-dialog.tsx diff --git a/registry/default/magicui/hyper-text.tsx b/registry/magicui/hyper-text.tsx similarity index 100% rename from registry/default/magicui/hyper-text.tsx rename to registry/magicui/hyper-text.tsx diff --git a/registry/default/magicui/icon-cloud.tsx b/registry/magicui/icon-cloud.tsx similarity index 100% rename from registry/default/magicui/icon-cloud.tsx rename to registry/magicui/icon-cloud.tsx diff --git a/registry/default/magicui/interactive-grid-pattern.tsx b/registry/magicui/interactive-grid-pattern.tsx similarity index 100% rename from registry/default/magicui/interactive-grid-pattern.tsx rename to registry/magicui/interactive-grid-pattern.tsx diff --git a/registry/default/magicui/interactive-hover-button.tsx b/registry/magicui/interactive-hover-button.tsx similarity index 100% rename from registry/default/magicui/interactive-hover-button.tsx rename to registry/magicui/interactive-hover-button.tsx diff --git a/registry/default/magicui/iphone-15-pro.tsx b/registry/magicui/iphone-15-pro.tsx similarity index 100% rename from registry/default/magicui/iphone-15-pro.tsx rename to registry/magicui/iphone-15-pro.tsx diff --git a/registry/default/magicui/line-shadow-text.tsx b/registry/magicui/line-shadow-text.tsx similarity index 100% rename from registry/default/magicui/line-shadow-text.tsx rename to registry/magicui/line-shadow-text.tsx diff --git a/registry/default/magicui/linear-mask.tsx b/registry/magicui/linear-mask.tsx similarity index 100% rename from registry/default/magicui/linear-mask.tsx rename to registry/magicui/linear-mask.tsx diff --git a/registry/default/magicui/magic-card.tsx b/registry/magicui/magic-card.tsx similarity index 100% rename from registry/default/magicui/magic-card.tsx rename to registry/magicui/magic-card.tsx diff --git a/registry/default/magicui/marquee.tsx b/registry/magicui/marquee.tsx similarity index 100% rename from registry/default/magicui/marquee.tsx rename to registry/magicui/marquee.tsx diff --git a/registry/default/magicui/meteors.tsx b/registry/magicui/meteors.tsx similarity index 100% rename from registry/default/magicui/meteors.tsx rename to registry/magicui/meteors.tsx diff --git a/registry/default/magicui/morphing-text.tsx b/registry/magicui/morphing-text.tsx similarity index 100% rename from registry/default/magicui/morphing-text.tsx rename to registry/magicui/morphing-text.tsx diff --git a/registry/default/magicui/neon-gradient-card.tsx b/registry/magicui/neon-gradient-card.tsx similarity index 100% rename from registry/default/magicui/neon-gradient-card.tsx rename to registry/magicui/neon-gradient-card.tsx diff --git a/registry/default/magicui/number-ticker.tsx b/registry/magicui/number-ticker.tsx similarity index 100% rename from registry/default/magicui/number-ticker.tsx rename to registry/magicui/number-ticker.tsx diff --git a/registry/default/magicui/orbiting-circles.tsx b/registry/magicui/orbiting-circles.tsx similarity index 100% rename from registry/default/magicui/orbiting-circles.tsx rename to registry/magicui/orbiting-circles.tsx diff --git a/registry/default/magicui/particles.tsx b/registry/magicui/particles.tsx similarity index 100% rename from registry/default/magicui/particles.tsx rename to registry/magicui/particles.tsx diff --git a/registry/default/magicui/pulsating-button.tsx b/registry/magicui/pulsating-button.tsx similarity index 100% rename from registry/default/magicui/pulsating-button.tsx rename to registry/magicui/pulsating-button.tsx diff --git a/registry/default/magicui/rainbow-button.tsx b/registry/magicui/rainbow-button.tsx similarity index 100% rename from registry/default/magicui/rainbow-button.tsx rename to registry/magicui/rainbow-button.tsx diff --git a/registry/default/magicui/retro-grid.tsx b/registry/magicui/retro-grid.tsx similarity index 100% rename from registry/default/magicui/retro-grid.tsx rename to registry/magicui/retro-grid.tsx diff --git a/registry/default/magicui/ripple-button.tsx b/registry/magicui/ripple-button.tsx similarity index 100% rename from registry/default/magicui/ripple-button.tsx rename to registry/magicui/ripple-button.tsx diff --git a/registry/default/magicui/ripple.tsx b/registry/magicui/ripple.tsx similarity index 100% rename from registry/default/magicui/ripple.tsx rename to registry/magicui/ripple.tsx diff --git a/registry/default/magicui/safari.tsx b/registry/magicui/safari.tsx similarity index 99% rename from registry/default/magicui/safari.tsx rename to registry/magicui/safari.tsx index fdad643ce..a8e94b7ff 100644 --- a/registry/default/magicui/safari.tsx +++ b/registry/magicui/safari.tsx @@ -11,7 +11,7 @@ export interface SafariProps extends SVGProps { mode?: SafariMode; } -export default function Safari({ +export function Safari({ imageSrc, videoSrc, url, diff --git a/registry/default/magicui/scratch-to-reveal.tsx b/registry/magicui/scratch-to-reveal.tsx similarity index 100% rename from registry/default/magicui/scratch-to-reveal.tsx rename to registry/magicui/scratch-to-reveal.tsx diff --git a/registry/default/magicui/script-copy-btn.tsx b/registry/magicui/script-copy-btn.tsx similarity index 100% rename from registry/default/magicui/script-copy-btn.tsx rename to registry/magicui/script-copy-btn.tsx diff --git a/registry/default/magicui/scroll-based-velocity.tsx b/registry/magicui/scroll-based-velocity.tsx similarity index 100% rename from registry/default/magicui/scroll-based-velocity.tsx rename to registry/magicui/scroll-based-velocity.tsx diff --git a/registry/default/magicui/scroll-progress.tsx b/registry/magicui/scroll-progress.tsx similarity index 100% rename from registry/default/magicui/scroll-progress.tsx rename to registry/magicui/scroll-progress.tsx diff --git a/registry/default/magicui/shimmer-button.tsx b/registry/magicui/shimmer-button.tsx similarity index 100% rename from registry/default/magicui/shimmer-button.tsx rename to registry/magicui/shimmer-button.tsx diff --git a/registry/default/magicui/shine-border.tsx b/registry/magicui/shine-border.tsx similarity index 100% rename from registry/default/magicui/shine-border.tsx rename to registry/magicui/shine-border.tsx diff --git a/registry/default/magicui/shiny-button.tsx b/registry/magicui/shiny-button.tsx similarity index 100% rename from registry/default/magicui/shiny-button.tsx rename to registry/magicui/shiny-button.tsx diff --git a/registry/default/magicui/sparkles-text.tsx b/registry/magicui/sparkles-text.tsx similarity index 100% rename from registry/default/magicui/sparkles-text.tsx rename to registry/magicui/sparkles-text.tsx diff --git a/registry/default/magicui/terminal.tsx b/registry/magicui/terminal.tsx similarity index 100% rename from registry/default/magicui/terminal.tsx rename to registry/magicui/terminal.tsx diff --git a/registry/default/magicui/text-animate.tsx b/registry/magicui/text-animate.tsx similarity index 100% rename from registry/default/magicui/text-animate.tsx rename to registry/magicui/text-animate.tsx diff --git a/registry/default/magicui/text-reveal.tsx b/registry/magicui/text-reveal.tsx similarity index 100% rename from registry/default/magicui/text-reveal.tsx rename to registry/magicui/text-reveal.tsx diff --git a/registry/default/magicui/tweet-card.tsx b/registry/magicui/tweet-card.tsx similarity index 100% rename from registry/default/magicui/tweet-card.tsx rename to registry/magicui/tweet-card.tsx diff --git a/registry/default/magicui/typing-animation.tsx b/registry/magicui/typing-animation.tsx similarity index 100% rename from registry/default/magicui/typing-animation.tsx rename to registry/magicui/typing-animation.tsx diff --git a/registry/default/magicui/warp-background.tsx b/registry/magicui/warp-background.tsx similarity index 100% rename from registry/default/magicui/warp-background.tsx rename to registry/magicui/warp-background.tsx diff --git a/registry/default/magicui/word-rotate.tsx b/registry/magicui/word-rotate.tsx similarity index 100% rename from registry/default/magicui/word-rotate.tsx rename to registry/magicui/word-rotate.tsx diff --git a/registry/registry-base-colors.ts b/registry/registry-base-colors.ts deleted file mode 100644 index bd2ab3dd4..000000000 --- a/registry/registry-base-colors.ts +++ /dev/null @@ -1,756 +0,0 @@ -export const baseColors = [ - { - name: "zinc", - label: "Zinc", - activeColor: { - light: "240 5.9% 10%", - dark: "240 5.2% 33.9%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "240 10% 3.9%", - card: "0 0% 100%", - "card-foreground": "240 10% 3.9%", - popover: "0 0% 100%", - "popover-foreground": "240 10% 3.9%", - primary: "240 5.9% 10%", - "primary-foreground": "0 0% 98%", - secondary: "240 4.8% 95.9%", - "secondary-foreground": "240 5.9% 10%", - muted: "240 4.8% 95.9%", - "muted-foreground": "240 3.8% 46.1%", - accent: "240 4.8% 95.9%", - "accent-foreground": "240 5.9% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - border: "240 5.9% 90%", - input: "240 5.9% 90%", - ring: "240 5.9% 10%", - radius: "0.5rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "240 10% 3.9%", - foreground: "0 0% 98%", - card: "240 10% 3.9%", - "card-foreground": "0 0% 98%", - popover: "240 10% 3.9%", - "popover-foreground": "0 0% 98%", - primary: "0 0% 98%", - "primary-foreground": "240 5.9% 10%", - secondary: "240 3.7% 15.9%", - "secondary-foreground": "0 0% 98%", - muted: "240 3.7% 15.9%", - "muted-foreground": "240 5% 64.9%", - accent: "240 3.7% 15.9%", - "accent-foreground": "0 0% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - border: "240 3.7% 15.9%", - input: "240 3.7% 15.9%", - ring: "240 4.9% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "slate", - label: "Slate", - activeColor: { - light: "215.4 16.3% 46.9%", - dark: "215.3 19.3% 34.5%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "222.2 84% 4.9%", - card: "0 0% 100%", - "card-foreground": "222.2 84% 4.9%", - popover: "0 0% 100%", - "popover-foreground": "222.2 84% 4.9%", - primary: "222.2 47.4% 11.2%", - "primary-foreground": "210 40% 98%", - secondary: "210 40% 96.1%", - "secondary-foreground": "222.2 47.4% 11.2%", - muted: "210 40% 96.1%", - "muted-foreground": "215.4 16.3% 46.9%", - accent: "210 40% 96.1%", - "accent-foreground": "222.2 47.4% 11.2%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "210 40% 98%", - border: "214.3 31.8% 91.4%", - input: "214.3 31.8% 91.4%", - ring: "222.2 84% 4.9%", - radius: "0.5rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "222.2 84% 4.9%", - foreground: "210 40% 98%", - card: "222.2 84% 4.9%", - "card-foreground": "210 40% 98%", - popover: "222.2 84% 4.9%", - "popover-foreground": "210 40% 98%", - primary: "210 40% 98%", - "primary-foreground": "222.2 47.4% 11.2%", - secondary: "217.2 32.6% 17.5%", - "secondary-foreground": "210 40% 98%", - muted: "217.2 32.6% 17.5%", - "muted-foreground": "215 20.2% 65.1%", - accent: "217.2 32.6% 17.5%", - "accent-foreground": "210 40% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "210 40% 98%", - border: "217.2 32.6% 17.5%", - input: "217.2 32.6% 17.5%", - ring: "212.7 26.8% 83.9", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "stone", - label: "Stone", - activeColor: { - light: "25 5.3% 44.7%", - dark: "33.3 5.5% 32.4%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "20 14.3% 4.1%", - card: "0 0% 100%", - "card-foreground": "20 14.3% 4.1%", - popover: "0 0% 100%", - "popover-foreground": "20 14.3% 4.1%", - primary: "24 9.8% 10%", - "primary-foreground": "60 9.1% 97.8%", - secondary: "60 4.8% 95.9%", - "secondary-foreground": "24 9.8% 10%", - muted: "60 4.8% 95.9%", - "muted-foreground": "25 5.3% 44.7%", - accent: "60 4.8% 95.9%", - "accent-foreground": "24 9.8% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "60 9.1% 97.8%", - border: "20 5.9% 90%", - input: "20 5.9% 90%", - ring: "20 14.3% 4.1%", - radius: "0.95rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "20 14.3% 4.1%", - foreground: "60 9.1% 97.8%", - card: "20 14.3% 4.1%", - "card-foreground": "60 9.1% 97.8%", - popover: "20 14.3% 4.1%", - "popover-foreground": "60 9.1% 97.8%", - primary: "60 9.1% 97.8%", - "primary-foreground": "24 9.8% 10%", - secondary: "12 6.5% 15.1%", - "secondary-foreground": "60 9.1% 97.8%", - muted: "12 6.5% 15.1%", - "muted-foreground": "24 5.4% 63.9%", - accent: "12 6.5% 15.1%", - "accent-foreground": "60 9.1% 97.8%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "60 9.1% 97.8%", - border: "12 6.5% 15.1%", - input: "12 6.5% 15.1%", - ring: "24 5.7% 82.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "gray", - label: "Gray", - activeColor: { - light: "220 8.9% 46.1%", - dark: "215 13.8% 34.1%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "224 71.4% 4.1%", - card: "0 0% 100%", - "card-foreground": "224 71.4% 4.1%", - popover: "0 0% 100%", - "popover-foreground": "224 71.4% 4.1%", - primary: "220.9 39.3% 11%", - "primary-foreground": "210 20% 98%", - secondary: "220 14.3% 95.9%", - "secondary-foreground": "220.9 39.3% 11%", - muted: "220 14.3% 95.9%", - "muted-foreground": "220 8.9% 46.1%", - accent: "220 14.3% 95.9%", - "accent-foreground": "220.9 39.3% 11%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "210 20% 98%", - border: "220 13% 91%", - input: "220 13% 91%", - ring: "224 71.4% 4.1%", - radius: "0.35rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "224 71.4% 4.1%", - foreground: "210 20% 98%", - card: "224 71.4% 4.1%", - "card-foreground": "210 20% 98%", - popover: "224 71.4% 4.1%", - "popover-foreground": "210 20% 98%", - primary: "210 20% 98%", - "primary-foreground": "220.9 39.3% 11%", - secondary: "215 27.9% 16.9%", - "secondary-foreground": "210 20% 98%", - muted: "215 27.9% 16.9%", - "muted-foreground": "217.9 10.6% 64.9%", - accent: "215 27.9% 16.9%", - "accent-foreground": "210 20% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "210 20% 98%", - border: "215 27.9% 16.9%", - input: "215 27.9% 16.9%", - ring: "216 12.2% 83.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "neutral", - label: "Neutral", - activeColor: { - light: "0 0% 45.1%", - dark: "0 0% 32.2%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "0 0% 3.9%", - card: "0 0% 100%", - "card-foreground": "0 0% 3.9%", - popover: "0 0% 100%", - "popover-foreground": "0 0% 3.9%", - primary: "0 0% 9%", - "primary-foreground": "0 0% 98%", - secondary: "0 0% 96.1%", - "secondary-foreground": "0 0% 9%", - muted: "0 0% 96.1%", - "muted-foreground": "0 0% 45.1%", - accent: "0 0% 96.1%", - "accent-foreground": "0 0% 9%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - border: "0 0% 89.8%", - input: "0 0% 89.8%", - ring: "0 0% 3.9%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "0 0% 3.9%", - foreground: "0 0% 98%", - card: "0 0% 3.9%", - "card-foreground": "0 0% 98%", - popover: "0 0% 3.9%", - "popover-foreground": "0 0% 98%", - primary: "0 0% 98%", - "primary-foreground": "0 0% 9%", - secondary: "0 0% 14.9%", - "secondary-foreground": "0 0% 98%", - muted: "0 0% 14.9%", - "muted-foreground": "0 0% 63.9%", - accent: "0 0% 14.9%", - "accent-foreground": "0 0% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - border: "0 0% 14.9%", - input: "0 0% 14.9%", - ring: "0 0% 83.1%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "red", - label: "Red", - activeColor: { - light: "0 72.2% 50.6%", - dark: "0 72.2% 50.6%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "0 0% 3.9%", - card: "0 0% 100%", - "card-foreground": "0 0% 3.9%", - popover: "0 0% 100%", - "popover-foreground": "0 0% 3.9%", - primary: "0 72.2% 50.6%", - "primary-foreground": "0 85.7% 97.3%", - secondary: "0 0% 96.1%", - "secondary-foreground": "0 0% 9%", - muted: "0 0% 96.1%", - "muted-foreground": "0 0% 45.1%", - accent: "0 0% 96.1%", - "accent-foreground": "0 0% 9%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - border: "0 0% 89.8%", - input: "0 0% 89.8%", - ring: "0 72.2% 50.6%", - radius: "0.4rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "0 0% 3.9%", - foreground: "0 0% 98%", - card: "0 0% 3.9%", - "card-foreground": "0 0% 98%", - popover: "0 0% 3.9%", - "popover-foreground": "0 0% 98%", - primary: "0 72.2% 50.6%", - "primary-foreground": "0 85.7% 97.3%", - secondary: "0 0% 14.9%", - "secondary-foreground": "0 0% 98%", - muted: "0 0% 14.9%", - "muted-foreground": "0 0% 63.9%", - accent: "0 0% 14.9%", - "accent-foreground": "0 0% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "0 0% 98%", - border: "0 0% 14.9%", - input: "0 0% 14.9%", - ring: "0 72.2% 50.6%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "rose", - label: "Rose", - activeColor: { - light: "346.8 77.2% 49.8%", - dark: "346.8 77.2% 49.8%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "240 10% 3.9%", - card: "0 0% 100%", - "card-foreground": "240 10% 3.9%", - popover: "0 0% 100%", - "popover-foreground": "240 10% 3.9%", - primary: "346.8 77.2% 49.8%", - "primary-foreground": "355.7 100% 97.3%", - secondary: "240 4.8% 95.9%", - "secondary-foreground": "240 5.9% 10%", - muted: "240 4.8% 95.9%", - "muted-foreground": "240 3.8% 46.1%", - accent: "240 4.8% 95.9%", - "accent-foreground": "240 5.9% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - border: "240 5.9% 90%", - input: "240 5.9% 90%", - ring: "346.8 77.2% 49.8%", - radius: "0.5rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "20 14.3% 4.1%", - foreground: "0 0% 95%", - popover: "0 0% 9%", - "popover-foreground": "0 0% 95%", - card: "24 9.8% 10%", - "card-foreground": "0 0% 95%", - primary: "346.8 77.2% 49.8%", - "primary-foreground": "355.7 100% 97.3%", - secondary: "240 3.7% 15.9%", - "secondary-foreground": "0 0% 98%", - muted: "0 0% 15%", - "muted-foreground": "240 5% 64.9%", - accent: "12 6.5% 15.1%", - "accent-foreground": "0 0% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "0 85.7% 97.3%", - border: "240 3.7% 15.9%", - input: "240 3.7% 15.9%", - ring: "346.8 77.2% 49.8%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "orange", - label: "Orange", - activeColor: { - light: "24.6 95% 53.1%", - dark: "20.5 90.2% 48.2%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "20 14.3% 4.1%", - card: "0 0% 100%", - "card-foreground": "20 14.3% 4.1%", - popover: "0 0% 100%", - "popover-foreground": "20 14.3% 4.1%", - primary: "24.6 95% 53.1%", - "primary-foreground": "60 9.1% 97.8%", - secondary: "60 4.8% 95.9%", - "secondary-foreground": "24 9.8% 10%", - muted: "60 4.8% 95.9%", - "muted-foreground": "25 5.3% 44.7%", - accent: "60 4.8% 95.9%", - "accent-foreground": "24 9.8% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "60 9.1% 97.8%", - border: "20 5.9% 90%", - input: "20 5.9% 90%", - ring: "24.6 95% 53.1%", - radius: "0.95rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "20 14.3% 4.1%", - foreground: "60 9.1% 97.8%", - card: "20 14.3% 4.1%", - "card-foreground": "60 9.1% 97.8%", - popover: "20 14.3% 4.1%", - "popover-foreground": "60 9.1% 97.8%", - primary: "20.5 90.2% 48.2%", - "primary-foreground": "60 9.1% 97.8%", - secondary: "12 6.5% 15.1%", - "secondary-foreground": "60 9.1% 97.8%", - muted: "12 6.5% 15.1%", - "muted-foreground": "24 5.4% 63.9%", - accent: "12 6.5% 15.1%", - "accent-foreground": "60 9.1% 97.8%", - destructive: "0 72.2% 50.6%", - "destructive-foreground": "60 9.1% 97.8%", - border: "12 6.5% 15.1%", - input: "12 6.5% 15.1%", - ring: "20.5 90.2% 48.2%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "green", - label: "Green", - activeColor: { - light: "142.1 76.2% 36.3%", - dark: "142.1 70.6% 45.3%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "240 10% 3.9%", - card: "0 0% 100%", - "card-foreground": "240 10% 3.9%", - popover: "0 0% 100%", - "popover-foreground": "240 10% 3.9%", - primary: "142.1 76.2% 36.3%", - "primary-foreground": "355.7 100% 97.3%", - secondary: "240 4.8% 95.9%", - "secondary-foreground": "240 5.9% 10%", - muted: "240 4.8% 95.9%", - "muted-foreground": "240 3.8% 46.1%", - accent: "240 4.8% 95.9%", - "accent-foreground": "240 5.9% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "0 0% 98%", - border: "240 5.9% 90%", - input: "240 5.9% 90%", - ring: "142.1 76.2% 36.3%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "20 14.3% 4.1%", - foreground: "0 0% 95%", - popover: "0 0% 9%", - "popover-foreground": "0 0% 95%", - card: "24 9.8% 10%", - "card-foreground": "0 0% 95%", - primary: "142.1 70.6% 45.3%", - "primary-foreground": "144.9 80.4% 10%", - secondary: "240 3.7% 15.9%", - "secondary-foreground": "0 0% 98%", - muted: "0 0% 15%", - "muted-foreground": "240 5% 64.9%", - accent: "12 6.5% 15.1%", - "accent-foreground": "0 0% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "0 85.7% 97.3%", - border: "240 3.7% 15.9%", - input: "240 3.7% 15.9%", - ring: "142.4 71.8% 29.2%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "blue", - label: "Blue", - activeColor: { - light: "221.2 83.2% 53.3%", - dark: "217.2 91.2% 59.8%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "222.2 84% 4.9%", - card: "0 0% 100%", - "card-foreground": "222.2 84% 4.9%", - popover: "0 0% 100%", - "popover-foreground": "222.2 84% 4.9%", - primary: "221.2 83.2% 53.3%", - "primary-foreground": "210 40% 98%", - secondary: "210 40% 96.1%", - "secondary-foreground": "222.2 47.4% 11.2%", - muted: "210 40% 96.1%", - "muted-foreground": "215.4 16.3% 46.9%", - accent: "210 40% 96.1%", - "accent-foreground": "222.2 47.4% 11.2%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "210 40% 98%", - border: "214.3 31.8% 91.4%", - input: "214.3 31.8% 91.4%", - ring: "221.2 83.2% 53.3%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "222.2 84% 4.9%", - foreground: "210 40% 98%", - card: "222.2 84% 4.9%", - "card-foreground": "210 40% 98%", - popover: "222.2 84% 4.9%", - "popover-foreground": "210 40% 98%", - primary: "217.2 91.2% 59.8%", - "primary-foreground": "222.2 47.4% 11.2%", - secondary: "217.2 32.6% 17.5%", - "secondary-foreground": "210 40% 98%", - muted: "217.2 32.6% 17.5%", - "muted-foreground": "215 20.2% 65.1%", - accent: "217.2 32.6% 17.5%", - "accent-foreground": "210 40% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "210 40% 98%", - border: "217.2 32.6% 17.5%", - input: "217.2 32.6% 17.5%", - ring: "224.3 76.3% 48%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "yellow", - label: "Yellow", - activeColor: { - light: "47.9 95.8% 53.1%", - dark: "47.9 95.8% 53.1%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "20 14.3% 4.1%", - card: "0 0% 100%", - "card-foreground": "20 14.3% 4.1%", - popover: "0 0% 100%", - "popover-foreground": "20 14.3% 4.1%", - primary: "47.9 95.8% 53.1%", - "primary-foreground": "26 83.3% 14.1%", - secondary: "60 4.8% 95.9%", - "secondary-foreground": "24 9.8% 10%", - muted: "60 4.8% 95.9%", - "muted-foreground": "25 5.3% 44.7%", - accent: "60 4.8% 95.9%", - "accent-foreground": "24 9.8% 10%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "60 9.1% 97.8%", - border: "20 5.9% 90%", - input: "20 5.9% 90%", - ring: "20 14.3% 4.1%", - radius: "0.95rem", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "20 14.3% 4.1%", - foreground: "60 9.1% 97.8%", - card: "20 14.3% 4.1%", - "card-foreground": "60 9.1% 97.8%", - popover: "20 14.3% 4.1%", - "popover-foreground": "60 9.1% 97.8%", - primary: "47.9 95.8% 53.1%", - "primary-foreground": "26 83.3% 14.1%", - secondary: "12 6.5% 15.1%", - "secondary-foreground": "60 9.1% 97.8%", - muted: "12 6.5% 15.1%", - "muted-foreground": "24 5.4% 63.9%", - accent: "12 6.5% 15.1%", - "accent-foreground": "60 9.1% 97.8%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "60 9.1% 97.8%", - border: "12 6.5% 15.1%", - input: "12 6.5% 15.1%", - ring: "35.5 91.7% 32.9%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, - { - name: "violet", - label: "Violet", - activeColor: { - light: "262.1 83.3% 57.8%", - dark: "263.4 70% 50.4%", - }, - cssVars: { - light: { - background: "0 0% 100%", - foreground: "224 71.4% 4.1%", - card: "0 0% 100%", - "card-foreground": "224 71.4% 4.1%", - popover: "0 0% 100%", - "popover-foreground": "224 71.4% 4.1%", - primary: "262.1 83.3% 57.8%", - "primary-foreground": "210 20% 98%", - secondary: "220 14.3% 95.9%", - "secondary-foreground": "220.9 39.3% 11%", - muted: "220 14.3% 95.9%", - "muted-foreground": "220 8.9% 46.1%", - accent: "220 14.3% 95.9%", - "accent-foreground": "220.9 39.3% 11%", - destructive: "0 84.2% 60.2%", - "destructive-foreground": "210 20% 98%", - border: "220 13% 91%", - input: "220 13% 91%", - ring: "262.1 83.3% 57.8%", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "224 71.4% 4.1%", - foreground: "210 20% 98%", - card: "224 71.4% 4.1%", - "card-foreground": "210 20% 98%", - popover: "224 71.4% 4.1%", - "popover-foreground": "210 20% 98%", - primary: "263.4 70% 50.4%", - "primary-foreground": "210 20% 98%", - secondary: "215 27.9% 16.9%", - "secondary-foreground": "210 20% 98%", - muted: "215 27.9% 16.9%", - "muted-foreground": "217.9 10.6% 64.9%", - accent: "215 27.9% 16.9%", - "accent-foreground": "210 20% 98%", - destructive: "0 62.8% 30.6%", - "destructive-foreground": "210 20% 98%", - border: "215 27.9% 16.9%", - input: "215 27.9% 16.9%", - ring: "263.4 70% 50.4%", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, - }, - }, -] as const; - -export type BaseColor = (typeof baseColors)[number]; diff --git a/registry/registry-blocks.ts b/registry/registry-blocks.ts deleted file mode 100644 index 3bb8d2a4a..000000000 --- a/registry/registry-blocks.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Registry } from "@/registry/schema"; - -export const blocks: Registry = []; diff --git a/registry/registry-colors.ts b/registry/registry-colors.ts deleted file mode 100644 index 5130fcee3..000000000 --- a/registry/registry-colors.ts +++ /dev/null @@ -1,1566 +0,0 @@ -export const colors = { - inherit: "inherit", - current: "currentColor", - transparent: "transparent", - black: { - hex: "#000000", - rgb: "rgb(0,0,0)", - hsl: "hsl(0,0%,0%)", - }, - white: { - hex: "#ffffff", - rgb: "rgb(255,255,255)", - hsl: "hsl(0,0%,100%)", - }, - slate: [ - { - scale: 50, - hex: "#f8fafc", - rgb: "rgb(248,250,252)", - hsl: "hsl(210,40%,98%)", - }, - { - scale: 100, - hex: "#f1f5f9", - rgb: "rgb(241,245,249)", - hsl: "hsl(210,40%,96.1%)", - }, - { - scale: 200, - hex: "#e2e8f0", - rgb: "rgb(226,232,240)", - hsl: "hsl(214.3,31.8%,91.4%)", - }, - { - scale: 300, - hex: "#cbd5e1", - rgb: "rgb(203,213,225)", - hsl: "hsl(212.7,26.8%,83.9%)", - }, - { - scale: 400, - hex: "#94a3b8", - rgb: "rgb(148,163,184)", - hsl: "hsl(215,20.2%,65.1%)", - }, - { - scale: 500, - hex: "#64748b", - rgb: "rgb(100,116,139)", - hsl: "hsl(215.4,16.3%,46.9%)", - }, - { - scale: 600, - hex: "#475569", - rgb: "rgb(71,85,105)", - hsl: "hsl(215.3,19.3%,34.5%)", - }, - { - scale: 700, - hex: "#334155", - rgb: "rgb(51,65,85)", - hsl: "hsl(215.3,25%,26.7%)", - }, - { - scale: 800, - hex: "#1e293b", - rgb: "rgb(30,41,59)", - hsl: "hsl(217.2,32.6%,17.5%)", - }, - { - scale: 900, - hex: "#0f172a", - rgb: "rgb(15,23,42)", - hsl: "hsl(222.2,47.4%,11.2%)", - }, - { - scale: 950, - hex: "#020617", - rgb: "rgb(2,6,23)", - hsl: "hsl(222.2,84%,4.9%)", - }, - ], - gray: [ - { - scale: 50, - hex: "#f9fafb", - rgb: "rgb(249,250,251)", - hsl: "hsl(210,20%,98%)", - }, - { - scale: 100, - hex: "#f3f4f6", - rgb: "rgb(243,244,246)", - hsl: "hsl(220,14.3%,95.9%)", - }, - { - scale: 200, - hex: "#e5e7eb", - rgb: "rgb(229,231,235)", - hsl: "hsl(220,13%,91%)", - }, - { - scale: 300, - hex: "#d1d5db", - rgb: "rgb(209,213,219)", - hsl: "hsl(216,12.2%,83.9%)", - }, - { - scale: 400, - hex: "#9ca3af", - rgb: "rgb(156,163,175)", - hsl: "hsl(217.9,10.6%,64.9%)", - }, - { - scale: 500, - hex: "#6b7280", - rgb: "rgb(107,114,128)", - hsl: "hsl(220,8.9%,46.1%)", - }, - { - scale: 600, - hex: "#4b5563", - rgb: "rgb(75,85,99)", - hsl: "hsl(215,13.8%,34.1%)", - }, - { - scale: 700, - hex: "#374151", - rgb: "rgb(55,65,81)", - hsl: "hsl(216.9,19.1%,26.7%)", - }, - { - scale: 800, - hex: "#1f2937", - rgb: "rgb(31,41,55)", - hsl: "hsl(215,27.9%,16.9%)", - }, - { - scale: 900, - hex: "#111827", - rgb: "rgb(17,24,39)", - hsl: "hsl(220.9,39.3%,11%)", - }, - { - scale: 950, - hex: "#030712", - rgb: "rgb(3,7,18)", - hsl: "hsl(224,71.4%,4.1%)", - }, - ], - zinc: [ - { - scale: 50, - hex: "#fafafa", - rgb: "rgb(250,250,250)", - hsl: "hsl(0,0%,98%)", - }, - { - scale: 100, - hex: "#f4f4f5", - rgb: "rgb(244,244,245)", - hsl: "hsl(240,4.8%,95.9%)", - }, - { - scale: 200, - hex: "#e4e4e7", - rgb: "rgb(228,228,231)", - hsl: "hsl(240,5.9%,90%)", - }, - { - scale: 300, - hex: "#d4d4d8", - rgb: "rgb(212,212,216)", - hsl: "hsl(240,4.9%,83.9%)", - }, - { - scale: 400, - hex: "#a1a1aa", - rgb: "rgb(161,161,170)", - hsl: "hsl(240,5%,64.9%)", - }, - { - scale: 500, - hex: "#71717a", - rgb: "rgb(113,113,122)", - hsl: "hsl(240,3.8%,46.1%)", - }, - { - scale: 600, - hex: "#52525b", - rgb: "rgb(82,82,91)", - hsl: "hsl(240,5.2%,33.9%)", - }, - { - scale: 700, - hex: "#3f3f46", - rgb: "rgb(63,63,70)", - hsl: "hsl(240,5.3%,26.1%)", - }, - { - scale: 800, - hex: "#27272a", - rgb: "rgb(39,39,42)", - hsl: "hsl(240,3.7%,15.9%)", - }, - { - scale: 900, - hex: "#18181b", - rgb: "rgb(24,24,27)", - hsl: "hsl(240,5.9%,10%)", - }, - { - scale: 950, - hex: "#09090b", - rgb: "rgb(9,9,11)", - hsl: "hsl(240,10%,3.9%)", - }, - ], - neutral: [ - { - scale: 50, - hex: "#fafafa", - rgb: "rgb(250,250,250)", - hsl: "hsl(0,0%,98%)", - }, - { - scale: 100, - hex: "#f5f5f5", - rgb: "rgb(245,245,245)", - hsl: "hsl(0,0%,96.1%)", - }, - { - scale: 200, - hex: "#e5e5e5", - rgb: "rgb(229,229,229)", - hsl: "hsl(0,0%,89.8%)", - }, - { - scale: 300, - hex: "#d4d4d4", - rgb: "rgb(212,212,212)", - hsl: "hsl(0,0%,83.1%)", - }, - { - scale: 400, - hex: "#a3a3a3", - rgb: "rgb(163,163,163)", - hsl: "hsl(0,0%,63.9%)", - }, - { - scale: 500, - hex: "#737373", - rgb: "rgb(115,115,115)", - hsl: "hsl(0,0%,45.1%)", - }, - { - scale: 600, - hex: "#525252", - rgb: "rgb(82,82,82)", - hsl: "hsl(0,0%,32.2%)", - }, - { - scale: 700, - hex: "#404040", - rgb: "rgb(64,64,64)", - hsl: "hsl(0,0%,25.1%)", - }, - { - scale: 800, - hex: "#262626", - rgb: "rgb(38,38,38)", - hsl: "hsl(0,0%,14.9%)", - }, - { - scale: 900, - hex: "#171717", - rgb: "rgb(23,23,23)", - hsl: "hsl(0,0%,9%)", - }, - { - scale: 950, - hex: "#0a0a0a", - rgb: "rgb(10,10,10)", - hsl: "hsl(0,0%,3.9%)", - }, - ], - stone: [ - { - scale: 50, - hex: "#fafaf9", - rgb: "rgb(250,250,249)", - hsl: "hsl(60,9.1%,97.8%)", - }, - { - scale: 100, - hex: "#f5f5f4", - rgb: "rgb(245,245,244)", - hsl: "hsl(60,4.8%,95.9%)", - }, - { - scale: 200, - hex: "#e7e5e4", - rgb: "rgb(231,229,228)", - hsl: "hsl(20,5.9%,90%)", - }, - { - scale: 300, - hex: "#d6d3d1", - rgb: "rgb(214,211,209)", - hsl: "hsl(24,5.7%,82.9%)", - }, - { - scale: 400, - hex: "#a8a29e", - rgb: "rgb(168,162,158)", - hsl: "hsl(24,5.4%,63.9%)", - }, - { - scale: 500, - hex: "#78716c", - rgb: "rgb(120,113,108)", - hsl: "hsl(25,5.3%,44.7%)", - }, - { - scale: 600, - hex: "#57534e", - rgb: "rgb(87,83,78)", - hsl: "hsl(33.3,5.5%,32.4%)", - }, - { - scale: 700, - hex: "#44403c", - rgb: "rgb(68,64,60)", - hsl: "hsl(30,6.3%,25.1%)", - }, - { - scale: 800, - hex: "#292524", - rgb: "rgb(41,37,36)", - hsl: "hsl(12,6.5%,15.1%)", - }, - { - scale: 900, - hex: "#1c1917", - rgb: "rgb(28,25,23)", - hsl: "hsl(24,9.8%,10%)", - }, - { - scale: 950, - hex: "#0c0a09", - rgb: "rgb(12,10,9)", - hsl: "hsl(20,14.3%,4.1%)", - }, - ], - red: [ - { - scale: 50, - hex: "#fef2f2", - rgb: "rgb(254,242,242)", - hsl: "hsl(0,85.7%,97.3%)", - }, - { - scale: 100, - hex: "#fee2e2", - rgb: "rgb(254,226,226)", - hsl: "hsl(0,93.3%,94.1%)", - }, - { - scale: 200, - hex: "#fecaca", - rgb: "rgb(254,202,202)", - hsl: "hsl(0,96.3%,89.4%)", - }, - { - scale: 300, - hex: "#fca5a5", - rgb: "rgb(252,165,165)", - hsl: "hsl(0,93.5%,81.8%)", - }, - { - scale: 400, - hex: "#f87171", - rgb: "rgb(248,113,113)", - hsl: "hsl(0,90.6%,70.8%)", - }, - { - scale: 500, - hex: "#ef4444", - rgb: "rgb(239,68,68)", - hsl: "hsl(0,84.2%,60.2%)", - }, - { - scale: 600, - hex: "#dc2626", - rgb: "rgb(220,38,38)", - hsl: "hsl(0,72.2%,50.6%)", - }, - { - scale: 700, - hex: "#b91c1c", - rgb: "rgb(185,28,28)", - hsl: "hsl(0,73.7%,41.8%)", - }, - { - scale: 800, - hex: "#991b1b", - rgb: "rgb(153,27,27)", - hsl: "hsl(0,70%,35.3%)", - }, - { - scale: 900, - hex: "#7f1d1d", - rgb: "rgb(127,29,29)", - hsl: "hsl(0,62.8%,30.6%)", - }, - { - scale: 950, - hex: "#450a0a", - rgb: "rgb(69,10,10)", - hsl: "hsl(0,74.7%,15.5%)", - }, - ], - orange: [ - { - scale: 50, - hex: "#fff7ed", - rgb: "rgb(255,247,237)", - hsl: "hsl(33.3,100%,96.5%)", - }, - { - scale: 100, - hex: "#ffedd5", - rgb: "rgb(255,237,213)", - hsl: "hsl(34.3,100%,91.8%)", - }, - { - scale: 200, - hex: "#fed7aa", - rgb: "rgb(254,215,170)", - hsl: "hsl(32.1,97.7%,83.1%)", - }, - { - scale: 300, - hex: "#fdba74", - rgb: "rgb(253,186,116)", - hsl: "hsl(30.7,97.2%,72.4%)", - }, - { - scale: 400, - hex: "#fb923c", - rgb: "rgb(251,146,60)", - hsl: "hsl(27,96%,61%)", - }, - { - scale: 500, - hex: "#f97316", - rgb: "rgb(249,115,22)", - hsl: "hsl(24.6,95%,53.1%)", - }, - { - scale: 600, - hex: "#ea580c", - rgb: "rgb(234,88,12)", - hsl: "hsl(20.5,90.2%,48.2%)", - }, - { - scale: 700, - hex: "#c2410c", - rgb: "rgb(194,65,12)", - hsl: "hsl(17.5,88.3%,40.4%)", - }, - { - scale: 800, - hex: "#9a3412", - rgb: "rgb(154,52,18)", - hsl: "hsl(15,79.1%,33.7%)", - }, - { - scale: 900, - hex: "#7c2d12", - rgb: "rgb(124,45,18)", - hsl: "hsl(15.3,74.6%,27.8%)", - }, - { - scale: 950, - hex: "#431407", - rgb: "rgb(67,20,7)", - hsl: "hsl(13,81.1%,14.5%)", - }, - ], - amber: [ - { - scale: 50, - hex: "#fffbeb", - rgb: "rgb(255,251,235)", - hsl: "hsl(48,100%,96.1%)", - }, - { - scale: 100, - hex: "#fef3c7", - rgb: "rgb(254,243,199)", - hsl: "hsl(48,96.5%,88.8%)", - }, - { - scale: 200, - hex: "#fde68a", - rgb: "rgb(253,230,138)", - hsl: "hsl(48,96.6%,76.7%)", - }, - { - scale: 300, - hex: "#fcd34d", - rgb: "rgb(252,211,77)", - hsl: "hsl(45.9,96.7%,64.5%)", - }, - { - scale: 400, - hex: "#fbbf24", - rgb: "rgb(251,191,36)", - hsl: "hsl(43.3,96.4%,56.3%)", - }, - { - scale: 500, - hex: "#f59e0b", - rgb: "rgb(245,158,11)", - hsl: "hsl(37.7,92.1%,50.2%)", - }, - { - scale: 600, - hex: "#d97706", - rgb: "rgb(217,119,6)", - hsl: "hsl(32.1,94.6%,43.7%)", - }, - { - scale: 700, - hex: "#b45309", - rgb: "rgb(180,83,9)", - hsl: "hsl(26,90.5%,37.1%)", - }, - { - scale: 800, - hex: "#92400e", - rgb: "rgb(146,64,14)", - hsl: "hsl(22.7,82.5%,31.4%)", - }, - { - scale: 900, - hex: "#78350f", - rgb: "rgb(120,53,15)", - hsl: "hsl(21.7,77.8%,26.5%)", - }, - { - scale: 950, - hex: "#451a03", - rgb: "rgb(69,26,3)", - hsl: "hsl(20.9,91.7%,14.1%)", - }, - ], - yellow: [ - { - scale: 50, - hex: "#fefce8", - rgb: "rgb(254,252,232)", - hsl: "hsl(54.5,91.7%,95.3%)", - }, - { - scale: 100, - hex: "#fef9c3", - rgb: "rgb(254,249,195)", - hsl: "hsl(54.9,96.7%,88%)", - }, - { - scale: 200, - hex: "#fef08a", - rgb: "rgb(254,240,138)", - hsl: "hsl(52.8,98.3%,76.9%)", - }, - { - scale: 300, - hex: "#fde047", - rgb: "rgb(253,224,71)", - hsl: "hsl(50.4,97.8%,63.5%)", - }, - { - scale: 400, - hex: "#facc15", - rgb: "rgb(250,204,21)", - hsl: "hsl(47.9,95.8%,53.1%)", - }, - { - scale: 500, - hex: "#eab308", - rgb: "rgb(234,179,8)", - hsl: "hsl(45.4,93.4%,47.5%)", - }, - { - scale: 600, - hex: "#ca8a04", - rgb: "rgb(202,138,4)", - hsl: "hsl(40.6,96.1%,40.4%)", - }, - { - scale: 700, - hex: "#a16207", - rgb: "rgb(161,98,7)", - hsl: "hsl(35.5,91.7%,32.9%)", - }, - { - scale: 800, - hex: "#854d0e", - rgb: "rgb(133,77,14)", - hsl: "hsl(31.8,81%,28.8%)", - }, - { - scale: 900, - hex: "#713f12", - rgb: "rgb(113,63,18)", - hsl: "hsl(28.4,72.5%,25.7%)", - }, - { - scale: 950, - hex: "#422006", - rgb: "rgb(66,32,6)", - hsl: "hsl(26,83.3%,14.1%)", - }, - ], - lime: [ - { - scale: 50, - hex: "#f7fee7", - rgb: "rgb(247,254,231)", - hsl: "hsl(78.3,92%,95.1%)", - }, - { - scale: 100, - hex: "#ecfccb", - rgb: "rgb(236,252,203)", - hsl: "hsl(79.6,89.1%,89.2%)", - }, - { - scale: 200, - hex: "#d9f99d", - rgb: "rgb(217,249,157)", - hsl: "hsl(80.9,88.5%,79.6%)", - }, - { - scale: 300, - hex: "#bef264", - rgb: "rgb(190,242,100)", - hsl: "hsl(82,84.5%,67.1%)", - }, - { - scale: 400, - hex: "#a3e635", - rgb: "rgb(163,230,53)", - hsl: "hsl(82.7,78%,55.5%)", - }, - { - scale: 500, - hex: "#84cc16", - rgb: "rgb(132,204,22)", - hsl: "hsl(83.7,80.5%,44.3%)", - }, - { - scale: 600, - hex: "#65a30d", - rgb: "rgb(101,163,13)", - hsl: "hsl(84.8,85.2%,34.5%)", - }, - { - scale: 700, - hex: "#4d7c0f", - rgb: "rgb(77,124,15)", - hsl: "hsl(85.9,78.4%,27.3%)", - }, - { - scale: 800, - hex: "#3f6212", - rgb: "rgb(63,98,18)", - hsl: "hsl(86.3,69%,22.7%)", - }, - { - scale: 900, - hex: "#365314", - rgb: "rgb(54,83,20)", - hsl: "hsl(87.6,61.2%,20.2%)", - }, - { - scale: 950, - hex: "#1a2e05", - rgb: "rgb(26,46,5)", - hsl: "hsl(89.3,80.4%,10%)", - }, - ], - green: [ - { - scale: 50, - hex: "#f0fdf4", - rgb: "rgb(240,253,244)", - hsl: "hsl(138.5,76.5%,96.7%)", - }, - { - scale: 100, - hex: "#dcfce7", - rgb: "rgb(220,252,231)", - hsl: "hsl(140.6,84.2%,92.5%)", - }, - { - scale: 200, - hex: "#bbf7d0", - rgb: "rgb(187,247,208)", - hsl: "hsl(141,78.9%,85.1%)", - }, - { - scale: 300, - hex: "#86efac", - rgb: "rgb(134,239,172)", - hsl: "hsl(141.7,76.6%,73.1%)", - }, - { - scale: 400, - hex: "#4ade80", - rgb: "rgb(74,222,128)", - hsl: "hsl(141.9,69.2%,58%)", - }, - { - scale: 500, - hex: "#22c55e", - rgb: "rgb(34,197,94)", - hsl: "hsl(142.1,70.6%,45.3%)", - }, - { - scale: 600, - hex: "#16a34a", - rgb: "rgb(22,163,74)", - hsl: "hsl(142.1,76.2%,36.3%)", - }, - { - scale: 700, - hex: "#15803d", - rgb: "rgb(21,128,61)", - hsl: "hsl(142.4,71.8%,29.2%)", - }, - { - scale: 800, - hex: "#166534", - rgb: "rgb(22,101,52)", - hsl: "hsl(142.8,64.2%,24.1%)", - }, - { - scale: 900, - hex: "#14532d", - rgb: "rgb(20,83,45)", - hsl: "hsl(143.8,61.2%,20.2%)", - }, - { - scale: 950, - hex: "#052e16", - rgb: "rgb(5,46,22)", - hsl: "hsl(144.9,80.4%,10%)", - }, - ], - emerald: [ - { - scale: 50, - hex: "#ecfdf5", - rgb: "rgb(236,253,245)", - hsl: "hsl(151.8,81%,95.9%)", - }, - { - scale: 100, - hex: "#d1fae5", - rgb: "rgb(209,250,229)", - hsl: "hsl(149.3,80.4%,90%)", - }, - { - scale: 200, - hex: "#a7f3d0", - rgb: "rgb(167,243,208)", - hsl: "hsl(152.4,76%,80.4%)", - }, - { - scale: 300, - hex: "#6ee7b7", - rgb: "rgb(110,231,183)", - hsl: "hsl(156.2,71.6%,66.9%)", - }, - { - scale: 400, - hex: "#34d399", - rgb: "rgb(52,211,153)", - hsl: "hsl(158.1,64.4%,51.6%)", - }, - { - scale: 500, - hex: "#10b981", - rgb: "rgb(16,185,129)", - hsl: "hsl(160.1,84.1%,39.4%)", - }, - { - scale: 600, - hex: "#059669", - rgb: "rgb(5,150,105)", - hsl: "hsl(161.4,93.5%,30.4%)", - }, - { - scale: 700, - hex: "#047857", - rgb: "rgb(4,120,87)", - hsl: "hsl(162.9,93.5%,24.3%)", - }, - { - scale: 800, - hex: "#065f46", - rgb: "rgb(6,95,70)", - hsl: "hsl(163.1,88.1%,19.8%)", - }, - { - scale: 900, - hex: "#064e3b", - rgb: "rgb(6,78,59)", - hsl: "hsl(164.2,85.7%,16.5%)", - }, - { - scale: 950, - hex: "#022c22", - rgb: "rgb(2,44,34)", - hsl: "hsl(165.7,91.3%,9%)", - }, - ], - teal: [ - { - scale: 50, - hex: "#f0fdfa", - rgb: "rgb(240,253,250)", - hsl: "hsl(166.2,76.5%,96.7%)", - }, - { - scale: 100, - hex: "#ccfbf1", - rgb: "rgb(204,251,241)", - hsl: "hsl(167.2,85.5%,89.2%)", - }, - { - scale: 200, - hex: "#99f6e4", - rgb: "rgb(153,246,228)", - hsl: "hsl(168.4,83.8%,78.2%)", - }, - { - scale: 300, - hex: "#5eead4", - rgb: "rgb(94,234,212)", - hsl: "hsl(170.6,76.9%,64.3%)", - }, - { - scale: 400, - hex: "#2dd4bf", - rgb: "rgb(45,212,191)", - hsl: "hsl(172.5,66%,50.4%)", - }, - { - scale: 500, - hex: "#14b8a6", - rgb: "rgb(20,184,166)", - hsl: "hsl(173.4,80.4%,40%)", - }, - { - scale: 600, - hex: "#0d9488", - rgb: "rgb(13,148,136)", - hsl: "hsl(174.7,83.9%,31.6%)", - }, - { - scale: 700, - hex: "#0f766e", - rgb: "rgb(15,118,110)", - hsl: "hsl(175.3,77.4%,26.1%)", - }, - { - scale: 800, - hex: "#115e59", - rgb: "rgb(17,94,89)", - hsl: "hsl(176.1,69.4%,21.8%)", - }, - { - scale: 900, - hex: "#134e4a", - rgb: "rgb(19,78,74)", - hsl: "hsl(175.9,60.8%,19%)", - }, - { - scale: 950, - hex: "#042f2e", - rgb: "rgb(4,47,46)", - hsl: "hsl(178.6,84.3%,10%)", - }, - ], - cyan: [ - { - scale: 50, - hex: "#ecfeff", - rgb: "rgb(236,254,255)", - hsl: "hsl(183.2,100%,96.3%)", - }, - { - scale: 100, - hex: "#cffafe", - rgb: "rgb(207,250,254)", - hsl: "hsl(185.1,95.9%,90.4%)", - }, - { - scale: 200, - hex: "#a5f3fc", - rgb: "rgb(165,243,252)", - hsl: "hsl(186.2,93.5%,81.8%)", - }, - { - scale: 300, - hex: "#67e8f9", - rgb: "rgb(103,232,249)", - hsl: "hsl(187,92.4%,69%)", - }, - { - scale: 400, - hex: "#22d3ee", - rgb: "rgb(34,211,238)", - hsl: "hsl(187.9,85.7%,53.3%)", - }, - { - scale: 500, - hex: "#06b6d4", - rgb: "rgb(6,182,212)", - hsl: "hsl(188.7,94.5%,42.7%)", - }, - { - scale: 600, - hex: "#0891b2", - rgb: "rgb(8,145,178)", - hsl: "hsl(191.6,91.4%,36.5%)", - }, - { - scale: 700, - hex: "#0e7490", - rgb: "rgb(14,116,144)", - hsl: "hsl(192.9,82.3%,31%)", - }, - { - scale: 800, - hex: "#155e75", - rgb: "rgb(21,94,117)", - hsl: "hsl(194.4,69.6%,27.1%)", - }, - { - scale: 900, - hex: "#164e63", - rgb: "rgb(22,78,99)", - hsl: "hsl(196.4,63.6%,23.7%)", - }, - { - scale: 950, - hex: "#083344", - rgb: "rgb(8,51,68)", - hsl: "hsl(197,78.9%,14.9%)", - }, - ], - sky: [ - { - scale: 50, - hex: "#f0f9ff", - rgb: "rgb(240,249,255)", - hsl: "hsl(204,100%,97.1%)", - }, - { - scale: 100, - hex: "#e0f2fe", - rgb: "rgb(224,242,254)", - hsl: "hsl(204,93.8%,93.7%)", - }, - { - scale: 200, - hex: "#bae6fd", - rgb: "rgb(186,230,253)", - hsl: "hsl(200.6,94.4%,86.1%)", - }, - { - scale: 300, - hex: "#7dd3fc", - rgb: "rgb(125,211,252)", - hsl: "hsl(199.4,95.5%,73.9%)", - }, - { - scale: 400, - hex: "#38bdf8", - rgb: "rgb(56,189,248)", - hsl: "hsl(198.4,93.2%,59.6%)", - }, - { - scale: 500, - hex: "#0ea5e9", - rgb: "rgb(14,165,233)", - hsl: "hsl(198.6,88.7%,48.4%)", - }, - { - scale: 600, - hex: "#0284c7", - rgb: "rgb(2,132,199)", - hsl: "hsl(200.4,98%,39.4%)", - }, - { - scale: 700, - hex: "#0369a1", - rgb: "rgb(3,105,161)", - hsl: "hsl(201.3,96.3%,32.2%)", - }, - { - scale: 800, - hex: "#075985", - rgb: "rgb(7,89,133)", - hsl: "hsl(201,90%,27.5%)", - }, - { - scale: 900, - hex: "#0c4a6e", - rgb: "rgb(12,74,110)", - hsl: "hsl(202,80.3%,23.9%)", - }, - { - scale: 950, - hex: "#082f49", - rgb: "rgb(8,47,73)", - hsl: "hsl(204,80.2%,15.9%)", - }, - ], - blue: [ - { - scale: 50, - hex: "#eff6ff", - rgb: "rgb(239,246,255)", - hsl: "hsl(213.8,100%,96.9%)", - }, - { - scale: 100, - hex: "#dbeafe", - rgb: "rgb(219,234,254)", - hsl: "hsl(214.3,94.6%,92.7%)", - }, - { - scale: 200, - hex: "#bfdbfe", - rgb: "rgb(191,219,254)", - hsl: "hsl(213.3,96.9%,87.3%)", - }, - { - scale: 300, - hex: "#93c5fd", - rgb: "rgb(147,197,253)", - hsl: "hsl(211.7,96.4%,78.4%)", - }, - { - scale: 400, - hex: "#60a5fa", - rgb: "rgb(96,165,250)", - hsl: "hsl(213.1,93.9%,67.8%)", - }, - { - scale: 500, - hex: "#3b82f6", - rgb: "rgb(59,130,246)", - hsl: "hsl(217.2,91.2%,59.8%)", - }, - { - scale: 600, - hex: "#2563eb", - rgb: "rgb(37,99,235)", - hsl: "hsl(221.2,83.2%,53.3%)", - }, - { - scale: 700, - hex: "#1d4ed8", - rgb: "rgb(29,78,216)", - hsl: "hsl(224.3,76.3%,48%)", - }, - { - scale: 800, - hex: "#1e40af", - rgb: "rgb(30,64,175)", - hsl: "hsl(225.9,70.7%,40.2%)", - }, - { - scale: 900, - hex: "#1e3a8a", - rgb: "rgb(30,58,138)", - hsl: "hsl(224.4,64.3%,32.9%)", - }, - { - scale: 950, - hex: "#172554", - rgb: "rgb(23,37,84)", - hsl: "hsl(226.2,57%,21%)", - }, - ], - indigo: [ - { - scale: 50, - hex: "#eef2ff", - rgb: "rgb(238,242,255)", - hsl: "hsl(225.9,100%,96.7%)", - }, - { - scale: 100, - hex: "#e0e7ff", - rgb: "rgb(224,231,255)", - hsl: "hsl(226.5,100%,93.9%)", - }, - { - scale: 200, - hex: "#c7d2fe", - rgb: "rgb(199,210,254)", - hsl: "hsl(228,96.5%,88.8%)", - }, - { - scale: 300, - hex: "#a5b4fc", - rgb: "rgb(165,180,252)", - hsl: "hsl(229.7,93.5%,81.8%)", - }, - { - scale: 400, - hex: "#818cf8", - rgb: "rgb(129,140,248)", - hsl: "hsl(234.5,89.5%,73.9%)", - }, - { - scale: 500, - hex: "#6366f1", - rgb: "rgb(99,102,241)", - hsl: "hsl(238.7,83.5%,66.7%)", - }, - { - scale: 600, - hex: "#4f46e5", - rgb: "rgb(79,70,229)", - hsl: "hsl(243.4,75.4%,58.6%)", - }, - { - scale: 700, - hex: "#4338ca", - rgb: "rgb(67,56,202)", - hsl: "hsl(244.5,57.9%,50.6%)", - }, - { - scale: 800, - hex: "#3730a3", - rgb: "rgb(55,48,163)", - hsl: "hsl(243.7,54.5%,41.4%)", - }, - { - scale: 900, - hex: "#312e81", - rgb: "rgb(49,46,129)", - hsl: "hsl(242.2,47.4%,34.3%)", - }, - { - scale: 950, - hex: "#1e1b4b", - rgb: "rgb(30,27,75)", - hsl: "hsl(243.8,47.1%,20%)", - }, - ], - violet: [ - { - scale: 50, - hex: "#f5f3ff", - rgb: "rgb(245,243,255)", - hsl: "hsl(250,100%,97.6%)", - }, - { - scale: 100, - hex: "#ede9fe", - rgb: "rgb(237,233,254)", - hsl: "hsl(251.4,91.3%,95.5%)", - }, - { - scale: 200, - hex: "#ddd6fe", - rgb: "rgb(221,214,254)", - hsl: "hsl(250.5,95.2%,91.8%)", - }, - { - scale: 300, - hex: "#c4b5fd", - rgb: "rgb(196,181,253)", - hsl: "hsl(252.5,94.7%,85.1%)", - }, - { - scale: 400, - hex: "#a78bfa", - rgb: "rgb(167,139,250)", - hsl: "hsl(255.1,91.7%,76.3%)", - }, - { - scale: 500, - hex: "#8b5cf6", - rgb: "rgb(139,92,246)", - hsl: "hsl(258.3,89.5%,66.3%)", - }, - { - scale: 600, - hex: "#7c3aed", - rgb: "rgb(124,58,237)", - hsl: "hsl(262.1,83.3%,57.8%)", - }, - { - scale: 700, - hex: "#6d28d9", - rgb: "rgb(109,40,217)", - hsl: "hsl(263.4,70%,50.4%)", - }, - { - scale: 800, - hex: "#5b21b6", - rgb: "rgb(91,33,182)", - hsl: "hsl(263.4,69.3%,42.2%)", - }, - { - scale: 900, - hex: "#4c1d95", - rgb: "rgb(76,29,149)", - hsl: "hsl(263.5,67.4%,34.9%)", - }, - { - scale: 950, - hex: "#1e1b4b", - rgb: "rgb(46,16,101)", - hsl: "hsl(261.2,72.6%,22.9%)", - }, - ], - purple: [ - { - scale: 50, - hex: "#faf5ff", - rgb: "rgb(250,245,255)", - hsl: "hsl(270,100%,98%)", - }, - { - scale: 100, - hex: "#f3e8ff", - rgb: "rgb(243,232,255)", - hsl: "hsl(268.7,100%,95.5%)", - }, - { - scale: 200, - hex: "#e9d5ff", - rgb: "rgb(233,213,255)", - hsl: "hsl(268.6,100%,91.8%)", - }, - { - scale: 300, - hex: "#d8b4fe", - rgb: "rgb(216,180,254)", - hsl: "hsl(269.2,97.4%,85.1%)", - }, - { - scale: 400, - hex: "#c084fc", - rgb: "rgb(192,132,252)", - hsl: "hsl(270,95.2%,75.3%)", - }, - { - scale: 500, - hex: "#a855f7", - rgb: "rgb(168,85,247)", - hsl: "hsl(270.7,91%,65.1%)", - }, - { - scale: 600, - hex: "#9333ea", - rgb: "rgb(147,51,234)", - hsl: "hsl(271.5,81.3%,55.9%)", - }, - { - scale: 700, - hex: "#7e22ce", - rgb: "rgb(126,34,206)", - hsl: "hsl(272.1,71.7%,47.1%)", - }, - { - scale: 800, - hex: "#6b21a8", - rgb: "rgb(107,33,168)", - hsl: "hsl(272.9,67.2%,39.4%)", - }, - { - scale: 900, - hex: "#581c87", - rgb: "rgb(88,28,135)", - hsl: "hsl(273.6,65.6%,32%)", - }, - { - scale: 950, - hex: "#3b0764", - rgb: "rgb(59,7,100)", - hsl: "hsl(273.5,86.9%,21%)", - }, - ], - fuchsia: [ - { - scale: 50, - hex: "#fdf4ff", - rgb: "rgb(253,244,255)", - hsl: "hsl(289.1,100%,97.8%)", - }, - { - scale: 100, - hex: "#fae8ff", - rgb: "rgb(250,232,255)", - hsl: "hsl(287,100%,95.5%)", - }, - { - scale: 200, - hex: "#f5d0fe", - rgb: "rgb(245,208,254)", - hsl: "hsl(288.3,95.8%,90.6%)", - }, - { - scale: 300, - hex: "#f0abfc", - rgb: "rgb(240,171,252)", - hsl: "hsl(291.1,93.1%,82.9%)", - }, - { - scale: 400, - hex: "#e879f9", - rgb: "rgb(232,121,249)", - hsl: "hsl(292,91.4%,72.5%)", - }, - { - scale: 500, - hex: "#d946ef", - rgb: "rgb(217,70,239)", - hsl: "hsl(292.2,84.1%,60.6%)", - }, - { - scale: 600, - hex: "#c026d3", - rgb: "rgb(192,38,211)", - hsl: "hsl(293.4,69.5%,48.8%)", - }, - { - scale: 700, - hex: "#a21caf", - rgb: "rgb(162,28,175)", - hsl: "hsl(294.7,72.4%,39.8%)", - }, - { - scale: 800, - hex: "#86198f", - rgb: "rgb(134,25,143)", - hsl: "hsl(295.4,70.2%,32.9%)", - }, - { - scale: 900, - hex: "#701a75", - rgb: "rgb(112,26,117)", - hsl: "hsl(296.7,63.6%,28%)", - }, - { - scale: 950, - hex: "#4a044e", - rgb: "rgb(74,4,78)", - hsl: "hsl(296.8,90.2%,16.1%)", - }, - ], - pink: [ - { - scale: 50, - hex: "#fdf2f8", - rgb: "rgb(253,242,248)", - hsl: "hsl(327.3,73.3%,97.1%)", - }, - { - scale: 100, - hex: "#fce7f3", - rgb: "rgb(252,231,243)", - hsl: "hsl(325.7,77.8%,94.7%)", - }, - { - scale: 200, - hex: "#fbcfe8", - rgb: "rgb(251,207,232)", - hsl: "hsl(325.9,84.6%,89.8%)", - }, - { - scale: 300, - hex: "#f9a8d4", - rgb: "rgb(249,168,212)", - hsl: "hsl(327.4,87.1%,81.8%)", - }, - { - scale: 400, - hex: "#f472b6", - rgb: "rgb(244,114,182)", - hsl: "hsl(328.6,85.5%,70.2%)", - }, - { - scale: 500, - hex: "#ec4899", - rgb: "rgb(236,72,153)", - hsl: "hsl(330.4,81.2%,60.4%)", - }, - { - scale: 600, - hex: "#db2777", - rgb: "rgb(219,39,119)", - hsl: "hsl(333.3,71.4%,50.6%)", - }, - { - scale: 700, - hex: "#be185d", - rgb: "rgb(190,24,93)", - hsl: "hsl(335.1,77.6%,42%)", - }, - { - scale: 800, - hex: "#9d174d", - rgb: "rgb(157,23,77)", - hsl: "hsl(335.8,74.4%,35.3%)", - }, - { - scale: 900, - hex: "#831843", - rgb: "rgb(131,24,67)", - hsl: "hsl(335.9,69%,30.4%)", - }, - { - scale: 950, - hex: "#500724", - rgb: "rgb(80,7,36)", - hsl: "hsl(336.2,83.9%,17.1%)", - }, - ], - rose: [ - { - scale: 50, - hex: "#fff1f2", - rgb: "rgb(255,241,242)", - hsl: "hsl(355.7,100%,97.3%)", - }, - { - scale: 100, - hex: "#ffe4e6", - rgb: "rgb(255,228,230)", - hsl: "hsl(355.6,100%,94.7%)", - }, - { - scale: 200, - hex: "#fecdd3", - rgb: "rgb(254,205,211)", - hsl: "hsl(352.7,96.1%,90%)", - }, - { - scale: 300, - hex: "#fda4af", - rgb: "rgb(253,164,175)", - hsl: "hsl(352.6,95.7%,81.8%)", - }, - { - scale: 400, - hex: "#fb7185", - rgb: "rgb(251,113,133)", - hsl: "hsl(351.3,94.5%,71.4%)", - }, - { - scale: 500, - hex: "#f43f5e", - rgb: "rgb(244,63,94)", - hsl: "hsl(349.7,89.2%,60.2%)", - }, - { - scale: 600, - hex: "#e11d48", - rgb: "rgb(225,29,72)", - hsl: "hsl(346.8,77.2%,49.8%)", - }, - { - scale: 700, - hex: "#be123c", - rgb: "rgb(190,18,60)", - hsl: "hsl(345.3,82.7%,40.8%)", - }, - { - scale: 800, - hex: "#9f1239", - rgb: "rgb(159,18,57)", - hsl: "hsl(343.4,79.7%,34.7%)", - }, - { - scale: 900, - hex: "#881337", - rgb: "rgb(136,19,55)", - hsl: "hsl(341.5,75.5%,30.4%)", - }, - { - scale: 950, - hex: "#4c0519", - rgb: "rgb(76,5,25)", - hsl: "hsl(343.1,87.7%,15.9%)", - }, - ], -}; - -export const colorMapping = { - light: { - background: "white", - foreground: "{{base}}-950", - card: "white", - "card-foreground": "{{base}}-950", - popover: "white", - "popover-foreground": "{{base}}-950", - primary: "{{base}}-900", - "primary-foreground": "{{base}}-50", - secondary: "{{base}}-100", - "secondary-foreground": "{{base}}-900", - muted: "{{base}}-100", - "muted-foreground": "{{base}}-500", - accent: "{{base}}-100", - "accent-foreground": "{{base}}-900", - destructive: "red-500", - "destructive-foreground": "{{base}}-50", - border: "{{base}}-200", - input: "{{base}}-200", - ring: "{{base}}-950", - "chart-1": "12 76% 61%", - "chart-2": "173 58% 39%", - "chart-3": "197 37% 24%", - "chart-4": "43 74% 66%", - "chart-5": "27 87% 67%", - }, - dark: { - background: "{{base}}-950", - foreground: "{{base}}-50", - card: "{{base}}-950", - "card-foreground": "{{base}}-50", - popover: "{{base}}-950", - "popover-foreground": "{{base}}-50", - primary: "{{base}}-50", - "primary-foreground": "{{base}}-900", - secondary: "{{base}}-800", - "secondary-foreground": "{{base}}-50", - muted: "{{base}}-800", - "muted-foreground": "{{base}}-400", - accent: "{{base}}-800", - "accent-foreground": "{{base}}-50", - destructive: "red-900", - "destructive-foreground": "{{base}}-50", - border: "{{base}}-800", - input: "{{base}}-800", - ring: "{{base}}-300", - "chart-1": "220 70% 50%", - "chart-2": "160 60% 45%", - "chart-3": "30 80% 55%", - "chart-4": "280 65% 60%", - "chart-5": "340 75% 55%", - }, -} as const; diff --git a/registry/registry-hooks.ts b/registry/registry-hooks.ts deleted file mode 100644 index 26760f8c1..000000000 --- a/registry/registry-hooks.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Registry } from "@/registry/schema"; - -export const hooks: Registry = []; diff --git a/registry/registry-lib.ts b/registry/registry-lib.ts deleted file mode 100644 index 1f6d12629..000000000 --- a/registry/registry-lib.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Registry } from "@/registry/schema"; - -export const lib: Registry = [ - { - name: "utils", - type: "registry:lib", - dependencies: ["clsx", "tailwind-merge"], - files: [ - { - path: "lib/utils.ts", - type: "registry:lib", - }, - ], - }, -]; diff --git a/registry/registry-styles.ts b/registry/registry-styles.ts deleted file mode 100644 index 34402da0c..000000000 --- a/registry/registry-styles.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const styles = [ - { - name: "default", - label: "Default", - }, -] as const; - -export type Style = (typeof styles)[number]; diff --git a/registry/registry-themes.ts b/registry/registry-themes.ts deleted file mode 100644 index ab2cd1c27..000000000 --- a/registry/registry-themes.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Registry } from "./schema"; - -export const themes: Registry = []; diff --git a/registry/schema.ts b/registry/schema.ts deleted file mode 100644 index 78339a8f7..000000000 --- a/registry/schema.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { z } from "zod"; - -export const blockChunkSchema = z.object({ - name: z.string(), - description: z.string(), - component: z.any(), - file: z.string(), - code: z.string().optional(), - container: z - .object({ - className: z.string().nullish(), - }) - .optional(), -}); - -export const registryItemTypeSchema = z.enum([ - "registry:style", - "registry:lib", - "registry:example", - "registry:block", - "registry:component", - "registry:ui", - "registry:hook", - "registry:theme", - "registry:page", -]); - -export const registryItemFileSchema = z.union([ - z.string(), - z.object({ - path: z.string(), - content: z.string().optional(), - type: registryItemTypeSchema, - target: z.string().optional(), - }), -]); - -export const registryItemTailwindSchema = z.object({ - config: z.object({ - content: z.array(z.string()).optional(), - theme: z.record(z.string(), z.any()).optional(), - plugins: z.array(z.string()).optional(), - }), -}); - -export const registryItemCssVarsSchema = z.object({ - light: z.record(z.string(), z.string()).optional(), - dark: z.record(z.string(), z.string()).optional(), -}); - -export const registryEntrySchema = z.object({ - name: z.string(), - type: registryItemTypeSchema, - description: z.string().optional(), - dependencies: z.array(z.string()).optional(), - devDependencies: z.array(z.string()).optional(), - registryDependencies: z.array(z.string()).optional(), - files: z.array(registryItemFileSchema).optional(), - tailwind: registryItemTailwindSchema.optional(), - cssVars: registryItemCssVarsSchema.optional(), - source: z.string().optional(), - category: z.string().optional(), - subcategory: z.string().optional(), - chunks: z.array(blockChunkSchema).optional(), - docs: z.string().optional(), -}); - -export const registrySchema = z.array(registryEntrySchema); - -export type RegistryEntry = z.infer; - -export type Registry = z.infer; - -export const blockSchema = registryEntrySchema.extend({ - type: z.literal("registry:block"), - style: z.enum(["default"]), - component: z.any(), - container: z - .object({ - height: z.string().nullish(), - className: z.string().nullish(), - }) - .optional(), - code: z.string(), - highlightedCode: z.string(), -}); - -export type Block = z.infer; - -export type BlockChunk = z.infer; diff --git a/tsconfig.json b/tsconfig.json index 8005167fd..4e6abb1ec 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,10 +29,10 @@ "./*" ], "@/components/magicui/*": [ - "./registry/default/magicui/*" + "registry/magicui/*" ], "@/components/example/*": [ - "./registry/default/example/*" + "registry/example/*" ], "content-collections": ["./.content-collections/generated"] } @@ -48,7 +48,5 @@ "node_modules", "packages/**/*", "scripts/**/*", - "scripts/build-registry.ts", - "__registry__" ] } \ No newline at end of file From 75e283bb79cf2124f1bdb7003e584e2e8b81e965 Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 13:33:27 -0500 Subject: [PATCH 2/8] fix: get previews working --- __registry__/index.tsx | 6009 +++++++++++------ app/registry/[name]/route.ts | 57 + components/component-preview.tsx | 38 +- components/component-wrapper.tsx | 26 +- next.config.mjs | 22 - package.json | 4 +- pnpm-lock.yaml | 13 +- public/r/index.json | 22 + registry.json | 1397 ++-- registry/example/magic-card-demo.tsx | 2 + registry/magicui/confetti.tsx | 2 + registry/magicui/cool-mode.tsx | 4 +- registry/magicui/interactive-grid-pattern.tsx | 2 + registry/magicui/scratch-to-reveal.tsx | 1 + registry/registry-examples.ts | 401 +- registry/registry-lib.ts | 15 + registry/registry-ui.ts | 143 +- scripts/build-registry.mts | 851 +-- tsconfig.json | 14 +- 19 files changed, 5243 insertions(+), 3780 deletions(-) create mode 100644 app/registry/[name]/route.ts create mode 100644 public/r/index.json create mode 100644 registry/registry-lib.ts diff --git a/__registry__/index.tsx b/__registry__/index.tsx index 0bdcc223d..328627c1b 100644 --- a/__registry__/index.tsx +++ b/__registry__/index.tsx @@ -1,2201 +1,3824 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-explicit-any */ // @ts-nocheck // This file is autogenerated by scripts/build-registry.ts // Do not edit this file directly. import * as React from "react"; export const Index: Record = { - default: { - "magic-card": { - name: "magic-card", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/magic-card.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/magic-card.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - android: { - name: "android", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/android.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/android.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "warp-background": { - name: "warp-background", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/warp-background.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/warp-background.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "line-shadow-text": { - name: "line-shadow-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/line-shadow-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/line-shadow-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - terminal: { - name: "terminal", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/terminal.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/terminal.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "aurora-text": { - name: "aurora-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/aurora-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/aurora-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "morphing-text": { - name: "morphing-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/morphing-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/morphing-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scroll-progress": { - name: "scroll-progress", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/scroll-progress.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/scroll-progress.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "neon-gradient-card": { - name: "neon-gradient-card", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/neon-gradient-card.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/neon-gradient-card.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - meteors: { - name: "meteors", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/meteors.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/meteors.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "grid-pattern": { - name: "grid-pattern", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/grid-pattern.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/grid-pattern.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "interactive-grid-pattern": { - name: "interactive-grid-pattern", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/interactive-grid-pattern.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/interactive-grid-pattern.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dot-pattern": { - name: "dot-pattern", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/dot-pattern.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/dot-pattern.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "flickering-grid": { - name: "flickering-grid", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/flickering-grid.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/flickering-grid.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "hero-video-dialog": { - name: "hero-video-dialog", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/hero-video-dialog.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/hero-video-dialog.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "code-comparison": { - name: "code-comparison", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/code-comparison.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/code-comparison.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "script-copy-btn": { - name: "script-copy-btn", - type: "registry:ui", - registryDependencies: ["button"], - files: ["registry/default/magicui/script-copy-btn.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/script-copy-btn.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - marquee: { - name: "marquee", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/marquee.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/marquee.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - globe: { - name: "globe", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/globe.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/globe.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shimmer-button": { - name: "shimmer-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/shimmer-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/shimmer-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "tweet-card": { - name: "tweet-card", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/tweet-card.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/tweet-card.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "client-tweet-card": { - name: "client-tweet-card", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/client-tweet-card.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/client-tweet-card.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "bento-grid": { - name: "bento-grid", - type: "registry:ui", - registryDependencies: ["button"], - files: ["registry/default/magicui/bento-grid.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/bento-grid.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - particles: { - name: "particles", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/particles.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/particles.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "number-ticker": { - name: "number-ticker", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/number-ticker.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/number-ticker.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - ripple: { - name: "ripple", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/ripple.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/ripple.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "retro-grid": { - name: "retro-grid", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/retro-grid.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/retro-grid.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-list": { - name: "animated-list", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-list.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/animated-list.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-shiny-text": { - name: "animated-shiny-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-shiny-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/animated-shiny-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-grid-pattern": { - name: "animated-grid-pattern", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-grid-pattern.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/animated-grid-pattern.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "border-beam": { - name: "border-beam", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/border-beam.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/border-beam.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam": { - name: "animated-beam", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-beam.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/animated-beam.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-reveal": { - name: "text-reveal", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/text-reveal.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/text-reveal.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "hyper-text": { - name: "hyper-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/hyper-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/hyper-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-gradient-text": { - name: "animated-gradient-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-gradient-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/animated-gradient-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "orbiting-circles": { - name: "orbiting-circles", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/orbiting-circles.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/orbiting-circles.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - dock: { - name: "dock", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/dock.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/dock.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "word-rotate": { - name: "word-rotate", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/word-rotate.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/word-rotate.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "avatar-circles": { - name: "avatar-circles", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/avatar-circles.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/avatar-circles.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "typing-animation": { - name: "typing-animation", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/typing-animation.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/typing-animation.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "sparkles-text": { - name: "sparkles-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/sparkles-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/sparkles-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "flip-text": { - name: "flip-text", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/flip-text.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/flip-text.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "icon-cloud": { - name: "icon-cloud", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/icon-cloud.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/icon-cloud.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate": { - name: "text-animate", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/text-animate.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/text-animate.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scroll-based-velocity": { - name: "scroll-based-velocity", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/scroll-based-velocity.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/scroll-based-velocity.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scratch-to-reveal": { - name: "scratch-to-reveal", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/scratch-to-reveal.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/scratch-to-reveal.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shiny-button": { - name: "shiny-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/shiny-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/shiny-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "box-reveal": { - name: "box-reveal", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/box-reveal.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/box-reveal.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shine-border": { - name: "shine-border", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/shine-border.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/shine-border.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-circular-progress-bar": { - name: "animated-circular-progress-bar", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-circular-progress-bar.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/magicui/animated-circular-progress-bar.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - confetti: { - name: "confetti", - type: "registry:ui", - registryDependencies: ["button"], - files: ["registry/default/magicui/confetti.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/confetti.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-subscribe-button": { - name: "animated-subscribe-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/animated-subscribe-button.tsx"], - component: React.lazy( - () => - import("@/registry/default/magicui/animated-subscribe-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "cool-mode": { - name: "cool-mode", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/cool-mode.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/cool-mode.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "pulsating-button": { - name: "pulsating-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/pulsating-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/pulsating-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "ripple-button": { - name: "ripple-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/ripple-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/ripple-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "file-tree": { - name: "file-tree", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/file-tree.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/file-tree.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "blur-fade": { - name: "blur-fade", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/blur-fade.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/blur-fade.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - safari: { - name: "safari", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/safari.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/safari.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "iphone-15-pro": { - name: "iphone-15-pro", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/iphone-15-pro.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/iphone-15-pro.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "rainbow-button": { - name: "rainbow-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/rainbow-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/rainbow-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "interactive-hover-button": { - name: "interactive-hover-button", - type: "registry:ui", - registryDependencies: undefined, - files: ["registry/default/magicui/interactive-hover-button.tsx"], - component: React.lazy( - () => import("@/registry/default/magicui/interactive-hover-button.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "magic-card-demo": { - name: "magic-card-demo", - type: "registry:example", - registryDependencies: ["magic-card"], - files: ["registry/default/example/magic-card-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/magic-card-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "android-demo": { - name: "android-demo", - type: "registry:example", - registryDependencies: ["android"], - files: ["registry/default/example/android-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/android-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "android-demo-2": { - name: "android-demo-2", - type: "registry:example", - registryDependencies: ["android"], - files: ["registry/default/example/android-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/android-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "android-demo-3": { - name: "android-demo-3", - type: "registry:example", - registryDependencies: ["android"], - files: ["registry/default/example/android-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/android-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "warp-background-demo": { - name: "warp-background-demo", - type: "registry:example", - registryDependencies: ["warp-background"], - files: ["registry/default/example/warp-background-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/warp-background-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "line-shadow-text-demo": { - name: "line-shadow-text-demo", - type: "registry:example", - registryDependencies: ["line-shadow-text"], - files: ["registry/default/example/line-shadow-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/line-shadow-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "aurora-text-demo": { - name: "aurora-text-demo", - type: "registry:example", - registryDependencies: ["aurora-text"], - files: ["registry/default/example/aurora-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/aurora-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "terminal-demo": { - name: "terminal-demo", - type: "registry:example", - registryDependencies: ["terminal"], - files: ["registry/default/example/terminal-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/terminal-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "morphing-text-demo": { - name: "morphing-text-demo", - type: "registry:example", - registryDependencies: ["morphing-text"], - files: ["registry/default/example/morphing-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/morphing-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scroll-progress-demo": { - name: "scroll-progress-demo", - type: "registry:example", - registryDependencies: ["scroll-progress"], - files: ["registry/default/example/scroll-progress-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/scroll-progress-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "neon-gradient-card-demo": { - name: "neon-gradient-card-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/neon-gradient-card-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/neon-gradient-card-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "meteors-demo": { - name: "meteors-demo", - type: "registry:example", - registryDependencies: ["meteors"], - files: ["registry/default/example/meteors-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/meteors-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "grid-pattern-demo": { - name: "grid-pattern-demo", - type: "registry:example", - registryDependencies: ["grid-pattern"], - files: ["registry/default/example/grid-pattern-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/grid-pattern-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "grid-pattern-linear-gradient": { - name: "grid-pattern-linear-gradient", - type: "registry:example", - registryDependencies: ["grid-pattern"], - files: ["registry/default/example/grid-pattern-linear-gradient.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/grid-pattern-linear-gradient.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "grid-pattern-dashed": { - name: "grid-pattern-dashed", - type: "registry:example", - registryDependencies: ["grid-pattern"], - files: ["registry/default/example/grid-pattern-dashed.tsx"], - component: React.lazy( - () => import("@/registry/default/example/grid-pattern-dashed.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dot-pattern-demo": { - name: "dot-pattern-demo", - type: "registry:example", - registryDependencies: ["dot-pattern"], - files: ["registry/default/example/dot-pattern-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/dot-pattern-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dot-pattern-linear-gradient": { - name: "dot-pattern-linear-gradient", - type: "registry:example", - registryDependencies: ["dot-pattern"], - files: ["registry/default/example/dot-pattern-linear-gradient.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/dot-pattern-linear-gradient.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "flickering-grid-demo": { - name: "flickering-grid-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/flickering-grid-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/flickering-grid-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "flickering-grid-rounded-demo": { - name: "flickering-grid-rounded-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/flickering-grid-rounded-demo.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/flickering-grid-rounded-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "hero-video-dialog-demo": { - name: "hero-video-dialog-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/hero-video-dialog-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/hero-video-dialog-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "hero-video-dialog-demo-top-in-bottom-out": { - name: "hero-video-dialog-demo-top-in-bottom-out", - type: "registry:example", - registryDependencies: undefined, - files: [ - "registry/default/example/hero-video-dialog-demo-top-in-bottom-out.tsx", - ], - component: React.lazy( - () => - import( - "@/registry/default/example/hero-video-dialog-demo-top-in-bottom-out.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "code-comparison-demo": { - name: "code-comparison-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/code-comparison-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/code-comparison-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "script-copy-btn-demo": { - name: "script-copy-btn-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/script-copy-btn-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/script-copy-btn-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "marquee-demo": { - name: "marquee-demo", - type: "registry:example", - registryDependencies: ["marquee"], - files: ["registry/default/example/marquee-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/marquee-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "marquee-demo-vertical": { - name: "marquee-demo-vertical", - type: "registry:example", - registryDependencies: ["marquee"], - files: ["registry/default/example/marquee-demo-vertical.tsx"], - component: React.lazy( - () => import("@/registry/default/example/marquee-demo-vertical.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "marquee-logos": { - name: "marquee-logos", - type: "registry:example", - registryDependencies: ["marquee"], - files: ["registry/default/example/marquee-logos.tsx"], - component: React.lazy( - () => import("@/registry/default/example/marquee-logos.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "marquee-3d": { - name: "marquee-3d", - type: "registry:example", - registryDependencies: ["marquee"], - files: ["registry/default/example/marquee-3d.tsx"], - component: React.lazy( - () => import("@/registry/default/example/marquee-3d.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "globe-demo": { - name: "globe-demo", - type: "registry:example", - registryDependencies: ["globe"], - files: ["registry/default/example/globe-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/globe-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "tweet-card-demo": { - name: "tweet-card-demo", - type: "registry:example", - registryDependencies: ["tweet-card"], - files: ["registry/default/example/tweet-card-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/tweet-card-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "tweet-card-images": { - name: "tweet-card-images", - type: "registry:example", - registryDependencies: ["tweet-card"], - files: ["registry/default/example/tweet-card-images.tsx"], - component: React.lazy( - () => import("@/registry/default/example/tweet-card-images.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "tweet-card-meta-preview": { - name: "tweet-card-meta-preview", - type: "registry:example", - registryDependencies: ["tweet-card"], - files: ["registry/default/example/tweet-card-meta-preview.tsx"], - component: React.lazy( - () => import("@/registry/default/example/tweet-card-meta-preview.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shimmer-button-demo": { - name: "shimmer-button-demo", - type: "registry:example", - registryDependencies: ["shimmer-button"], - files: ["registry/default/example/shimmer-button-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/shimmer-button-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "bento-demo": { - name: "bento-demo", - type: "registry:example", - registryDependencies: [ - "bento-grid", - "marquee", - "animated-list-demo", - "animated-beam-multiple-outputs", - "shadcn:command", - "shadcn:calendar", - ], - files: ["registry/default/example/bento-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/bento-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "bento-demo-vertical": { - name: "bento-demo-vertical", - type: "registry:example", - registryDependencies: ["bento-grid"], - files: ["registry/default/example/bento-demo-vertical.tsx"], - component: React.lazy( - () => import("@/registry/default/example/bento-demo-vertical.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "number-ticker-demo": { - name: "number-ticker-demo", - type: "registry:example", - registryDependencies: ["number-ticker"], - files: ["registry/default/example/number-ticker-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/number-ticker-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "number-ticker-decimal-demo": { - name: "number-ticker-decimal-demo", - type: "registry:example", - registryDependencies: ["number-ticker"], - files: ["registry/default/example/number-ticker-decimal-demo.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/number-ticker-decimal-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "ripple-demo": { - name: "ripple-demo", - type: "registry:example", - registryDependencies: ["ripple"], - files: ["registry/default/example/ripple-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/ripple-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "retro-grid-demo": { - name: "retro-grid-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/retro-grid-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/retro-grid-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-list-demo": { - name: "animated-list-demo", - type: "registry:example", - registryDependencies: ["animated-list"], - files: ["registry/default/example/animated-list-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/animated-list-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-shiny-text-demo": { - name: "animated-shiny-text-demo", - type: "registry:example", - registryDependencies: ["animated-shiny-text"], - files: ["registry/default/example/animated-shiny-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/animated-shiny-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "particles-demo": { - name: "particles-demo", - type: "registry:example", - registryDependencies: ["particles"], - files: ["registry/default/example/particles-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/particles-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-grid-pattern-demo": { - name: "animated-grid-pattern-demo", - type: "registry:example", - registryDependencies: ["animated-grid-pattern"], - files: ["registry/default/example/animated-grid-pattern-demo.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/animated-grid-pattern-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "interactive-grid-pattern-demo": { - name: "interactive-grid-pattern-demo", - type: "registry:example", - registryDependencies: ["interactive-grid-pattern"], - files: ["registry/default/example/interactive-grid-pattern-demo.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/interactive-grid-pattern-demo.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "interactive-grid-pattern-demo-2": { - name: "interactive-grid-pattern-demo-2", - type: "registry:example", - registryDependencies: ["interactive-grid-pattern"], - files: ["registry/default/example/interactive-grid-pattern-demo-2.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/interactive-grid-pattern-demo-2.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "border-beam-demo": { - name: "border-beam-demo", - type: "registry:example", - registryDependencies: ["border-beam"], - files: ["registry/default/example/border-beam-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/border-beam-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam-demo": { - name: "animated-beam-demo", - type: "registry:example", - registryDependencies: ["animated-beam"], - files: ["registry/default/example/animated-beam-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/animated-beam-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam-unidirectional": { - name: "animated-beam-unidirectional", - type: "registry:example", - registryDependencies: ["animated-beam"], - files: ["registry/default/example/animated-beam-unidirectional.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/animated-beam-unidirectional.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam-bidirectional": { - name: "animated-beam-bidirectional", - type: "registry:example", - registryDependencies: ["animated-beam"], - files: ["registry/default/example/animated-beam-bidirectional.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/animated-beam-bidirectional.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam-multiple-inputs": { - name: "animated-beam-multiple-inputs", - type: "registry:example", - registryDependencies: ["animated-beam"], - files: ["registry/default/example/animated-beam-multiple-inputs.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/animated-beam-multiple-inputs.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-beam-multiple-outputs": { - name: "animated-beam-multiple-outputs", - type: "registry:example", - registryDependencies: ["animated-beam"], - files: ["registry/default/example/animated-beam-multiple-outputs.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/animated-beam-multiple-outputs.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-reveal-demo": { - name: "text-reveal-demo", - type: "registry:example", - registryDependencies: ["text-reveal"], - files: ["registry/default/example/text-reveal-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-reveal-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-gradient-text-demo": { - name: "animated-gradient-text-demo", - type: "registry:example", - registryDependencies: ["animated-gradient-text"], - files: ["registry/default/example/animated-gradient-text-demo.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/animated-gradient-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "orbiting-circles-demo": { - name: "orbiting-circles-demo", - type: "registry:example", - registryDependencies: ["orbiting-circles"], - files: ["registry/default/example/orbiting-circles-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/orbiting-circles-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dock-demo": { - name: "dock-demo", - type: "registry:example", - registryDependencies: ["dock"], - files: ["registry/default/example/dock-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/dock-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dock-demo-2": { - name: "dock-demo-2", - type: "registry:example", - registryDependencies: ["dock"], - files: ["registry/default/example/dock-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/dock-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "dock-demo-3": { - name: "dock-demo-3", - type: "registry:example", - registryDependencies: ["dock"], - files: ["registry/default/example/dock-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/dock-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "word-rotate-demo": { - name: "word-rotate-demo", - type: "registry:example", - registryDependencies: ["word-rotate"], - files: ["registry/default/example/word-rotate-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/word-rotate-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "hyper-text-demo": { - name: "hyper-text-demo", - type: "registry:example", - registryDependencies: ["hyper-text"], - files: ["registry/default/example/hyper-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/hyper-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "avatar-circles-demo": { - name: "avatar-circles-demo", - type: "registry:example", - registryDependencies: ["avatar-circles"], - files: ["registry/default/example/avatar-circles-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/avatar-circles-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "typing-animation-demo": { - name: "typing-animation-demo", - type: "registry:example", - registryDependencies: ["typing-animation"], - files: ["registry/default/example/typing-animation-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/typing-animation-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scroll-based-velocity-demo": { - name: "scroll-based-velocity-demo", - type: "registry:example", - registryDependencies: ["scroll-based-velocity"], - files: ["registry/default/example/scroll-based-velocity-demo.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/scroll-based-velocity-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "scratch-to-reveal-demo": { - name: "scratch-to-reveal-demo", - type: "registry:example", - registryDependencies: ["scratch-to-reveal"], - files: ["registry/default/example/scratch-to-reveal-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/scratch-to-reveal-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "flip-text-demo": { - name: "flip-text-demo", - type: "registry:example", - registryDependencies: ["flip-text"], - files: ["registry/default/example/flip-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/flip-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "sparkles-text-demo": { - name: "sparkles-text-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/sparkles-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/sparkles-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "icon-cloud-demo": { - name: "icon-cloud-demo", - type: "registry:example", - registryDependencies: ["icon-cloud"], - files: ["registry/default/example/icon-cloud-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/icon-cloud-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "icon-cloud-demo-2": { - name: "icon-cloud-demo-2", - type: "registry:example", - registryDependencies: ["icon-cloud"], - files: ["registry/default/example/icon-cloud-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/icon-cloud-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "icon-cloud-demo-3": { - name: "icon-cloud-demo-3", - type: "registry:example", - registryDependencies: ["icon-cloud"], - files: ["registry/default/example/icon-cloud-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/icon-cloud-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo": { - name: "text-animate-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo-2": { - name: "text-animate-demo-2", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo-3": { - name: "text-animate-demo-3", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo-4": { - name: "text-animate-demo-4", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo-4.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo-4.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo-5": { - name: "text-animate-demo-5", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo-5.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo-5.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "text-animate-demo-6": { - name: "text-animate-demo-6", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/text-animate-demo-6.tsx"], - component: React.lazy( - () => import("@/registry/default/example/text-animate-demo-6.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shiny-button-demo": { - name: "shiny-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/shiny-button-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/shiny-button-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "box-reveal-demo": { - name: "box-reveal-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/box-reveal-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/box-reveal-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-circular-progress-bar-demo": { - name: "animated-circular-progress-bar-demo", - type: "registry:example", - registryDependencies: undefined, - files: [ - "registry/default/example/animated-circular-progress-bar-demo.tsx", - ], - component: React.lazy( - () => - import( - "@/registry/default/example/animated-circular-progress-bar-demo.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shine-border-demo": { - name: "shine-border-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/shine-border-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/shine-border-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "shine-border-demo-2": { - name: "shine-border-demo-2", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/shine-border-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/shine-border-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-demo": { - name: "confetti-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-basic-cannon": { - name: "confetti-basic-cannon", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-basic-cannon.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-basic-cannon.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-random-direction": { - name: "confetti-random-direction", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-random-direction.tsx"], - component: React.lazy( - () => - import("@/registry/default/example/confetti-random-direction.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-fireworks": { - name: "confetti-fireworks", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-fireworks.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-fireworks.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-stars": { - name: "confetti-stars", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-stars.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-stars.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-side-cannons": { - name: "confetti-side-cannons", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-side-cannons.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-side-cannons.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-custom-shapes": { - name: "confetti-custom-shapes", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-custom-shapes.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-custom-shapes.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "confetti-emoji": { - name: "confetti-emoji", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/confetti-emoji.tsx"], - component: React.lazy( - () => import("@/registry/default/example/confetti-emoji.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "animated-subscribe-button-demo": { - name: "animated-subscribe-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/animated-subscribe-button-demo.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/animated-subscribe-button-demo.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "cool-mode-demo": { - name: "cool-mode-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/cool-mode-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/cool-mode-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "cool-mode-custom": { - name: "cool-mode-custom", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/cool-mode-custom.tsx"], - component: React.lazy( - () => import("@/registry/default/example/cool-mode-custom.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "pulsating-button-demo": { - name: "pulsating-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/pulsating-button-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/pulsating-button-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "ripple-button-demo": { - name: "ripple-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/ripple-button-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/ripple-button-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "file-tree-demo": { - name: "file-tree-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/file-tree-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/file-tree-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "blur-fade-demo": { - name: "blur-fade-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/blur-fade-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/blur-fade-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "blur-fade-text-demo": { - name: "blur-fade-text-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/blur-fade-text-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/blur-fade-text-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "safari-demo": { - name: "safari-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/safari-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/safari-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "safari-demo-2": { - name: "safari-demo-2", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/safari-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/safari-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "safari-demo-3": { - name: "safari-demo-3", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/safari-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/safari-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "safari-demo-4": { - name: "safari-demo-4", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/safari-demo-4.tsx"], - component: React.lazy( - () => import("@/registry/default/example/safari-demo-4.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "iphone-15-pro-demo": { - name: "iphone-15-pro-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/iphone-15-pro-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/iphone-15-pro-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "iphone-15-pro-demo-2": { - name: "iphone-15-pro-demo-2", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/iphone-15-pro-demo-2.tsx"], - component: React.lazy( - () => import("@/registry/default/example/iphone-15-pro-demo-2.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "iphone-15-pro-demo-3": { - name: "iphone-15-pro-demo-3", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/iphone-15-pro-demo-3.tsx"], - component: React.lazy( - () => import("@/registry/default/example/iphone-15-pro-demo-3.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "rainbow-button-demo": { - name: "rainbow-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/rainbow-button-demo.tsx"], - component: React.lazy( - () => import("@/registry/default/example/rainbow-button-demo.tsx"), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - "interactive-hover-button-demo": { - name: "interactive-hover-button-demo", - type: "registry:example", - registryDependencies: undefined, - files: ["registry/default/example/interactive-hover-button-demo.tsx"], - component: React.lazy( - () => - import( - "@/registry/default/example/interactive-hover-button-demo.tsx" - ), - ), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, - utils: { - name: "utils", - type: "registry:lib", - registryDependencies: undefined, - files: ["registry/default/lib/utils.ts"], - component: React.lazy(() => import("@/registry/default/lib/utils.ts")), - source: "", - category: "undefined", - subcategory: "undefined", - chunks: [], - }, + index: { + name: "index", + description: "", + type: "registry:style", + registryDependencies: ["utils"], + files: [], + component: null, + meta: undefined, + }, + "magic-card": { + name: "magic-card", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/magic-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/magic-card.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + android: { + name: "android", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/android.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/android.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "warp-background": { + name: "warp-background", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/warp-background.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/warp-background.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "line-shadow-text": { + name: "line-shadow-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/line-shadow-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/line-shadow-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "aurora-text": { + name: "aurora-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/aurora-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/aurora-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "morphing-text": { + name: "morphing-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/morphing-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/morphing-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scroll-progress": { + name: "scroll-progress", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/scroll-progress.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/scroll-progress.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "neon-gradient-card": { + name: "neon-gradient-card", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/neon-gradient-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/neon-gradient-card.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + meteors: { + name: "meteors", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/meteors.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/meteors.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "grid-pattern": { + name: "grid-pattern", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/grid-pattern.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/grid-pattern.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "interactive-grid-pattern": { + name: "interactive-grid-pattern", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/interactive-grid-pattern.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/magicui/interactive-grid-pattern.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dot-pattern": { + name: "dot-pattern", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/dot-pattern.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/dot-pattern.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "flickering-grid": { + name: "flickering-grid", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/flickering-grid.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/flickering-grid.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "hero-video-dialog": { + name: "hero-video-dialog", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/hero-video-dialog.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/hero-video-dialog.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "code-comparison": { + name: "code-comparison", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/code-comparison.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/code-comparison.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "script-copy-btn": { + name: "script-copy-btn", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/magicui/script-copy-btn.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/script-copy-btn.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + marquee: { + name: "marquee", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/marquee.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/marquee.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + globe: { + name: "globe", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/globe.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/globe.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shimmer-button": { + name: "shimmer-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/shimmer-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/shimmer-button.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "tweet-card": { + name: "tweet-card", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/tweet-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/tweet-card.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "client-tweet-card": { + name: "client-tweet-card", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/client-tweet-card.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/client-tweet-card.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "bento-grid": { + name: "bento-grid", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/magicui/bento-grid.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/bento-grid.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + particles: { + name: "particles", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/particles.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/particles.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "number-ticker": { + name: "number-ticker", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/number-ticker.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/number-ticker.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + ripple: { + name: "ripple", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/ripple.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/ripple.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "retro-grid": { + name: "retro-grid", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/retro-grid.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/retro-grid.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-list": { + name: "animated-list", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-list.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/animated-list.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-shiny-text": { + name: "animated-shiny-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-shiny-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/animated-shiny-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-grid-pattern": { + name: "animated-grid-pattern", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-grid-pattern.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/animated-grid-pattern.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "border-beam": { + name: "border-beam", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/border-beam.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/border-beam.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam": { + name: "animated-beam", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-beam.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/animated-beam.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-reveal": { + name: "text-reveal", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/text-reveal.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/text-reveal.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "hyper-text": { + name: "hyper-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/hyper-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/hyper-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-gradient-text": { + name: "animated-gradient-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-gradient-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/animated-gradient-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "orbiting-circles": { + name: "orbiting-circles", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/orbiting-circles.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/orbiting-circles.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + dock: { + name: "dock", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/dock.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/dock.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "word-rotate": { + name: "word-rotate", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/word-rotate.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/word-rotate.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "avatar-circles": { + name: "avatar-circles", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/avatar-circles.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/avatar-circles.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "typing-animation": { + name: "typing-animation", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/typing-animation.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/typing-animation.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "sparkles-text": { + name: "sparkles-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/sparkles-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/sparkles-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "flip-text": { + name: "flip-text", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/flip-text.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/flip-text.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "icon-cloud": { + name: "icon-cloud", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/icon-cloud.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/icon-cloud.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate": { + name: "text-animate", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/text-animate.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/text-animate.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scroll-based-velocity": { + name: "scroll-based-velocity", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/scroll-based-velocity.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/scroll-based-velocity.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scratch-to-reveal": { + name: "scratch-to-reveal", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/scratch-to-reveal.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/scratch-to-reveal.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shiny-button": { + name: "shiny-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/shiny-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/shiny-button.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "box-reveal": { + name: "box-reveal", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/box-reveal.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/box-reveal.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shine-border": { + name: "shine-border", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/shine-border.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/shine-border.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-circular-progress-bar": { + name: "animated-circular-progress-bar", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-circular-progress-bar.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/magicui/animated-circular-progress-bar.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + confetti: { + name: "confetti", + description: "", + type: "registry:ui", + registryDependencies: ["button"], + files: [ + { + path: "registry/magicui/confetti.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/confetti.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-subscribe-button": { + name: "animated-subscribe-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/animated-subscribe-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/magicui/animated-subscribe-button.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "cool-mode": { + name: "cool-mode", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/cool-mode.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/cool-mode.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "pulsating-button": { + name: "pulsating-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/pulsating-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/pulsating-button.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "ripple-button": { + name: "ripple-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/ripple-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/ripple-button.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "file-tree": { + name: "file-tree", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/file-tree.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/file-tree.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "blur-fade": { + name: "blur-fade", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/blur-fade.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/blur-fade.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + safari: { + name: "safari", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/safari.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/safari.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "iphone-15-pro": { + name: "iphone-15-pro", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/iphone-15-pro.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/iphone-15-pro.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "rainbow-button": { + name: "rainbow-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/rainbow-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/magicui/rainbow-button.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "interactive-hover-button": { + name: "interactive-hover-button", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/magicui/interactive-hover-button.tsx", + type: "registry:ui", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/magicui/interactive-hover-button.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "magic-card-demo": { + name: "magic-card-demo", + description: "", + type: "registry:example", + registryDependencies: ["magic-card"], + files: [ + { + path: "registry/example/magic-card-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/magic-card-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "android-demo": { + name: "android-demo", + description: "", + type: "registry:example", + registryDependencies: ["android"], + files: [ + { + path: "registry/example/android-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/android-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "android-demo-2": { + name: "android-demo-2", + description: "", + type: "registry:example", + registryDependencies: ["android"], + files: [ + { + path: "registry/example/android-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/android-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "android-demo-3": { + name: "android-demo-3", + description: "", + type: "registry:example", + registryDependencies: ["android"], + files: [ + { + path: "registry/example/android-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/android-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "warp-background-demo": { + name: "warp-background-demo", + description: "", + type: "registry:example", + registryDependencies: ["warp-background"], + files: [ + { + path: "registry/example/warp-background-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/warp-background-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "line-shadow-text-demo": { + name: "line-shadow-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["line-shadow-text"], + files: [ + { + path: "registry/example/line-shadow-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/line-shadow-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "aurora-text-demo": { + name: "aurora-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["aurora-text"], + files: [ + { + path: "registry/example/aurora-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/aurora-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "morphing-text-demo": { + name: "morphing-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["morphing-text"], + files: [ + { + path: "registry/example/morphing-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/morphing-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scroll-progress-demo": { + name: "scroll-progress-demo", + description: "", + type: "registry:example", + registryDependencies: ["scroll-progress"], + files: [ + { + path: "registry/example/scroll-progress-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/scroll-progress-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "neon-gradient-card-demo": { + name: "neon-gradient-card-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/neon-gradient-card-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/neon-gradient-card-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "meteors-demo": { + name: "meteors-demo", + description: "", + type: "registry:example", + registryDependencies: ["meteors"], + files: [ + { + path: "registry/example/meteors-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/meteors-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "grid-pattern-demo": { + name: "grid-pattern-demo", + description: "", + type: "registry:example", + registryDependencies: ["grid-pattern"], + files: [ + { + path: "registry/example/grid-pattern-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/grid-pattern-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "grid-pattern-linear-gradient": { + name: "grid-pattern-linear-gradient", + description: "", + type: "registry:example", + registryDependencies: ["grid-pattern"], + files: [ + { + path: "registry/example/grid-pattern-linear-gradient.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/grid-pattern-linear-gradient.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "grid-pattern-dashed": { + name: "grid-pattern-dashed", + description: "", + type: "registry:example", + registryDependencies: ["grid-pattern"], + files: [ + { + path: "registry/example/grid-pattern-dashed.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/grid-pattern-dashed.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dot-pattern-demo": { + name: "dot-pattern-demo", + description: "", + type: "registry:example", + registryDependencies: ["dot-pattern"], + files: [ + { + path: "registry/example/dot-pattern-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/dot-pattern-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dot-pattern-linear-gradient": { + name: "dot-pattern-linear-gradient", + description: "", + type: "registry:example", + registryDependencies: ["dot-pattern"], + files: [ + { + path: "registry/example/dot-pattern-linear-gradient.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/dot-pattern-linear-gradient.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "flickering-grid-demo": { + name: "flickering-grid-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/flickering-grid-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/flickering-grid-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "flickering-grid-rounded-demo": { + name: "flickering-grid-rounded-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/flickering-grid-rounded-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/flickering-grid-rounded-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "hero-video-dialog-demo": { + name: "hero-video-dialog-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/hero-video-dialog-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/hero-video-dialog-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "hero-video-dialog-demo-top-in-bottom-out": { + name: "hero-video-dialog-demo-top-in-bottom-out", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "code-comparison-demo": { + name: "code-comparison-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/code-comparison-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/code-comparison-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "script-copy-btn-demo": { + name: "script-copy-btn-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/script-copy-btn-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/script-copy-btn-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "marquee-demo": { + name: "marquee-demo", + description: "", + type: "registry:example", + registryDependencies: ["marquee"], + files: [ + { + path: "registry/example/marquee-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/marquee-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "marquee-demo-vertical": { + name: "marquee-demo-vertical", + description: "", + type: "registry:example", + registryDependencies: ["marquee"], + files: [ + { + path: "registry/example/marquee-demo-vertical.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/marquee-demo-vertical.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "marquee-logos": { + name: "marquee-logos", + description: "", + type: "registry:example", + registryDependencies: ["marquee"], + files: [ + { + path: "registry/example/marquee-logos.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/marquee-logos.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "marquee-3d": { + name: "marquee-3d", + description: "", + type: "registry:example", + registryDependencies: ["marquee"], + files: [ + { + path: "registry/example/marquee-3d.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/marquee-3d.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "globe-demo": { + name: "globe-demo", + description: "", + type: "registry:example", + registryDependencies: ["globe"], + files: [ + { + path: "registry/example/globe-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/globe-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "tweet-card-demo": { + name: "tweet-card-demo", + description: "", + type: "registry:example", + registryDependencies: ["tweet-card"], + files: [ + { + path: "registry/example/tweet-card-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/tweet-card-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "tweet-card-images": { + name: "tweet-card-images", + description: "", + type: "registry:example", + registryDependencies: ["tweet-card"], + files: [ + { + path: "registry/example/tweet-card-images.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/tweet-card-images.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "tweet-card-meta-preview": { + name: "tweet-card-meta-preview", + description: "", + type: "registry:example", + registryDependencies: ["tweet-card"], + files: [ + { + path: "registry/example/tweet-card-meta-preview.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/tweet-card-meta-preview.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shimmer-button-demo": { + name: "shimmer-button-demo", + description: "", + type: "registry:example", + registryDependencies: ["shimmer-button"], + files: [ + { + path: "registry/example/shimmer-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/shimmer-button-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "bento-demo": { + name: "bento-demo", + description: "", + type: "registry:example", + registryDependencies: [ + "bento-grid", + "marquee", + "animated-list-demo", + "animated-beam-multiple-outputs", + "shadcn:command", + "shadcn:calendar", + ], + files: [ + { + path: "registry/example/bento-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/bento-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "bento-demo-vertical": { + name: "bento-demo-vertical", + description: "", + type: "registry:example", + registryDependencies: ["bento-grid"], + files: [ + { + path: "registry/example/bento-demo-vertical.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/bento-demo-vertical.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "number-ticker-demo": { + name: "number-ticker-demo", + description: "", + type: "registry:example", + registryDependencies: ["number-ticker"], + files: [ + { + path: "registry/example/number-ticker-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/number-ticker-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "number-ticker-decimal-demo": { + name: "number-ticker-decimal-demo", + description: "", + type: "registry:example", + registryDependencies: ["number-ticker"], + files: [ + { + path: "registry/example/number-ticker-decimal-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/number-ticker-decimal-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "ripple-demo": { + name: "ripple-demo", + description: "", + type: "registry:example", + registryDependencies: ["ripple"], + files: [ + { + path: "registry/example/ripple-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/ripple-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "retro-grid-demo": { + name: "retro-grid-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/retro-grid-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/retro-grid-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-list-demo": { + name: "animated-list-demo", + description: "", + type: "registry:example", + registryDependencies: ["animated-list"], + files: [ + { + path: "registry/example/animated-list-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/animated-list-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-shiny-text-demo": { + name: "animated-shiny-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["animated-shiny-text"], + files: [ + { + path: "registry/example/animated-shiny-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-shiny-text-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "particles-demo": { + name: "particles-demo", + description: "", + type: "registry:example", + registryDependencies: ["particles"], + files: [ + { + path: "registry/example/particles-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/particles-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-grid-pattern-demo": { + name: "animated-grid-pattern-demo", + description: "", + type: "registry:example", + registryDependencies: ["animated-grid-pattern"], + files: [ + { + path: "registry/example/animated-grid-pattern-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-grid-pattern-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "interactive-grid-pattern-demo": { + name: "interactive-grid-pattern-demo", + description: "", + type: "registry:example", + registryDependencies: ["interactive-grid-pattern"], + files: [ + { + path: "registry/example/interactive-grid-pattern-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/interactive-grid-pattern-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "interactive-grid-pattern-demo-2": { + name: "interactive-grid-pattern-demo-2", + description: "", + type: "registry:example", + registryDependencies: ["interactive-grid-pattern"], + files: [ + { + path: "registry/example/interactive-grid-pattern-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/interactive-grid-pattern-demo-2.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "border-beam-demo": { + name: "border-beam-demo", + description: "", + type: "registry:example", + registryDependencies: ["border-beam"], + files: [ + { + path: "registry/example/border-beam-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/border-beam-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam-demo": { + name: "animated-beam-demo", + description: "", + type: "registry:example", + registryDependencies: ["animated-beam"], + files: [ + { + path: "registry/example/animated-beam-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/animated-beam-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam-unidirectional": { + name: "animated-beam-unidirectional", + description: "", + type: "registry:example", + registryDependencies: ["animated-beam"], + files: [ + { + path: "registry/example/animated-beam-unidirectional.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-beam-unidirectional.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam-bidirectional": { + name: "animated-beam-bidirectional", + description: "", + type: "registry:example", + registryDependencies: ["animated-beam"], + files: [ + { + path: "registry/example/animated-beam-bidirectional.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-beam-bidirectional.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam-multiple-inputs": { + name: "animated-beam-multiple-inputs", + description: "", + type: "registry:example", + registryDependencies: ["animated-beam"], + files: [ + { + path: "registry/example/animated-beam-multiple-inputs.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-beam-multiple-inputs.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-beam-multiple-outputs": { + name: "animated-beam-multiple-outputs", + description: "", + type: "registry:example", + registryDependencies: ["animated-beam"], + files: [ + { + path: "registry/example/animated-beam-multiple-outputs.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-beam-multiple-outputs.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-reveal-demo": { + name: "text-reveal-demo", + description: "", + type: "registry:example", + registryDependencies: ["text-reveal"], + files: [ + { + path: "registry/example/text-reveal-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-reveal-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-gradient-text-demo": { + name: "animated-gradient-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["animated-gradient-text"], + files: [ + { + path: "registry/example/animated-gradient-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-gradient-text-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "orbiting-circles-demo": { + name: "orbiting-circles-demo", + description: "", + type: "registry:example", + registryDependencies: ["orbiting-circles"], + files: [ + { + path: "registry/example/orbiting-circles-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/orbiting-circles-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dock-demo": { + name: "dock-demo", + description: "", + type: "registry:example", + registryDependencies: ["dock"], + files: [ + { + path: "registry/example/dock-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/dock-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dock-demo-2": { + name: "dock-demo-2", + description: "", + type: "registry:example", + registryDependencies: ["dock"], + files: [ + { + path: "registry/example/dock-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/dock-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "dock-demo-3": { + name: "dock-demo-3", + description: "", + type: "registry:example", + registryDependencies: ["dock"], + files: [ + { + path: "registry/example/dock-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/dock-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "word-rotate-demo": { + name: "word-rotate-demo", + description: "", + type: "registry:example", + registryDependencies: ["word-rotate"], + files: [ + { + path: "registry/example/word-rotate-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/word-rotate-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "hyper-text-demo": { + name: "hyper-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["hyper-text"], + files: [ + { + path: "registry/example/hyper-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/hyper-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "avatar-circles-demo": { + name: "avatar-circles-demo", + description: "", + type: "registry:example", + registryDependencies: ["avatar-circles"], + files: [ + { + path: "registry/example/avatar-circles-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/avatar-circles-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "typing-animation-demo": { + name: "typing-animation-demo", + description: "", + type: "registry:example", + registryDependencies: ["typing-animation"], + files: [ + { + path: "registry/example/typing-animation-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/typing-animation-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scroll-based-velocity-demo": { + name: "scroll-based-velocity-demo", + description: "", + type: "registry:example", + registryDependencies: ["scroll-based-velocity"], + files: [ + { + path: "registry/example/scroll-based-velocity-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/scroll-based-velocity-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "scratch-to-reveal-demo": { + name: "scratch-to-reveal-demo", + description: "", + type: "registry:example", + registryDependencies: ["scratch-to-reveal"], + files: [ + { + path: "registry/example/scratch-to-reveal-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/scratch-to-reveal-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "flip-text-demo": { + name: "flip-text-demo", + description: "", + type: "registry:example", + registryDependencies: ["flip-text"], + files: [ + { + path: "registry/example/flip-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/flip-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "sparkles-text-demo": { + name: "sparkles-text-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/sparkles-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/sparkles-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "icon-cloud-demo": { + name: "icon-cloud-demo", + description: "", + type: "registry:example", + registryDependencies: ["icon-cloud"], + files: [ + { + path: "registry/example/icon-cloud-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/icon-cloud-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "icon-cloud-demo-2": { + name: "icon-cloud-demo-2", + description: "", + type: "registry:example", + registryDependencies: ["icon-cloud"], + files: [ + { + path: "registry/example/icon-cloud-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/icon-cloud-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "icon-cloud-demo-3": { + name: "icon-cloud-demo-3", + description: "", + type: "registry:example", + registryDependencies: ["icon-cloud"], + files: [ + { + path: "registry/example/icon-cloud-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/icon-cloud-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo": { + name: "text-animate-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo-2": { + name: "text-animate-demo-2", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo-3": { + name: "text-animate-demo-3", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo-4": { + name: "text-animate-demo-4", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo-4.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo-4.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo-5": { + name: "text-animate-demo-5", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo-5.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo-5.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "text-animate-demo-6": { + name: "text-animate-demo-6", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/text-animate-demo-6.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/text-animate-demo-6.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shiny-button-demo": { + name: "shiny-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/shiny-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/shiny-button-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "box-reveal-demo": { + name: "box-reveal-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/box-reveal-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/box-reveal-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-circular-progress-bar-demo": { + name: "animated-circular-progress-bar-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/animated-circular-progress-bar-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-circular-progress-bar-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shine-border-demo": { + name: "shine-border-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/shine-border-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/shine-border-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "shine-border-demo-2": { + name: "shine-border-demo-2", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/shine-border-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/shine-border-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-demo": { + name: "confetti-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-basic-cannon": { + name: "confetti-basic-cannon", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-basic-cannon.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-basic-cannon.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-random-direction": { + name: "confetti-random-direction", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-random-direction.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/confetti-random-direction.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-fireworks": { + name: "confetti-fireworks", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-fireworks.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-fireworks.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-stars": { + name: "confetti-stars", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-stars.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-stars.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-side-cannons": { + name: "confetti-side-cannons", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-side-cannons.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-side-cannons.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-custom-shapes": { + name: "confetti-custom-shapes", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-custom-shapes.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-custom-shapes.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "confetti-emoji": { + name: "confetti-emoji", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/confetti-emoji.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/confetti-emoji.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "animated-subscribe-button-demo": { + name: "animated-subscribe-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/animated-subscribe-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/animated-subscribe-button-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "cool-mode-demo": { + name: "cool-mode-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/cool-mode-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/cool-mode-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "cool-mode-custom": { + name: "cool-mode-custom", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/cool-mode-custom.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/cool-mode-custom.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "pulsating-button-demo": { + name: "pulsating-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/pulsating-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/pulsating-button-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "ripple-button-demo": { + name: "ripple-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/ripple-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/ripple-button-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "file-tree-demo": { + name: "file-tree-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/file-tree-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/file-tree-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "blur-fade-demo": { + name: "blur-fade-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/blur-fade-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/blur-fade-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "blur-fade-text-demo": { + name: "blur-fade-text-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/blur-fade-text-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/blur-fade-text-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "safari-demo": { + name: "safari-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/safari-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/safari-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "safari-demo-2": { + name: "safari-demo-2", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/safari-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/safari-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "safari-demo-3": { + name: "safari-demo-3", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/safari-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/safari-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "safari-demo-4": { + name: "safari-demo-4", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/safari-demo-4.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/safari-demo-4.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "iphone-15-pro-demo": { + name: "iphone-15-pro-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/iphone-15-pro-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/iphone-15-pro-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "iphone-15-pro-demo-2": { + name: "iphone-15-pro-demo-2", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/iphone-15-pro-demo-2.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/iphone-15-pro-demo-2.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "iphone-15-pro-demo-3": { + name: "iphone-15-pro-demo-3", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/iphone-15-pro-demo-3.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/iphone-15-pro-demo-3.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "rainbow-button-demo": { + name: "rainbow-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/rainbow-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/example/rainbow-button-demo.tsx"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + "interactive-hover-button-demo": { + name: "interactive-hover-button-demo", + description: "", + type: "registry:example", + registryDependencies: undefined, + files: [ + { + path: "registry/example/interactive-hover-button-demo.tsx", + type: "registry:example", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import( + "@/registry/example/interactive-hover-button-demo.tsx" + ); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, + }, + utils: { + name: "utils", + description: "", + type: "registry:lib", + registryDependencies: undefined, + files: [ + { + path: "registry/lib/utils.ts", + type: "registry:lib", + target: "", + }, + ], + component: React.lazy(async () => { + const mod = await import("@/registry/lib/utils.ts"); + const exportName = + Object.keys(mod).find( + (key) => + typeof mod[key] === "function" || typeof mod[key] === "object", + ) || item.name; + return { default: mod.default || mod[exportName] }; + }), + meta: undefined, }, }; diff --git a/app/registry/[name]/route.ts b/app/registry/[name]/route.ts new file mode 100644 index 000000000..f6f71b6cb --- /dev/null +++ b/app/registry/[name]/route.ts @@ -0,0 +1,57 @@ +import { promises as fs } from "fs"; +import { NextResponse } from "next/server"; +import path from "path"; +import { registryItemSchema } from "shadcn/registry"; + +// This route shows an example for serving a component using a route handler. +export async function GET( + request: Request, + { params }: { params: { name: string } }, +) { + try { + const { name } = params; + // Cache the registry import + const registryData = await import("@/registry.json"); + const registry = registryData.default; + + // Find the component from the registry. + const component = registry.items.find((c) => c.name === name); + + // If the component is not found, return a 404 error. + if (!component) { + return NextResponse.json( + { error: "Component not found" }, + { status: 404 }, + ); + } + + // Validate before file operations. + const registryItem = registryItemSchema.parse(component); + + // If the component has no files, return a 400 error. + if (!registryItem.files?.length) { + return NextResponse.json( + { error: "Component has no files" }, + { status: 400 }, + ); + } + + // Read all files in parallel. + const filesWithContent = await Promise.all( + registryItem.files.map(async (file) => { + const filePath = path.join(process.cwd(), file.path); + const content = await fs.readFile(filePath, "utf8"); + return { ...file, content }; + }), + ); + + // Return the component with the files. + return NextResponse.json({ ...registryItem, files: filesWithContent }); + } catch (error) { + console.error("Error processing component request:", error); + return NextResponse.json( + { error: "Something went wrong" }, + { status: 500 }, + ); + } +} diff --git a/components/component-preview.tsx b/components/component-preview.tsx index be2bf56ce..ae9606e69 100644 --- a/components/component-preview.tsx +++ b/components/component-preview.tsx @@ -1,17 +1,9 @@ -"use client"; - -import Registry from "@/registry.json"; -import { RotateCcw } from "lucide-react"; -import * as React from "react"; - +import { Index } from "@/__registry__"; import { ComponentWrapper } from "@/components/component-wrapper"; import { Icons } from "@/components/icons"; -import { OpenInV0Button } from "@/components/open-in-v0-button"; -import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -// import { useConfig } from "@/lib/use-config"; import { cn } from "@/lib/utils"; -// import { styles } from "@/registry/registry-styles"; +import * as React from "react"; interface ComponentPreviewProps extends React.HTMLAttributes { name: string; @@ -19,7 +11,7 @@ interface ComponentPreviewProps extends React.HTMLAttributes { preview?: boolean; } -export function ComponentPreview({ +export async function ComponentPreview({ name, children, className, @@ -27,14 +19,13 @@ export function ComponentPreview({ preview = false, ...props }: ComponentPreviewProps) { - const [key, setKey] = React.useState(0); const Codes = React.Children.toArray(children) as React.ReactElement[]; const Code = Codes[0]; const Preview = React.useMemo(() => { - const registryItem = Registry.items.find((item) => item.name === name); + const Component = Index[name]?.component; - if (!registryItem) { + if (!Component) { console.error(`Component with name "${name}" not found in registry.`); return (

@@ -47,11 +38,6 @@ export function ComponentPreview({ ); } - const Component = React.lazy(() => { - // Ensure we're using the correct path by removing any leading dots or slashes - const cleanPath = registryItem.files[0].path.replace(/^[./]+/, ""); - return import(`../../${cleanPath}`); - }); return ; }, [name]); @@ -82,18 +68,8 @@ export function ComponentPreview({

)} - - -
- - -
+ + diff --git a/components/component-wrapper.tsx b/components/component-wrapper.tsx index f02b437ec..98ed35688 100644 --- a/components/component-wrapper.tsx +++ b/components/component-wrapper.tsx @@ -1,19 +1,29 @@ +"use client"; + +import { OpenInV0Button } from "@/components/open-in-v0-button"; +import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; +import { RotateCcw } from "lucide-react"; +import React from "react"; -interface ComponentWrapperProps { - className?: string; - children: any; +interface ComponentWrapperProps extends React.HTMLAttributes { + name: string; } + export const ComponentWrapper = ({ className, children, + name, }: ComponentWrapperProps) => { + const [key, setKey] = React.useState(0); + return (
+
+ + +
{children}
); diff --git a/next.config.mjs b/next.config.mjs index d4d28099d..1ebbfc243 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -33,28 +33,6 @@ const nextConfig = { destination: "/docs/components/marquee", permanent: true, }, - { - source: "/r", - destination: "/r/index.json", - permanent: true, - }, - { - source: "/r/index", - destination: "/r/index.json", - permanent: true, - }, - { - source: "/r/:name((?!index\\.json|styles/).*)", - destination: "/r/styles/default/:name.json", - permanent: true, - missing: [ - { - type: "query", - key: "_redirected", - value: undefined, - }, - ], - }, ]; }, }; diff --git a/package.json b/package.json index 6f25fef72..4f4acf5d8 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dev": "concurrently \"content-collections watch\" \"next dev\"", "prebuild": "pnpm build:docs && pnpm build:registry", "build": "next build", - "build:registry": "shadcn build", + "build:registry": "npx tsx ./scripts/build-registry.mts", "build:docs": "content-collections build", "typecheck": "pnpm build:docs && tsc --noEmit", "start": "next start", @@ -70,7 +70,7 @@ "react-hook-form": "^7.50.1", "react-tweet": "^3.2.1", "schema-dts": "^1.1.2", - "shadcn": "2.2.0-canary.3", + "shadcn": "2.3.0", "sonner": "^1.5.0", "tailwind-merge": "^2.4.0", "ts-morph": "^23.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f77d9fadc..e57a071c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,8 +147,8 @@ importers: specifier: ^1.1.2 version: 1.1.2(typescript@5.3.3) shadcn: - specifier: 2.2.0-canary.3 - version: 2.2.0-canary.3(typescript@5.3.3) + specifier: 2.3.0 + version: 2.3.0(typescript@5.3.3) sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4873,8 +4873,8 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - shadcn@2.2.0-canary.3: - resolution: {integrity: sha512-P0adSoD8SY6W8JGqvTnOnUm26G2/u91XelxXs+JbMJWFhQz7JkGld0M9+BPAC9fO8JC4yVy4gdHWc52GhoXknA==} + shadcn@2.3.0: + resolution: {integrity: sha512-Q/ra8/r2wb5W0DX0LKuPpsT6/0vtgwW/DR9uunJ6/3lXMOBo2UyUeCQ2m9/XAlALHhyGnzHngf8s8NrW1kcg5Q==} hasBin: true shebang-command@1.2.0: @@ -10882,11 +10882,11 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - shadcn@2.2.0-canary.3(typescript@5.3.3): + shadcn@2.3.0(typescript@5.3.3): dependencies: '@antfu/ni': 0.21.12 '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/parser': 7.26.5 '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.24.0) commander: 10.0.1 cosmiconfig: 8.3.6(typescript@5.3.3) @@ -10897,7 +10897,6 @@ snapshots: fs-extra: 11.3.0 https-proxy-agent: 6.2.1 kleur: 4.1.5 - lodash.template: 4.5.0 node-fetch: 3.3.2 ora: 6.3.1 postcss: 8.4.39 diff --git a/public/r/index.json b/public/r/index.json new file mode 100644 index 000000000..a9ef59549 --- /dev/null +++ b/public/r/index.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "index", + "type": "registry:style", + "dependencies": [ + "tailwindcss-animate", + "class-variance-authority", + "lucide-react" + ], + "registryDependencies": [ + "utils" + ], + "files": [], + "tailwind": { + "config": { + "plugins": [ + "require(\"tailwindcss-animate\")" + ] + } + }, + "cssVars": {} +} \ No newline at end of file diff --git a/registry.json b/registry.json index 3703ad056..7d3f50fbc 100644 --- a/registry.json +++ b/registry.json @@ -1,84 +1,89 @@ { - "$schema": "https://ui.shadcn.com/schema/registry.json", - "name": "magicui", + "name": "Magic UI", "homepage": "https://magicui.design", "items": [ + { + "name": "index", + "type": "registry:style", + "dependencies": [ + "tailwindcss-animate", + "class-variance-authority", + "lucide-react" + ], + "registryDependencies": [ + "utils" + ], + "files": [], + "tailwind": { + "config": { + "plugins": [ + "require(\"tailwindcss-animate\")" + ] + } + }, + "cssVars": {} + }, { "name": "magic-card", - "type": "registry:component", - "title": "Magic Card", - "description": "A spotlight effect that follows your mouse cursor and highlights borders on hover.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/magic-card.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "android", - "type": "registry:component", - "title": "Android", - "description": "A mockup of an Android device.", + "type": "registry:ui", "files": [ - { "path": "registry/magicui/android.tsx", "type": "registry:component" } + { + "path": "registry/magicui/android.tsx", + "type": "registry:ui" + } ] }, { "name": "warp-background", - "type": "registry:component", - "title": "Warp Background", - "description": "A card with a time warping background effect.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/warp-background.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "line-shadow-text", - "type": "registry:component", - "title": "Line Shadow Text", - "description": "A text component with a moving line shadow.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/line-shadow-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "aurora-text", - "type": "registry:component", - "title": "Aurora Text", - "description": "A beautiful aurora text effect", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/aurora-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ], - "cssVars": { - "light": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - }, - "dark": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - } - }, "tailwind": { "config": { "theme": { @@ -106,65 +111,113 @@ } }, "aurora-1": { - "0%, 100%": { "top": "0", "right": "0" }, - "50%": { "top": "50%", "right": "25%" }, - "75%": { "top": "25%", "right": "50%" } + "0%, 100%": { + "top": "0", + "right": "0" + }, + "50%": { + "top": "50%", + "right": "25%" + }, + "75%": { + "top": "25%", + "right": "50%" + } }, "aurora-2": { - "0%, 100%": { "top": "0", "left": "0" }, - "60%": { "top": "75%", "left": "25%" }, - "85%": { "top": "50%", "left": "50%" } + "0%, 100%": { + "top": "0", + "left": "0" + }, + "60%": { + "top": "75%", + "left": "25%" + }, + "85%": { + "top": "50%", + "left": "50%" + } }, "aurora-3": { - "0%, 100%": { "bottom": "0", "left": "0" }, - "40%": { "bottom": "50%", "left": "25%" }, - "65%": { "bottom": "25%", "left": "50%" } + "0%, 100%": { + "bottom": "0", + "left": "0" + }, + "40%": { + "bottom": "50%", + "left": "25%" + }, + "65%": { + "bottom": "25%", + "left": "50%" + } }, "aurora-4": { - "0%, 100%": { "bottom": "0", "right": "0" }, - "50%": { "bottom": "25%", "right": "40%" }, - "90%": { "bottom": "50%", "right": "25%" } + "0%, 100%": { + "bottom": "0", + "right": "0" + }, + "50%": { + "bottom": "25%", + "right": "40%" + }, + "90%": { + "bottom": "50%", + "right": "25%" + } } } } } } + }, + "cssVars": { + "light": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + }, + "dark": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + } } }, { "name": "morphing-text", - "type": "registry:component", - "title": "Morphing Text", - "description": "A dynamic text morphing component for Magic UI.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/morphing-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "scroll-progress", - "type": "registry:component", - "title": "Scroll Progress", - "description": "Animated Scroll Progress for your pages", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/scroll-progress.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "neon-gradient-card", - "type": "registry:component", - "title": "Neon Gradient Card", - "description": "A beautiful neon card effect", + "type": "registry:ui", "files": [ { "path": "registry/magicui/neon-gradient-card.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -176,8 +229,12 @@ }, "keyframes": { "background-position-spin": { - "0%": { "backgroundPosition": "top center" }, - "100%": { "backgroundPosition": "bottom center" } + "0%": { + "backgroundPosition": "top center" + }, + "100%": { + "backgroundPosition": "bottom center" + } } } } @@ -187,11 +244,12 @@ }, { "name": "meteors", - "type": "registry:component", - "title": "Meteors", - "description": "A meteor shower effect.", + "type": "registry:ui", "files": [ - { "path": "registry/magicui/meteors.tsx", "type": "registry:component" } + { + "path": "registry/magicui/meteors.tsx", + "type": "registry:ui" + } ], "tailwind": { "config": { @@ -206,7 +264,9 @@ "transform": "rotate(215deg) translateX(0)", "opacity": "1" }, - "70%": { "opacity": "1" }, + "70%": { + "opacity": "1" + }, "100%": { "transform": "rotate(215deg) translateX(-500px)", "opacity": "0" @@ -220,99 +280,97 @@ }, { "name": "grid-pattern", - "type": "registry:component", - "title": "Grid Pattern", - "description": "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/grid-pattern.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "interactive-grid-pattern", - "type": "registry:component", - "title": "Interactive Grid Pattern", - "description": "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/interactive-grid-pattern.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "dot-pattern", - "type": "registry:component", - "title": "Dot Pattern", - "description": "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/dot-pattern.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "flickering-grid", - "type": "registry:component", - "title": "Flickering Grid", - "description": "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/flickering-grid.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "hero-video-dialog", - "type": "registry:component", - "title": "Hero Video Dialog", - "description": "A hero video dialog component.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/hero-video-dialog.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "code-comparison", - "type": "registry:component", - "title": "Code Comparison", - "description": "A component which compares two code snippets.", - "dependencies": ["shiki", "next-themes"], + "type": "registry:ui", + "dependencies": [ + "shiki", + "next-themes" + ], "files": [ { "path": "registry/magicui/code-comparison.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "script-copy-btn", - "type": "registry:component", - "title": "Script Copy Button", - "description": "Copy code to clipboard", - "dependencies": ["motion", "shiki", "next-themes"], - "registryDependencies": ["button"], + "type": "registry:ui", + "dependencies": [ + "motion", + "shiki", + "next-themes" + ], + "registryDependencies": [ + "button" + ], "files": [ { "path": "registry/magicui/script-copy-btn.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "marquee", - "type": "registry:component", - "title": "Marquee", - "description": "An infinite scrolling component that can be used to display text, images, or videos.", + "type": "registry:ui", "files": [ - { "path": "registry/magicui/marquee.tsx", "type": "registry:component" } + { + "path": "registry/magicui/marquee.tsx", + "type": "registry:ui" + } ], "tailwind": { "config": { @@ -320,12 +378,20 @@ "extend": { "keyframes": { "marquee": { - "from": { "transform": "translateX(0)" }, - "to": { "transform": "translateX(calc(-100% - var(--gap)))" } + "from": { + "transform": "translateX(0)" + }, + "to": { + "transform": "translateX(calc(-100% - var(--gap)))" + } }, "marquee-vertical": { - "from": { "transform": "translateY(0)" }, - "to": { "transform": "translateY(calc(-100% - var(--gap)))" } + "from": { + "transform": "translateY(0)" + }, + "to": { + "transform": "translateY(calc(-100% - var(--gap)))" + } } }, "animation": { @@ -339,23 +405,24 @@ }, { "name": "globe", - "type": "registry:component", - "title": "Globe", - "description": "An autorotating, interactive, and highly performant globe made using WebGL.", - "dependencies": ["cobe"], + "type": "registry:ui", + "dependencies": [ + "cobe" + ], "files": [ - { "path": "registry/magicui/globe.tsx", "type": "registry:component" } + { + "path": "registry/magicui/globe.tsx", + "type": "registry:ui" + } ] }, { "name": "shimmer-button", - "type": "registry:component", - "title": "Shimmer Button", - "description": "A button with a shimmering light which travels around the perimeter.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/shimmer-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -394,76 +461,77 @@ }, { "name": "tweet-card", - "type": "registry:component", - "title": "Tweet Card", - "description": "A card that displays a tweet with the author's name, handle, and profile picture.", - "dependencies": ["react-tweet"], + "type": "registry:ui", + "dependencies": [ + "react-tweet" + ], "files": [ { "path": "registry/magicui/tweet-card.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "client-tweet-card", - "type": "registry:component", - "title": "Client Tweet Card", - "description": "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", - "dependencies": ["react-tweet"], + "type": "registry:ui", + "dependencies": [ + "react-tweet" + ], "files": [ { "path": "registry/magicui/client-tweet-card.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "bento-grid", - "type": "registry:component", - "title": "Bento Grid", - "description": "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", - "dependencies": ["@radix-ui/react-icons"], - "registryDependencies": ["button"], + "type": "registry:ui", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "button" + ], "files": [ { "path": "registry/magicui/bento-grid.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "particles", - "type": "registry:component", - "title": "Particles", - "description": "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/particles.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "number-ticker", - "type": "registry:component", - "title": "Number Ticker", - "description": "Animate numbers to count up or down to a target number", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/number-ticker.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "ripple", - "type": "registry:component", - "title": "Ripple", - "description": "An animated ripple effect typically used behind elements to emphasize them.", + "type": "registry:ui", "files": [ - { "path": "registry/magicui/ripple.tsx", "type": "registry:component" } + { + "path": "registry/magicui/ripple.tsx", + "type": "registry:ui" + } ], "tailwind": { "config": { @@ -489,13 +557,11 @@ }, { "name": "retro-grid", - "type": "registry:component", - "title": "Retro Grid", - "description": "An animated scrolling retro grid effect", + "type": "registry:ui", "files": [ { "path": "registry/magicui/retro-grid.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -507,8 +573,12 @@ }, "keyframes": { "grid": { - "0%": { "transform": "translateY(-50%)" }, - "100%": { "transform": "translateY(0)" } + "0%": { + "transform": "translateY(-50%)" + }, + "100%": { + "transform": "translateY(0)" + } } } } @@ -518,26 +588,24 @@ }, { "name": "animated-list", - "type": "registry:component", - "title": "Animated List", - "description": "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/animated-list.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "animated-shiny-text", - "type": "registry:component", - "title": "Animated Shiny Text", - "description": "A light glare effect which pans across text making it appear as if it is shimmering.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/animated-shiny-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -564,26 +632,24 @@ }, { "name": "animated-grid-pattern", - "type": "registry:component", - "title": "Animated Grid Pattern", - "description": "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/animated-grid-pattern.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "border-beam", - "type": "registry:component", - "title": "Border Beam", - "description": "An animated beam of light which travels along the border of its container.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/border-beam.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -607,52 +673,50 @@ }, { "name": "animated-beam", - "type": "registry:component", - "title": "Animated Beam", - "description": "An animated beam of light which travels along a path. Useful for showcasing the \"integration\" features of a website.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/animated-beam.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "text-reveal", - "type": "registry:component", - "title": "Text Reveal", - "description": "Fade in text as you scroll down the page.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/text-reveal.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "hyper-text", - "type": "registry:component", - "title": "Hyper Text", - "description": "A text animation that scrambles letters before revealing the final text.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/hyper-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "animated-gradient-text", - "type": "registry:component", - "title": "Animated Gradient Text", - "description": "An animated gradient background which transitions between colors for text.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/animated-gradient-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -676,13 +740,11 @@ }, { "name": "orbiting-circles", - "type": "registry:component", - "title": "Orbiting Circles", - "description": "A collection of circles which move in orbit along a circular path", + "type": "registry:ui", "files": [ { "path": "registry/magicui/orbiting-circles.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -709,165 +771,162 @@ }, { "name": "dock", - "type": "registry:component", - "title": "Dock", - "description": "An implementation of the MacOS dock using react + tailwindcss + framer motion", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ - { "path": "registry/magicui/dock.tsx", "type": "registry:component" } + { + "path": "registry/magicui/dock.tsx", + "type": "registry:ui" + } ] }, { "name": "word-rotate", - "type": "registry:component", - "title": "Word Rotate", - "description": "A vertical rotation of words", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/word-rotate.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "avatar-circles", - "type": "registry:component", - "title": "Avatar Circles", - "description": "Overlapping circles of avatars.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/avatar-circles.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "typing-animation", - "type": "registry:component", - "title": "Typing Animation", - "description": "Characters appearing in typed animation", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/typing-animation.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "sparkles-text", - "type": "registry:component", - "title": "Sparkles Text", - "description": "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/sparkles-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "flip-text", - "type": "registry:component", - "title": "Flip Text", - "description": "Text flipping character animation", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/flip-text.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "icon-cloud", - "type": "registry:component", - "title": "Icon Cloud", - "description": "An interactive 3D tag cloud component", + "type": "registry:ui", "dependencies": [], "files": [ { "path": "registry/magicui/icon-cloud.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "text-animate", - "type": "registry:component", - "title": "Text Animate", - "description": "A text animation component that animates text using a variety of different animations.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/text-animate.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "scroll-based-velocity", - "type": "registry:component", - "title": "Scroll Based Velocity", - "description": "Scrolling text whose speed changes based on scroll speed", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/scroll-based-velocity.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "scratch-to-reveal", - "type": "registry:component", - "title": "Scratch To Reveal", - "description": "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/scratch-to-reveal.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "shiny-button", - "type": "registry:component", - "title": "Shiny Button", - "description": "A shiny button component with dynamic styles in the dark mode or light mode.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/shiny-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "box-reveal", - "type": "registry:component", - "title": "Box Reveal Animation", - "description": "Sliding box animation that reveals text behind it.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/box-reveal.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "shine-border", - "type": "registry:component", - "title": "Shine Border", - "description": "Shine border is an animated background border effect.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/shine-border.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -897,64 +956,61 @@ }, { "name": "animated-circular-progress-bar", - "type": "registry:component", - "title": "Animated Circular Progress Bar", - "description": "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/animated-circular-progress-bar.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "confetti", - "type": "registry:component", - "title": "Confetti", - "description": "Confetti animations are best used to delight your users when something special happens", - "dependencies": ["canvas-confetti", "@types/canvas-confetti"], - "registryDependencies": ["button"], + "type": "registry:ui", + "dependencies": [ + "canvas-confetti", + "@types/canvas-confetti" + ], + "registryDependencies": [ + "button" + ], "files": [ { "path": "registry/magicui/confetti.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "animated-subscribe-button", - "type": "registry:component", - "title": "Animated Subscribe Button", - "description": "An animated subscribe button useful for showing a micro animation from intial to final result.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/animated-subscribe-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "cool-mode", - "type": "registry:component", - "title": "Cool Mode", - "description": "Cool mode effect for buttons, links, and other DOMs", + "type": "registry:ui", "files": [ { "path": "registry/magicui/cool-mode.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "pulsating-button", - "type": "registry:component", - "title": "Pulsating Button", - "description": "An animated pulsating button useful for capturing attention of users.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/pulsating-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -966,8 +1022,12 @@ }, "keyframes": { "pulse": { - "0%, 100%": { "boxShadow": "0 0 0 0 var(--pulse-color)" }, - "50%": { "boxShadow": "0 0 0 8px var(--pulse-color)" } + "0%, 100%": { + "boxShadow": "0 0 0 0 var(--pulse-color)" + }, + "50%": { + "boxShadow": "0 0 0 8px var(--pulse-color)" + } } } } @@ -977,13 +1037,11 @@ }, { "name": "ripple-button", - "type": "registry:component", - "title": "Ripple Button", - "description": "An animated button with ripple useful for user engagement.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/ripple-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ], "tailwind": { @@ -1011,77 +1069,56 @@ }, { "name": "file-tree", - "type": "registry:component", - "title": "File Tree", - "description": "A component used to showcase the folder and file structure of a directory.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/file-tree.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "blur-fade", - "type": "registry:component", - "title": "Blur Fade", - "description": "Blur fade in and out animation. Used to smoothly fade in and out content.", - "dependencies": ["motion"], + "type": "registry:ui", + "dependencies": [ + "motion" + ], "files": [ { "path": "registry/magicui/blur-fade.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "safari", - "type": "registry:component", - "title": "Safari", - "description": "A safari browser mockup to showcase your website.", + "type": "registry:ui", "files": [ - { "path": "registry/magicui/safari.tsx", "type": "registry:component" } + { + "path": "registry/magicui/safari.tsx", + "type": "registry:ui" + } ] }, { "name": "iphone-15-pro", - "type": "registry:component", - "title": "iPhone 15 Pro", - "description": "A mockup of the iPhone 15 Pro", + "type": "registry:ui", "files": [ { "path": "registry/magicui/iphone-15-pro.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "rainbow-button", - "type": "registry:component", - "title": "Rainbow Button", - "description": "An animated button with a rainbow effect.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/rainbow-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ], - "cssVars": { - "light": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - }, - "dark": { - "--color-1": "0 100% 63%", - "--color-2": "270 100% 63%", - "--color-3": "210 100% 63%", - "--color-4": "195 100% 63%", - "--color-5": "90 100% 63%" - } - }, "tailwind": { "config": { "theme": { @@ -1098,364 +1135,433 @@ }, "keyframes": { "rainbow": { - "0%": { "background-position": "0%" }, - "100%": { "background-position": "200%" } + "0%": { + "background-position": "0%" + }, + "100%": { + "background-position": "200%" + } } } } } } + }, + "cssVars": { + "light": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + }, + "dark": { + "--color-1": "0 100% 63%", + "--color-2": "270 100% 63%", + "--color-3": "210 100% 63%", + "--color-4": "195 100% 63%", + "--color-5": "90 100% 63%" + } } }, { "name": "interactive-hover-button", - "type": "registry:component", - "title": "Interactive Hover Button", - "description": "A visually engaging button component that responds to hover with dynamic transitions, adapting smoothly between light and dark modes for enhanced user interactivity.", + "type": "registry:ui", "files": [ { "path": "registry/magicui/interactive-hover-button.tsx", - "type": "registry:component" + "type": "registry:ui" } ] }, { "name": "magic-card-demo", - "type": "registry:component", - "registryDependencies": ["magic-card"], + "type": "registry:example", + "registryDependencies": [ + "magic-card" + ], "files": [ { "path": "registry/example/magic-card-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "android-demo", - "type": "registry:component", - "registryDependencies": ["android"], + "type": "registry:example", + "registryDependencies": [ + "android" + ], "files": [ { "path": "registry/example/android-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "android-demo-2", - "type": "registry:component", - "registryDependencies": ["android"], + "type": "registry:example", + "registryDependencies": [ + "android" + ], "files": [ { "path": "registry/example/android-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "android-demo-3", - "type": "registry:component", - "registryDependencies": ["android"], + "type": "registry:example", + "registryDependencies": [ + "android" + ], "files": [ { "path": "registry/example/android-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "warp-background-demo", - "type": "registry:component", - "registryDependencies": ["warp-background"], + "type": "registry:example", + "registryDependencies": [ + "warp-background" + ], "files": [ { "path": "registry/example/warp-background-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "line-shadow-text-demo", - "type": "registry:component", - "registryDependencies": ["line-shadow-text"], + "type": "registry:example", + "registryDependencies": [ + "line-shadow-text" + ], "files": [ { "path": "registry/example/line-shadow-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "aurora-text-demo", - "type": "registry:component", - "registryDependencies": ["aurora-text"], + "type": "registry:example", + "registryDependencies": [ + "aurora-text" + ], "files": [ { "path": "registry/example/aurora-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "morphing-text-demo", - "type": "registry:component", - "registryDependencies": ["morphing-text"], + "type": "registry:example", + "registryDependencies": [ + "morphing-text" + ], "files": [ { "path": "registry/example/morphing-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "scroll-progress-demo", - "type": "registry:component", - "registryDependencies": ["scroll-progress"], + "type": "registry:example", + "registryDependencies": [ + "scroll-progress" + ], "files": [ { "path": "registry/example/scroll-progress-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "neon-gradient-card-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/neon-gradient-card-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "meteors-demo", - "type": "registry:component", - "registryDependencies": ["meteors"], + "type": "registry:example", + "registryDependencies": [ + "meteors" + ], "files": [ { "path": "registry/example/meteors-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "grid-pattern-demo", - "type": "registry:component", - "registryDependencies": ["grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "grid-pattern" + ], "files": [ { "path": "registry/example/grid-pattern-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "grid-pattern-linear-gradient", - "type": "registry:component", - "registryDependencies": ["grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "grid-pattern" + ], "files": [ { "path": "registry/example/grid-pattern-linear-gradient.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "grid-pattern-dashed", - "type": "registry:component", - "registryDependencies": ["grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "grid-pattern" + ], "files": [ { "path": "registry/example/grid-pattern-dashed.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "dot-pattern-demo", - "type": "registry:component", - "registryDependencies": ["dot-pattern"], + "type": "registry:example", + "registryDependencies": [ + "dot-pattern" + ], "files": [ { "path": "registry/example/dot-pattern-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "dot-pattern-linear-gradient", - "type": "registry:component", - "registryDependencies": ["dot-pattern"], + "type": "registry:example", + "registryDependencies": [ + "dot-pattern" + ], "files": [ { "path": "registry/example/dot-pattern-linear-gradient.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "flickering-grid-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/flickering-grid-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "flickering-grid-rounded-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/flickering-grid-rounded-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "hero-video-dialog-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/hero-video-dialog-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "hero-video-dialog-demo-top-in-bottom-out", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "code-comparison-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/code-comparison-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "script-copy-btn-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/script-copy-btn-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "marquee-demo", - "type": "registry:component", - "registryDependencies": ["marquee"], + "type": "registry:example", + "registryDependencies": [ + "marquee" + ], "files": [ { "path": "registry/example/marquee-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "marquee-demo-vertical", - "type": "registry:component", - "registryDependencies": ["marquee"], + "type": "registry:example", + "registryDependencies": [ + "marquee" + ], "files": [ { "path": "registry/example/marquee-demo-vertical.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "marquee-logos", - "type": "registry:component", - "registryDependencies": ["marquee"], + "type": "registry:example", + "registryDependencies": [ + "marquee" + ], "files": [ { "path": "registry/example/marquee-logos.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "marquee-3d", - "type": "registry:component", - "registryDependencies": ["marquee"], + "type": "registry:example", + "registryDependencies": [ + "marquee" + ], "files": [ { "path": "registry/example/marquee-3d.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "globe-demo", - "type": "registry:component", - "registryDependencies": ["globe"], + "type": "registry:example", + "registryDependencies": [ + "globe" + ], "files": [ { "path": "registry/example/globe-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "tweet-card-demo", - "type": "registry:component", - "registryDependencies": ["tweet-card"], + "type": "registry:example", + "registryDependencies": [ + "tweet-card" + ], "files": [ { "path": "registry/example/tweet-card-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "tweet-card-images", - "type": "registry:component", - "registryDependencies": ["tweet-card"], + "type": "registry:example", + "registryDependencies": [ + "tweet-card" + ], "files": [ { "path": "registry/example/tweet-card-images.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "tweet-card-meta-preview", - "type": "registry:component", - "registryDependencies": ["tweet-card"], + "type": "registry:example", + "registryDependencies": [ + "tweet-card" + ], "files": [ { "path": "registry/example/tweet-card-meta-preview.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "shimmer-button-demo", - "type": "registry:component", - "registryDependencies": ["shimmer-button"], + "type": "registry:example", + "registryDependencies": [ + "shimmer-button" + ], "files": [ { "path": "registry/example/shimmer-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "bento-demo", - "type": "registry:component", + "type": "registry:example", + "dependencies": [ + "@radix-ui/react-icons" + ], "registryDependencies": [ "bento-grid", "marquee", @@ -1464,751 +1570,840 @@ "shadcn:command", "shadcn:calendar" ], - "dependencies": ["@radix-ui/react-icons"], "files": [ { "path": "registry/example/bento-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "bento-demo-vertical", - "type": "registry:component", - "registryDependencies": ["bento-grid"], - "dependencies": ["@radix-ui/react-icons"], + "type": "registry:example", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "bento-grid" + ], "files": [ { "path": "registry/example/bento-demo-vertical.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "number-ticker-demo", - "type": "registry:component", - "registryDependencies": ["number-ticker"], + "type": "registry:example", + "registryDependencies": [ + "number-ticker" + ], "files": [ { "path": "registry/example/number-ticker-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "number-ticker-decimal-demo", - "type": "registry:component", - "registryDependencies": ["number-ticker"], + "type": "registry:example", + "registryDependencies": [ + "number-ticker" + ], "files": [ { "path": "registry/example/number-ticker-decimal-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "ripple-demo", - "type": "registry:component", - "registryDependencies": ["ripple"], + "type": "registry:example", + "registryDependencies": [ + "ripple" + ], "files": [ { "path": "registry/example/ripple-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "retro-grid-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/retro-grid-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-list-demo", - "type": "registry:component", - "registryDependencies": ["animated-list"], + "type": "registry:example", + "registryDependencies": [ + "animated-list" + ], "files": [ { "path": "registry/example/animated-list-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-shiny-text-demo", - "type": "registry:component", - "registryDependencies": ["animated-shiny-text"], - "dependencies": ["@radix-ui/react-icons"], + "type": "registry:example", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "animated-shiny-text" + ], "files": [ { "path": "registry/example/animated-shiny-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "particles-demo", - "type": "registry:component", - "registryDependencies": ["particles"], - "dependencies": ["next-themes"], + "type": "registry:example", + "dependencies": [ + "next-themes" + ], + "registryDependencies": [ + "particles" + ], "files": [ { "path": "registry/example/particles-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-grid-pattern-demo", - "type": "registry:component", - "registryDependencies": ["animated-grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "animated-grid-pattern" + ], "files": [ { "path": "registry/example/animated-grid-pattern-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "interactive-grid-pattern-demo", - "type": "registry:component", - "registryDependencies": ["interactive-grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "interactive-grid-pattern" + ], "files": [ { "path": "registry/example/interactive-grid-pattern-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "interactive-grid-pattern-demo-2", - "type": "registry:component", - "registryDependencies": ["interactive-grid-pattern"], + "type": "registry:example", + "registryDependencies": [ + "interactive-grid-pattern" + ], "files": [ { "path": "registry/example/interactive-grid-pattern-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "border-beam-demo", - "type": "registry:component", - "registryDependencies": ["border-beam"], + "type": "registry:example", + "registryDependencies": [ + "border-beam" + ], "files": [ { "path": "registry/example/border-beam-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-beam-demo", - "type": "registry:component", - "registryDependencies": ["animated-beam"], - "dependencies": ["@radix-ui/react-icons"], + "type": "registry:example", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "animated-beam" + ], "files": [ { "path": "registry/example/animated-beam-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-beam-unidirectional", - "type": "registry:component", - "registryDependencies": ["animated-beam"], + "type": "registry:example", + "registryDependencies": [ + "animated-beam" + ], "files": [ { "path": "registry/example/animated-beam-unidirectional.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-beam-bidirectional", - "type": "registry:component", - "registryDependencies": ["animated-beam"], + "type": "registry:example", + "registryDependencies": [ + "animated-beam" + ], "files": [ { "path": "registry/example/animated-beam-bidirectional.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-beam-multiple-inputs", - "type": "registry:component", - "registryDependencies": ["animated-beam"], + "type": "registry:example", + "registryDependencies": [ + "animated-beam" + ], "files": [ { "path": "registry/example/animated-beam-multiple-inputs.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-beam-multiple-outputs", - "type": "registry:component", - "registryDependencies": ["animated-beam"], + "type": "registry:example", + "registryDependencies": [ + "animated-beam" + ], "files": [ { "path": "registry/example/animated-beam-multiple-outputs.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-reveal-demo", - "type": "registry:component", - "registryDependencies": ["text-reveal"], + "type": "registry:example", + "registryDependencies": [ + "text-reveal" + ], "files": [ { "path": "registry/example/text-reveal-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-gradient-text-demo", - "type": "registry:component", - "registryDependencies": ["animated-gradient-text"], - "dependencies": ["lucide-react"], + "type": "registry:example", + "dependencies": [ + "lucide-react" + ], + "registryDependencies": [ + "animated-gradient-text" + ], "files": [ { "path": "registry/example/animated-gradient-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "orbiting-circles-demo", - "type": "registry:component", - "registryDependencies": ["orbiting-circles"], - "dependencies": ["@radix-ui/react-icons"], + "type": "registry:example", + "dependencies": [ + "@radix-ui/react-icons" + ], + "registryDependencies": [ + "orbiting-circles" + ], "files": [ { "path": "registry/example/orbiting-circles-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "dock-demo", - "type": "registry:component", - "registryDependencies": ["dock"], + "type": "registry:example", + "registryDependencies": [ + "dock" + ], "files": [ { "path": "registry/example/dock-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "dock-demo-2", - "type": "registry:component", - "registryDependencies": ["dock"], + "type": "registry:example", + "registryDependencies": [ + "dock" + ], "files": [ { "path": "registry/example/dock-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "dock-demo-3", - "type": "registry:component", - "registryDependencies": ["dock"], + "type": "registry:example", + "registryDependencies": [ + "dock" + ], "files": [ { "path": "registry/example/dock-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "word-rotate-demo", - "type": "registry:component", - "registryDependencies": ["word-rotate"], + "type": "registry:example", + "registryDependencies": [ + "word-rotate" + ], "files": [ { "path": "registry/example/word-rotate-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "hyper-text-demo", - "type": "registry:component", - "registryDependencies": ["hyper-text"], + "type": "registry:example", + "registryDependencies": [ + "hyper-text" + ], "files": [ { "path": "registry/example/hyper-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "avatar-circles-demo", - "type": "registry:component", - "registryDependencies": ["avatar-circles"], + "type": "registry:example", + "registryDependencies": [ + "avatar-circles" + ], "files": [ { "path": "registry/example/avatar-circles-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "typing-animation-demo", - "type": "registry:component", - "registryDependencies": ["typing-animation"], + "type": "registry:example", + "registryDependencies": [ + "typing-animation" + ], "files": [ { "path": "registry/example/typing-animation-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "scroll-based-velocity-demo", - "type": "registry:component", - "registryDependencies": ["scroll-based-velocity"], + "type": "registry:example", + "registryDependencies": [ + "scroll-based-velocity" + ], "files": [ { "path": "registry/example/scroll-based-velocity-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "scratch-to-reveal-demo", - "type": "registry:component", - "registryDependencies": ["scratch-to-reveal"], + "type": "registry:example", + "registryDependencies": [ + "scratch-to-reveal" + ], "files": [ { "path": "registry/example/scratch-to-reveal-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "flip-text-demo", - "type": "registry:component", - "registryDependencies": ["flip-text"], + "type": "registry:example", + "registryDependencies": [ + "flip-text" + ], "files": [ { "path": "registry/example/flip-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "sparkles-text-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/sparkles-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "icon-cloud-demo", - "type": "registry:component", - "registryDependencies": ["icon-cloud"], + "type": "registry:example", + "registryDependencies": [ + "icon-cloud" + ], "files": [ { "path": "registry/example/icon-cloud-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "icon-cloud-demo-2", - "type": "registry:component", - "registryDependencies": ["icon-cloud"], + "type": "registry:example", + "registryDependencies": [ + "icon-cloud" + ], "files": [ { "path": "registry/example/icon-cloud-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "icon-cloud-demo-3", - "type": "registry:component", - "registryDependencies": ["icon-cloud"], + "type": "registry:example", + "registryDependencies": [ + "icon-cloud" + ], "files": [ { "path": "registry/example/icon-cloud-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo-2", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo-3", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo-4", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo-4.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo-5", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo-5.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "text-animate-demo-6", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/text-animate-demo-6.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "shiny-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/shiny-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "box-reveal-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/box-reveal-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-circular-progress-bar-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/animated-circular-progress-bar-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "shine-border-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/shine-border-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "shine-border-demo-2", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/shine-border-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-basic-cannon", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-basic-cannon.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-random-direction", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-random-direction.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-fireworks", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-fireworks.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-stars", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-stars.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-side-cannons", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-side-cannons.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-custom-shapes", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-custom-shapes.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "confetti-emoji", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/confetti-emoji.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "animated-subscribe-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/animated-subscribe-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "cool-mode-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/cool-mode-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "cool-mode-custom", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/cool-mode-custom.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "pulsating-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/pulsating-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "ripple-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/ripple-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "file-tree-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/file-tree-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "blur-fade-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/blur-fade-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "blur-fade-text-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/blur-fade-text-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "safari-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/safari-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "safari-demo-2", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/safari-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "safari-demo-3", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/safari-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "safari-demo-4", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/safari-demo-4.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "iphone-15-pro-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/iphone-15-pro-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "iphone-15-pro-demo-2", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/iphone-15-pro-demo-2.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "iphone-15-pro-demo-3", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/iphone-15-pro-demo-3.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "rainbow-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/rainbow-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" } ] }, { "name": "interactive-hover-button-demo", - "type": "registry:component", + "type": "registry:example", "files": [ { "path": "registry/example/interactive-hover-button-demo.tsx", - "type": "registry:component" + "type": "registry:example" + } + ] + }, + { + "name": "utils", + "type": "registry:lib", + "dependencies": [ + "clsx", + "tailwind-merge" + ], + "files": [ + { + "path": "registry/lib/utils.ts", + "type": "registry:lib" } ] } ] -} +} \ No newline at end of file diff --git a/registry/example/magic-card-demo.tsx b/registry/example/magic-card-demo.tsx index b5c9ae99c..df2891901 100644 --- a/registry/example/magic-card-demo.tsx +++ b/registry/example/magic-card-demo.tsx @@ -1,3 +1,5 @@ +"use client"; + import { useTheme } from "next-themes"; import { MagicCard } from "@/registry/magicui/magic-card"; diff --git a/registry/magicui/confetti.tsx b/registry/magicui/confetti.tsx index 161255fc5..c6df6cef8 100644 --- a/registry/magicui/confetti.tsx +++ b/registry/magicui/confetti.tsx @@ -1,3 +1,5 @@ +"use client"; + import type { GlobalOptions as ConfettiGlobalOptions, CreateTypes as ConfettiInstance, diff --git a/registry/magicui/cool-mode.tsx b/registry/magicui/cool-mode.tsx index 387b9a9aa..4f8f09ac0 100644 --- a/registry/magicui/cool-mode.tsx +++ b/registry/magicui/cool-mode.tsx @@ -1,4 +1,6 @@ -import React, { ReactNode, RefObject, useEffect, useRef } from "react"; +"use client"; + +import React, { ReactNode, useEffect, useRef } from "react"; export interface BaseParticle { element: HTMLElement | SVGSVGElement; diff --git a/registry/magicui/interactive-grid-pattern.tsx b/registry/magicui/interactive-grid-pattern.tsx index ba8ccd285..bab1ce94f 100644 --- a/registry/magicui/interactive-grid-pattern.tsx +++ b/registry/magicui/interactive-grid-pattern.tsx @@ -1,3 +1,5 @@ +"use client"; + import { cn } from "@/lib/utils"; import React, { useState } from "react"; diff --git a/registry/magicui/scratch-to-reveal.tsx b/registry/magicui/scratch-to-reveal.tsx index 3662bdec2..149ee33aa 100644 --- a/registry/magicui/scratch-to-reveal.tsx +++ b/registry/magicui/scratch-to-reveal.tsx @@ -1,3 +1,4 @@ +"use client"; import { cn } from "@/lib/utils"; import { motion, useAnimation } from "motion/react"; import React, { useEffect, useRef, useState } from "react"; diff --git a/registry/registry-examples.ts b/registry/registry-examples.ts index b8b859c22..1633ee47d 100644 --- a/registry/registry-examples.ts +++ b/registry/registry-examples.ts @@ -1,190 +1,234 @@ -import { Registry } from "@/registry/schema"; +import { type Registry } from "shadcn/registry"; -export const examples: Registry = [ +export const examples: Registry["items"] = [ { name: "magic-card-demo", type: "registry:example", registryDependencies: ["magic-card"], - files: ["example/magic-card-demo.tsx"], + files: [{ path: "example/magic-card-demo.tsx", type: "registry:example" }], }, { name: "android-demo", type: "registry:example", registryDependencies: ["android"], - files: ["example/android-demo.tsx"], + files: [{ path: "example/android-demo.tsx", type: "registry:example" }], }, { name: "android-demo-2", type: "registry:example", registryDependencies: ["android"], - files: ["example/android-demo-2.tsx"], + files: [{ path: "example/android-demo-2.tsx", type: "registry:example" }], }, { name: "android-demo-3", type: "registry:example", registryDependencies: ["android"], - files: ["example/android-demo-3.tsx"], + files: [{ path: "example/android-demo-3.tsx", type: "registry:example" }], }, { name: "warp-background-demo", type: "registry:example", registryDependencies: ["warp-background"], - files: ["example/warp-background-demo.tsx"], + files: [ + { path: "example/warp-background-demo.tsx", type: "registry:example" }, + ], }, { name: "line-shadow-text-demo", type: "registry:example", registryDependencies: ["line-shadow-text"], - files: ["example/line-shadow-text-demo.tsx"], + files: [ + { path: "example/line-shadow-text-demo.tsx", type: "registry:example" }, + ], }, { name: "aurora-text-demo", type: "registry:example", registryDependencies: ["aurora-text"], - files: ["example/aurora-text-demo.tsx"], - }, - { - name: "terminal-demo", - type: "registry:example", - registryDependencies: ["terminal"], - files: ["example/terminal-demo.tsx"], + files: [{ path: "example/aurora-text-demo.tsx", type: "registry:example" }], }, { name: "morphing-text-demo", type: "registry:example", registryDependencies: ["morphing-text"], - files: ["example/morphing-text-demo.tsx"], + files: [ + { path: "example/morphing-text-demo.tsx", type: "registry:example" }, + ], }, { name: "scroll-progress-demo", type: "registry:example", registryDependencies: ["scroll-progress"], - files: ["example/scroll-progress-demo.tsx"], + files: [ + { path: "example/scroll-progress-demo.tsx", type: "registry:example" }, + ], }, { name: "neon-gradient-card-demo", type: "registry:example", - files: ["example/neon-gradient-card-demo.tsx"], + files: [ + { path: "example/neon-gradient-card-demo.tsx", type: "registry:example" }, + ], }, { name: "meteors-demo", type: "registry:example", registryDependencies: ["meteors"], - files: ["example/meteors-demo.tsx"], + files: [{ path: "example/meteors-demo.tsx", type: "registry:example" }], }, { name: "grid-pattern-demo", type: "registry:example", registryDependencies: ["grid-pattern"], - files: ["example/grid-pattern-demo.tsx"], + files: [ + { path: "example/grid-pattern-demo.tsx", type: "registry:example" }, + ], }, { name: "grid-pattern-linear-gradient", type: "registry:example", registryDependencies: ["grid-pattern"], - files: ["example/grid-pattern-linear-gradient.tsx"], + files: [ + { + path: "example/grid-pattern-linear-gradient.tsx", + type: "registry:example", + }, + ], }, { name: "grid-pattern-dashed", type: "registry:example", registryDependencies: ["grid-pattern"], - files: ["example/grid-pattern-dashed.tsx"], + files: [ + { path: "example/grid-pattern-dashed.tsx", type: "registry:example" }, + ], }, { name: "dot-pattern-demo", type: "registry:example", registryDependencies: ["dot-pattern"], - files: ["example/dot-pattern-demo.tsx"], + files: [{ path: "example/dot-pattern-demo.tsx", type: "registry:example" }], }, { name: "dot-pattern-linear-gradient", type: "registry:example", registryDependencies: ["dot-pattern"], - files: ["example/dot-pattern-linear-gradient.tsx"], + files: [ + { + path: "example/dot-pattern-linear-gradient.tsx", + type: "registry:example", + }, + ], }, { name: "flickering-grid-demo", type: "registry:example", - files: ["example/flickering-grid-demo.tsx"], + files: [ + { path: "example/flickering-grid-demo.tsx", type: "registry:example" }, + ], }, { name: "flickering-grid-rounded-demo", type: "registry:example", - files: ["example/flickering-grid-rounded-demo.tsx"], + files: [ + { + path: "example/flickering-grid-rounded-demo.tsx", + type: "registry:example", + }, + ], }, { name: "hero-video-dialog-demo", type: "registry:example", - files: ["example/hero-video-dialog-demo.tsx"], + files: [ + { path: "example/hero-video-dialog-demo.tsx", type: "registry:example" }, + ], }, { name: "hero-video-dialog-demo-top-in-bottom-out", type: "registry:example", - files: ["example/hero-video-dialog-demo-top-in-bottom-out.tsx"], + files: [ + { + path: "example/hero-video-dialog-demo-top-in-bottom-out.tsx", + type: "registry:example", + }, + ], }, { name: "code-comparison-demo", type: "registry:example", - files: ["example/code-comparison-demo.tsx"], + files: [ + { path: "example/code-comparison-demo.tsx", type: "registry:example" }, + ], }, { name: "script-copy-btn-demo", type: "registry:example", - files: ["example/script-copy-btn-demo.tsx"], + files: [ + { path: "example/script-copy-btn-demo.tsx", type: "registry:example" }, + ], }, { name: "marquee-demo", type: "registry:example", registryDependencies: ["marquee"], - files: ["example/marquee-demo.tsx"], + files: [{ path: "example/marquee-demo.tsx", type: "registry:example" }], }, { name: "marquee-demo-vertical", type: "registry:example", registryDependencies: ["marquee"], - files: ["example/marquee-demo-vertical.tsx"], + files: [ + { path: "example/marquee-demo-vertical.tsx", type: "registry:example" }, + ], }, { name: "marquee-logos", type: "registry:example", registryDependencies: ["marquee"], - files: ["example/marquee-logos.tsx"], + files: [{ path: "example/marquee-logos.tsx", type: "registry:example" }], }, { name: "marquee-3d", type: "registry:example", registryDependencies: ["marquee"], - files: ["example/marquee-3d.tsx"], + files: [{ path: "example/marquee-3d.tsx", type: "registry:example" }], }, { name: "globe-demo", type: "registry:example", registryDependencies: ["globe"], - files: ["example/globe-demo.tsx"], + files: [{ path: "example/globe-demo.tsx", type: "registry:example" }], }, { name: "tweet-card-demo", type: "registry:example", registryDependencies: ["tweet-card"], - files: ["example/tweet-card-demo.tsx"], + files: [{ path: "example/tweet-card-demo.tsx", type: "registry:example" }], }, { name: "tweet-card-images", type: "registry:example", registryDependencies: ["tweet-card"], - files: ["example/tweet-card-images.tsx"], + files: [ + { path: "example/tweet-card-images.tsx", type: "registry:example" }, + ], }, { name: "tweet-card-meta-preview", type: "registry:example", registryDependencies: ["tweet-card"], - files: ["example/tweet-card-meta-preview.tsx"], + files: [ + { path: "example/tweet-card-meta-preview.tsx", type: "registry:example" }, + ], }, { name: "shimmer-button-demo", type: "registry:example", registryDependencies: ["shimmer-button"], - files: ["example/shimmer-button-demo.tsx"], + files: [ + { path: "example/shimmer-button-demo.tsx", type: "registry:example" }, + ], }, { name: "bento-demo", @@ -198,394 +242,531 @@ export const examples: Registry = [ "shadcn:calendar", ], dependencies: ["@radix-ui/react-icons"], - files: ["example/bento-demo.tsx"], + files: [{ path: "example/bento-demo.tsx", type: "registry:example" }], }, { name: "bento-demo-vertical", type: "registry:example", registryDependencies: ["bento-grid"], dependencies: ["@radix-ui/react-icons"], - files: ["example/bento-demo-vertical.tsx"], + files: [ + { path: "example/bento-demo-vertical.tsx", type: "registry:example" }, + ], }, { name: "number-ticker-demo", type: "registry:example", registryDependencies: ["number-ticker"], - files: ["example/number-ticker-demo.tsx"], + files: [ + { path: "example/number-ticker-demo.tsx", type: "registry:example" }, + ], }, { name: "number-ticker-decimal-demo", type: "registry:example", registryDependencies: ["number-ticker"], - files: ["example/number-ticker-decimal-demo.tsx"], + files: [ + { + path: "example/number-ticker-decimal-demo.tsx", + type: "registry:example", + }, + ], }, { name: "ripple-demo", type: "registry:example", registryDependencies: ["ripple"], - files: ["example/ripple-demo.tsx"], + files: [{ path: "example/ripple-demo.tsx", type: "registry:example" }], }, { name: "retro-grid-demo", type: "registry:example", - files: ["example/retro-grid-demo.tsx"], + files: [{ path: "example/retro-grid-demo.tsx", type: "registry:example" }], }, { name: "animated-list-demo", type: "registry:example", registryDependencies: ["animated-list"], - files: ["example/animated-list-demo.tsx"], + files: [ + { path: "example/animated-list-demo.tsx", type: "registry:example" }, + ], }, { name: "animated-shiny-text-demo", type: "registry:example", registryDependencies: ["animated-shiny-text"], dependencies: ["@radix-ui/react-icons"], - files: ["example/animated-shiny-text-demo.tsx"], + files: [ + { + path: "example/animated-shiny-text-demo.tsx", + type: "registry:example", + }, + ], }, { name: "particles-demo", type: "registry:example", registryDependencies: ["particles"], dependencies: ["next-themes"], - files: ["example/particles-demo.tsx"], + files: [{ path: "example/particles-demo.tsx", type: "registry:example" }], }, { name: "animated-grid-pattern-demo", type: "registry:example", registryDependencies: ["animated-grid-pattern"], - files: ["example/animated-grid-pattern-demo.tsx"], + files: [ + { + path: "example/animated-grid-pattern-demo.tsx", + type: "registry:example", + }, + ], }, { name: "interactive-grid-pattern-demo", type: "registry:example", registryDependencies: ["interactive-grid-pattern"], - files: ["example/interactive-grid-pattern-demo.tsx"], + files: [ + { + path: "example/interactive-grid-pattern-demo.tsx", + type: "registry:example", + }, + ], }, { name: "interactive-grid-pattern-demo-2", type: "registry:example", registryDependencies: ["interactive-grid-pattern"], - files: ["example/interactive-grid-pattern-demo-2.tsx"], + files: [ + { + path: "example/interactive-grid-pattern-demo-2.tsx", + type: "registry:example", + }, + ], }, { name: "border-beam-demo", type: "registry:example", registryDependencies: ["border-beam"], - files: ["example/border-beam-demo.tsx"], + files: [{ path: "example/border-beam-demo.tsx", type: "registry:example" }], }, { name: "animated-beam-demo", type: "registry:example", registryDependencies: ["animated-beam"], dependencies: ["@radix-ui/react-icons"], - files: ["example/animated-beam-demo.tsx"], + files: [ + { path: "example/animated-beam-demo.tsx", type: "registry:example" }, + ], }, { name: "animated-beam-unidirectional", type: "registry:example", registryDependencies: ["animated-beam"], - files: ["example/animated-beam-unidirectional.tsx"], + files: [ + { + path: "example/animated-beam-unidirectional.tsx", + type: "registry:example", + }, + ], }, { name: "animated-beam-bidirectional", type: "registry:example", registryDependencies: ["animated-beam"], - files: ["example/animated-beam-bidirectional.tsx"], + files: [ + { + path: "example/animated-beam-bidirectional.tsx", + type: "registry:example", + }, + ], }, { name: "animated-beam-multiple-inputs", type: "registry:example", registryDependencies: ["animated-beam"], - files: ["example/animated-beam-multiple-inputs.tsx"], + files: [ + { + path: "example/animated-beam-multiple-inputs.tsx", + type: "registry:example", + }, + ], }, { name: "animated-beam-multiple-outputs", type: "registry:example", registryDependencies: ["animated-beam"], - files: ["example/animated-beam-multiple-outputs.tsx"], + files: [ + { + path: "example/animated-beam-multiple-outputs.tsx", + type: "registry:example", + }, + ], }, { name: "text-reveal-demo", type: "registry:example", registryDependencies: ["text-reveal"], - files: ["example/text-reveal-demo.tsx"], + files: [{ path: "example/text-reveal-demo.tsx", type: "registry:example" }], }, { name: "animated-gradient-text-demo", type: "registry:example", registryDependencies: ["animated-gradient-text"], dependencies: ["lucide-react"], - files: ["example/animated-gradient-text-demo.tsx"], + files: [ + { + path: "example/animated-gradient-text-demo.tsx", + type: "registry:example", + }, + ], }, { name: "orbiting-circles-demo", type: "registry:example", registryDependencies: ["orbiting-circles"], dependencies: ["@radix-ui/react-icons"], - files: ["example/orbiting-circles-demo.tsx"], + files: [ + { path: "example/orbiting-circles-demo.tsx", type: "registry:example" }, + ], }, { name: "dock-demo", type: "registry:example", registryDependencies: ["dock"], - files: ["example/dock-demo.tsx"], + files: [{ path: "example/dock-demo.tsx", type: "registry:example" }], }, { name: "dock-demo-2", type: "registry:example", registryDependencies: ["dock"], - files: ["example/dock-demo-2.tsx"], + files: [{ path: "example/dock-demo-2.tsx", type: "registry:example" }], }, { name: "dock-demo-3", type: "registry:example", registryDependencies: ["dock"], - files: ["example/dock-demo-3.tsx"], + files: [{ path: "example/dock-demo-3.tsx", type: "registry:example" }], }, { name: "word-rotate-demo", type: "registry:example", registryDependencies: ["word-rotate"], - files: ["example/word-rotate-demo.tsx"], + files: [{ path: "example/word-rotate-demo.tsx", type: "registry:example" }], }, { name: "hyper-text-demo", type: "registry:example", registryDependencies: ["hyper-text"], - files: ["example/hyper-text-demo.tsx"], + files: [{ path: "example/hyper-text-demo.tsx", type: "registry:example" }], }, { name: "avatar-circles-demo", type: "registry:example", registryDependencies: ["avatar-circles"], - files: ["example/avatar-circles-demo.tsx"], + files: [ + { path: "example/avatar-circles-demo.tsx", type: "registry:example" }, + ], }, { name: "typing-animation-demo", type: "registry:example", registryDependencies: ["typing-animation"], - files: ["example/typing-animation-demo.tsx"], + files: [ + { path: "example/typing-animation-demo.tsx", type: "registry:example" }, + ], }, { name: "scroll-based-velocity-demo", type: "registry:example", registryDependencies: ["scroll-based-velocity"], - files: ["example/scroll-based-velocity-demo.tsx"], + files: [ + { + path: "example/scroll-based-velocity-demo.tsx", + type: "registry:example", + }, + ], }, { name: "scratch-to-reveal-demo", type: "registry:example", registryDependencies: ["scratch-to-reveal"], - files: ["example/scratch-to-reveal-demo.tsx"], + files: [ + { path: "example/scratch-to-reveal-demo.tsx", type: "registry:example" }, + ], }, { name: "flip-text-demo", type: "registry:example", registryDependencies: ["flip-text"], - files: ["example/flip-text-demo.tsx"], + files: [{ path: "example/flip-text-demo.tsx", type: "registry:example" }], }, { name: "sparkles-text-demo", type: "registry:example", - files: ["example/sparkles-text-demo.tsx"], + files: [ + { path: "example/sparkles-text-demo.tsx", type: "registry:example" }, + ], }, { name: "icon-cloud-demo", type: "registry:example", registryDependencies: ["icon-cloud"], - files: ["example/icon-cloud-demo.tsx"], + files: [{ path: "example/icon-cloud-demo.tsx", type: "registry:example" }], }, { name: "icon-cloud-demo-2", type: "registry:example", registryDependencies: ["icon-cloud"], - files: ["example/icon-cloud-demo-2.tsx"], + files: [ + { path: "example/icon-cloud-demo-2.tsx", type: "registry:example" }, + ], }, { name: "icon-cloud-demo-3", type: "registry:example", registryDependencies: ["icon-cloud"], - files: ["example/icon-cloud-demo-3.tsx"], + files: [ + { path: "example/icon-cloud-demo-3.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo", type: "registry:example", - files: ["example/text-animate-demo.tsx"], + files: [ + { path: "example/text-animate-demo.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo-2", type: "registry:example", - files: ["example/text-animate-demo-2.tsx"], + files: [ + { path: "example/text-animate-demo-2.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo-3", type: "registry:example", - files: ["example/text-animate-demo-3.tsx"], + files: [ + { path: "example/text-animate-demo-3.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo-4", type: "registry:example", - files: ["example/text-animate-demo-4.tsx"], + files: [ + { path: "example/text-animate-demo-4.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo-5", type: "registry:example", - files: ["example/text-animate-demo-5.tsx"], + files: [ + { path: "example/text-animate-demo-5.tsx", type: "registry:example" }, + ], }, { name: "text-animate-demo-6", type: "registry:example", - files: ["example/text-animate-demo-6.tsx"], + files: [ + { path: "example/text-animate-demo-6.tsx", type: "registry:example" }, + ], }, { name: "shiny-button-demo", type: "registry:example", - files: ["example/shiny-button-demo.tsx"], + files: [ + { path: "example/shiny-button-demo.tsx", type: "registry:example" }, + ], }, { name: "box-reveal-demo", type: "registry:example", - files: ["example/box-reveal-demo.tsx"], + files: [{ path: "example/box-reveal-demo.tsx", type: "registry:example" }], }, { name: "animated-circular-progress-bar-demo", type: "registry:example", - files: ["example/animated-circular-progress-bar-demo.tsx"], + files: [ + { + path: "example/animated-circular-progress-bar-demo.tsx", + type: "registry:example", + }, + ], }, { name: "shine-border-demo", type: "registry:example", - files: ["example/shine-border-demo.tsx"], + files: [ + { path: "example/shine-border-demo.tsx", type: "registry:example" }, + ], }, { name: "shine-border-demo-2", type: "registry:example", - files: ["example/shine-border-demo-2.tsx"], + files: [ + { path: "example/shine-border-demo-2.tsx", type: "registry:example" }, + ], }, { name: "confetti-demo", type: "registry:example", - files: ["example/confetti-demo.tsx"], + files: [{ path: "example/confetti-demo.tsx", type: "registry:example" }], }, { name: "confetti-basic-cannon", type: "registry:example", - files: ["example/confetti-basic-cannon.tsx"], + files: [ + { path: "example/confetti-basic-cannon.tsx", type: "registry:example" }, + ], }, { name: "confetti-random-direction", type: "registry:example", - files: ["example/confetti-random-direction.tsx"], + files: [ + { + path: "example/confetti-random-direction.tsx", + type: "registry:example", + }, + ], }, { name: "confetti-fireworks", type: "registry:example", - files: ["example/confetti-fireworks.tsx"], + files: [ + { path: "example/confetti-fireworks.tsx", type: "registry:example" }, + ], }, { name: "confetti-stars", type: "registry:example", - files: ["example/confetti-stars.tsx"], + files: [{ path: "example/confetti-stars.tsx", type: "registry:example" }], }, { name: "confetti-side-cannons", type: "registry:example", - files: ["example/confetti-side-cannons.tsx"], + files: [ + { path: "example/confetti-side-cannons.tsx", type: "registry:example" }, + ], }, { name: "confetti-custom-shapes", type: "registry:example", - files: ["example/confetti-custom-shapes.tsx"], + files: [ + { path: "example/confetti-custom-shapes.tsx", type: "registry:example" }, + ], }, { name: "confetti-emoji", type: "registry:example", - files: ["example/confetti-emoji.tsx"], + files: [{ path: "example/confetti-emoji.tsx", type: "registry:example" }], }, { name: "animated-subscribe-button-demo", type: "registry:example", - files: ["example/animated-subscribe-button-demo.tsx"], + files: [ + { + path: "example/animated-subscribe-button-demo.tsx", + type: "registry:example", + }, + ], }, { name: "cool-mode-demo", type: "registry:example", - files: ["example/cool-mode-demo.tsx"], + files: [{ path: "example/cool-mode-demo.tsx", type: "registry:example" }], }, { name: "cool-mode-custom", type: "registry:example", - files: ["example/cool-mode-custom.tsx"], + files: [{ path: "example/cool-mode-custom.tsx", type: "registry:example" }], }, { name: "pulsating-button-demo", type: "registry:example", - files: ["example/pulsating-button-demo.tsx"], + files: [ + { path: "example/pulsating-button-demo.tsx", type: "registry:example" }, + ], }, { name: "ripple-button-demo", type: "registry:example", - files: ["example/ripple-button-demo.tsx"], + files: [ + { path: "example/ripple-button-demo.tsx", type: "registry:example" }, + ], }, { name: "file-tree-demo", type: "registry:example", - files: ["example/file-tree-demo.tsx"], + files: [{ path: "example/file-tree-demo.tsx", type: "registry:example" }], }, { name: "blur-fade-demo", type: "registry:example", - files: ["example/blur-fade-demo.tsx"], + files: [{ path: "example/blur-fade-demo.tsx", type: "registry:example" }], }, { name: "blur-fade-text-demo", type: "registry:example", - files: ["example/blur-fade-text-demo.tsx"], + files: [ + { path: "example/blur-fade-text-demo.tsx", type: "registry:example" }, + ], }, { name: "safari-demo", type: "registry:example", - files: ["example/safari-demo.tsx"], + files: [{ path: "example/safari-demo.tsx", type: "registry:example" }], }, { name: "safari-demo-2", type: "registry:example", - files: ["example/safari-demo-2.tsx"], + files: [{ path: "example/safari-demo-2.tsx", type: "registry:example" }], }, { name: "safari-demo-3", type: "registry:example", - files: ["example/safari-demo-3.tsx"], + files: [{ path: "example/safari-demo-3.tsx", type: "registry:example" }], }, { name: "safari-demo-4", type: "registry:example", - files: ["example/safari-demo-4.tsx"], + files: [{ path: "example/safari-demo-4.tsx", type: "registry:example" }], }, { name: "iphone-15-pro-demo", type: "registry:example", - files: ["example/iphone-15-pro-demo.tsx"], + files: [ + { path: "example/iphone-15-pro-demo.tsx", type: "registry:example" }, + ], }, { name: "iphone-15-pro-demo-2", type: "registry:example", - files: ["example/iphone-15-pro-demo-2.tsx"], + files: [ + { path: "example/iphone-15-pro-demo-2.tsx", type: "registry:example" }, + ], }, { name: "iphone-15-pro-demo-3", type: "registry:example", - files: ["example/iphone-15-pro-demo-3.tsx"], + files: [ + { path: "example/iphone-15-pro-demo-3.tsx", type: "registry:example" }, + ], }, { name: "rainbow-button-demo", type: "registry:example", - files: ["example/rainbow-button-demo.tsx"], + files: [ + { path: "example/rainbow-button-demo.tsx", type: "registry:example" }, + ], }, { name: "interactive-hover-button-demo", type: "registry:example", - files: ["example/interactive-hover-button-demo.tsx"], + files: [ + { + path: "example/interactive-hover-button-demo.tsx", + type: "registry:example", + }, + ], }, ]; diff --git a/registry/registry-lib.ts b/registry/registry-lib.ts new file mode 100644 index 000000000..b6b6c0e97 --- /dev/null +++ b/registry/registry-lib.ts @@ -0,0 +1,15 @@ +import { type Registry } from "shadcn/registry"; + +export const lib: Registry["items"] = [ + { + name: "utils", + type: "registry:lib", + dependencies: ["clsx", "tailwind-merge"], + files: [ + { + path: "lib/utils.ts", + type: "registry:lib", + }, + ], + }, +]; diff --git a/registry/registry-ui.ts b/registry/registry-ui.ts index 24cc99c91..3ece67dcd 100644 --- a/registry/registry-ui.ts +++ b/registry/registry-ui.ts @@ -1,40 +1,34 @@ -import { Registry } from "@/registry/schema"; +import { type Registry } from "shadcn/registry"; -export const ui: Registry = [ +export const ui: Registry["items"] = [ { name: "magic-card", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/magic-card.tsx"], + files: [{ path: "magicui/magic-card.tsx", type: "registry:ui" }], }, { name: "android", type: "registry:ui", - files: ["magicui/android.tsx"], + files: [{ path: "magicui/android.tsx", type: "registry:ui" }], }, { name: "warp-background", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/warp-background.tsx"], + files: [{ path: "magicui/warp-background.tsx", type: "registry:ui" }], }, { name: "line-shadow-text", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/line-shadow-text.tsx"], - }, - { - name: "terminal", - type: "registry:ui", - dependencies: ["motion"], - files: ["magicui/terminal.tsx"], + files: [{ path: "magicui/line-shadow-text.tsx", type: "registry:ui" }], }, { name: "aurora-text", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/aurora-text.tsx"], + files: [{ path: "magicui/aurora-text.tsx", type: "registry:ui" }], cssVars: { light: { "--color-1": "0 100% 63%", @@ -100,18 +94,18 @@ export const ui: Registry = [ { name: "morphing-text", type: "registry:ui", - files: ["magicui/morphing-text.tsx"], + files: [{ path: "magicui/morphing-text.tsx", type: "registry:ui" }], }, { name: "scroll-progress", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/scroll-progress.tsx"], + files: [{ path: "magicui/scroll-progress.tsx", type: "registry:ui" }], }, { name: "neon-gradient-card", type: "registry:ui", - files: ["magicui/neon-gradient-card.tsx"], + files: [{ path: "magicui/neon-gradient-card.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -134,7 +128,7 @@ export const ui: Registry = [ { name: "meteors", type: "registry:ui", - files: ["magicui/meteors.tsx"], + files: [{ path: "magicui/meteors.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -163,46 +157,48 @@ export const ui: Registry = [ { name: "grid-pattern", type: "registry:ui", - files: ["magicui/grid-pattern.tsx"], + files: [{ path: "magicui/grid-pattern.tsx", type: "registry:ui" }], }, { name: "interactive-grid-pattern", type: "registry:ui", - files: ["magicui/interactive-grid-pattern.tsx"], + files: [ + { path: "magicui/interactive-grid-pattern.tsx", type: "registry:ui" }, + ], }, { name: "dot-pattern", type: "registry:ui", - files: ["magicui/dot-pattern.tsx"], + files: [{ path: "magicui/dot-pattern.tsx", type: "registry:ui" }], }, { name: "flickering-grid", type: "registry:ui", - files: ["magicui/flickering-grid.tsx"], + files: [{ path: "magicui/flickering-grid.tsx", type: "registry:ui" }], }, { name: "hero-video-dialog", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/hero-video-dialog.tsx"], + files: [{ path: "magicui/hero-video-dialog.tsx", type: "registry:ui" }], }, { name: "code-comparison", type: "registry:ui", dependencies: ["shiki", "next-themes"], - files: ["magicui/code-comparison.tsx"], + files: [{ path: "magicui/code-comparison.tsx", type: "registry:ui" }], }, { name: "script-copy-btn", type: "registry:ui", dependencies: ["motion", "shiki", "next-themes"], registryDependencies: ["button"], - files: ["magicui/script-copy-btn.tsx"], + files: [{ path: "magicui/script-copy-btn.tsx", type: "registry:ui" }], }, { name: "marquee", type: "registry:ui", - files: ["magicui/marquee.tsx"], + files: [{ path: "magicui/marquee.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -231,12 +227,12 @@ export const ui: Registry = [ name: "globe", type: "registry:ui", dependencies: ["cobe"], - files: ["magicui/globe.tsx"], + files: [{ path: "magicui/globe.tsx", type: "registry:ui" }], }, { name: "shimmer-button", type: "registry:ui", - files: ["magicui/shimmer-button.tsx"], + files: [{ path: "magicui/shimmer-button.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -277,36 +273,36 @@ export const ui: Registry = [ name: "tweet-card", type: "registry:ui", dependencies: ["react-tweet"], - files: ["magicui/tweet-card.tsx"], + files: [{ path: "magicui/tweet-card.tsx", type: "registry:ui" }], }, { name: "client-tweet-card", type: "registry:ui", dependencies: ["react-tweet"], - files: ["magicui/client-tweet-card.tsx"], + files: [{ path: "magicui/client-tweet-card.tsx", type: "registry:ui" }], }, { name: "bento-grid", type: "registry:ui", dependencies: ["@radix-ui/react-icons"], registryDependencies: ["button"], - files: ["magicui/bento-grid.tsx"], + files: [{ path: "magicui/bento-grid.tsx", type: "registry:ui" }], }, { name: "particles", type: "registry:ui", - files: ["magicui/particles.tsx"], + files: [{ path: "magicui/particles.tsx", type: "registry:ui" }], }, { name: "number-ticker", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/number-ticker.tsx"], + files: [{ path: "magicui/number-ticker.tsx", type: "registry:ui" }], }, { name: "ripple", type: "registry:ui", - files: ["magicui/ripple.tsx"], + files: [{ path: "magicui/ripple.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -333,7 +329,7 @@ export const ui: Registry = [ { name: "retro-grid", type: "registry:ui", - files: ["magicui/retro-grid.tsx"], + files: [{ path: "magicui/retro-grid.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -356,12 +352,12 @@ export const ui: Registry = [ name: "animated-list", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/animated-list.tsx"], + files: [{ path: "magicui/animated-list.tsx", type: "registry:ui" }], }, { name: "animated-shiny-text", type: "registry:ui", - files: ["magicui/animated-shiny-text.tsx"], + files: [{ path: "magicui/animated-shiny-text.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -388,12 +384,12 @@ export const ui: Registry = [ name: "animated-grid-pattern", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/animated-grid-pattern.tsx"], + files: [{ path: "magicui/animated-grid-pattern.tsx", type: "registry:ui" }], }, { name: "border-beam", type: "registry:ui", - files: ["magicui/border-beam.tsx"], + files: [{ path: "magicui/border-beam.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -418,24 +414,26 @@ export const ui: Registry = [ name: "animated-beam", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/animated-beam.tsx"], + files: [{ path: "magicui/animated-beam.tsx", type: "registry:ui" }], }, { name: "text-reveal", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/text-reveal.tsx"], + files: [{ path: "magicui/text-reveal.tsx", type: "registry:ui" }], }, { name: "hyper-text", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/hyper-text.tsx"], + files: [{ path: "magicui/hyper-text.tsx", type: "registry:ui" }], }, { name: "animated-gradient-text", type: "registry:ui", - files: ["magicui/animated-gradient-text.tsx"], + files: [ + { path: "magicui/animated-gradient-text.tsx", type: "registry:ui" }, + ], tailwind: { config: { theme: { @@ -458,7 +456,7 @@ export const ui: Registry = [ { name: "orbiting-circles", type: "registry:ui", - files: ["magicui/orbiting-circles.tsx"], + files: [{ path: "magicui/orbiting-circles.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -487,77 +485,77 @@ export const ui: Registry = [ name: "dock", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/dock.tsx"], + files: [{ path: "magicui/dock.tsx", type: "registry:ui" }], }, { name: "word-rotate", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/word-rotate.tsx"], + files: [{ path: "magicui/word-rotate.tsx", type: "registry:ui" }], }, { name: "avatar-circles", type: "registry:ui", - files: ["magicui/avatar-circles.tsx"], + files: [{ path: "magicui/avatar-circles.tsx", type: "registry:ui" }], }, { name: "typing-animation", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/typing-animation.tsx"], + files: [{ path: "magicui/typing-animation.tsx", type: "registry:ui" }], }, { name: "sparkles-text", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/sparkles-text.tsx"], + files: [{ path: "magicui/sparkles-text.tsx", type: "registry:ui" }], }, { name: "flip-text", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/flip-text.tsx"], + files: [{ path: "magicui/flip-text.tsx", type: "registry:ui" }], }, { name: "icon-cloud", type: "registry:ui", dependencies: [], - files: ["magicui/icon-cloud.tsx"], + files: [{ path: "magicui/icon-cloud.tsx", type: "registry:ui" }], }, { name: "text-animate", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/text-animate.tsx"], + files: [{ path: "magicui/text-animate.tsx", type: "registry:ui" }], }, { name: "scroll-based-velocity", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/scroll-based-velocity.tsx"], + files: [{ path: "magicui/scroll-based-velocity.tsx", type: "registry:ui" }], }, { name: "scratch-to-reveal", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/scratch-to-reveal.tsx"], + files: [{ path: "magicui/scratch-to-reveal.tsx", type: "registry:ui" }], }, { name: "shiny-button", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/shiny-button.tsx"], + files: [{ path: "magicui/shiny-button.tsx", type: "registry:ui" }], }, { name: "box-reveal", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/box-reveal.tsx"], + files: [{ path: "magicui/box-reveal.tsx", type: "registry:ui" }], }, { name: "shine-border", type: "registry:ui", - files: ["magicui/shine-border.tsx"], + files: [{ path: "magicui/shine-border.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -586,30 +584,37 @@ export const ui: Registry = [ { name: "animated-circular-progress-bar", type: "registry:ui", - files: ["magicui/animated-circular-progress-bar.tsx"], + files: [ + { + path: "magicui/animated-circular-progress-bar.tsx", + type: "registry:ui", + }, + ], }, { name: "confetti", type: "registry:ui", dependencies: ["canvas-confetti", "@types/canvas-confetti"], registryDependencies: ["button"], - files: ["magicui/confetti.tsx"], + files: [{ path: "magicui/confetti.tsx", type: "registry:ui" }], }, { name: "animated-subscribe-button", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/animated-subscribe-button.tsx"], + files: [ + { path: "magicui/animated-subscribe-button.tsx", type: "registry:ui" }, + ], }, { name: "cool-mode", type: "registry:ui", - files: ["magicui/cool-mode.tsx"], + files: [{ path: "magicui/cool-mode.tsx", type: "registry:ui" }], }, { name: "pulsating-button", type: "registry:ui", - files: ["magicui/pulsating-button.tsx"], + files: [{ path: "magicui/pulsating-button.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -631,7 +636,7 @@ export const ui: Registry = [ { name: "ripple-button", type: "registry:ui", - files: ["magicui/ripple-button.tsx"], + files: [{ path: "magicui/ripple-button.tsx", type: "registry:ui" }], tailwind: { config: { theme: { @@ -658,28 +663,28 @@ export const ui: Registry = [ { name: "file-tree", type: "registry:ui", - files: ["magicui/file-tree.tsx"], + files: [{ path: "magicui/file-tree.tsx", type: "registry:ui" }], }, { name: "blur-fade", type: "registry:ui", dependencies: ["motion"], - files: ["magicui/blur-fade.tsx"], + files: [{ path: "magicui/blur-fade.tsx", type: "registry:ui" }], }, { name: "safari", type: "registry:ui", - files: ["magicui/safari.tsx"], + files: [{ path: "magicui/safari.tsx", type: "registry:ui" }], }, { name: "iphone-15-pro", type: "registry:ui", - files: ["magicui/iphone-15-pro.tsx"], + files: [{ path: "magicui/iphone-15-pro.tsx", type: "registry:ui" }], }, { name: "rainbow-button", type: "registry:ui", - files: ["magicui/rainbow-button.tsx"], + files: [{ path: "magicui/rainbow-button.tsx", type: "registry:ui" }], cssVars: { light: { "--color-1": "0 100% 63%", @@ -724,6 +729,8 @@ export const ui: Registry = [ { name: "interactive-hover-button", type: "registry:ui", - files: ["magicui/interactive-hover-button.tsx"], + files: [ + { path: "magicui/interactive-hover-button.tsx", type: "registry:ui" }, + ], }, ]; diff --git a/scripts/build-registry.mts b/scripts/build-registry.mts index f4f4464bd..29ba2320f 100644 --- a/scripts/build-registry.mts +++ b/scripts/build-registry.mts @@ -1,775 +1,156 @@ -// @sts-nocheck -import { existsSync, promises as fs } from "fs"; -import { tmpdir } from "os"; +import { exec } from "child_process"; +import { promises as fs } from "fs"; import path from "path"; -import { cwd } from "process"; -import template from "lodash.template"; import { rimraf } from "rimraf"; -import { Project, ScriptKind, SyntaxKind } from "ts-morph"; +import { registryItemSchema, type Registry } from "shadcn/registry"; import { z } from "zod"; -import { registry } from "../registry"; -import { baseColors } from "../registry/registry-base-colors"; -import { colorMapping, colors } from "../registry/registry-colors"; -import { styles } from "../registry/registry-styles"; -import { - Registry, - RegistryEntry, - registryEntrySchema, - registryItemTypeSchema, - registrySchema, -} from "../registry/schema"; - -const REGISTRY_PATH = path.join(process.cwd(), "public/r"); - -const REGISTRY_INDEX_WHITELIST: z.infer[] = [ - "registry:ui", - "registry:lib", - "registry:hook", - "registry:theme", - "registry:block", -]; - -const project = new Project({ - compilerOptions: {}, -}); - -async function createTempSourceFile(filename: string) { - const dir = await fs.mkdtemp(path.join(tmpdir(), "shadcn-")); - return path.join(dir, filename); -} - -// ---------------------------------------------------------------------------- -// Build __registry__/index.tsx. -// ---------------------------------------------------------------------------- -async function buildRegistry(registry: Registry) { - let index = `// @ts-nocheck +import { examples } from "../registry/registry-examples"; +import { lib } from "../registry/registry-lib"; +import { ui } from "../registry/registry-ui"; + +const DEPRECATED_ITEMS = ["toast"]; + +const registry = { + name: "Magic UI", + homepage: "https://magicui.design", + items: z.array(registryItemSchema).parse( + [ + { + name: "index", + type: "registry:style", + dependencies: [ + "tailwindcss-animate", + "class-variance-authority", + "lucide-react", + ], + registryDependencies: ["utils"], + tailwind: { + config: { + plugins: [`require("tailwindcss-animate")`], + }, + }, + cssVars: {}, + files: [], + }, + ...ui, + ...examples, + ...lib, + ].filter((item) => { + return !DEPRECATED_ITEMS.includes(item.name); + }), + ), +} satisfies Registry; + +async function buildRegistryIndex() { + let index = `/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// @ts-nocheck // This file is autogenerated by scripts/build-registry.ts // Do not edit this file directly. import * as React from "react" -export const Index: Record = { -`; - - for (const style of styles) { - index += ` "${style.name}": {`; - - // Build style index. - for (const item of registry) { - const resolveFiles = item.files?.map( - (file) => - `registry/${style.name}/${ - typeof file === "string" ? file : file.path - }`, - ); - if (!resolveFiles) { - continue; - } - - const type = item.type.split(":")[1]; - let sourceFilename = ""; - - let chunks: any = []; - if (item.type === "registry:block") { - const file = resolveFiles[0]; - const filename = path.basename(file); - const raw = await fs.readFile(file, "utf8"); - const tempFile = await createTempSourceFile(filename); - const sourceFile = project.createSourceFile(tempFile, raw, { - scriptKind: ScriptKind.TSX, - }); - - // Find all imports. - const imports = new Map< - string, - { - module: string; - text: string; - isDefault?: boolean; - } - >(); - sourceFile.getImportDeclarations().forEach((node) => { - // eslint-disable-next-line - const module = node.getModuleSpecifier().getLiteralValue(); - node.getNamedImports().forEach((item) => { - imports.set(item.getText(), { - module, - text: node.getText(), - }); - }); - - const defaultImport = node.getDefaultImport(); - if (defaultImport) { - imports.set(defaultImport.getText(), { - module, - text: defaultImport.getText(), - isDefault: true, - }); - } - }); - - // Find all opening tags with x-chunk attribute. - const components = sourceFile - .getDescendantsOfKind(SyntaxKind.JsxOpeningElement) - .filter((node) => { - return node.getAttribute("x-chunk") !== undefined; - }); - - chunks = await Promise.all( - components.map(async (component, index) => { - const chunkName = `${item.name}-chunk-${index}`; - - // Get the value of x-chunk attribute. - const attr = component - .getAttributeOrThrow("x-chunk") - .asKindOrThrow(SyntaxKind.JsxAttribute); - - const description = attr - .getInitializerOrThrow() - .asKindOrThrow(SyntaxKind.StringLiteral) - .getLiteralValue(); - - // Delete the x-chunk attribute. - attr.remove(); - - // Add a new attribute to the component. - component.addAttribute({ - name: "x-chunk", - initializer: `"${chunkName}"`, - }); - - // Get the value of x-chunk-container attribute. - const containerAttr = component - .getAttribute("x-chunk-container") - ?.asKindOrThrow(SyntaxKind.JsxAttribute); - - const containerClassName = containerAttr - ?.getInitializer() - ?.asKindOrThrow(SyntaxKind.StringLiteral) - .getLiteralValue(); - - containerAttr?.remove(); - - const parentJsxElement = component.getParentIfKindOrThrow( - SyntaxKind.JsxElement, - ); - - // Find all opening tags on component. - const children = parentJsxElement - .getDescendantsOfKind(SyntaxKind.JsxOpeningElement) - .map((node) => { - return node.getTagNameNode().getText(); - }) - .concat( - parentJsxElement - .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement) - .map((node) => { - return node.getTagNameNode().getText(); - }), - ); - - const componentImports = new Map< - string, - string | string[] | Set - >(); - children.forEach((child) => { - const importLine = imports.get(child); - if (importLine) { - const imports = componentImports.get(importLine.module) || []; - - const newImports = importLine.isDefault - ? importLine.text - : new Set([...imports, child]); - - componentImports.set( - importLine.module, - importLine?.isDefault ? newImports : Array.from(newImports), - ); - } - }); - - const componnetImportLines = Array.from( - componentImports.keys(), - ).map((key) => { - const values = componentImports.get(key); - const specifier = Array.isArray(values) - ? `{${values.join(",")}}` - : values; - - return `import ${specifier} from "${key}"`; - }); - - const code = ` - 'use client' - - ${componnetImportLines.join("\n")} - - export default function Component() { - return (${parentJsxElement.getText()}) - }`; - - const targetFile = file.replace(item.name, `${chunkName}`); - const targetFilePath = path.join( - cwd(), - `registry/${style.name}/${type}/${chunkName}.tsx`, - ); - - // Write component file. - rimraf.sync(targetFilePath); - await fs.writeFile(targetFilePath, code, "utf8"); - - return { - name: chunkName, - description, - component: `React.lazy(() => import("@/registry/${style.name}/${type}/${chunkName}")),`, - file: targetFile, - container: { - className: containerClassName, - }, - }; - }), - ); - - // // Write the source file for blocks only. - sourceFilename = `__registry__/${style.name}/${type}/${item.name}.tsx`; - - if (item.files) { - const files = item.files.map((file) => - typeof file === "string" - ? { type: "registry:page", path: file } - : file, - ); - if (files?.length) { - sourceFilename = `__registry__/${style.name}/${files[0].path}`; - } - } - - const sourcePath = path.join(process.cwd(), sourceFilename); - if (!existsSync(sourcePath)) { - await fs.mkdir(sourcePath, { recursive: true }); - } - - rimraf.sync(sourcePath); - await fs.writeFile(sourcePath, sourceFile.getText()); - } - - let componentPath = `@/registry/${style.name}/${type}/${item.name}`; - - if (item.files) { - const files = item.files.map((file) => - typeof file === "string" - ? { type: "registry:page", path: file } - : file, - ); - if (files?.length) { - componentPath = `@/registry/${style.name}/${files[0].path}`; - } - } - - index += ` - "${item.name}": { - name: "${item.name}", - type: "${item.type}", - registryDependencies: ${JSON.stringify(item.registryDependencies)}, - files: [${resolveFiles.map((file) => `"${file}"`)}], - component: React.lazy(() => import("${componentPath}")), - source: "${sourceFilename}", - category: "${item.category}", - subcategory: "${item.subcategory}", - chunks: [${chunks.map( - (chunk) => `{ - name: "${chunk.name}", - description: "${chunk.description ?? "No description"}", - component: ${chunk.component} - file: "${chunk.file}", - container: { - className: "${chunk.container.className}" - } - }`, - )}] - },`; +export const Index: Record = {`; + for (const item of registry.items) { + const resolveFiles = item.files?.map((file) => `registry/${file.path}`); + if (!resolveFiles) { + continue; } + const componentPath = item.files?.[0]?.path + ? `@/registry/${item.files[0].path}` + : ""; + index += ` + "${item.name}": { + name: "${item.name}", + description: "${item.description ?? ""}", + type: "${item.type}", + registryDependencies: ${JSON.stringify(item.registryDependencies)}, + files: [${item.files?.map((file) => { + const filePath = `registry/${typeof file === "string" ? file : file.path}`; + const resolvedFilePath = path.resolve(filePath); + return typeof file === "string" + ? `"${resolvedFilePath}"` + : `{ + path: "${filePath}", + type: "${file.type}", + target: "${file.target ?? ""}" + }`; + })}], + component: ${ + componentPath + ? `React.lazy(async () => { + const mod = await import("${componentPath}") + const exportName = Object.keys(mod).find(key => typeof mod[key] === 'function' || typeof mod[key] === 'object') || item.name + return { default: mod.default || mod[exportName] } + })` + : "null" + }, + meta: ${JSON.stringify(item.meta)}, },`; } index += ` -} -`; - - // ---------------------------------------------------------------------------- - // Build registry/index.json. - // ---------------------------------------------------------------------------- - const items = registry - .filter((item) => ["registry:ui"].includes(item.type)) - .map((item) => { - return { - ...item, - files: item.files?.map((_file) => { - const file = - typeof _file === "string" - ? { - path: _file, - type: item.type, - } - : _file; - - return file; - }), - }; - }); - const registryJson = JSON.stringify(items, null, 2); - rimraf.sync(path.join(REGISTRY_PATH, "index.json")); - await fs.writeFile( - path.join(REGISTRY_PATH, "index.json"), - registryJson, - "utf8", - ); + }`; // Write style index. rimraf.sync(path.join(process.cwd(), "__registry__/index.tsx")); await fs.writeFile(path.join(process.cwd(), "__registry__/index.tsx"), index); } -// ---------------------------------------------------------------------------- -// Build registry/styles/[style]/[name].json. -// ---------------------------------------------------------------------------- -async function buildStyles(registry: Registry) { - for (const style of styles) { - const targetPath = path.join(REGISTRY_PATH, "styles", style.name); - - // Create directory if it doesn't exist. - if (!existsSync(targetPath)) { - await fs.mkdir(targetPath, { recursive: true }); - } - - for (const item of registry) { - if (!REGISTRY_INDEX_WHITELIST.includes(item.type)) { - continue; - } - - let files; - if (item.files) { - files = await Promise.all( - item.files.map(async (_file) => { - const file = - typeof _file === "string" - ? { - path: _file, - type: item.type, - content: "", - target: "", - } - : _file; - - const content = await fs.readFile( - path.join(process.cwd(), "registry", style.name, file.path), - "utf8", - ); - - const tempFile = await createTempSourceFile(file.path); - const sourceFile = project.createSourceFile(tempFile, content, { - scriptKind: ScriptKind.TSX, - }); - - sourceFile.getVariableDeclaration("iframeHeight")?.remove(); - sourceFile.getVariableDeclaration("containerClassName")?.remove(); - sourceFile.getVariableDeclaration("description")?.remove(); - - return { - path: file.path, - type: file.type, - content: sourceFile.getText(), - target: file.target, - }; - }), - ); - } - - const payload = registryEntrySchema - .omit({ - source: true, - category: true, - subcategory: true, - chunks: true, - }) - .safeParse({ - ...item, - files, - }); - - if (payload.success) { - await fs.writeFile( - path.join(targetPath, `${item.name}.json`), - JSON.stringify(payload.data, null, 2), - "utf8", - ); - } - } - } - - // ---------------------------------------------------------------------------- - // Build registry/styles/index.json. - // ---------------------------------------------------------------------------- - const stylesJson = JSON.stringify(styles, null, 2); - await fs.writeFile( - path.join(REGISTRY_PATH, "styles/index.json"), - stylesJson, - "utf8", - ); -} - -// ---------------------------------------------------------------------------- -// Build registry/styles/[name]/index.json. -// ---------------------------------------------------------------------------- -async function buildStylesIndex() { - for (const style of styles) { - const targetPath = path.join(REGISTRY_PATH, "styles", style.name); - - const dependencies = [ - "tailwindcss-animate", - "class-variance-authority", - "lucide-react", - ]; - - const payload: RegistryEntry = { - name: style.name, - type: "registry:style", - dependencies, - registryDependencies: ["utils"], - tailwind: { - config: { - plugins: [`require("tailwindcss-animate")`], - }, - }, - cssVars: {}, - files: [], - }; - - await fs.writeFile( - path.join(targetPath, "index.json"), - JSON.stringify(payload, null, 2), - "utf8", - ); - } -} +async function buildRegistryJsonFile() { + // 1. Fix the path for registry items. + const fixedRegistry = { + ...registry, + items: registry.items.map((item) => { + const files = item.files?.map((file) => { + return { + ...file, + path: `registry/${file.path}`, + }; + }); -// ---------------------------------------------------------------------------- -// Build registry/colors/index.json. -// ---------------------------------------------------------------------------- -async function buildThemes() { - const colorsTargetPath = path.join(REGISTRY_PATH, "colors"); - rimraf.sync(colorsTargetPath); - if (!existsSync(colorsTargetPath)) { - await fs.mkdir(colorsTargetPath, { recursive: true }); - } - - const colorsData: Record = {}; - for (const [color, value] of Object.entries(colors)) { - if (typeof value === "string") { - colorsData[color] = value; - continue; - } - - if (Array.isArray(value)) { - colorsData[color] = value.map((item) => ({ + return { ...item, - rgbChannel: item.rgb.replace(/^rgb\((\d+),(\d+),(\d+)\)$/, "$1 $2 $3"), - hslChannel: item.hsl.replace( - /^hsl\(([\d.]+),([\d.]+%),([\d.]+%)\)$/, - "$1 $2 $3", - ), - })); - continue; - } - - if (typeof value === "object") { - colorsData[color] = { - ...value, - rgbChannel: value.rgb.replace(/^rgb\((\d+),(\d+),(\d+)\)$/, "$1 $2 $3"), - hslChannel: value.hsl.replace( - /^hsl\(([\d.]+),([\d.]+%),([\d.]+%)\)$/, - "$1 $2 $3", - ), + files, }; - continue; - } - } + }), + }; + // 2. Write the content of the registry to `registry.json` + rimraf.sync(path.join(process.cwd(), `registry.json`)); await fs.writeFile( - path.join(colorsTargetPath, "index.json"), - JSON.stringify(colorsData, null, 2), - "utf8", + path.join(process.cwd(), `registry.json`), + JSON.stringify(fixedRegistry, null, 2), ); - - // ---------------------------------------------------------------------------- - // Build registry/colors/[base].json. - // ---------------------------------------------------------------------------- - const BASE_STYLES = `@tailwind base; -@tailwind components; -@tailwind utilities; - `; - - const BASE_STYLES_WITH_VARIABLES = `@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: <%- colors.light["background"] %>; - --foreground: <%- colors.light["foreground"] %>; - --card: <%- colors.light["card"] %>; - --card-foreground: <%- colors.light["card-foreground"] %>; - --popover: <%- colors.light["popover"] %>; - --popover-foreground: <%- colors.light["popover-foreground"] %>; - --primary: <%- colors.light["primary"] %>; - --primary-foreground: <%- colors.light["primary-foreground"] %>; - --secondary: <%- colors.light["secondary"] %>; - --secondary-foreground: <%- colors.light["secondary-foreground"] %>; - --muted: <%- colors.light["muted"] %>; - --muted-foreground: <%- colors.light["muted-foreground"] %>; - --accent: <%- colors.light["accent"] %>; - --accent-foreground: <%- colors.light["accent-foreground"] %>; - --destructive: <%- colors.light["destructive"] %>; - --destructive-foreground: <%- colors.light["destructive-foreground"] %>; - --border: <%- colors.light["border"] %>; - --input: <%- colors.light["input"] %>; - --ring: <%- colors.light["ring"] %>; - --radius: 0.5rem; - --chart-1: <%- colors.light["chart-1"] %>; - --chart-2: <%- colors.light["chart-2"] %>; - --chart-3: <%- colors.light["chart-3"] %>; - --chart-4: <%- colors.light["chart-4"] %>; - --chart-5: <%- colors.light["chart-5"] %>; - } - - .dark { - --background: <%- colors.dark["background"] %>; - --foreground: <%- colors.dark["foreground"] %>; - --card: <%- colors.dark["card"] %>; - --card-foreground: <%- colors.dark["card-foreground"] %>; - --popover: <%- colors.dark["popover"] %>; - --popover-foreground: <%- colors.dark["popover-foreground"] %>; - --primary: <%- colors.dark["primary"] %>; - --primary-foreground: <%- colors.dark["primary-foreground"] %>; - --secondary: <%- colors.dark["secondary"] %>; - --secondary-foreground: <%- colors.dark["secondary-foreground"] %>; - --muted: <%- colors.dark["muted"] %>; - --muted-foreground: <%- colors.dark["muted-foreground"] %>; - --accent: <%- colors.dark["accent"] %>; - --accent-foreground: <%- colors.dark["accent-foreground"] %>; - --destructive: <%- colors.dark["destructive"] %>; - --destructive-foreground: <%- colors.dark["destructive-foreground"] %>; - --border: <%- colors.dark["border"] %>; - --input: <%- colors.dark["input"] %>; - --ring: <%- colors.dark["ring"] %>; - --chart-1: <%- colors.dark["chart-1"] %>; - --chart-2: <%- colors.dark["chart-2"] %>; - --chart-3: <%- colors.dark["chart-3"] %>; - --chart-4: <%- colors.dark["chart-4"] %>; - --chart-5: <%- colors.dark["chart-5"] %>; - } -} - -@layer base { - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -}`; - - for (const baseColor of ["slate", "gray", "zinc", "neutral", "stone"]) { - const base: Record = { - inlineColors: {}, - cssVars: {}, - }; - for (const [mode, values] of Object.entries(colorMapping)) { - base["inlineColors"][mode] = {}; - base["cssVars"][mode] = {}; - for (const [key, value] of Object.entries(values)) { - if (typeof value === "string") { - // Chart colors do not have a 1-to-1 mapping with tailwind colors. - if (key.startsWith("chart-")) { - base["cssVars"][mode][key] = value; - continue; - } - - const resolvedColor = value.replace(/{{base}}-/g, `${baseColor}-`); - base["inlineColors"][mode][key] = resolvedColor; - - const [resolvedBase, scale] = resolvedColor.split("-"); - const color = scale - ? colorsData[resolvedBase].find( - (item: any) => item.scale === parseInt(scale), - ) - : colorsData[resolvedBase]; - if (color) { - base["cssVars"][mode][key] = color.hslChannel; - } - } - } - } - - // Build css vars. - base["inlineColorsTemplate"] = template(BASE_STYLES)({}); - base["cssVarsTemplate"] = template(BASE_STYLES_WITH_VARIABLES)({ - colors: base["cssVars"], - }); - - await fs.writeFile( - path.join(REGISTRY_PATH, `colors/${baseColor}.json`), - JSON.stringify(base, null, 2), - "utf8", - ); - - // ---------------------------------------------------------------------------- - // Build registry/themes.css - // ---------------------------------------------------------------------------- - const THEME_STYLES_WITH_VARIABLES = ` -.theme-<%- theme %> { - --background: <%- colors.light["background"] %>; - --foreground: <%- colors.light["foreground"] %>; - - --muted: <%- colors.light["muted"] %>; - --muted-foreground: <%- colors.light["muted-foreground"] %>; - - --popover: <%- colors.light["popover"] %>; - --popover-foreground: <%- colors.light["popover-foreground"] %>; - - --card: <%- colors.light["card"] %>; - --card-foreground: <%- colors.light["card-foreground"] %>; - - --border: <%- colors.light["border"] %>; - --input: <%- colors.light["input"] %>; - - --primary: <%- colors.light["primary"] %>; - --primary-foreground: <%- colors.light["primary-foreground"] %>; - - --secondary: <%- colors.light["secondary"] %>; - --secondary-foreground: <%- colors.light["secondary-foreground"] %>; - - --accent: <%- colors.light["accent"] %>; - --accent-foreground: <%- colors.light["accent-foreground"] %>; - - --destructive: <%- colors.light["destructive"] %>; - --destructive-foreground: <%- colors.light["destructive-foreground"] %>; - - --ring: <%- colors.light["ring"] %>; - - --radius: <%- colors.light["radius"] %>; } -.dark .theme-<%- theme %> { - --background: <%- colors.dark["background"] %>; - --foreground: <%- colors.dark["foreground"] %>; - - --muted: <%- colors.dark["muted"] %>; - --muted-foreground: <%- colors.dark["muted-foreground"] %>; - - --popover: <%- colors.dark["popover"] %>; - --popover-foreground: <%- colors.dark["popover-foreground"] %>; - - --card: <%- colors.dark["card"] %>; - --card-foreground: <%- colors.dark["card-foreground"] %>; - - --border: <%- colors.dark["border"] %>; - --input: <%- colors.dark["input"] %>; - - --primary: <%- colors.dark["primary"] %>; - --primary-foreground: <%- colors.dark["primary-foreground"] %>; - - --secondary: <%- colors.dark["secondary"] %>; - --secondary-foreground: <%- colors.dark["secondary-foreground"] %>; - - --accent: <%- colors.dark["accent"] %>; - --accent-foreground: <%- colors.dark["accent-foreground"] %>; - - --destructive: <%- colors.dark["destructive"] %>; - --destructive-foreground: <%- colors.dark["destructive-foreground"] %>; - - --ring: <%- colors.dark["ring"] %>; -}`; - - const themeCSS = []; - for (const theme of baseColors) { - themeCSS.push( - // @ts-ignore - template(THEME_STYLES_WITH_VARIABLES)({ - colors: theme.cssVars, - theme: theme.name, - }), - ); - } - - await fs.writeFile( - path.join(REGISTRY_PATH, `themes.css`), - themeCSS.join("\n"), - "utf8", +async function buildRegistry() { + return new Promise((resolve, reject) => { + const process = exec( + `pnpm dlx shadcn build registry.json --output ../public/r/`, ); - // ---------------------------------------------------------------------------- - // Build registry/themes/[theme].json - // ---------------------------------------------------------------------------- - rimraf.sync(path.join(REGISTRY_PATH, "themes")); - for (const baseColor of ["slate", "gray", "zinc", "neutral", "stone"]) { - const payload: Record = { - name: baseColor, - label: baseColor.charAt(0).toUpperCase() + baseColor.slice(1), - cssVars: {}, - }; - for (const [mode, values] of Object.entries(colorMapping)) { - payload.cssVars[mode] = {}; - for (const [key, value] of Object.entries(values)) { - if (typeof value === "string") { - const resolvedColor = value.replace(/{{base}}-/g, `${baseColor}-`); - payload.cssVars[mode][key] = resolvedColor; - - const [resolvedBase, scale] = resolvedColor.split("-"); - const color = scale - ? colorsData[resolvedBase].find( - (item: any) => item.scale === parseInt(scale), - ) - : colorsData[resolvedBase]; - if (color) { - payload["cssVars"][mode][key] = color.hslChannel; - } - } - } + process.on("exit", (code) => { + if (code === 0) { + resolve(undefined); + } else { + reject(new Error(`Process exited with code ${code}`)); } - - const targetPath = path.join(REGISTRY_PATH, "themes"); - - // Create directory if it doesn't exist. - if (!existsSync(targetPath)) { - await fs.mkdir(targetPath, { recursive: true }); - } - - await fs.writeFile( - path.join(targetPath, `${payload.name}.json`), - JSON.stringify(payload, null, 2), - "utf8", - ); - } - } + }); + }); } try { - const result = registrySchema.safeParse(registry); - - if (!result.success) { - console.error(result.error); - process.exit(1); - } + console.log("🗂️ Building registry/__index__.tsx..."); + await buildRegistryIndex(); - await buildRegistry(result.data); - await buildStyles(result.data); - await buildStylesIndex(); - await buildThemes(); + console.log("💅 Building registry.json..."); + await buildRegistryJsonFile(); - console.log("✅ Done!"); + console.log("🏗️ Building registry..."); + await buildRegistry(); } catch (error) { console.error(error); process.exit(1); diff --git a/tsconfig.json b/tsconfig.json index 4e6abb1ec..4c1c89880 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", @@ -28,12 +28,12 @@ "@/*": [ "./*" ], - "@/components/magicui/*": [ - "registry/magicui/*" - ], - "@/components/example/*": [ - "registry/example/*" - ], + // "@/components/magicui/*": [ + // "registry/magicui/*" + // ], + // "@/components/example/*": [ + // "registry/example/*" + // ], "content-collections": ["./.content-collections/generated"] } }, From 66eaa72a0968bc6691063786917fd8ec73414b56 Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 13:46:00 -0500 Subject: [PATCH 3/8] fix: update titles and descriptions --- __registry__/index.tsx | 150 ++++++++++++++++++++++--------------- registry.json | 118 +++++++++++++++++++++++++++++ registry/registry-ui.ts | 150 +++++++++++++++++++++++++++++++++++++ scripts/build-registry.mts | 4 +- 4 files changed, 361 insertions(+), 61 deletions(-) diff --git a/__registry__/index.tsx b/__registry__/index.tsx index 328627c1b..8bf89b487 100644 --- a/__registry__/index.tsx +++ b/__registry__/index.tsx @@ -17,7 +17,8 @@ export const Index: Record = { }, "magic-card": { name: "magic-card", - description: "", + description: + "A spotlight effect that follows your mouse cursor and highlights borders on hover.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -40,7 +41,7 @@ export const Index: Record = { }, android: { name: "android", - description: "", + description: "A mockup of an Android device.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -63,7 +64,7 @@ export const Index: Record = { }, "warp-background": { name: "warp-background", - description: "", + description: "A card with a time warping background effect.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -86,7 +87,7 @@ export const Index: Record = { }, "line-shadow-text": { name: "line-shadow-text", - description: "", + description: "A text component with a moving line shadow.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -109,7 +110,7 @@ export const Index: Record = { }, "aurora-text": { name: "aurora-text", - description: "", + description: "A beautiful aurora text effect", type: "registry:ui", registryDependencies: undefined, files: [ @@ -132,7 +133,7 @@ export const Index: Record = { }, "morphing-text": { name: "morphing-text", - description: "", + description: "A dynamic text morphing component for Magic UI.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -155,7 +156,7 @@ export const Index: Record = { }, "scroll-progress": { name: "scroll-progress", - description: "", + description: "Animated Scroll Progress for your pages", type: "registry:ui", registryDependencies: undefined, files: [ @@ -178,7 +179,7 @@ export const Index: Record = { }, "neon-gradient-card": { name: "neon-gradient-card", - description: "", + description: "A beautiful neon card effect", type: "registry:ui", registryDependencies: undefined, files: [ @@ -201,7 +202,7 @@ export const Index: Record = { }, meteors: { name: "meteors", - description: "", + description: "A meteor shower effect.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -224,7 +225,8 @@ export const Index: Record = { }, "grid-pattern": { name: "grid-pattern", - description: "", + description: + "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -247,7 +249,8 @@ export const Index: Record = { }, "interactive-grid-pattern": { name: "interactive-grid-pattern", - description: "", + description: + "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -272,7 +275,8 @@ export const Index: Record = { }, "dot-pattern": { name: "dot-pattern", - description: "", + description: + "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -295,7 +299,8 @@ export const Index: Record = { }, "flickering-grid": { name: "flickering-grid", - description: "", + description: + "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -318,7 +323,7 @@ export const Index: Record = { }, "hero-video-dialog": { name: "hero-video-dialog", - description: "", + description: "A hero video dialog component.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -341,7 +346,7 @@ export const Index: Record = { }, "code-comparison": { name: "code-comparison", - description: "", + description: "A component which compares two code snippets.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -364,7 +369,7 @@ export const Index: Record = { }, "script-copy-btn": { name: "script-copy-btn", - description: "", + description: "Copy code to clipboard", type: "registry:ui", registryDependencies: ["button"], files: [ @@ -387,7 +392,8 @@ export const Index: Record = { }, marquee: { name: "marquee", - description: "", + description: + "An infinite scrolling component that can be used to display text, images, or videos.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -410,7 +416,8 @@ export const Index: Record = { }, globe: { name: "globe", - description: "", + description: + "An autorotating, interactive, and highly performant globe made using WebGL.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -433,7 +440,8 @@ export const Index: Record = { }, "shimmer-button": { name: "shimmer-button", - description: "", + description: + "A button with a shimmering light which travels around the perimeter.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -456,7 +464,8 @@ export const Index: Record = { }, "tweet-card": { name: "tweet-card", - description: "", + description: + "A card that displays a tweet with the author's name, handle, and profile picture.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -479,7 +488,8 @@ export const Index: Record = { }, "client-tweet-card": { name: "client-tweet-card", - description: "", + description: + "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -502,7 +512,8 @@ export const Index: Record = { }, "bento-grid": { name: "bento-grid", - description: "", + description: + "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", type: "registry:ui", registryDependencies: ["button"], files: [ @@ -525,7 +536,8 @@ export const Index: Record = { }, particles: { name: "particles", - description: "", + description: + "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -548,7 +560,7 @@ export const Index: Record = { }, "number-ticker": { name: "number-ticker", - description: "", + description: "Animate numbers to count up or down to a target number", type: "registry:ui", registryDependencies: undefined, files: [ @@ -571,7 +583,8 @@ export const Index: Record = { }, ripple: { name: "ripple", - description: "", + description: + "An animated ripple effect typically used behind elements to emphasize them.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -594,7 +607,7 @@ export const Index: Record = { }, "retro-grid": { name: "retro-grid", - description: "", + description: "An animated scrolling retro grid effect", type: "registry:ui", registryDependencies: undefined, files: [ @@ -617,7 +630,8 @@ export const Index: Record = { }, "animated-list": { name: "animated-list", - description: "", + description: + "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -640,7 +654,8 @@ export const Index: Record = { }, "animated-shiny-text": { name: "animated-shiny-text", - description: "", + description: + "A light glare effect which pans across text making it appear as if it is shimmering.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -663,7 +678,8 @@ export const Index: Record = { }, "animated-grid-pattern": { name: "animated-grid-pattern", - description: "", + description: + "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -686,7 +702,8 @@ export const Index: Record = { }, "border-beam": { name: "border-beam", - description: "", + description: + "An animated beam of light which travels along the border of its container.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -709,7 +726,8 @@ export const Index: Record = { }, "animated-beam": { name: "animated-beam", - description: "", + description: + 'An animated beam of light which travels along a path. Useful for showcasing the "integration" features of a website.', type: "registry:ui", registryDependencies: undefined, files: [ @@ -732,7 +750,7 @@ export const Index: Record = { }, "text-reveal": { name: "text-reveal", - description: "", + description: "Fade in text as you scroll down the page.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -755,7 +773,8 @@ export const Index: Record = { }, "hyper-text": { name: "hyper-text", - description: "", + description: + "A text animation that scrambles letters before revealing the final text.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -778,7 +797,8 @@ export const Index: Record = { }, "animated-gradient-text": { name: "animated-gradient-text", - description: "", + description: + "An animated gradient background which transitions between colors for text.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -801,7 +821,8 @@ export const Index: Record = { }, "orbiting-circles": { name: "orbiting-circles", - description: "", + description: + "A collection of circles which move in orbit along a circular path", type: "registry:ui", registryDependencies: undefined, files: [ @@ -824,7 +845,8 @@ export const Index: Record = { }, dock: { name: "dock", - description: "", + description: + "An implementation of the MacOS dock using react + tailwindcss + framer motion", type: "registry:ui", registryDependencies: undefined, files: [ @@ -847,7 +869,7 @@ export const Index: Record = { }, "word-rotate": { name: "word-rotate", - description: "", + description: "A vertical rotation of words", type: "registry:ui", registryDependencies: undefined, files: [ @@ -870,7 +892,7 @@ export const Index: Record = { }, "avatar-circles": { name: "avatar-circles", - description: "", + description: "Overlapping circles of avatars.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -893,7 +915,7 @@ export const Index: Record = { }, "typing-animation": { name: "typing-animation", - description: "", + description: "Characters appearing in typed animation", type: "registry:ui", registryDependencies: undefined, files: [ @@ -916,7 +938,8 @@ export const Index: Record = { }, "sparkles-text": { name: "sparkles-text", - description: "", + description: + "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -939,7 +962,7 @@ export const Index: Record = { }, "flip-text": { name: "flip-text", - description: "", + description: "Text flipping character animation", type: "registry:ui", registryDependencies: undefined, files: [ @@ -962,7 +985,7 @@ export const Index: Record = { }, "icon-cloud": { name: "icon-cloud", - description: "", + description: "An interactive 3D tag cloud component", type: "registry:ui", registryDependencies: undefined, files: [ @@ -985,7 +1008,8 @@ export const Index: Record = { }, "text-animate": { name: "text-animate", - description: "", + description: + "A text animation component that animates text using a variety of different animations.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1008,7 +1032,7 @@ export const Index: Record = { }, "scroll-based-velocity": { name: "scroll-based-velocity", - description: "", + description: "Scrolling text whose speed changes based on scroll speed", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1031,7 +1055,8 @@ export const Index: Record = { }, "scratch-to-reveal": { name: "scratch-to-reveal", - description: "", + description: + "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1054,7 +1079,8 @@ export const Index: Record = { }, "shiny-button": { name: "shiny-button", - description: "", + description: + "A shiny button component with dynamic styles in the dark mode or light mode.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1077,7 +1103,7 @@ export const Index: Record = { }, "box-reveal": { name: "box-reveal", - description: "", + description: "Sliding box animation that reveals text behind it.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1100,7 +1126,7 @@ export const Index: Record = { }, "shine-border": { name: "shine-border", - description: "", + description: "Shine border is an animated background border effect.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1123,7 +1149,8 @@ export const Index: Record = { }, "animated-circular-progress-bar": { name: "animated-circular-progress-bar", - description: "", + description: + "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1148,7 +1175,8 @@ export const Index: Record = { }, confetti: { name: "confetti", - description: "", + description: + "Confetti animations are best used to delight your users when something special happens", type: "registry:ui", registryDependencies: ["button"], files: [ @@ -1171,7 +1199,8 @@ export const Index: Record = { }, "animated-subscribe-button": { name: "animated-subscribe-button", - description: "", + description: + "An animated subscribe button useful for showing a micro animation from intial to final result.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1196,7 +1225,7 @@ export const Index: Record = { }, "cool-mode": { name: "cool-mode", - description: "", + description: "Cool mode effect for buttons, links, and other DOMs", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1219,7 +1248,8 @@ export const Index: Record = { }, "pulsating-button": { name: "pulsating-button", - description: "", + description: + "An animated pulsating button useful for capturing attention of users.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1242,7 +1272,7 @@ export const Index: Record = { }, "ripple-button": { name: "ripple-button", - description: "", + description: "An animated button with ripple useful for user engagement.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1265,7 +1295,8 @@ export const Index: Record = { }, "file-tree": { name: "file-tree", - description: "", + description: + "A component used to showcase the folder and file structure of a directory.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1288,7 +1319,8 @@ export const Index: Record = { }, "blur-fade": { name: "blur-fade", - description: "", + description: + "Blur fade in and out animation. Used to smoothly fade in and out content.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1311,7 +1343,7 @@ export const Index: Record = { }, safari: { name: "safari", - description: "", + description: "A safari browser mockup to showcase your website.", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1334,7 +1366,7 @@ export const Index: Record = { }, "iphone-15-pro": { name: "iphone-15-pro", - description: "", + description: "A mockup of the iPhone 15 Pro", type: "registry:ui", registryDependencies: undefined, files: [ @@ -1357,7 +1389,7 @@ export const Index: Record = { }, "rainbow-button": { name: "rainbow-button", - description: "", + description: "An animated button with a rainbow effect.", type: "registry:ui", registryDependencies: undefined, files: [ diff --git a/registry.json b/registry.json index 7d3f50fbc..864fb429e 100644 --- a/registry.json +++ b/registry.json @@ -26,6 +26,8 @@ { "name": "magic-card", "type": "registry:ui", + "title": "Magic Card", + "description": "A spotlight effect that follows your mouse cursor and highlights borders on hover.", "dependencies": [ "motion" ], @@ -39,6 +41,8 @@ { "name": "android", "type": "registry:ui", + "title": "Android", + "description": "A mockup of an Android device.", "files": [ { "path": "registry/magicui/android.tsx", @@ -49,6 +53,8 @@ { "name": "warp-background", "type": "registry:ui", + "title": "Warp Background", + "description": "A card with a time warping background effect.", "dependencies": [ "motion" ], @@ -62,6 +68,8 @@ { "name": "line-shadow-text", "type": "registry:ui", + "title": "Line Shadow Text", + "description": "A text component with a moving line shadow.", "dependencies": [ "motion" ], @@ -75,6 +83,8 @@ { "name": "aurora-text", "type": "registry:ui", + "title": "Aurora Text", + "description": "A beautiful aurora text effect", "dependencies": [ "motion" ], @@ -191,6 +201,8 @@ { "name": "morphing-text", "type": "registry:ui", + "title": "Morphing Text", + "description": "A dynamic text morphing component for Magic UI.", "files": [ { "path": "registry/magicui/morphing-text.tsx", @@ -201,6 +213,8 @@ { "name": "scroll-progress", "type": "registry:ui", + "title": "Scroll Progress", + "description": "Animated Scroll Progress for your pages", "dependencies": [ "motion" ], @@ -214,6 +228,8 @@ { "name": "neon-gradient-card", "type": "registry:ui", + "title": "Neon Gradient Card", + "description": "A beautiful neon card effect", "files": [ { "path": "registry/magicui/neon-gradient-card.tsx", @@ -245,6 +261,8 @@ { "name": "meteors", "type": "registry:ui", + "title": "Meteors", + "description": "A meteor shower effect.", "files": [ { "path": "registry/magicui/meteors.tsx", @@ -281,6 +299,8 @@ { "name": "grid-pattern", "type": "registry:ui", + "title": "Grid Pattern", + "description": "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { "path": "registry/magicui/grid-pattern.tsx", @@ -291,6 +311,8 @@ { "name": "interactive-grid-pattern", "type": "registry:ui", + "title": "Interactive Grid Pattern", + "description": "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { "path": "registry/magicui/interactive-grid-pattern.tsx", @@ -301,6 +323,8 @@ { "name": "dot-pattern", "type": "registry:ui", + "title": "Dot Pattern", + "description": "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", "files": [ { "path": "registry/magicui/dot-pattern.tsx", @@ -311,6 +335,8 @@ { "name": "flickering-grid", "type": "registry:ui", + "title": "Flickering Grid", + "description": "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", "files": [ { "path": "registry/magicui/flickering-grid.tsx", @@ -321,6 +347,8 @@ { "name": "hero-video-dialog", "type": "registry:ui", + "title": "Hero Video Dialog", + "description": "A hero video dialog component.", "dependencies": [ "motion" ], @@ -334,6 +362,8 @@ { "name": "code-comparison", "type": "registry:ui", + "title": "Code Comparison", + "description": "A component which compares two code snippets.", "dependencies": [ "shiki", "next-themes" @@ -348,6 +378,8 @@ { "name": "script-copy-btn", "type": "registry:ui", + "title": "Script Copy Button", + "description": "Copy code to clipboard", "dependencies": [ "motion", "shiki", @@ -366,6 +398,8 @@ { "name": "marquee", "type": "registry:ui", + "title": "Marquee", + "description": "An infinite scrolling component that can be used to display text, images, or videos.", "files": [ { "path": "registry/magicui/marquee.tsx", @@ -406,6 +440,8 @@ { "name": "globe", "type": "registry:ui", + "title": "Globe", + "description": "An autorotating, interactive, and highly performant globe made using WebGL.", "dependencies": [ "cobe" ], @@ -419,6 +455,8 @@ { "name": "shimmer-button", "type": "registry:ui", + "title": "Shimmer Button", + "description": "A button with a shimmering light which travels around the perimeter.", "files": [ { "path": "registry/magicui/shimmer-button.tsx", @@ -462,6 +500,8 @@ { "name": "tweet-card", "type": "registry:ui", + "title": "Tweet Card", + "description": "A card that displays a tweet with the author's name, handle, and profile picture.", "dependencies": [ "react-tweet" ], @@ -475,6 +515,8 @@ { "name": "client-tweet-card", "type": "registry:ui", + "title": "Client Tweet Card", + "description": "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", "dependencies": [ "react-tweet" ], @@ -488,6 +530,8 @@ { "name": "bento-grid", "type": "registry:ui", + "title": "Bento Grid", + "description": "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", "dependencies": [ "@radix-ui/react-icons" ], @@ -504,6 +548,8 @@ { "name": "particles", "type": "registry:ui", + "title": "Particles", + "description": "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", "files": [ { "path": "registry/magicui/particles.tsx", @@ -514,6 +560,8 @@ { "name": "number-ticker", "type": "registry:ui", + "title": "Number Ticker", + "description": "Animate numbers to count up or down to a target number", "dependencies": [ "motion" ], @@ -527,6 +575,8 @@ { "name": "ripple", "type": "registry:ui", + "title": "Ripple", + "description": "An animated ripple effect typically used behind elements to emphasize them.", "files": [ { "path": "registry/magicui/ripple.tsx", @@ -558,6 +608,8 @@ { "name": "retro-grid", "type": "registry:ui", + "title": "Retro Grid", + "description": "An animated scrolling retro grid effect", "files": [ { "path": "registry/magicui/retro-grid.tsx", @@ -589,6 +641,8 @@ { "name": "animated-list", "type": "registry:ui", + "title": "Animated List", + "description": "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", "dependencies": [ "motion" ], @@ -602,6 +656,8 @@ { "name": "animated-shiny-text", "type": "registry:ui", + "title": "Animated Shiny Text", + "description": "A light glare effect which pans across text making it appear as if it is shimmering.", "files": [ { "path": "registry/magicui/animated-shiny-text.tsx", @@ -633,6 +689,8 @@ { "name": "animated-grid-pattern", "type": "registry:ui", + "title": "Animated Grid Pattern", + "description": "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", "dependencies": [ "motion" ], @@ -646,6 +704,8 @@ { "name": "border-beam", "type": "registry:ui", + "title": "Border Beam", + "description": "An animated beam of light which travels along the border of its container.", "files": [ { "path": "registry/magicui/border-beam.tsx", @@ -674,6 +734,8 @@ { "name": "animated-beam", "type": "registry:ui", + "title": "Animated Beam", + "description": "An animated beam of light which travels along a path. Useful for showcasing the \"integration\" features of a website.", "dependencies": [ "motion" ], @@ -687,6 +749,8 @@ { "name": "text-reveal", "type": "registry:ui", + "title": "Text Reveal", + "description": "Fade in text as you scroll down the page.", "dependencies": [ "motion" ], @@ -700,6 +764,8 @@ { "name": "hyper-text", "type": "registry:ui", + "title": "Hyper Text", + "description": "A text animation that scrambles letters before revealing the final text.", "dependencies": [ "motion" ], @@ -713,6 +779,8 @@ { "name": "animated-gradient-text", "type": "registry:ui", + "title": "Animated Gradient Text", + "description": "An animated gradient background which transitions between colors for text.", "files": [ { "path": "registry/magicui/animated-gradient-text.tsx", @@ -741,6 +809,8 @@ { "name": "orbiting-circles", "type": "registry:ui", + "title": "Orbiting Circles", + "description": "A collection of circles which move in orbit along a circular path", "files": [ { "path": "registry/magicui/orbiting-circles.tsx", @@ -772,6 +842,8 @@ { "name": "dock", "type": "registry:ui", + "title": "Dock", + "description": "An implementation of the MacOS dock using react + tailwindcss + framer motion", "dependencies": [ "motion" ], @@ -785,6 +857,8 @@ { "name": "word-rotate", "type": "registry:ui", + "title": "Word Rotate", + "description": "A vertical rotation of words", "dependencies": [ "motion" ], @@ -798,6 +872,8 @@ { "name": "avatar-circles", "type": "registry:ui", + "title": "Avatar Circles", + "description": "Overlapping circles of avatars.", "files": [ { "path": "registry/magicui/avatar-circles.tsx", @@ -808,6 +884,8 @@ { "name": "typing-animation", "type": "registry:ui", + "title": "Typing Animation", + "description": "Characters appearing in typed animation", "dependencies": [ "motion" ], @@ -821,6 +899,8 @@ { "name": "sparkles-text", "type": "registry:ui", + "title": "Sparkles Text", + "description": "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", "dependencies": [ "motion" ], @@ -834,6 +914,8 @@ { "name": "flip-text", "type": "registry:ui", + "title": "Flip Text", + "description": "Text flipping character animation", "dependencies": [ "motion" ], @@ -847,6 +929,8 @@ { "name": "icon-cloud", "type": "registry:ui", + "title": "Icon Cloud", + "description": "An interactive 3D tag cloud component", "dependencies": [], "files": [ { @@ -858,6 +942,8 @@ { "name": "text-animate", "type": "registry:ui", + "title": "Text Animate", + "description": "A text animation component that animates text using a variety of different animations.", "dependencies": [ "motion" ], @@ -871,6 +957,8 @@ { "name": "scroll-based-velocity", "type": "registry:ui", + "title": "Scroll Based Velocity", + "description": "Scrolling text whose speed changes based on scroll speed", "dependencies": [ "motion" ], @@ -884,6 +972,8 @@ { "name": "scratch-to-reveal", "type": "registry:ui", + "title": "Scratch To Reveal", + "description": "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", "dependencies": [ "motion" ], @@ -897,6 +987,8 @@ { "name": "shiny-button", "type": "registry:ui", + "title": "Shiny Button", + "description": "A shiny button component with dynamic styles in the dark mode or light mode.", "dependencies": [ "motion" ], @@ -910,6 +1002,8 @@ { "name": "box-reveal", "type": "registry:ui", + "title": "Box Reveal Animation", + "description": "Sliding box animation that reveals text behind it.", "dependencies": [ "motion" ], @@ -923,6 +1017,8 @@ { "name": "shine-border", "type": "registry:ui", + "title": "Shine Border", + "description": "Shine border is an animated background border effect.", "files": [ { "path": "registry/magicui/shine-border.tsx", @@ -957,6 +1053,8 @@ { "name": "animated-circular-progress-bar", "type": "registry:ui", + "title": "Animated Circular Progress Bar", + "description": "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", "files": [ { "path": "registry/magicui/animated-circular-progress-bar.tsx", @@ -967,6 +1065,8 @@ { "name": "confetti", "type": "registry:ui", + "title": "Confetti", + "description": "Confetti animations are best used to delight your users when something special happens", "dependencies": [ "canvas-confetti", "@types/canvas-confetti" @@ -984,6 +1084,8 @@ { "name": "animated-subscribe-button", "type": "registry:ui", + "title": "Animated Subscribe Button", + "description": "An animated subscribe button useful for showing a micro animation from intial to final result.", "dependencies": [ "motion" ], @@ -997,6 +1099,8 @@ { "name": "cool-mode", "type": "registry:ui", + "title": "Cool Mode", + "description": "Cool mode effect for buttons, links, and other DOMs", "files": [ { "path": "registry/magicui/cool-mode.tsx", @@ -1007,6 +1111,8 @@ { "name": "pulsating-button", "type": "registry:ui", + "title": "Pulsating Button", + "description": "An animated pulsating button useful for capturing attention of users.", "files": [ { "path": "registry/magicui/pulsating-button.tsx", @@ -1038,6 +1144,8 @@ { "name": "ripple-button", "type": "registry:ui", + "title": "Ripple Button", + "description": "An animated button with ripple useful for user engagement.", "files": [ { "path": "registry/magicui/ripple-button.tsx", @@ -1070,6 +1178,8 @@ { "name": "file-tree", "type": "registry:ui", + "title": "File Tree", + "description": "A component used to showcase the folder and file structure of a directory.", "files": [ { "path": "registry/magicui/file-tree.tsx", @@ -1080,6 +1190,8 @@ { "name": "blur-fade", "type": "registry:ui", + "title": "Blur Fade", + "description": "Blur fade in and out animation. Used to smoothly fade in and out content.", "dependencies": [ "motion" ], @@ -1093,6 +1205,8 @@ { "name": "safari", "type": "registry:ui", + "title": "Safari", + "description": "A safari browser mockup to showcase your website.", "files": [ { "path": "registry/magicui/safari.tsx", @@ -1103,6 +1217,8 @@ { "name": "iphone-15-pro", "type": "registry:ui", + "title": "iPhone 15 Pro", + "description": "A mockup of the iPhone 15 Pro", "files": [ { "path": "registry/magicui/iphone-15-pro.tsx", @@ -1113,6 +1229,8 @@ { "name": "rainbow-button", "type": "registry:ui", + "title": "Rainbow Button", + "description": "An animated button with a rainbow effect.", "files": [ { "path": "registry/magicui/rainbow-button.tsx", diff --git a/registry/registry-ui.ts b/registry/registry-ui.ts index 3ece67dcd..cd27768b8 100644 --- a/registry/registry-ui.ts +++ b/registry/registry-ui.ts @@ -4,29 +4,40 @@ export const ui: Registry["items"] = [ { name: "magic-card", type: "registry:ui", + title: "Magic Card", + description: + "A spotlight effect that follows your mouse cursor and highlights borders on hover.", dependencies: ["motion"], files: [{ path: "magicui/magic-card.tsx", type: "registry:ui" }], }, { name: "android", type: "registry:ui", + title: "Android", + description: "A mockup of an Android device.", files: [{ path: "magicui/android.tsx", type: "registry:ui" }], }, { name: "warp-background", type: "registry:ui", + title: "Warp Background", + description: "A card with a time warping background effect.", dependencies: ["motion"], files: [{ path: "magicui/warp-background.tsx", type: "registry:ui" }], }, { name: "line-shadow-text", type: "registry:ui", + title: "Line Shadow Text", + description: "A text component with a moving line shadow.", dependencies: ["motion"], files: [{ path: "magicui/line-shadow-text.tsx", type: "registry:ui" }], }, { name: "aurora-text", type: "registry:ui", + title: "Aurora Text", + description: "A beautiful aurora text effect", dependencies: ["motion"], files: [{ path: "magicui/aurora-text.tsx", type: "registry:ui" }], cssVars: { @@ -94,17 +105,23 @@ export const ui: Registry["items"] = [ { name: "morphing-text", type: "registry:ui", + title: "Morphing Text", + description: "A dynamic text morphing component for Magic UI.", files: [{ path: "magicui/morphing-text.tsx", type: "registry:ui" }], }, { name: "scroll-progress", type: "registry:ui", + title: "Scroll Progress", + description: "Animated Scroll Progress for your pages", dependencies: ["motion"], files: [{ path: "magicui/scroll-progress.tsx", type: "registry:ui" }], }, { name: "neon-gradient-card", type: "registry:ui", + title: "Neon Gradient Card", + description: "A beautiful neon card effect", files: [{ path: "magicui/neon-gradient-card.tsx", type: "registry:ui" }], tailwind: { config: { @@ -128,6 +145,8 @@ export const ui: Registry["items"] = [ { name: "meteors", type: "registry:ui", + title: "Meteors", + description: "A meteor shower effect.", files: [{ path: "magicui/meteors.tsx", type: "registry:ui" }], tailwind: { config: { @@ -157,11 +176,17 @@ export const ui: Registry["items"] = [ { name: "grid-pattern", type: "registry:ui", + title: "Grid Pattern", + description: + "A background grid pattern made with SVGs, fully customizable using Tailwind CSS.", files: [{ path: "magicui/grid-pattern.tsx", type: "registry:ui" }], }, { name: "interactive-grid-pattern", type: "registry:ui", + title: "Interactive Grid Pattern", + description: + "A interactive background grid pattern made with SVGs, fully customizable using Tailwind CSS.", files: [ { path: "magicui/interactive-grid-pattern.tsx", type: "registry:ui" }, ], @@ -169,28 +194,40 @@ export const ui: Registry["items"] = [ { name: "dot-pattern", type: "registry:ui", + title: "Dot Pattern", + description: + "A background dot pattern made with SVGs, fully customizable using Tailwind CSS.", files: [{ path: "magicui/dot-pattern.tsx", type: "registry:ui" }], }, { name: "flickering-grid", type: "registry:ui", + title: "Flickering Grid", + description: + "A flickering grid background made with SVGs, fully customizable using Tailwind CSS.", files: [{ path: "magicui/flickering-grid.tsx", type: "registry:ui" }], }, { name: "hero-video-dialog", type: "registry:ui", + title: "Hero Video Dialog", + description: "A hero video dialog component.", dependencies: ["motion"], files: [{ path: "magicui/hero-video-dialog.tsx", type: "registry:ui" }], }, { name: "code-comparison", type: "registry:ui", + title: "Code Comparison", + description: "A component which compares two code snippets.", dependencies: ["shiki", "next-themes"], files: [{ path: "magicui/code-comparison.tsx", type: "registry:ui" }], }, { name: "script-copy-btn", type: "registry:ui", + title: "Script Copy Button", + description: "Copy code to clipboard", dependencies: ["motion", "shiki", "next-themes"], registryDependencies: ["button"], files: [{ path: "magicui/script-copy-btn.tsx", type: "registry:ui" }], @@ -198,6 +235,9 @@ export const ui: Registry["items"] = [ { name: "marquee", type: "registry:ui", + title: "Marquee", + description: + "An infinite scrolling component that can be used to display text, images, or videos.", files: [{ path: "magicui/marquee.tsx", type: "registry:ui" }], tailwind: { config: { @@ -226,12 +266,18 @@ export const ui: Registry["items"] = [ { name: "globe", type: "registry:ui", + title: "Globe", + description: + "An autorotating, interactive, and highly performant globe made using WebGL.", dependencies: ["cobe"], files: [{ path: "magicui/globe.tsx", type: "registry:ui" }], }, { name: "shimmer-button", type: "registry:ui", + title: "Shimmer Button", + description: + "A button with a shimmering light which travels around the perimeter.", files: [{ path: "magicui/shimmer-button.tsx", type: "registry:ui" }], tailwind: { config: { @@ -272,18 +318,27 @@ export const ui: Registry["items"] = [ { name: "tweet-card", type: "registry:ui", + title: "Tweet Card", + description: + "A card that displays a tweet with the author's name, handle, and profile picture.", dependencies: ["react-tweet"], files: [{ path: "magicui/tweet-card.tsx", type: "registry:ui" }], }, { name: "client-tweet-card", type: "registry:ui", + title: "Client Tweet Card", + description: + "A client-side version of the tweet card that displays a tweet with the author's name, handle, and profile picture.", dependencies: ["react-tweet"], files: [{ path: "magicui/client-tweet-card.tsx", type: "registry:ui" }], }, { name: "bento-grid", type: "registry:ui", + title: "Bento Grid", + description: + "Bento grid is a layout used to showcase the features of a product in a simple and elegant way.", dependencies: ["@radix-ui/react-icons"], registryDependencies: ["button"], files: [{ path: "magicui/bento-grid.tsx", type: "registry:ui" }], @@ -291,17 +346,25 @@ export const ui: Registry["items"] = [ { name: "particles", type: "registry:ui", + title: "Particles", + description: + "Particles are a fun way to add some visual flair to your website. They can be used to create a sense of depth, movement, and interactivity.", files: [{ path: "magicui/particles.tsx", type: "registry:ui" }], }, { name: "number-ticker", type: "registry:ui", + title: "Number Ticker", + description: "Animate numbers to count up or down to a target number", dependencies: ["motion"], files: [{ path: "magicui/number-ticker.tsx", type: "registry:ui" }], }, { name: "ripple", type: "registry:ui", + title: "Ripple", + description: + "An animated ripple effect typically used behind elements to emphasize them.", files: [{ path: "magicui/ripple.tsx", type: "registry:ui" }], tailwind: { config: { @@ -329,6 +392,8 @@ export const ui: Registry["items"] = [ { name: "retro-grid", type: "registry:ui", + title: "Retro Grid", + description: "An animated scrolling retro grid effect", files: [{ path: "magicui/retro-grid.tsx", type: "registry:ui" }], tailwind: { config: { @@ -351,12 +416,18 @@ export const ui: Registry["items"] = [ { name: "animated-list", type: "registry:ui", + title: "Animated List", + description: + "A list that animates each item in sequence with a delay. Used to showcase notifications or events on your landing page.", dependencies: ["motion"], files: [{ path: "magicui/animated-list.tsx", type: "registry:ui" }], }, { name: "animated-shiny-text", type: "registry:ui", + title: "Animated Shiny Text", + description: + "A light glare effect which pans across text making it appear as if it is shimmering.", files: [{ path: "magicui/animated-shiny-text.tsx", type: "registry:ui" }], tailwind: { config: { @@ -383,12 +454,18 @@ export const ui: Registry["items"] = [ { name: "animated-grid-pattern", type: "registry:ui", + title: "Animated Grid Pattern", + description: + "A animated background grid pattern made with SVGs, fully customizable using Tailwind CSS.", dependencies: ["motion"], files: [{ path: "magicui/animated-grid-pattern.tsx", type: "registry:ui" }], }, { name: "border-beam", type: "registry:ui", + title: "Border Beam", + description: + "An animated beam of light which travels along the border of its container.", files: [{ path: "magicui/border-beam.tsx", type: "registry:ui" }], tailwind: { config: { @@ -413,24 +490,35 @@ export const ui: Registry["items"] = [ { name: "animated-beam", type: "registry:ui", + title: "Animated Beam", + description: + 'An animated beam of light which travels along a path. Useful for showcasing the "integration" features of a website.', dependencies: ["motion"], files: [{ path: "magicui/animated-beam.tsx", type: "registry:ui" }], }, { name: "text-reveal", type: "registry:ui", + title: "Text Reveal", + description: "Fade in text as you scroll down the page.", dependencies: ["motion"], files: [{ path: "magicui/text-reveal.tsx", type: "registry:ui" }], }, { name: "hyper-text", type: "registry:ui", + title: "Hyper Text", + description: + "A text animation that scrambles letters before revealing the final text.", dependencies: ["motion"], files: [{ path: "magicui/hyper-text.tsx", type: "registry:ui" }], }, { name: "animated-gradient-text", type: "registry:ui", + title: "Animated Gradient Text", + description: + "An animated gradient background which transitions between colors for text.", files: [ { path: "magicui/animated-gradient-text.tsx", type: "registry:ui" }, ], @@ -456,6 +544,9 @@ export const ui: Registry["items"] = [ { name: "orbiting-circles", type: "registry:ui", + title: "Orbiting Circles", + description: + "A collection of circles which move in orbit along a circular path", files: [{ path: "magicui/orbiting-circles.tsx", type: "registry:ui" }], tailwind: { config: { @@ -484,77 +575,108 @@ export const ui: Registry["items"] = [ { name: "dock", type: "registry:ui", + title: "Dock", + description: + "An implementation of the MacOS dock using react + tailwindcss + framer motion", dependencies: ["motion"], files: [{ path: "magicui/dock.tsx", type: "registry:ui" }], }, { name: "word-rotate", type: "registry:ui", + title: "Word Rotate", + description: "A vertical rotation of words", dependencies: ["motion"], files: [{ path: "magicui/word-rotate.tsx", type: "registry:ui" }], }, { name: "avatar-circles", type: "registry:ui", + title: "Avatar Circles", + description: "Overlapping circles of avatars.", files: [{ path: "magicui/avatar-circles.tsx", type: "registry:ui" }], }, { name: "typing-animation", type: "registry:ui", + title: "Typing Animation", + description: "Characters appearing in typed animation", dependencies: ["motion"], files: [{ path: "magicui/typing-animation.tsx", type: "registry:ui" }], }, { name: "sparkles-text", type: "registry:ui", + title: "Sparkles Text", + description: + "A dynamic text that generates continuous sparkles with smooth transitions, perfect for highlighting text with animated stars.", dependencies: ["motion"], files: [{ path: "magicui/sparkles-text.tsx", type: "registry:ui" }], }, { name: "flip-text", type: "registry:ui", + title: "Flip Text", + description: "Text flipping character animation", dependencies: ["motion"], files: [{ path: "magicui/flip-text.tsx", type: "registry:ui" }], }, { name: "icon-cloud", type: "registry:ui", + title: "Icon Cloud", + description: "An interactive 3D tag cloud component", dependencies: [], files: [{ path: "magicui/icon-cloud.tsx", type: "registry:ui" }], }, { name: "text-animate", type: "registry:ui", + title: "Text Animate", + description: + "A text animation component that animates text using a variety of different animations.", dependencies: ["motion"], files: [{ path: "magicui/text-animate.tsx", type: "registry:ui" }], }, { name: "scroll-based-velocity", type: "registry:ui", + title: "Scroll Based Velocity", + description: "Scrolling text whose speed changes based on scroll speed", dependencies: ["motion"], files: [{ path: "magicui/scroll-based-velocity.tsx", type: "registry:ui" }], }, { name: "scratch-to-reveal", type: "registry:ui", + title: "Scratch To Reveal", + description: + "The ScratchToReveal component creates an interactive scratch-off effect with customizable dimensions and animations, revealing hidden content beneath.", dependencies: ["motion"], files: [{ path: "magicui/scratch-to-reveal.tsx", type: "registry:ui" }], }, { name: "shiny-button", type: "registry:ui", + title: "Shiny Button", + description: + "A shiny button component with dynamic styles in the dark mode or light mode.", dependencies: ["motion"], files: [{ path: "magicui/shiny-button.tsx", type: "registry:ui" }], }, { name: "box-reveal", type: "registry:ui", + title: "Box Reveal Animation", + description: "Sliding box animation that reveals text behind it.", dependencies: ["motion"], files: [{ path: "magicui/box-reveal.tsx", type: "registry:ui" }], }, { name: "shine-border", type: "registry:ui", + title: "Shine Border", + description: "Shine border is an animated background border effect.", files: [{ path: "magicui/shine-border.tsx", type: "registry:ui" }], tailwind: { config: { @@ -584,6 +706,9 @@ export const ui: Registry["items"] = [ { name: "animated-circular-progress-bar", type: "registry:ui", + title: "Animated Circular Progress Bar", + description: + "Animated Circular Progress Bar is a component that displays a circular gauge with a percentage value.", files: [ { path: "magicui/animated-circular-progress-bar.tsx", @@ -594,6 +719,9 @@ export const ui: Registry["items"] = [ { name: "confetti", type: "registry:ui", + title: "Confetti", + description: + "Confetti animations are best used to delight your users when something special happens", dependencies: ["canvas-confetti", "@types/canvas-confetti"], registryDependencies: ["button"], files: [{ path: "magicui/confetti.tsx", type: "registry:ui" }], @@ -601,6 +729,9 @@ export const ui: Registry["items"] = [ { name: "animated-subscribe-button", type: "registry:ui", + title: "Animated Subscribe Button", + description: + "An animated subscribe button useful for showing a micro animation from intial to final result.", dependencies: ["motion"], files: [ { path: "magicui/animated-subscribe-button.tsx", type: "registry:ui" }, @@ -609,11 +740,16 @@ export const ui: Registry["items"] = [ { name: "cool-mode", type: "registry:ui", + title: "Cool Mode", + description: "Cool mode effect for buttons, links, and other DOMs", files: [{ path: "magicui/cool-mode.tsx", type: "registry:ui" }], }, { name: "pulsating-button", type: "registry:ui", + title: "Pulsating Button", + description: + "An animated pulsating button useful for capturing attention of users.", files: [{ path: "magicui/pulsating-button.tsx", type: "registry:ui" }], tailwind: { config: { @@ -636,6 +772,8 @@ export const ui: Registry["items"] = [ { name: "ripple-button", type: "registry:ui", + title: "Ripple Button", + description: "An animated button with ripple useful for user engagement.", files: [{ path: "magicui/ripple-button.tsx", type: "registry:ui" }], tailwind: { config: { @@ -663,27 +801,39 @@ export const ui: Registry["items"] = [ { name: "file-tree", type: "registry:ui", + title: "File Tree", + description: + "A component used to showcase the folder and file structure of a directory.", files: [{ path: "magicui/file-tree.tsx", type: "registry:ui" }], }, { name: "blur-fade", type: "registry:ui", + title: "Blur Fade", + description: + "Blur fade in and out animation. Used to smoothly fade in and out content.", dependencies: ["motion"], files: [{ path: "magicui/blur-fade.tsx", type: "registry:ui" }], }, { name: "safari", type: "registry:ui", + title: "Safari", + description: "A safari browser mockup to showcase your website.", files: [{ path: "magicui/safari.tsx", type: "registry:ui" }], }, { name: "iphone-15-pro", type: "registry:ui", + title: "iPhone 15 Pro", + description: "A mockup of the iPhone 15 Pro", files: [{ path: "magicui/iphone-15-pro.tsx", type: "registry:ui" }], }, { name: "rainbow-button", type: "registry:ui", + title: "Rainbow Button", + description: "An animated button with a rainbow effect.", files: [{ path: "magicui/rainbow-button.tsx", type: "registry:ui" }], cssVars: { light: { diff --git a/scripts/build-registry.mts b/scripts/build-registry.mts index 29ba2320f..6997939df 100644 --- a/scripts/build-registry.mts +++ b/scripts/build-registry.mts @@ -63,8 +63,8 @@ export const Index: Record = {`; index += ` "${item.name}": { - name: "${item.name}", - description: "${item.description ?? ""}", + name: ${JSON.stringify(item.name)}, + description: ${JSON.stringify(item.description ?? "")}, type: "${item.type}", registryDependencies: ${JSON.stringify(item.registryDependencies)}, files: [${item.files?.map((file) => { From 5bb45a6ddb1ecd1fadad42d182ba5ea9755cb723 Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 13:49:46 -0500 Subject: [PATCH 4/8] fix: update titles and descriptions --- registry/registry-examples.ts | 212 ++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) diff --git a/registry/registry-examples.ts b/registry/registry-examples.ts index 1633ee47d..860c0fb3c 100644 --- a/registry/registry-examples.ts +++ b/registry/registry-examples.ts @@ -4,30 +4,42 @@ export const examples: Registry["items"] = [ { name: "magic-card-demo", type: "registry:example", + title: "Magic Card Demo", + description: + "Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.", registryDependencies: ["magic-card"], files: [{ path: "example/magic-card-demo.tsx", type: "registry:example" }], }, { name: "android-demo", type: "registry:example", + title: "Android Demo", + description: "Example showing a mockup of an Android device.", registryDependencies: ["android"], files: [{ path: "example/android-demo.tsx", type: "registry:example" }], }, { name: "android-demo-2", type: "registry:example", + title: "Android Demo 2", + description: "Second example showing a mockup of an Android device.", registryDependencies: ["android"], files: [{ path: "example/android-demo-2.tsx", type: "registry:example" }], }, { name: "android-demo-3", type: "registry:example", + title: "Android Demo 3", + description: "Third example showing a mockup of an Android device.", registryDependencies: ["android"], files: [{ path: "example/android-demo-3.tsx", type: "registry:example" }], }, { name: "warp-background-demo", type: "registry:example", + title: "Warp Background Demo", + description: + "Example showing a card with a time warping background effect.", registryDependencies: ["warp-background"], files: [ { path: "example/warp-background-demo.tsx", type: "registry:example" }, @@ -36,6 +48,8 @@ export const examples: Registry["items"] = [ { name: "line-shadow-text-demo", type: "registry:example", + title: "Line Shadow Text Demo", + description: "Example showing a text component with a moving line shadow.", registryDependencies: ["line-shadow-text"], files: [ { path: "example/line-shadow-text-demo.tsx", type: "registry:example" }, @@ -44,12 +58,16 @@ export const examples: Registry["items"] = [ { name: "aurora-text-demo", type: "registry:example", + title: "Aurora Text Demo", + description: "Example showing a beautiful aurora text effect.", registryDependencies: ["aurora-text"], files: [{ path: "example/aurora-text-demo.tsx", type: "registry:example" }], }, { name: "morphing-text-demo", type: "registry:example", + title: "Morphing Text Demo", + description: "Example showing a dynamic text morphing component.", registryDependencies: ["morphing-text"], files: [ { path: "example/morphing-text-demo.tsx", type: "registry:example" }, @@ -58,6 +76,8 @@ export const examples: Registry["items"] = [ { name: "scroll-progress-demo", type: "registry:example", + title: "Scroll Progress Demo", + description: "Example showing animated scroll progress for your pages.", registryDependencies: ["scroll-progress"], files: [ { path: "example/scroll-progress-demo.tsx", type: "registry:example" }, @@ -66,6 +86,8 @@ export const examples: Registry["items"] = [ { name: "neon-gradient-card-demo", type: "registry:example", + title: "Neon Gradient Card Demo", + description: "Example showing a beautiful neon card effect.", files: [ { path: "example/neon-gradient-card-demo.tsx", type: "registry:example" }, ], @@ -73,12 +95,16 @@ export const examples: Registry["items"] = [ { name: "meteors-demo", type: "registry:example", + title: "Meteors Demo", + description: "Example showing a meteor shower effect.", registryDependencies: ["meteors"], files: [{ path: "example/meteors-demo.tsx", type: "registry:example" }], }, { name: "grid-pattern-demo", type: "registry:example", + title: "Grid Pattern Demo", + description: "Example showing a background grid pattern made with SVGs.", registryDependencies: ["grid-pattern"], files: [ { path: "example/grid-pattern-demo.tsx", type: "registry:example" }, @@ -87,6 +113,8 @@ export const examples: Registry["items"] = [ { name: "grid-pattern-linear-gradient", type: "registry:example", + title: "Grid Pattern Linear Gradient", + description: "Example showing a grid pattern with linear gradient effects.", registryDependencies: ["grid-pattern"], files: [ { @@ -98,6 +126,8 @@ export const examples: Registry["items"] = [ { name: "grid-pattern-dashed", type: "registry:example", + title: "Grid Pattern Dashed", + description: "Example showing a dashed grid pattern.", registryDependencies: ["grid-pattern"], files: [ { path: "example/grid-pattern-dashed.tsx", type: "registry:example" }, @@ -106,12 +136,16 @@ export const examples: Registry["items"] = [ { name: "dot-pattern-demo", type: "registry:example", + title: "Dot Pattern Demo", + description: "Example showing a background dot pattern made with SVGs.", registryDependencies: ["dot-pattern"], files: [{ path: "example/dot-pattern-demo.tsx", type: "registry:example" }], }, { name: "dot-pattern-linear-gradient", type: "registry:example", + title: "Dot Pattern Linear Gradient", + description: "Example showing a dot pattern with linear gradient effects.", registryDependencies: ["dot-pattern"], files: [ { @@ -123,6 +157,8 @@ export const examples: Registry["items"] = [ { name: "flickering-grid-demo", type: "registry:example", + title: "Flickering Grid Demo", + description: "Example showing a flickering grid background.", files: [ { path: "example/flickering-grid-demo.tsx", type: "registry:example" }, ], @@ -130,6 +166,9 @@ export const examples: Registry["items"] = [ { name: "flickering-grid-rounded-demo", type: "registry:example", + title: "Flickering Grid Rounded Demo", + description: + "Example showing a flickering grid background with rounded corners.", files: [ { path: "example/flickering-grid-rounded-demo.tsx", @@ -140,6 +179,8 @@ export const examples: Registry["items"] = [ { name: "hero-video-dialog-demo", type: "registry:example", + title: "Hero Video Dialog Demo", + description: "Example showing a hero video dialog component.", files: [ { path: "example/hero-video-dialog-demo.tsx", type: "registry:example" }, ], @@ -147,6 +188,9 @@ export const examples: Registry["items"] = [ { name: "hero-video-dialog-demo-top-in-bottom-out", type: "registry:example", + title: "Hero Video Dialog Top In Bottom Out Demo", + description: + "Example showing a hero video dialog with top-in bottom-out animation.", files: [ { path: "example/hero-video-dialog-demo-top-in-bottom-out.tsx", @@ -157,6 +201,9 @@ export const examples: Registry["items"] = [ { name: "code-comparison-demo", type: "registry:example", + title: "Code Comparison Demo", + description: + "Example showing a component which compares two code snippets.", files: [ { path: "example/code-comparison-demo.tsx", type: "registry:example" }, ], @@ -164,6 +211,8 @@ export const examples: Registry["items"] = [ { name: "script-copy-btn-demo", type: "registry:example", + title: "Script Copy Button Demo", + description: "Example showing how to copy code to clipboard.", files: [ { path: "example/script-copy-btn-demo.tsx", type: "registry:example" }, ], @@ -171,12 +220,16 @@ export const examples: Registry["items"] = [ { name: "marquee-demo", type: "registry:example", + title: "Marquee Demo", + description: "Example showing an infinite scrolling component.", registryDependencies: ["marquee"], files: [{ path: "example/marquee-demo.tsx", type: "registry:example" }], }, { name: "marquee-demo-vertical", type: "registry:example", + title: "Marquee Vertical Demo", + description: "Example showing a vertical infinite scrolling component.", registryDependencies: ["marquee"], files: [ { path: "example/marquee-demo-vertical.tsx", type: "registry:example" }, @@ -185,30 +238,40 @@ export const examples: Registry["items"] = [ { name: "marquee-logos", type: "registry:example", + title: "Marquee Logos", + description: "Example showing an infinite scrolling logo carousel.", registryDependencies: ["marquee"], files: [{ path: "example/marquee-logos.tsx", type: "registry:example" }], }, { name: "marquee-3d", type: "registry:example", + title: "Marquee 3D", + description: "Example showing a 3D infinite scrolling component.", registryDependencies: ["marquee"], files: [{ path: "example/marquee-3d.tsx", type: "registry:example" }], }, { name: "globe-demo", type: "registry:example", + title: "Globe Demo", + description: "Example showing an autorotating, interactive WebGL globe.", registryDependencies: ["globe"], files: [{ path: "example/globe-demo.tsx", type: "registry:example" }], }, { name: "tweet-card-demo", type: "registry:example", + title: "Tweet Card Demo", + description: "Example showing a tweet card with author info.", registryDependencies: ["tweet-card"], files: [{ path: "example/tweet-card-demo.tsx", type: "registry:example" }], }, { name: "tweet-card-images", type: "registry:example", + title: "Tweet Card Images", + description: "Example showing a tweet card with images.", registryDependencies: ["tweet-card"], files: [ { path: "example/tweet-card-images.tsx", type: "registry:example" }, @@ -217,6 +280,8 @@ export const examples: Registry["items"] = [ { name: "tweet-card-meta-preview", type: "registry:example", + title: "Tweet Card Meta Preview", + description: "Example showing a tweet card with meta preview.", registryDependencies: ["tweet-card"], files: [ { path: "example/tweet-card-meta-preview.tsx", type: "registry:example" }, @@ -225,6 +290,8 @@ export const examples: Registry["items"] = [ { name: "shimmer-button-demo", type: "registry:example", + title: "Shimmer Button Demo", + description: "Example showing a button with a shimmering light effect.", registryDependencies: ["shimmer-button"], files: [ { path: "example/shimmer-button-demo.tsx", type: "registry:example" }, @@ -233,6 +300,8 @@ export const examples: Registry["items"] = [ { name: "bento-demo", type: "registry:example", + title: "Bento Demo", + description: "Example showing a bento grid layout for showcasing features.", registryDependencies: [ "bento-grid", "marquee", @@ -247,6 +316,8 @@ export const examples: Registry["items"] = [ { name: "bento-demo-vertical", type: "registry:example", + title: "Bento Vertical Demo", + description: "Example showing a vertical bento grid layout.", registryDependencies: ["bento-grid"], dependencies: ["@radix-ui/react-icons"], files: [ @@ -256,6 +327,8 @@ export const examples: Registry["items"] = [ { name: "number-ticker-demo", type: "registry:example", + title: "Number Ticker Demo", + description: "Example showing animated counting numbers.", registryDependencies: ["number-ticker"], files: [ { path: "example/number-ticker-demo.tsx", type: "registry:example" }, @@ -264,6 +337,8 @@ export const examples: Registry["items"] = [ { name: "number-ticker-decimal-demo", type: "registry:example", + title: "Number Ticker Decimal Demo", + description: "Example showing animated counting decimal numbers.", registryDependencies: ["number-ticker"], files: [ { @@ -275,17 +350,23 @@ export const examples: Registry["items"] = [ { name: "ripple-demo", type: "registry:example", + title: "Ripple Demo", + description: "Example showing an animated ripple effect.", registryDependencies: ["ripple"], files: [{ path: "example/ripple-demo.tsx", type: "registry:example" }], }, { name: "retro-grid-demo", type: "registry:example", + title: "Retro Grid Demo", + description: "Example showing an animated scrolling retro grid effect.", files: [{ path: "example/retro-grid-demo.tsx", type: "registry:example" }], }, { name: "animated-list-demo", type: "registry:example", + title: "Animated List Demo", + description: "Example showing a list with sequenced item animations.", registryDependencies: ["animated-list"], files: [ { path: "example/animated-list-demo.tsx", type: "registry:example" }, @@ -294,6 +375,8 @@ export const examples: Registry["items"] = [ { name: "animated-shiny-text-demo", type: "registry:example", + title: "Animated Shiny Text Demo", + description: "Example showing text with a shimmering light effect.", registryDependencies: ["animated-shiny-text"], dependencies: ["@radix-ui/react-icons"], files: [ @@ -306,6 +389,8 @@ export const examples: Registry["items"] = [ { name: "particles-demo", type: "registry:example", + title: "Particles Demo", + description: "Example showing interactive particle effects.", registryDependencies: ["particles"], dependencies: ["next-themes"], files: [{ path: "example/particles-demo.tsx", type: "registry:example" }], @@ -313,6 +398,8 @@ export const examples: Registry["items"] = [ { name: "animated-grid-pattern-demo", type: "registry:example", + title: "Animated Grid Pattern Demo", + description: "Example showing an animated grid pattern background.", registryDependencies: ["animated-grid-pattern"], files: [ { @@ -324,6 +411,8 @@ export const examples: Registry["items"] = [ { name: "interactive-grid-pattern-demo", type: "registry:example", + title: "Interactive Grid Pattern Demo", + description: "Example showing an interactive grid pattern background.", registryDependencies: ["interactive-grid-pattern"], files: [ { @@ -335,6 +424,9 @@ export const examples: Registry["items"] = [ { name: "interactive-grid-pattern-demo-2", type: "registry:example", + title: "Interactive Grid Pattern Demo 2", + description: + "Second example showing an interactive grid pattern background.", registryDependencies: ["interactive-grid-pattern"], files: [ { @@ -346,12 +438,16 @@ export const examples: Registry["items"] = [ { name: "border-beam-demo", type: "registry:example", + title: "Border Beam Demo", + description: "Example showing an animated border beam effect.", registryDependencies: ["border-beam"], files: [{ path: "example/border-beam-demo.tsx", type: "registry:example" }], }, { name: "animated-beam-demo", type: "registry:example", + title: "Animated Beam Demo", + description: "Example showing an animated beam of light effect.", registryDependencies: ["animated-beam"], dependencies: ["@radix-ui/react-icons"], files: [ @@ -361,6 +457,8 @@ export const examples: Registry["items"] = [ { name: "animated-beam-unidirectional", type: "registry:example", + title: "Animated Beam Unidirectional", + description: "Example showing a unidirectional animated beam effect.", registryDependencies: ["animated-beam"], files: [ { @@ -372,6 +470,8 @@ export const examples: Registry["items"] = [ { name: "animated-beam-bidirectional", type: "registry:example", + title: "Animated Beam Bidirectional", + description: "Example showing a bidirectional animated beam effect.", registryDependencies: ["animated-beam"], files: [ { @@ -383,6 +483,8 @@ export const examples: Registry["items"] = [ { name: "animated-beam-multiple-inputs", type: "registry:example", + title: "Animated Beam Multiple Inputs", + description: "Example showing animated beams with multiple input points.", registryDependencies: ["animated-beam"], files: [ { @@ -394,6 +496,8 @@ export const examples: Registry["items"] = [ { name: "animated-beam-multiple-outputs", type: "registry:example", + title: "Animated Beam Multiple Outputs", + description: "Example showing animated beams with multiple output points.", registryDependencies: ["animated-beam"], files: [ { @@ -405,12 +509,16 @@ export const examples: Registry["items"] = [ { name: "text-reveal-demo", type: "registry:example", + title: "Text Reveal Demo", + description: "Example showing text that fades in on scroll.", registryDependencies: ["text-reveal"], files: [{ path: "example/text-reveal-demo.tsx", type: "registry:example" }], }, { name: "animated-gradient-text-demo", type: "registry:example", + title: "Animated Gradient Text Demo", + description: "Example showing text with animated gradient backgrounds.", registryDependencies: ["animated-gradient-text"], dependencies: ["lucide-react"], files: [ @@ -423,6 +531,8 @@ export const examples: Registry["items"] = [ { name: "orbiting-circles-demo", type: "registry:example", + title: "Orbiting Circles Demo", + description: "Example showing circles moving in orbital paths.", registryDependencies: ["orbiting-circles"], dependencies: ["@radix-ui/react-icons"], files: [ @@ -432,36 +542,48 @@ export const examples: Registry["items"] = [ { name: "dock-demo", type: "registry:example", + title: "Dock Demo", + description: "Example showing a MacOS-style dock implementation.", registryDependencies: ["dock"], files: [{ path: "example/dock-demo.tsx", type: "registry:example" }], }, { name: "dock-demo-2", type: "registry:example", + title: "Dock Demo 2", + description: "Second example showing a MacOS-style dock implementation.", registryDependencies: ["dock"], files: [{ path: "example/dock-demo-2.tsx", type: "registry:example" }], }, { name: "dock-demo-3", type: "registry:example", + title: "Dock Demo 3", + description: "Third example showing a MacOS-style dock implementation.", registryDependencies: ["dock"], files: [{ path: "example/dock-demo-3.tsx", type: "registry:example" }], }, { name: "word-rotate-demo", type: "registry:example", + title: "Word Rotate Demo", + description: "Example showing vertical word rotation animation.", registryDependencies: ["word-rotate"], files: [{ path: "example/word-rotate-demo.tsx", type: "registry:example" }], }, { name: "hyper-text-demo", type: "registry:example", + title: "Hyper Text Demo", + description: "Example showing text with scrambling letter animations.", registryDependencies: ["hyper-text"], files: [{ path: "example/hyper-text-demo.tsx", type: "registry:example" }], }, { name: "avatar-circles-demo", type: "registry:example", + title: "Avatar Circles Demo", + description: "Example showing overlapping avatar circles.", registryDependencies: ["avatar-circles"], files: [ { path: "example/avatar-circles-demo.tsx", type: "registry:example" }, @@ -470,6 +592,8 @@ export const examples: Registry["items"] = [ { name: "typing-animation-demo", type: "registry:example", + title: "Typing Animation Demo", + description: "Example showing typed character animations.", registryDependencies: ["typing-animation"], files: [ { path: "example/typing-animation-demo.tsx", type: "registry:example" }, @@ -478,6 +602,8 @@ export const examples: Registry["items"] = [ { name: "scroll-based-velocity-demo", type: "registry:example", + title: "Scroll Based Velocity Demo", + description: "Example showing text speed changes based on scroll velocity.", registryDependencies: ["scroll-based-velocity"], files: [ { @@ -489,6 +615,8 @@ export const examples: Registry["items"] = [ { name: "scratch-to-reveal-demo", type: "registry:example", + title: "Scratch To Reveal Demo", + description: "Example showing an interactive scratch-off reveal effect.", registryDependencies: ["scratch-to-reveal"], files: [ { path: "example/scratch-to-reveal-demo.tsx", type: "registry:example" }, @@ -497,12 +625,16 @@ export const examples: Registry["items"] = [ { name: "flip-text-demo", type: "registry:example", + title: "Flip Text Demo", + description: "Example showing text with character flip animations.", registryDependencies: ["flip-text"], files: [{ path: "example/flip-text-demo.tsx", type: "registry:example" }], }, { name: "sparkles-text-demo", type: "registry:example", + title: "Sparkles Text Demo", + description: "Example showing text with animated sparkle effects.", files: [ { path: "example/sparkles-text-demo.tsx", type: "registry:example" }, ], @@ -510,12 +642,16 @@ export const examples: Registry["items"] = [ { name: "icon-cloud-demo", type: "registry:example", + title: "Icon Cloud Demo", + description: "Example showing an interactive 3D icon cloud.", registryDependencies: ["icon-cloud"], files: [{ path: "example/icon-cloud-demo.tsx", type: "registry:example" }], }, { name: "icon-cloud-demo-2", type: "registry:example", + title: "Icon Cloud Demo 2", + description: "Second example showing an interactive 3D icon cloud.", registryDependencies: ["icon-cloud"], files: [ { path: "example/icon-cloud-demo-2.tsx", type: "registry:example" }, @@ -524,6 +660,8 @@ export const examples: Registry["items"] = [ { name: "icon-cloud-demo-3", type: "registry:example", + title: "Icon Cloud Demo 3", + description: "Third example showing an interactive 3D icon cloud.", registryDependencies: ["icon-cloud"], files: [ { path: "example/icon-cloud-demo-3.tsx", type: "registry:example" }, @@ -532,6 +670,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo", type: "registry:example", + title: "Text Animate Demo", + description: "Example showing various text animations.", files: [ { path: "example/text-animate-demo.tsx", type: "registry:example" }, ], @@ -539,6 +679,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo-2", type: "registry:example", + title: "Text Animate Demo 2", + description: "Second example showing various text animations.", files: [ { path: "example/text-animate-demo-2.tsx", type: "registry:example" }, ], @@ -546,6 +688,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo-3", type: "registry:example", + title: "Text Animate Demo 3", + description: "Third example showing various text animations.", files: [ { path: "example/text-animate-demo-3.tsx", type: "registry:example" }, ], @@ -553,6 +697,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo-4", type: "registry:example", + title: "Text Animate Demo 4", + description: "Fourth example showing various text animations.", files: [ { path: "example/text-animate-demo-4.tsx", type: "registry:example" }, ], @@ -560,6 +706,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo-5", type: "registry:example", + title: "Text Animate Demo 5", + description: "Fifth example showing various text animations.", files: [ { path: "example/text-animate-demo-5.tsx", type: "registry:example" }, ], @@ -567,6 +715,8 @@ export const examples: Registry["items"] = [ { name: "text-animate-demo-6", type: "registry:example", + title: "Text Animate Demo 6", + description: "Sixth example showing various text animations.", files: [ { path: "example/text-animate-demo-6.tsx", type: "registry:example" }, ], @@ -574,6 +724,8 @@ export const examples: Registry["items"] = [ { name: "shiny-button-demo", type: "registry:example", + title: "Shiny Button Demo", + description: "Example showing a shiny button with dynamic styles.", files: [ { path: "example/shiny-button-demo.tsx", type: "registry:example" }, ], @@ -581,11 +733,15 @@ export const examples: Registry["items"] = [ { name: "box-reveal-demo", type: "registry:example", + title: "Box Reveal Demo", + description: "Example showing a sliding box text reveal animation.", files: [{ path: "example/box-reveal-demo.tsx", type: "registry:example" }], }, { name: "animated-circular-progress-bar-demo", type: "registry:example", + title: "Animated Circular Progress Bar Demo", + description: "Example showing an animated circular progress gauge.", files: [ { path: "example/animated-circular-progress-bar-demo.tsx", @@ -596,6 +752,8 @@ export const examples: Registry["items"] = [ { name: "shine-border-demo", type: "registry:example", + title: "Shine Border Demo", + description: "Example showing an animated shining border effect.", files: [ { path: "example/shine-border-demo.tsx", type: "registry:example" }, ], @@ -603,6 +761,8 @@ export const examples: Registry["items"] = [ { name: "shine-border-demo-2", type: "registry:example", + title: "Shine Border Demo 2", + description: "Second example showing an animated shining border effect.", files: [ { path: "example/shine-border-demo-2.tsx", type: "registry:example" }, ], @@ -610,11 +770,15 @@ export const examples: Registry["items"] = [ { name: "confetti-demo", type: "registry:example", + title: "Confetti Demo", + description: "Example showing confetti animations for celebrations.", files: [{ path: "example/confetti-demo.tsx", type: "registry:example" }], }, { name: "confetti-basic-cannon", type: "registry:example", + title: "Confetti Basic Cannon", + description: "Example showing basic confetti cannon animation.", files: [ { path: "example/confetti-basic-cannon.tsx", type: "registry:example" }, ], @@ -622,6 +786,8 @@ export const examples: Registry["items"] = [ { name: "confetti-random-direction", type: "registry:example", + title: "Confetti Random Direction", + description: "Example showing confetti with random directions.", files: [ { path: "example/confetti-random-direction.tsx", @@ -632,6 +798,8 @@ export const examples: Registry["items"] = [ { name: "confetti-fireworks", type: "registry:example", + title: "Confetti Fireworks", + description: "Example showing fireworks-style confetti animation.", files: [ { path: "example/confetti-fireworks.tsx", type: "registry:example" }, ], @@ -639,11 +807,15 @@ export const examples: Registry["items"] = [ { name: "confetti-stars", type: "registry:example", + title: "Confetti Stars", + description: "Example showing star-shaped confetti animation.", files: [{ path: "example/confetti-stars.tsx", type: "registry:example" }], }, { name: "confetti-side-cannons", type: "registry:example", + title: "Confetti Side Cannons", + description: "Example showing side-mounted confetti cannons.", files: [ { path: "example/confetti-side-cannons.tsx", type: "registry:example" }, ], @@ -651,6 +823,8 @@ export const examples: Registry["items"] = [ { name: "confetti-custom-shapes", type: "registry:example", + title: "Confetti Custom Shapes", + description: "Example showing confetti with custom shape particles.", files: [ { path: "example/confetti-custom-shapes.tsx", type: "registry:example" }, ], @@ -658,11 +832,16 @@ export const examples: Registry["items"] = [ { name: "confetti-emoji", type: "registry:example", + title: "Confetti Emoji", + description: "Example showing confetti with emoji particles.", files: [{ path: "example/confetti-emoji.tsx", type: "registry:example" }], }, { name: "animated-subscribe-button-demo", type: "registry:example", + title: "Animated Subscribe Button Demo", + description: + "Example showing an animated subscribe button with micro animations.", files: [ { path: "example/animated-subscribe-button-demo.tsx", @@ -673,16 +852,22 @@ export const examples: Registry["items"] = [ { name: "cool-mode-demo", type: "registry:example", + title: "Cool Mode Demo", + description: "Example showing cool mode effect for buttons and links.", files: [{ path: "example/cool-mode-demo.tsx", type: "registry:example" }], }, { name: "cool-mode-custom", type: "registry:example", + title: "Cool Mode Custom", + description: "Example showing customized cool mode effects.", files: [{ path: "example/cool-mode-custom.tsx", type: "registry:example" }], }, { name: "pulsating-button-demo", type: "registry:example", + title: "Pulsating Button Demo", + description: "Example showing an animated pulsating button.", files: [ { path: "example/pulsating-button-demo.tsx", type: "registry:example" }, ], @@ -690,6 +875,8 @@ export const examples: Registry["items"] = [ { name: "ripple-button-demo", type: "registry:example", + title: "Ripple Button Demo", + description: "Example showing an animated button with ripple effect.", files: [ { path: "example/ripple-button-demo.tsx", type: "registry:example" }, ], @@ -697,16 +884,23 @@ export const examples: Registry["items"] = [ { name: "file-tree-demo", type: "registry:example", + title: "File Tree Demo", + description: + "Example showing a component that displays folder and file structure.", files: [{ path: "example/file-tree-demo.tsx", type: "registry:example" }], }, { name: "blur-fade-demo", type: "registry:example", + title: "Blur Fade Demo", + description: "Example showing blur fade in and out animations.", files: [{ path: "example/blur-fade-demo.tsx", type: "registry:example" }], }, { name: "blur-fade-text-demo", type: "registry:example", + title: "Blur Fade Text Demo", + description: "Example showing blur fade animations with text.", files: [ { path: "example/blur-fade-text-demo.tsx", type: "registry:example" }, ], @@ -714,26 +908,36 @@ export const examples: Registry["items"] = [ { name: "safari-demo", type: "registry:example", + title: "Safari Demo", + description: "Example showing a Safari browser mockup.", files: [{ path: "example/safari-demo.tsx", type: "registry:example" }], }, { name: "safari-demo-2", type: "registry:example", + title: "Safari Demo 2", + description: "Second example showing a Safari browser mockup.", files: [{ path: "example/safari-demo-2.tsx", type: "registry:example" }], }, { name: "safari-demo-3", type: "registry:example", + title: "Safari Demo 3", + description: "Third example showing a Safari browser mockup.", files: [{ path: "example/safari-demo-3.tsx", type: "registry:example" }], }, { name: "safari-demo-4", type: "registry:example", + title: "Safari Demo 4", + description: "Fourth example showing a Safari browser mockup.", files: [{ path: "example/safari-demo-4.tsx", type: "registry:example" }], }, { name: "iphone-15-pro-demo", type: "registry:example", + title: "iPhone 15 Pro Demo", + description: "Example showing an iPhone 15 Pro mockup.", files: [ { path: "example/iphone-15-pro-demo.tsx", type: "registry:example" }, ], @@ -741,6 +945,8 @@ export const examples: Registry["items"] = [ { name: "iphone-15-pro-demo-2", type: "registry:example", + title: "iPhone 15 Pro Demo 2", + description: "Second example showing an iPhone 15 Pro mockup.", files: [ { path: "example/iphone-15-pro-demo-2.tsx", type: "registry:example" }, ], @@ -748,6 +954,8 @@ export const examples: Registry["items"] = [ { name: "iphone-15-pro-demo-3", type: "registry:example", + title: "iPhone 15 Pro Demo 3", + description: "Third example showing an iPhone 15 Pro mockup.", files: [ { path: "example/iphone-15-pro-demo-3.tsx", type: "registry:example" }, ], @@ -755,6 +963,8 @@ export const examples: Registry["items"] = [ { name: "rainbow-button-demo", type: "registry:example", + title: "Rainbow Button Demo", + description: "Example showing an animated button with rainbow effect.", files: [ { path: "example/rainbow-button-demo.tsx", type: "registry:example" }, ], @@ -762,6 +972,8 @@ export const examples: Registry["items"] = [ { name: "interactive-hover-button-demo", type: "registry:example", + title: "Interactive Hover Button Demo", + description: "Example showing an interactive button with hover effects.", files: [ { path: "example/interactive-hover-button-demo.tsx", From cf6d1d3f585d45c5752eed9a2657bfa0fc37d4dc Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 15:27:05 -0500 Subject: [PATCH 5/8] fix: update packages --- __registry__/index.tsx | 212 +++-- app/(blog)/blog/[slug]/page.tsx | 4 +- app/(blog)/blog/page.tsx | 6 +- app/(marketing)/layout.tsx | 2 +- components/blog/more-articles.tsx | 4 +- components/blog/promo-section.tsx | 2 +- components/open-in-v0-button.tsx | 2 +- components/sections/hero.tsx | 2 +- components/ui/button.tsx | 6 +- content/showcase/writora.mdx | 2 +- package.json | 4 +- pnpm-lock.yaml | 1466 +++++++++++++++++++++-------- registry.json | 204 ++++ 13 files changed, 1415 insertions(+), 501 deletions(-) diff --git a/__registry__/index.tsx b/__registry__/index.tsx index 8bf89b487..85d52c875 100644 --- a/__registry__/index.tsx +++ b/__registry__/index.tsx @@ -1437,7 +1437,8 @@ export const Index: Record = { }, "magic-card-demo": { name: "magic-card-demo", - description: "", + description: + "Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.", type: "registry:example", registryDependencies: ["magic-card"], files: [ @@ -1460,7 +1461,7 @@ export const Index: Record = { }, "android-demo": { name: "android-demo", - description: "", + description: "Example showing a mockup of an Android device.", type: "registry:example", registryDependencies: ["android"], files: [ @@ -1483,7 +1484,7 @@ export const Index: Record = { }, "android-demo-2": { name: "android-demo-2", - description: "", + description: "Second example showing a mockup of an Android device.", type: "registry:example", registryDependencies: ["android"], files: [ @@ -1506,7 +1507,7 @@ export const Index: Record = { }, "android-demo-3": { name: "android-demo-3", - description: "", + description: "Third example showing a mockup of an Android device.", type: "registry:example", registryDependencies: ["android"], files: [ @@ -1529,7 +1530,8 @@ export const Index: Record = { }, "warp-background-demo": { name: "warp-background-demo", - description: "", + description: + "Example showing a card with a time warping background effect.", type: "registry:example", registryDependencies: ["warp-background"], files: [ @@ -1552,7 +1554,7 @@ export const Index: Record = { }, "line-shadow-text-demo": { name: "line-shadow-text-demo", - description: "", + description: "Example showing a text component with a moving line shadow.", type: "registry:example", registryDependencies: ["line-shadow-text"], files: [ @@ -1575,7 +1577,7 @@ export const Index: Record = { }, "aurora-text-demo": { name: "aurora-text-demo", - description: "", + description: "Example showing a beautiful aurora text effect.", type: "registry:example", registryDependencies: ["aurora-text"], files: [ @@ -1598,7 +1600,7 @@ export const Index: Record = { }, "morphing-text-demo": { name: "morphing-text-demo", - description: "", + description: "Example showing a dynamic text morphing component.", type: "registry:example", registryDependencies: ["morphing-text"], files: [ @@ -1621,7 +1623,7 @@ export const Index: Record = { }, "scroll-progress-demo": { name: "scroll-progress-demo", - description: "", + description: "Example showing animated scroll progress for your pages.", type: "registry:example", registryDependencies: ["scroll-progress"], files: [ @@ -1644,7 +1646,7 @@ export const Index: Record = { }, "neon-gradient-card-demo": { name: "neon-gradient-card-demo", - description: "", + description: "Example showing a beautiful neon card effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1669,7 +1671,7 @@ export const Index: Record = { }, "meteors-demo": { name: "meteors-demo", - description: "", + description: "Example showing a meteor shower effect.", type: "registry:example", registryDependencies: ["meteors"], files: [ @@ -1692,7 +1694,7 @@ export const Index: Record = { }, "grid-pattern-demo": { name: "grid-pattern-demo", - description: "", + description: "Example showing a background grid pattern made with SVGs.", type: "registry:example", registryDependencies: ["grid-pattern"], files: [ @@ -1715,7 +1717,7 @@ export const Index: Record = { }, "grid-pattern-linear-gradient": { name: "grid-pattern-linear-gradient", - description: "", + description: "Example showing a grid pattern with linear gradient effects.", type: "registry:example", registryDependencies: ["grid-pattern"], files: [ @@ -1740,7 +1742,7 @@ export const Index: Record = { }, "grid-pattern-dashed": { name: "grid-pattern-dashed", - description: "", + description: "Example showing a dashed grid pattern.", type: "registry:example", registryDependencies: ["grid-pattern"], files: [ @@ -1763,7 +1765,7 @@ export const Index: Record = { }, "dot-pattern-demo": { name: "dot-pattern-demo", - description: "", + description: "Example showing a background dot pattern made with SVGs.", type: "registry:example", registryDependencies: ["dot-pattern"], files: [ @@ -1786,7 +1788,7 @@ export const Index: Record = { }, "dot-pattern-linear-gradient": { name: "dot-pattern-linear-gradient", - description: "", + description: "Example showing a dot pattern with linear gradient effects.", type: "registry:example", registryDependencies: ["dot-pattern"], files: [ @@ -1811,7 +1813,7 @@ export const Index: Record = { }, "flickering-grid-demo": { name: "flickering-grid-demo", - description: "", + description: "Example showing a flickering grid background.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1834,7 +1836,8 @@ export const Index: Record = { }, "flickering-grid-rounded-demo": { name: "flickering-grid-rounded-demo", - description: "", + description: + "Example showing a flickering grid background with rounded corners.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1859,7 +1862,7 @@ export const Index: Record = { }, "hero-video-dialog-demo": { name: "hero-video-dialog-demo", - description: "", + description: "Example showing a hero video dialog component.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1882,7 +1885,8 @@ export const Index: Record = { }, "hero-video-dialog-demo-top-in-bottom-out": { name: "hero-video-dialog-demo-top-in-bottom-out", - description: "", + description: + "Example showing a hero video dialog with top-in bottom-out animation.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1907,7 +1911,8 @@ export const Index: Record = { }, "code-comparison-demo": { name: "code-comparison-demo", - description: "", + description: + "Example showing a component which compares two code snippets.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1930,7 +1935,7 @@ export const Index: Record = { }, "script-copy-btn-demo": { name: "script-copy-btn-demo", - description: "", + description: "Example showing how to copy code to clipboard.", type: "registry:example", registryDependencies: undefined, files: [ @@ -1953,7 +1958,7 @@ export const Index: Record = { }, "marquee-demo": { name: "marquee-demo", - description: "", + description: "Example showing an infinite scrolling component.", type: "registry:example", registryDependencies: ["marquee"], files: [ @@ -1976,7 +1981,7 @@ export const Index: Record = { }, "marquee-demo-vertical": { name: "marquee-demo-vertical", - description: "", + description: "Example showing a vertical infinite scrolling component.", type: "registry:example", registryDependencies: ["marquee"], files: [ @@ -1999,7 +2004,7 @@ export const Index: Record = { }, "marquee-logos": { name: "marquee-logos", - description: "", + description: "Example showing an infinite scrolling logo carousel.", type: "registry:example", registryDependencies: ["marquee"], files: [ @@ -2022,7 +2027,7 @@ export const Index: Record = { }, "marquee-3d": { name: "marquee-3d", - description: "", + description: "Example showing a 3D infinite scrolling component.", type: "registry:example", registryDependencies: ["marquee"], files: [ @@ -2045,7 +2050,7 @@ export const Index: Record = { }, "globe-demo": { name: "globe-demo", - description: "", + description: "Example showing an autorotating, interactive WebGL globe.", type: "registry:example", registryDependencies: ["globe"], files: [ @@ -2068,7 +2073,7 @@ export const Index: Record = { }, "tweet-card-demo": { name: "tweet-card-demo", - description: "", + description: "Example showing a tweet card with author info.", type: "registry:example", registryDependencies: ["tweet-card"], files: [ @@ -2091,7 +2096,7 @@ export const Index: Record = { }, "tweet-card-images": { name: "tweet-card-images", - description: "", + description: "Example showing a tweet card with images.", type: "registry:example", registryDependencies: ["tweet-card"], files: [ @@ -2114,7 +2119,7 @@ export const Index: Record = { }, "tweet-card-meta-preview": { name: "tweet-card-meta-preview", - description: "", + description: "Example showing a tweet card with meta preview.", type: "registry:example", registryDependencies: ["tweet-card"], files: [ @@ -2139,7 +2144,7 @@ export const Index: Record = { }, "shimmer-button-demo": { name: "shimmer-button-demo", - description: "", + description: "Example showing a button with a shimmering light effect.", type: "registry:example", registryDependencies: ["shimmer-button"], files: [ @@ -2162,7 +2167,7 @@ export const Index: Record = { }, "bento-demo": { name: "bento-demo", - description: "", + description: "Example showing a bento grid layout for showcasing features.", type: "registry:example", registryDependencies: [ "bento-grid", @@ -2192,7 +2197,7 @@ export const Index: Record = { }, "bento-demo-vertical": { name: "bento-demo-vertical", - description: "", + description: "Example showing a vertical bento grid layout.", type: "registry:example", registryDependencies: ["bento-grid"], files: [ @@ -2215,7 +2220,7 @@ export const Index: Record = { }, "number-ticker-demo": { name: "number-ticker-demo", - description: "", + description: "Example showing animated counting numbers.", type: "registry:example", registryDependencies: ["number-ticker"], files: [ @@ -2238,7 +2243,7 @@ export const Index: Record = { }, "number-ticker-decimal-demo": { name: "number-ticker-decimal-demo", - description: "", + description: "Example showing animated counting decimal numbers.", type: "registry:example", registryDependencies: ["number-ticker"], files: [ @@ -2263,7 +2268,7 @@ export const Index: Record = { }, "ripple-demo": { name: "ripple-demo", - description: "", + description: "Example showing an animated ripple effect.", type: "registry:example", registryDependencies: ["ripple"], files: [ @@ -2286,7 +2291,7 @@ export const Index: Record = { }, "retro-grid-demo": { name: "retro-grid-demo", - description: "", + description: "Example showing an animated scrolling retro grid effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -2309,7 +2314,7 @@ export const Index: Record = { }, "animated-list-demo": { name: "animated-list-demo", - description: "", + description: "Example showing a list with sequenced item animations.", type: "registry:example", registryDependencies: ["animated-list"], files: [ @@ -2332,7 +2337,7 @@ export const Index: Record = { }, "animated-shiny-text-demo": { name: "animated-shiny-text-demo", - description: "", + description: "Example showing text with a shimmering light effect.", type: "registry:example", registryDependencies: ["animated-shiny-text"], files: [ @@ -2357,7 +2362,7 @@ export const Index: Record = { }, "particles-demo": { name: "particles-demo", - description: "", + description: "Example showing interactive particle effects.", type: "registry:example", registryDependencies: ["particles"], files: [ @@ -2380,7 +2385,7 @@ export const Index: Record = { }, "animated-grid-pattern-demo": { name: "animated-grid-pattern-demo", - description: "", + description: "Example showing an animated grid pattern background.", type: "registry:example", registryDependencies: ["animated-grid-pattern"], files: [ @@ -2405,7 +2410,7 @@ export const Index: Record = { }, "interactive-grid-pattern-demo": { name: "interactive-grid-pattern-demo", - description: "", + description: "Example showing an interactive grid pattern background.", type: "registry:example", registryDependencies: ["interactive-grid-pattern"], files: [ @@ -2430,7 +2435,8 @@ export const Index: Record = { }, "interactive-grid-pattern-demo-2": { name: "interactive-grid-pattern-demo-2", - description: "", + description: + "Second example showing an interactive grid pattern background.", type: "registry:example", registryDependencies: ["interactive-grid-pattern"], files: [ @@ -2455,7 +2461,7 @@ export const Index: Record = { }, "border-beam-demo": { name: "border-beam-demo", - description: "", + description: "Example showing an animated border beam effect.", type: "registry:example", registryDependencies: ["border-beam"], files: [ @@ -2478,7 +2484,7 @@ export const Index: Record = { }, "animated-beam-demo": { name: "animated-beam-demo", - description: "", + description: "Example showing an animated beam of light effect.", type: "registry:example", registryDependencies: ["animated-beam"], files: [ @@ -2501,7 +2507,7 @@ export const Index: Record = { }, "animated-beam-unidirectional": { name: "animated-beam-unidirectional", - description: "", + description: "Example showing a unidirectional animated beam effect.", type: "registry:example", registryDependencies: ["animated-beam"], files: [ @@ -2526,7 +2532,7 @@ export const Index: Record = { }, "animated-beam-bidirectional": { name: "animated-beam-bidirectional", - description: "", + description: "Example showing a bidirectional animated beam effect.", type: "registry:example", registryDependencies: ["animated-beam"], files: [ @@ -2551,7 +2557,7 @@ export const Index: Record = { }, "animated-beam-multiple-inputs": { name: "animated-beam-multiple-inputs", - description: "", + description: "Example showing animated beams with multiple input points.", type: "registry:example", registryDependencies: ["animated-beam"], files: [ @@ -2576,7 +2582,7 @@ export const Index: Record = { }, "animated-beam-multiple-outputs": { name: "animated-beam-multiple-outputs", - description: "", + description: "Example showing animated beams with multiple output points.", type: "registry:example", registryDependencies: ["animated-beam"], files: [ @@ -2601,7 +2607,7 @@ export const Index: Record = { }, "text-reveal-demo": { name: "text-reveal-demo", - description: "", + description: "Example showing text that fades in on scroll.", type: "registry:example", registryDependencies: ["text-reveal"], files: [ @@ -2624,7 +2630,7 @@ export const Index: Record = { }, "animated-gradient-text-demo": { name: "animated-gradient-text-demo", - description: "", + description: "Example showing text with animated gradient backgrounds.", type: "registry:example", registryDependencies: ["animated-gradient-text"], files: [ @@ -2649,7 +2655,7 @@ export const Index: Record = { }, "orbiting-circles-demo": { name: "orbiting-circles-demo", - description: "", + description: "Example showing circles moving in orbital paths.", type: "registry:example", registryDependencies: ["orbiting-circles"], files: [ @@ -2672,7 +2678,7 @@ export const Index: Record = { }, "dock-demo": { name: "dock-demo", - description: "", + description: "Example showing a MacOS-style dock implementation.", type: "registry:example", registryDependencies: ["dock"], files: [ @@ -2695,7 +2701,7 @@ export const Index: Record = { }, "dock-demo-2": { name: "dock-demo-2", - description: "", + description: "Second example showing a MacOS-style dock implementation.", type: "registry:example", registryDependencies: ["dock"], files: [ @@ -2718,7 +2724,7 @@ export const Index: Record = { }, "dock-demo-3": { name: "dock-demo-3", - description: "", + description: "Third example showing a MacOS-style dock implementation.", type: "registry:example", registryDependencies: ["dock"], files: [ @@ -2741,7 +2747,7 @@ export const Index: Record = { }, "word-rotate-demo": { name: "word-rotate-demo", - description: "", + description: "Example showing vertical word rotation animation.", type: "registry:example", registryDependencies: ["word-rotate"], files: [ @@ -2764,7 +2770,7 @@ export const Index: Record = { }, "hyper-text-demo": { name: "hyper-text-demo", - description: "", + description: "Example showing text with scrambling letter animations.", type: "registry:example", registryDependencies: ["hyper-text"], files: [ @@ -2787,7 +2793,7 @@ export const Index: Record = { }, "avatar-circles-demo": { name: "avatar-circles-demo", - description: "", + description: "Example showing overlapping avatar circles.", type: "registry:example", registryDependencies: ["avatar-circles"], files: [ @@ -2810,7 +2816,7 @@ export const Index: Record = { }, "typing-animation-demo": { name: "typing-animation-demo", - description: "", + description: "Example showing typed character animations.", type: "registry:example", registryDependencies: ["typing-animation"], files: [ @@ -2833,7 +2839,7 @@ export const Index: Record = { }, "scroll-based-velocity-demo": { name: "scroll-based-velocity-demo", - description: "", + description: "Example showing text speed changes based on scroll velocity.", type: "registry:example", registryDependencies: ["scroll-based-velocity"], files: [ @@ -2858,7 +2864,7 @@ export const Index: Record = { }, "scratch-to-reveal-demo": { name: "scratch-to-reveal-demo", - description: "", + description: "Example showing an interactive scratch-off reveal effect.", type: "registry:example", registryDependencies: ["scratch-to-reveal"], files: [ @@ -2881,7 +2887,7 @@ export const Index: Record = { }, "flip-text-demo": { name: "flip-text-demo", - description: "", + description: "Example showing text with character flip animations.", type: "registry:example", registryDependencies: ["flip-text"], files: [ @@ -2904,7 +2910,7 @@ export const Index: Record = { }, "sparkles-text-demo": { name: "sparkles-text-demo", - description: "", + description: "Example showing text with animated sparkle effects.", type: "registry:example", registryDependencies: undefined, files: [ @@ -2927,7 +2933,7 @@ export const Index: Record = { }, "icon-cloud-demo": { name: "icon-cloud-demo", - description: "", + description: "Example showing an interactive 3D icon cloud.", type: "registry:example", registryDependencies: ["icon-cloud"], files: [ @@ -2950,7 +2956,7 @@ export const Index: Record = { }, "icon-cloud-demo-2": { name: "icon-cloud-demo-2", - description: "", + description: "Second example showing an interactive 3D icon cloud.", type: "registry:example", registryDependencies: ["icon-cloud"], files: [ @@ -2973,7 +2979,7 @@ export const Index: Record = { }, "icon-cloud-demo-3": { name: "icon-cloud-demo-3", - description: "", + description: "Third example showing an interactive 3D icon cloud.", type: "registry:example", registryDependencies: ["icon-cloud"], files: [ @@ -2996,7 +3002,7 @@ export const Index: Record = { }, "text-animate-demo": { name: "text-animate-demo", - description: "", + description: "Example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3019,7 +3025,7 @@ export const Index: Record = { }, "text-animate-demo-2": { name: "text-animate-demo-2", - description: "", + description: "Second example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3042,7 +3048,7 @@ export const Index: Record = { }, "text-animate-demo-3": { name: "text-animate-demo-3", - description: "", + description: "Third example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3065,7 +3071,7 @@ export const Index: Record = { }, "text-animate-demo-4": { name: "text-animate-demo-4", - description: "", + description: "Fourth example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3088,7 +3094,7 @@ export const Index: Record = { }, "text-animate-demo-5": { name: "text-animate-demo-5", - description: "", + description: "Fifth example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3111,7 +3117,7 @@ export const Index: Record = { }, "text-animate-demo-6": { name: "text-animate-demo-6", - description: "", + description: "Sixth example showing various text animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3134,7 +3140,7 @@ export const Index: Record = { }, "shiny-button-demo": { name: "shiny-button-demo", - description: "", + description: "Example showing a shiny button with dynamic styles.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3157,7 +3163,7 @@ export const Index: Record = { }, "box-reveal-demo": { name: "box-reveal-demo", - description: "", + description: "Example showing a sliding box text reveal animation.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3180,7 +3186,7 @@ export const Index: Record = { }, "animated-circular-progress-bar-demo": { name: "animated-circular-progress-bar-demo", - description: "", + description: "Example showing an animated circular progress gauge.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3205,7 +3211,7 @@ export const Index: Record = { }, "shine-border-demo": { name: "shine-border-demo", - description: "", + description: "Example showing an animated shining border effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3228,7 +3234,7 @@ export const Index: Record = { }, "shine-border-demo-2": { name: "shine-border-demo-2", - description: "", + description: "Second example showing an animated shining border effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3251,7 +3257,7 @@ export const Index: Record = { }, "confetti-demo": { name: "confetti-demo", - description: "", + description: "Example showing confetti animations for celebrations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3274,7 +3280,7 @@ export const Index: Record = { }, "confetti-basic-cannon": { name: "confetti-basic-cannon", - description: "", + description: "Example showing basic confetti cannon animation.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3297,7 +3303,7 @@ export const Index: Record = { }, "confetti-random-direction": { name: "confetti-random-direction", - description: "", + description: "Example showing confetti with random directions.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3322,7 +3328,7 @@ export const Index: Record = { }, "confetti-fireworks": { name: "confetti-fireworks", - description: "", + description: "Example showing fireworks-style confetti animation.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3345,7 +3351,7 @@ export const Index: Record = { }, "confetti-stars": { name: "confetti-stars", - description: "", + description: "Example showing star-shaped confetti animation.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3368,7 +3374,7 @@ export const Index: Record = { }, "confetti-side-cannons": { name: "confetti-side-cannons", - description: "", + description: "Example showing side-mounted confetti cannons.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3391,7 +3397,7 @@ export const Index: Record = { }, "confetti-custom-shapes": { name: "confetti-custom-shapes", - description: "", + description: "Example showing confetti with custom shape particles.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3414,7 +3420,7 @@ export const Index: Record = { }, "confetti-emoji": { name: "confetti-emoji", - description: "", + description: "Example showing confetti with emoji particles.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3437,7 +3443,8 @@ export const Index: Record = { }, "animated-subscribe-button-demo": { name: "animated-subscribe-button-demo", - description: "", + description: + "Example showing an animated subscribe button with micro animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3462,7 +3469,7 @@ export const Index: Record = { }, "cool-mode-demo": { name: "cool-mode-demo", - description: "", + description: "Example showing cool mode effect for buttons and links.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3485,7 +3492,7 @@ export const Index: Record = { }, "cool-mode-custom": { name: "cool-mode-custom", - description: "", + description: "Example showing customized cool mode effects.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3508,7 +3515,7 @@ export const Index: Record = { }, "pulsating-button-demo": { name: "pulsating-button-demo", - description: "", + description: "Example showing an animated pulsating button.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3531,7 +3538,7 @@ export const Index: Record = { }, "ripple-button-demo": { name: "ripple-button-demo", - description: "", + description: "Example showing an animated button with ripple effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3554,7 +3561,8 @@ export const Index: Record = { }, "file-tree-demo": { name: "file-tree-demo", - description: "", + description: + "Example showing a component that displays folder and file structure.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3577,7 +3585,7 @@ export const Index: Record = { }, "blur-fade-demo": { name: "blur-fade-demo", - description: "", + description: "Example showing blur fade in and out animations.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3600,7 +3608,7 @@ export const Index: Record = { }, "blur-fade-text-demo": { name: "blur-fade-text-demo", - description: "", + description: "Example showing blur fade animations with text.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3623,7 +3631,7 @@ export const Index: Record = { }, "safari-demo": { name: "safari-demo", - description: "", + description: "Example showing a Safari browser mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3646,7 +3654,7 @@ export const Index: Record = { }, "safari-demo-2": { name: "safari-demo-2", - description: "", + description: "Second example showing a Safari browser mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3669,7 +3677,7 @@ export const Index: Record = { }, "safari-demo-3": { name: "safari-demo-3", - description: "", + description: "Third example showing a Safari browser mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3692,7 +3700,7 @@ export const Index: Record = { }, "safari-demo-4": { name: "safari-demo-4", - description: "", + description: "Fourth example showing a Safari browser mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3715,7 +3723,7 @@ export const Index: Record = { }, "iphone-15-pro-demo": { name: "iphone-15-pro-demo", - description: "", + description: "Example showing an iPhone 15 Pro mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3738,7 +3746,7 @@ export const Index: Record = { }, "iphone-15-pro-demo-2": { name: "iphone-15-pro-demo-2", - description: "", + description: "Second example showing an iPhone 15 Pro mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3761,7 +3769,7 @@ export const Index: Record = { }, "iphone-15-pro-demo-3": { name: "iphone-15-pro-demo-3", - description: "", + description: "Third example showing an iPhone 15 Pro mockup.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3784,7 +3792,7 @@ export const Index: Record = { }, "rainbow-button-demo": { name: "rainbow-button-demo", - description: "", + description: "Example showing an animated button with rainbow effect.", type: "registry:example", registryDependencies: undefined, files: [ @@ -3807,7 +3815,7 @@ export const Index: Record = { }, "interactive-hover-button-demo": { name: "interactive-hover-button-demo", - description: "", + description: "Example showing an interactive button with hover effects.", type: "registry:example", registryDependencies: undefined, files: [ diff --git a/app/(blog)/blog/[slug]/page.tsx b/app/(blog)/blog/[slug]/page.tsx index cf0c2792f..505a0d7d3 100644 --- a/app/(blog)/blog/[slug]/page.tsx +++ b/app/(blog)/blog/[slug]/page.tsx @@ -195,7 +195,7 @@ export default function BlogPage({ params }: { params: { slug: string[] } }) { href="/blog" className="flex h-8 w-fit items-center justify-center rounded-full border border-border bg-muted px-4 text-sm text-secondary-foreground" > - + Back to Blog
@@ -206,7 +206,7 @@ export default function BlogPage({ params }: { params: { slug: string[] } }) { {post.title}
diff --git a/app/(blog)/blog/page.tsx b/app/(blog)/blog/page.tsx index d461c1d29..9da7a428e 100644 --- a/app/(blog)/blog/page.tsx +++ b/app/(blog)/blog/page.tsx @@ -52,7 +52,7 @@ export default function BlogPage() { {featuredPosts[0].title}
@@ -153,7 +153,7 @@ export default function BlogPage() { {filteredBlogs.map((blog) => (
  • diff --git a/app/(marketing)/layout.tsx b/app/(marketing)/layout.tsx index 7a2a50eb4..a5e56496f 100644 --- a/app/(marketing)/layout.tsx +++ b/app/(marketing)/layout.tsx @@ -15,7 +15,7 @@ export default async function MarketingLayout({
    {children}
    -
    +
    ); } diff --git a/components/blog/more-articles.tsx b/components/blog/more-articles.tsx index a043a8931..0692df2fe 100644 --- a/components/blog/more-articles.tsx +++ b/components/blog/more-articles.tsx @@ -23,7 +23,7 @@ export default function MoreArticles({ currentPost }: { currentPost: Blog }) {

    Read more like this - +

    {relatedPosts.map((post) => ( @@ -37,7 +37,7 @@ export default function MoreArticles({ currentPost }: { currentPost: Blog }) { {post.title}
    diff --git a/components/blog/promo-section.tsx b/components/blog/promo-section.tsx index 49e7ab691..3fbd005f7 100644 --- a/components/blog/promo-section.tsx +++ b/components/blog/promo-section.tsx @@ -18,7 +18,7 @@ export default function PromoSection() {
    diff --git a/components/open-in-v0-button.tsx b/components/open-in-v0-button.tsx index 9be7c8d1d..6ac8b5dd0 100644 --- a/components/open-in-v0-button.tsx +++ b/components/open-in-v0-button.tsx @@ -17,7 +17,7 @@ export function OpenInV0Button({ url }: { url: string }) { viewBox="0 0 40 20" fill="none" xmlns="http://www.w3.org/2000/svg" - className="h-5 w-5 text-current" + className="size-5 text-current" > 🎉 Introducing {post.title} - +

    =8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -947,8 +947,8 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@ianvs/prettier-plugin-sort-imports@4.3.1': - resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} + '@ianvs/prettier-plugin-sort-imports@4.4.1': + resolution: {integrity: sha512-F0/Hrcfpy8WuxlQyAWJTEren/uxKhYonOGY4OyWmwRdeTvkh9mMSCxowZLjNkhwi/2ipqCgtXwwOk7tW0mWXkA==} peerDependencies: '@vue/compiler-sfc': 2.7.x || 3.x prettier: 2 || 3 @@ -1963,8 +1963,11 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - '@rushstack/eslint-patch@1.7.2': - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} '@shikijs/core@1.20.0': resolution: {integrity: sha512-KlO3iE0THzSdYkzDFugt8SHe6FR3qNYTkmpbdW1d6xo8juQkMjybxAw/cBi2npL2eb2F4PbbnSs5Z9tDusfvyg==} @@ -2162,6 +2165,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -2223,47 +2231,57 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -2275,9 +2293,6 @@ packages: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - autoprefixer@10.4.14: resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -2289,12 +2304,13 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2347,10 +2363,22 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2570,6 +2598,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + css-declaration-sorter@7.1.1: resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} engines: {node: ^14 || ^16 || >=18} @@ -2632,6 +2664,18 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -2739,6 +2783,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2773,25 +2821,38 @@ packages: resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} engines: {node: '>= 0.4'} - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -2799,6 +2860,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -2850,8 +2915,8 @@ packages: eslint: '*' eslint-plugin-import: '*' - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2871,33 +2936,33 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-plugin-jsx-a11y@6.8.0: - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.33.2: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-tailwindcss@3.13.1: resolution: {integrity: sha512-2Nlgr9doO6vFAG9w4iGU0sspWXuzypfng10HTF+dFS2NterhweWtgdRvf/f7aaoOUUxVZM8wMIXzazrZ7CxyeA==} @@ -2916,6 +2981,7 @@ packages: eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -3102,6 +3168,10 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -3126,6 +3196,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -3134,6 +3208,10 @@ packages: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3146,6 +3224,10 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} @@ -3194,6 +3276,10 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3201,6 +3287,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3229,16 +3319,24 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hast-util-from-html@2.0.3: @@ -3343,6 +3441,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -3356,6 +3458,10 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -3366,6 +3472,10 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -3374,6 +3484,10 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} @@ -3385,10 +3499,22 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -3400,8 +3526,9 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -3430,8 +3557,9 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -3441,6 +3569,10 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3471,17 +3603,26 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-regexp@3.1.0: resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} engines: {node: '>=12'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3490,10 +3631,18 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} @@ -3502,18 +3651,28 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3521,8 +3680,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} @@ -3744,6 +3904,10 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} @@ -4176,6 +4340,10 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -4184,22 +4352,24 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} - object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} octokit@4.0.2: @@ -4228,6 +4398,10 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4699,8 +4873,8 @@ packages: resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} - reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: @@ -4713,6 +4887,10 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} @@ -4830,13 +5008,25 @@ packages: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -4869,10 +5059,18 @@ packages: resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shadcn@2.3.0: resolution: {integrity: sha512-Q/ra8/r2wb5W0DX0LKuPpsT6/0vtgwW/DR9uunJ6/3lXMOBo2UyUeCQ2m9/XAlALHhyGnzHngf8s8NrW1kcg5Q==} hasBin: true @@ -4899,10 +5097,26 @@ packages: shiki@1.20.0: resolution: {integrity: sha512-MZJJ1PCFsQB1Piq+25wiz0a75yUv8Q3/fzy7SzRx5ONdjdtGdyiKwYn8vb/FnK5kjS0voWGnPpjG16POauUR+g==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.5: resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4997,13 +5211,25 @@ packages: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} - string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.padend@3.1.5: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} @@ -5011,9 +5237,17 @@ packages: string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -5242,26 +5476,46 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + typed-array-length@1.0.5: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -5410,17 +5664,26 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.14: resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -5503,8 +5766,8 @@ snapshots: '@ampproject/remapping@2.2.1': dependencies: - '@jridgewell/gen-mapping': 0.3.4 - '@jridgewell/trace-mapping': 0.3.23 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 '@antfu/ni@0.21.12': {} @@ -5543,9 +5806,9 @@ snapshots: '@babel/generator@7.23.6': dependencies: - '@babel/types': 7.24.6 - '@jridgewell/gen-mapping': 0.3.4 - '@jridgewell/trace-mapping': 0.3.23 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/generator@7.26.5': @@ -5585,12 +5848,12 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.6 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.26.5 '@babel/helper-member-expression-to-functions@7.25.9': dependencies: @@ -5601,7 +5864,7 @@ snapshots: '@babel/helper-module-imports@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.26.5 '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': dependencies: @@ -5629,7 +5892,7 @@ snapshots: '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: @@ -5640,7 +5903,7 @@ snapshots: '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.26.5 '@babel/helper-string-parser@7.24.6': {} @@ -5655,20 +5918,20 @@ snapshots: '@babel/helpers@7.24.0': dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.6 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color '@babel/highlight@7.23.4': dependencies: - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 '@babel/parser@7.24.0': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.26.5 '@babel/parser@7.26.5': dependencies: @@ -5697,8 +5960,8 @@ snapshots: '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.6 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@babel/template@7.25.9': dependencies: @@ -5709,13 +5972,13 @@ snapshots: '@babel/traverse@7.24.0': dependencies: '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/generator': 7.26.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.6 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -5792,11 +6055,11 @@ snapshots: dependencies: '@clerc/core': 0.44.0 - '@commitlint/cli@19.3.0(@types/node@20.11.22)(typescript@5.3.3)': + '@commitlint/cli@19.3.0(@types/node@20.11.22)(typescript@5.7.3)': dependencies: '@commitlint/format': 19.3.0 '@commitlint/lint': 19.2.2 - '@commitlint/load': 19.2.0(@types/node@20.11.22)(typescript@5.3.3) + '@commitlint/load': 19.2.0(@types/node@20.11.22)(typescript@5.7.3) '@commitlint/read': 19.2.1 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -5843,15 +6106,15 @@ snapshots: '@commitlint/rules': 19.0.3 '@commitlint/types': 19.0.3 - '@commitlint/load@19.2.0(@types/node@20.11.22)(typescript@5.3.3)': + '@commitlint/load@19.2.0(@types/node@20.11.22)(typescript@5.7.3)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 '@commitlint/resolve-extends': 19.1.0 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.22)(cosmiconfig@9.0.0(typescript@5.3.3))(typescript@5.3.3) + cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.22)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -5903,13 +6166,13 @@ snapshots: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 - '@content-collections/cli@0.1.4(@content-collections/core@0.7.1(typescript@5.3.3))': + '@content-collections/cli@0.1.4(@content-collections/core@0.7.1(typescript@5.7.3))': dependencies: - '@content-collections/core': 0.7.1(typescript@5.3.3) - '@content-collections/integrations': 0.2.0(@content-collections/core@0.7.1(typescript@5.3.3)) + '@content-collections/core': 0.7.1(typescript@5.7.3) + '@content-collections/integrations': 0.2.0(@content-collections/core@0.7.1(typescript@5.7.3)) clerc: 0.44.0 - '@content-collections/core@0.7.1(typescript@5.3.3)': + '@content-collections/core@0.7.1(typescript@5.7.3)': dependencies: '@parcel/watcher': 2.4.1 camelcase: 8.0.0 @@ -5920,17 +6183,17 @@ snapshots: pluralize: 8.0.0 serialize-javascript: 6.0.2 tinyglobby: 0.2.6 - typescript: 5.3.3 + typescript: 5.7.3 yaml: 2.4.5 zod: 3.23.8 - '@content-collections/integrations@0.2.0(@content-collections/core@0.7.1(typescript@5.3.3))': + '@content-collections/integrations@0.2.0(@content-collections/core@0.7.1(typescript@5.7.3))': dependencies: - '@content-collections/core': 0.7.1(typescript@5.3.3) + '@content-collections/core': 0.7.1(typescript@5.7.3) - '@content-collections/mdx@0.1.5(@content-collections/core@0.7.1(typescript@5.3.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@content-collections/mdx@0.1.5(@content-collections/core@0.7.1(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@content-collections/core': 0.7.1(typescript@5.3.3) + '@content-collections/core': 0.7.1(typescript@5.7.3) esbuild: 0.21.5 mdx-bundler: 10.0.3(esbuild@0.21.5) react: 18.3.1 @@ -5939,10 +6202,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@content-collections/next@0.2.2(@content-collections/core@0.7.1(typescript@5.3.3))(next@14.2.13(@babel/core@7.24.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@content-collections/next@0.2.2(@content-collections/core@0.7.1(typescript@5.7.3))(next@14.2.13(@babel/core@7.24.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@content-collections/core': 0.7.1(typescript@5.3.3) - '@content-collections/integrations': 0.2.0(@content-collections/core@0.7.1(typescript@5.3.3)) + '@content-collections/core': 0.7.1(typescript@5.7.3) + '@content-collections/integrations': 0.2.0(@content-collections/core@0.7.1(typescript@5.7.3)) next: 14.2.13(@babel/core@7.24.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@cspotcode/source-map-support@0.8.1': @@ -6111,7 +6374,7 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': dependencies: @@ -6164,13 +6427,12 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': + '@ianvs/prettier-plugin-sort-imports@4.4.1(prettier@3.3.3)': dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/parser': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.6 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 prettier: 3.3.3 semver: 7.6.0 transitivePeerDependencies: @@ -7223,7 +7485,9 @@ snapshots: '@radix-ui/rect@1.1.0': {} - '@rushstack/eslint-patch@1.7.2': {} + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.10.5': {} '@shikijs/core@1.20.0': dependencies: @@ -7263,26 +7527,26 @@ snapshots: dependencies: tslib: 2.6.2 - '@t3-oss/env-core@0.7.3(typescript@5.3.3)(zod@3.23.8)': + '@t3-oss/env-core@0.7.3(typescript@5.7.3)(zod@3.23.8)': dependencies: zod: 3.23.8 optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 - '@t3-oss/env-nextjs@0.7.3(typescript@5.3.3)(zod@3.23.8)': + '@t3-oss/env-nextjs@0.7.3(typescript@5.7.3)(zod@3.23.8)': dependencies: - '@t3-oss/env-core': 0.7.3(typescript@5.3.3)(zod@3.23.8) + '@t3-oss/env-core': 0.7.3(typescript@5.7.3)(zod@3.23.8) zod: 3.23.8 optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 - '@tailwindcss/typography@0.5.10(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)))': + '@tailwindcss/typography@0.5.10(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)) + tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)) '@trysound/sax@0.2.0': {} @@ -7386,15 +7650,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) debug: 4.3.4 eslint: 8.57.1 optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -7405,7 +7669,7 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -7413,9 +7677,9 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) + tsutils: 3.21.0(typescript@5.7.3) optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -7435,11 +7699,17 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-walk@8.3.2: optional: true acorn@8.12.1: {} + acorn@8.14.0: {} + agent-base@7.1.3: {} aggregate-error@5.0.0: @@ -7499,76 +7769,92 @@ snapshots: dependencies: tslib: 2.6.2 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-array-buffer: 3.0.4 + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + array-ify@1.0.0: {} - array-includes@3.1.7: + array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 array-union@2.1.0: {} - array.prototype.filter@1.0.3: + array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.0.2 - array.prototype.findlastindex@1.2.4: + array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-errors: 1.3.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - array.prototype.tosorted@1.1.3: + array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -7577,10 +7863,6 @@ snapshots: astring@1.8.6: {} - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 - autoprefixer@10.4.14(postcss@8.4.39): dependencies: browserslist: 4.23.0 @@ -7595,11 +7877,9 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axe-core@4.7.0: {} + axe-core@4.10.2: {} - axobject-query@3.2.1: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} bail@2.0.2: {} @@ -7654,6 +7934,11 @@ snapshots: dependencies: streamsearch: 1.1.0 + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -7662,6 +7947,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.1 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -7837,30 +8134,30 @@ snapshots: convert-source-map@2.0.0: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.22)(cosmiconfig@9.0.0(typescript@5.3.3))(typescript@5.3.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.22)(cosmiconfig@9.0.0(typescript@5.7.3))(typescript@5.7.3): dependencies: '@types/node': 20.11.22 - cosmiconfig: 9.0.0(typescript@5.3.3) + cosmiconfig: 9.0.0(typescript@5.7.3) jiti: 1.21.0 - typescript: 5.3.3 + typescript: 5.7.3 - cosmiconfig@8.3.6(typescript@5.3.3): + cosmiconfig@8.3.6(typescript@5.7.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 - cosmiconfig@9.0.0(typescript@5.3.3): + cosmiconfig@9.0.0(typescript@5.7.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 create-require@1.1.1: optional: true @@ -7891,6 +8188,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + css-declaration-sorter@7.1.1(postcss@8.4.39): dependencies: postcss: 8.4.39 @@ -7972,6 +8275,24 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.0 @@ -8069,6 +8390,12 @@ snapshots: dependencies: is-obj: 2.0.0 + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} electron-to-chromium@1.4.686: {} @@ -8110,7 +8437,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 @@ -8136,41 +8463,107 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.14 - es-array-method-boxes-properly@1.0.0: {} + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} - es-iterator-helpers@1.0.17: + es-iterator-helpers@1.2.1: dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 + get-intrinsic: 1.2.7 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -8178,6 +8571,12 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -8238,20 +8637,20 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@13.3.0(eslint@8.57.1)(typescript@5.3.3): + eslint-config-next@13.3.0(eslint@8.57.1)(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 13.3.0 - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.3.3) + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1) - eslint-plugin-react: 7.33.2(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) optionalDependencies: - typescript: 5.3.3 + typescript: 5.7.3 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color @@ -8263,21 +8662,21 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.16.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 4.3.4 enhanced-resolve: 5.15.1 eslint: 8.57.1 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.7.5 - is-core-module: 2.13.1 + is-core-module: 2.16.1 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -8285,93 +8684,96 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) - hasown: 2.0.1 - is-core-module: 2.13.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 semver: 6.3.1 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: - '@babel/runtime': 7.24.0 - aria-query: 5.3.0 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 + axe-core: 4.10.2 + axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 eslint: 8.57.1 - hasown: 2.0.1 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@4.6.0(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react@7.33.2(eslint@8.57.1): + eslint-plugin-react@7.37.4(eslint@8.57.1): dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.3 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 - eslint-plugin-tailwindcss@3.13.1(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3))): + eslint-plugin-tailwindcss@3.13.1(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3))): dependencies: fast-glob: 3.3.2 postcss: 8.4.39 - tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)) + tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)) eslint-scope@7.2.2: dependencies: @@ -8383,7 +8785,7 @@ snapshots: eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 @@ -8392,7 +8794,7 @@ snapshots: '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 @@ -8425,8 +8827,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -8620,10 +9022,19 @@ snapshots: function.prototype.name@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + functions-have-names: 1.2.3 + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.22.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -8643,21 +9054,45 @@ snapshots: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 get-nonce@1.0.1: {} get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@6.0.1: {} get-stream@8.0.1: {} get-symbol-description@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 get-tsconfig@4.7.5: dependencies: @@ -8719,6 +9154,11 @@ snapshots: dependencies: define-properties: 1.2.1 + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -8730,7 +9170,9 @@ snapshots: gopd@1.0.1: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 + + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -8751,17 +9193,23 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 - hasown@2.0.1: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -8923,9 +9371,15 @@ snapshots: internal-slot@1.0.7: dependencies: es-errors: 1.3.0 - hasown: 2.0.1 + hasown: 2.0.2 side-channel: 1.0.5 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -8939,8 +9393,14 @@ snapshots: is-array-buffer@3.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.2.7 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} @@ -8952,13 +9412,22 @@ snapshots: dependencies: has-bigints: 1.0.2 + is-bigint@1.1.0: + dependencies: + has-bigints: 1.0.2 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 is-boolean-object@1.1.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + has-tostringtag: 1.0.2 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@2.0.5: {} @@ -8967,21 +9436,36 @@ snapshots: is-core-module@2.13.1: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} is-extendable@0.1.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} @@ -9003,7 +9487,7 @@ snapshots: is-interactive@2.0.0: {} - is-map@2.0.2: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -9011,6 +9495,11 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-obj@2.0.0: {} @@ -9029,16 +9518,27 @@ snapshots: is-regex@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + has-tostringtag: 1.0.2 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-regexp@3.1.0: {} - is-set@2.0.2: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 is-stream@3.0.0: {} @@ -9046,10 +9546,21 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 @@ -9058,29 +9569,38 @@ snapshots: dependencies: which-typed-array: 1.1.14 + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + is-unicode-supported@1.3.0: {} - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 - is-weakset@2.0.2: + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 isarray@2.0.5: {} isexe@2.0.0: {} - iterator.prototype@1.1.2: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 set-function-name: 2.0.2 jackspeak@2.3.6: @@ -9134,10 +9654,10 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.1.7 + object.assign: 4.1.7 + object.values: 1.2.1 keyv@4.5.4: dependencies: @@ -9289,6 +9809,8 @@ snapshots: markdown-table@3.0.3: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.1: dependencies: '@types/mdast': 4.0.4 @@ -10093,45 +10615,51 @@ snapshots: object-inspect@1.13.1: {} + object-inspect@1.13.4: {} + object-keys@1.1.1: {} object.assign@4.1.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - object.entries@1.1.7: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 - object.fromentries@2.0.7: + object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.1.1 - object.groupby@1.0.2: + object.fromentries@2.0.8: dependencies: - array.prototype.filter: 1.0.3 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 - object.hasown@1.1.3: + object.groupby@1.0.3: dependencies: + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 - object.values@1.1.7: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.1.1 octokit@4.0.2: dependencies: @@ -10183,6 +10711,12 @@ snapshots: strip-ansi: 7.1.0 wcwidth: 1.0.1 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -10341,13 +10875,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.39 - postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)): dependencies: lilconfig: 3.1.1 yaml: 2.4.0 optionalDependencies: postcss: 8.4.39 - ts-node: 10.9.2(@types/node@20.11.22)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.22)(typescript@5.7.3) postcss-media-query-parser@0.2.3: {} @@ -10620,15 +11154,16 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.6.2 - reflect.getprototypeof@1.0.5: + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} @@ -10636,11 +11171,20 @@ snapshots: regexp.prototype.flags@1.5.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -10793,7 +11337,7 @@ snapshots: resolve@2.0.0-next.5: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10828,26 +11372,45 @@ snapshots: safe-array-concat@1.1.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.2.7 has-symbols: 1.0.3 isarray: 2.0.5 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - schema-dts@1.1.2(typescript@5.3.3): + schema-dts@1.1.2(typescript@5.7.3): dependencies: - typescript: 5.3.3 + typescript: 5.7.3 section-matter@1.0.0: dependencies: @@ -10875,6 +11438,15 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 @@ -10882,14 +11454,20 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - shadcn@2.3.0(typescript@5.3.3): + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shadcn@2.3.0(typescript@5.7.3): dependencies: '@antfu/ni': 0.21.12 '@babel/core': 7.24.0 '@babel/parser': 7.26.5 '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.24.0) commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.7.3) deepmerge: 4.3.1 diff: 5.2.0 execa: 7.2.0 @@ -10933,13 +11511,41 @@ snapshots: '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + side-channel@1.0.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 object-inspect: 1.13.1 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -11023,17 +11629,27 @@ snapshots: get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.10: + string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + es-abstract: 1.23.9 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.5 + side-channel: 1.1.0 string.prototype.padend@3.1.5: dependencies: @@ -11041,23 +11657,51 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + string.prototype.trim@1.2.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 string.prototype.trimend@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.9 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 string_decoder@1.3.0: dependencies: @@ -11157,11 +11801,11 @@ snapshots: tailwind-merge@2.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3))): dependencies: - tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)) + tailwindcss: 3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)) - tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)): + tailwindcss@3.4.1(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -11180,7 +11824,7 @@ snapshots: postcss: 8.4.39 postcss-import: 15.1.0(postcss@8.4.39) postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3)) postcss-nested: 6.0.1(postcss@8.4.39) postcss-selector-parser: 6.0.15 resolve: 1.22.8 @@ -11246,7 +11890,7 @@ snapshots: '@ts-morph/common': 0.24.0 code-block-writer: 13.0.2 - ts-node@10.9.2(@types/node@20.11.22)(typescript@5.3.3): + ts-node@10.9.2(@types/node@20.11.22)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -11254,13 +11898,13 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.11.22 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.7.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optional: true @@ -11282,10 +11926,10 @@ snapshots: tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.3.3): + tsutils@3.21.0(typescript@5.7.3): dependencies: tslib: 1.14.1 - typescript: 5.3.3 + typescript: 5.7.3 tsx@4.11.0: dependencies: @@ -11306,45 +11950,85 @@ snapshots: typed-array-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-typed-array: 1.1.13 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-array-byte-length@1.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + typed-array-length@1.0.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript@5.3.3: {} + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.7.3: {} unbox-primitive@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} unicorn-magic@0.1.0: {} @@ -11531,39 +12215,57 @@ snapshots: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 - is-string: 1.0.7 + is-string: 1.1.1 is-symbol: 1.0.4 - which-builtin-type@1.1.3: + which-boxed-primitive@1.1.1: dependencies: - function.prototype.name: 1.1.6 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 which-typed-array@1.1.14: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@1.3.1: dependencies: isexe: 2.0.0 diff --git a/registry.json b/registry.json index 864fb429e..47558aaf5 100644 --- a/registry.json +++ b/registry.json @@ -1295,6 +1295,8 @@ { "name": "magic-card-demo", "type": "registry:example", + "title": "Magic Card Demo", + "description": "Example showing a spotlight effect that follows your mouse cursor and highlights borders on hover.", "registryDependencies": [ "magic-card" ], @@ -1308,6 +1310,8 @@ { "name": "android-demo", "type": "registry:example", + "title": "Android Demo", + "description": "Example showing a mockup of an Android device.", "registryDependencies": [ "android" ], @@ -1321,6 +1325,8 @@ { "name": "android-demo-2", "type": "registry:example", + "title": "Android Demo 2", + "description": "Second example showing a mockup of an Android device.", "registryDependencies": [ "android" ], @@ -1334,6 +1340,8 @@ { "name": "android-demo-3", "type": "registry:example", + "title": "Android Demo 3", + "description": "Third example showing a mockup of an Android device.", "registryDependencies": [ "android" ], @@ -1347,6 +1355,8 @@ { "name": "warp-background-demo", "type": "registry:example", + "title": "Warp Background Demo", + "description": "Example showing a card with a time warping background effect.", "registryDependencies": [ "warp-background" ], @@ -1360,6 +1370,8 @@ { "name": "line-shadow-text-demo", "type": "registry:example", + "title": "Line Shadow Text Demo", + "description": "Example showing a text component with a moving line shadow.", "registryDependencies": [ "line-shadow-text" ], @@ -1373,6 +1385,8 @@ { "name": "aurora-text-demo", "type": "registry:example", + "title": "Aurora Text Demo", + "description": "Example showing a beautiful aurora text effect.", "registryDependencies": [ "aurora-text" ], @@ -1386,6 +1400,8 @@ { "name": "morphing-text-demo", "type": "registry:example", + "title": "Morphing Text Demo", + "description": "Example showing a dynamic text morphing component.", "registryDependencies": [ "morphing-text" ], @@ -1399,6 +1415,8 @@ { "name": "scroll-progress-demo", "type": "registry:example", + "title": "Scroll Progress Demo", + "description": "Example showing animated scroll progress for your pages.", "registryDependencies": [ "scroll-progress" ], @@ -1412,6 +1430,8 @@ { "name": "neon-gradient-card-demo", "type": "registry:example", + "title": "Neon Gradient Card Demo", + "description": "Example showing a beautiful neon card effect.", "files": [ { "path": "registry/example/neon-gradient-card-demo.tsx", @@ -1422,6 +1442,8 @@ { "name": "meteors-demo", "type": "registry:example", + "title": "Meteors Demo", + "description": "Example showing a meteor shower effect.", "registryDependencies": [ "meteors" ], @@ -1435,6 +1457,8 @@ { "name": "grid-pattern-demo", "type": "registry:example", + "title": "Grid Pattern Demo", + "description": "Example showing a background grid pattern made with SVGs.", "registryDependencies": [ "grid-pattern" ], @@ -1448,6 +1472,8 @@ { "name": "grid-pattern-linear-gradient", "type": "registry:example", + "title": "Grid Pattern Linear Gradient", + "description": "Example showing a grid pattern with linear gradient effects.", "registryDependencies": [ "grid-pattern" ], @@ -1461,6 +1487,8 @@ { "name": "grid-pattern-dashed", "type": "registry:example", + "title": "Grid Pattern Dashed", + "description": "Example showing a dashed grid pattern.", "registryDependencies": [ "grid-pattern" ], @@ -1474,6 +1502,8 @@ { "name": "dot-pattern-demo", "type": "registry:example", + "title": "Dot Pattern Demo", + "description": "Example showing a background dot pattern made with SVGs.", "registryDependencies": [ "dot-pattern" ], @@ -1487,6 +1517,8 @@ { "name": "dot-pattern-linear-gradient", "type": "registry:example", + "title": "Dot Pattern Linear Gradient", + "description": "Example showing a dot pattern with linear gradient effects.", "registryDependencies": [ "dot-pattern" ], @@ -1500,6 +1532,8 @@ { "name": "flickering-grid-demo", "type": "registry:example", + "title": "Flickering Grid Demo", + "description": "Example showing a flickering grid background.", "files": [ { "path": "registry/example/flickering-grid-demo.tsx", @@ -1510,6 +1544,8 @@ { "name": "flickering-grid-rounded-demo", "type": "registry:example", + "title": "Flickering Grid Rounded Demo", + "description": "Example showing a flickering grid background with rounded corners.", "files": [ { "path": "registry/example/flickering-grid-rounded-demo.tsx", @@ -1520,6 +1556,8 @@ { "name": "hero-video-dialog-demo", "type": "registry:example", + "title": "Hero Video Dialog Demo", + "description": "Example showing a hero video dialog component.", "files": [ { "path": "registry/example/hero-video-dialog-demo.tsx", @@ -1530,6 +1568,8 @@ { "name": "hero-video-dialog-demo-top-in-bottom-out", "type": "registry:example", + "title": "Hero Video Dialog Top In Bottom Out Demo", + "description": "Example showing a hero video dialog with top-in bottom-out animation.", "files": [ { "path": "registry/example/hero-video-dialog-demo-top-in-bottom-out.tsx", @@ -1540,6 +1580,8 @@ { "name": "code-comparison-demo", "type": "registry:example", + "title": "Code Comparison Demo", + "description": "Example showing a component which compares two code snippets.", "files": [ { "path": "registry/example/code-comparison-demo.tsx", @@ -1550,6 +1592,8 @@ { "name": "script-copy-btn-demo", "type": "registry:example", + "title": "Script Copy Button Demo", + "description": "Example showing how to copy code to clipboard.", "files": [ { "path": "registry/example/script-copy-btn-demo.tsx", @@ -1560,6 +1604,8 @@ { "name": "marquee-demo", "type": "registry:example", + "title": "Marquee Demo", + "description": "Example showing an infinite scrolling component.", "registryDependencies": [ "marquee" ], @@ -1573,6 +1619,8 @@ { "name": "marquee-demo-vertical", "type": "registry:example", + "title": "Marquee Vertical Demo", + "description": "Example showing a vertical infinite scrolling component.", "registryDependencies": [ "marquee" ], @@ -1586,6 +1634,8 @@ { "name": "marquee-logos", "type": "registry:example", + "title": "Marquee Logos", + "description": "Example showing an infinite scrolling logo carousel.", "registryDependencies": [ "marquee" ], @@ -1599,6 +1649,8 @@ { "name": "marquee-3d", "type": "registry:example", + "title": "Marquee 3D", + "description": "Example showing a 3D infinite scrolling component.", "registryDependencies": [ "marquee" ], @@ -1612,6 +1664,8 @@ { "name": "globe-demo", "type": "registry:example", + "title": "Globe Demo", + "description": "Example showing an autorotating, interactive WebGL globe.", "registryDependencies": [ "globe" ], @@ -1625,6 +1679,8 @@ { "name": "tweet-card-demo", "type": "registry:example", + "title": "Tweet Card Demo", + "description": "Example showing a tweet card with author info.", "registryDependencies": [ "tweet-card" ], @@ -1638,6 +1694,8 @@ { "name": "tweet-card-images", "type": "registry:example", + "title": "Tweet Card Images", + "description": "Example showing a tweet card with images.", "registryDependencies": [ "tweet-card" ], @@ -1651,6 +1709,8 @@ { "name": "tweet-card-meta-preview", "type": "registry:example", + "title": "Tweet Card Meta Preview", + "description": "Example showing a tweet card with meta preview.", "registryDependencies": [ "tweet-card" ], @@ -1664,6 +1724,8 @@ { "name": "shimmer-button-demo", "type": "registry:example", + "title": "Shimmer Button Demo", + "description": "Example showing a button with a shimmering light effect.", "registryDependencies": [ "shimmer-button" ], @@ -1677,6 +1739,8 @@ { "name": "bento-demo", "type": "registry:example", + "title": "Bento Demo", + "description": "Example showing a bento grid layout for showcasing features.", "dependencies": [ "@radix-ui/react-icons" ], @@ -1698,6 +1762,8 @@ { "name": "bento-demo-vertical", "type": "registry:example", + "title": "Bento Vertical Demo", + "description": "Example showing a vertical bento grid layout.", "dependencies": [ "@radix-ui/react-icons" ], @@ -1714,6 +1780,8 @@ { "name": "number-ticker-demo", "type": "registry:example", + "title": "Number Ticker Demo", + "description": "Example showing animated counting numbers.", "registryDependencies": [ "number-ticker" ], @@ -1727,6 +1795,8 @@ { "name": "number-ticker-decimal-demo", "type": "registry:example", + "title": "Number Ticker Decimal Demo", + "description": "Example showing animated counting decimal numbers.", "registryDependencies": [ "number-ticker" ], @@ -1740,6 +1810,8 @@ { "name": "ripple-demo", "type": "registry:example", + "title": "Ripple Demo", + "description": "Example showing an animated ripple effect.", "registryDependencies": [ "ripple" ], @@ -1753,6 +1825,8 @@ { "name": "retro-grid-demo", "type": "registry:example", + "title": "Retro Grid Demo", + "description": "Example showing an animated scrolling retro grid effect.", "files": [ { "path": "registry/example/retro-grid-demo.tsx", @@ -1763,6 +1837,8 @@ { "name": "animated-list-demo", "type": "registry:example", + "title": "Animated List Demo", + "description": "Example showing a list with sequenced item animations.", "registryDependencies": [ "animated-list" ], @@ -1776,6 +1852,8 @@ { "name": "animated-shiny-text-demo", "type": "registry:example", + "title": "Animated Shiny Text Demo", + "description": "Example showing text with a shimmering light effect.", "dependencies": [ "@radix-ui/react-icons" ], @@ -1792,6 +1870,8 @@ { "name": "particles-demo", "type": "registry:example", + "title": "Particles Demo", + "description": "Example showing interactive particle effects.", "dependencies": [ "next-themes" ], @@ -1808,6 +1888,8 @@ { "name": "animated-grid-pattern-demo", "type": "registry:example", + "title": "Animated Grid Pattern Demo", + "description": "Example showing an animated grid pattern background.", "registryDependencies": [ "animated-grid-pattern" ], @@ -1821,6 +1903,8 @@ { "name": "interactive-grid-pattern-demo", "type": "registry:example", + "title": "Interactive Grid Pattern Demo", + "description": "Example showing an interactive grid pattern background.", "registryDependencies": [ "interactive-grid-pattern" ], @@ -1834,6 +1918,8 @@ { "name": "interactive-grid-pattern-demo-2", "type": "registry:example", + "title": "Interactive Grid Pattern Demo 2", + "description": "Second example showing an interactive grid pattern background.", "registryDependencies": [ "interactive-grid-pattern" ], @@ -1847,6 +1933,8 @@ { "name": "border-beam-demo", "type": "registry:example", + "title": "Border Beam Demo", + "description": "Example showing an animated border beam effect.", "registryDependencies": [ "border-beam" ], @@ -1860,6 +1948,8 @@ { "name": "animated-beam-demo", "type": "registry:example", + "title": "Animated Beam Demo", + "description": "Example showing an animated beam of light effect.", "dependencies": [ "@radix-ui/react-icons" ], @@ -1876,6 +1966,8 @@ { "name": "animated-beam-unidirectional", "type": "registry:example", + "title": "Animated Beam Unidirectional", + "description": "Example showing a unidirectional animated beam effect.", "registryDependencies": [ "animated-beam" ], @@ -1889,6 +1981,8 @@ { "name": "animated-beam-bidirectional", "type": "registry:example", + "title": "Animated Beam Bidirectional", + "description": "Example showing a bidirectional animated beam effect.", "registryDependencies": [ "animated-beam" ], @@ -1902,6 +1996,8 @@ { "name": "animated-beam-multiple-inputs", "type": "registry:example", + "title": "Animated Beam Multiple Inputs", + "description": "Example showing animated beams with multiple input points.", "registryDependencies": [ "animated-beam" ], @@ -1915,6 +2011,8 @@ { "name": "animated-beam-multiple-outputs", "type": "registry:example", + "title": "Animated Beam Multiple Outputs", + "description": "Example showing animated beams with multiple output points.", "registryDependencies": [ "animated-beam" ], @@ -1928,6 +2026,8 @@ { "name": "text-reveal-demo", "type": "registry:example", + "title": "Text Reveal Demo", + "description": "Example showing text that fades in on scroll.", "registryDependencies": [ "text-reveal" ], @@ -1941,6 +2041,8 @@ { "name": "animated-gradient-text-demo", "type": "registry:example", + "title": "Animated Gradient Text Demo", + "description": "Example showing text with animated gradient backgrounds.", "dependencies": [ "lucide-react" ], @@ -1957,6 +2059,8 @@ { "name": "orbiting-circles-demo", "type": "registry:example", + "title": "Orbiting Circles Demo", + "description": "Example showing circles moving in orbital paths.", "dependencies": [ "@radix-ui/react-icons" ], @@ -1973,6 +2077,8 @@ { "name": "dock-demo", "type": "registry:example", + "title": "Dock Demo", + "description": "Example showing a MacOS-style dock implementation.", "registryDependencies": [ "dock" ], @@ -1986,6 +2092,8 @@ { "name": "dock-demo-2", "type": "registry:example", + "title": "Dock Demo 2", + "description": "Second example showing a MacOS-style dock implementation.", "registryDependencies": [ "dock" ], @@ -1999,6 +2107,8 @@ { "name": "dock-demo-3", "type": "registry:example", + "title": "Dock Demo 3", + "description": "Third example showing a MacOS-style dock implementation.", "registryDependencies": [ "dock" ], @@ -2012,6 +2122,8 @@ { "name": "word-rotate-demo", "type": "registry:example", + "title": "Word Rotate Demo", + "description": "Example showing vertical word rotation animation.", "registryDependencies": [ "word-rotate" ], @@ -2025,6 +2137,8 @@ { "name": "hyper-text-demo", "type": "registry:example", + "title": "Hyper Text Demo", + "description": "Example showing text with scrambling letter animations.", "registryDependencies": [ "hyper-text" ], @@ -2038,6 +2152,8 @@ { "name": "avatar-circles-demo", "type": "registry:example", + "title": "Avatar Circles Demo", + "description": "Example showing overlapping avatar circles.", "registryDependencies": [ "avatar-circles" ], @@ -2051,6 +2167,8 @@ { "name": "typing-animation-demo", "type": "registry:example", + "title": "Typing Animation Demo", + "description": "Example showing typed character animations.", "registryDependencies": [ "typing-animation" ], @@ -2064,6 +2182,8 @@ { "name": "scroll-based-velocity-demo", "type": "registry:example", + "title": "Scroll Based Velocity Demo", + "description": "Example showing text speed changes based on scroll velocity.", "registryDependencies": [ "scroll-based-velocity" ], @@ -2077,6 +2197,8 @@ { "name": "scratch-to-reveal-demo", "type": "registry:example", + "title": "Scratch To Reveal Demo", + "description": "Example showing an interactive scratch-off reveal effect.", "registryDependencies": [ "scratch-to-reveal" ], @@ -2090,6 +2212,8 @@ { "name": "flip-text-demo", "type": "registry:example", + "title": "Flip Text Demo", + "description": "Example showing text with character flip animations.", "registryDependencies": [ "flip-text" ], @@ -2103,6 +2227,8 @@ { "name": "sparkles-text-demo", "type": "registry:example", + "title": "Sparkles Text Demo", + "description": "Example showing text with animated sparkle effects.", "files": [ { "path": "registry/example/sparkles-text-demo.tsx", @@ -2113,6 +2239,8 @@ { "name": "icon-cloud-demo", "type": "registry:example", + "title": "Icon Cloud Demo", + "description": "Example showing an interactive 3D icon cloud.", "registryDependencies": [ "icon-cloud" ], @@ -2126,6 +2254,8 @@ { "name": "icon-cloud-demo-2", "type": "registry:example", + "title": "Icon Cloud Demo 2", + "description": "Second example showing an interactive 3D icon cloud.", "registryDependencies": [ "icon-cloud" ], @@ -2139,6 +2269,8 @@ { "name": "icon-cloud-demo-3", "type": "registry:example", + "title": "Icon Cloud Demo 3", + "description": "Third example showing an interactive 3D icon cloud.", "registryDependencies": [ "icon-cloud" ], @@ -2152,6 +2284,8 @@ { "name": "text-animate-demo", "type": "registry:example", + "title": "Text Animate Demo", + "description": "Example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo.tsx", @@ -2162,6 +2296,8 @@ { "name": "text-animate-demo-2", "type": "registry:example", + "title": "Text Animate Demo 2", + "description": "Second example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo-2.tsx", @@ -2172,6 +2308,8 @@ { "name": "text-animate-demo-3", "type": "registry:example", + "title": "Text Animate Demo 3", + "description": "Third example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo-3.tsx", @@ -2182,6 +2320,8 @@ { "name": "text-animate-demo-4", "type": "registry:example", + "title": "Text Animate Demo 4", + "description": "Fourth example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo-4.tsx", @@ -2192,6 +2332,8 @@ { "name": "text-animate-demo-5", "type": "registry:example", + "title": "Text Animate Demo 5", + "description": "Fifth example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo-5.tsx", @@ -2202,6 +2344,8 @@ { "name": "text-animate-demo-6", "type": "registry:example", + "title": "Text Animate Demo 6", + "description": "Sixth example showing various text animations.", "files": [ { "path": "registry/example/text-animate-demo-6.tsx", @@ -2212,6 +2356,8 @@ { "name": "shiny-button-demo", "type": "registry:example", + "title": "Shiny Button Demo", + "description": "Example showing a shiny button with dynamic styles.", "files": [ { "path": "registry/example/shiny-button-demo.tsx", @@ -2222,6 +2368,8 @@ { "name": "box-reveal-demo", "type": "registry:example", + "title": "Box Reveal Demo", + "description": "Example showing a sliding box text reveal animation.", "files": [ { "path": "registry/example/box-reveal-demo.tsx", @@ -2232,6 +2380,8 @@ { "name": "animated-circular-progress-bar-demo", "type": "registry:example", + "title": "Animated Circular Progress Bar Demo", + "description": "Example showing an animated circular progress gauge.", "files": [ { "path": "registry/example/animated-circular-progress-bar-demo.tsx", @@ -2242,6 +2392,8 @@ { "name": "shine-border-demo", "type": "registry:example", + "title": "Shine Border Demo", + "description": "Example showing an animated shining border effect.", "files": [ { "path": "registry/example/shine-border-demo.tsx", @@ -2252,6 +2404,8 @@ { "name": "shine-border-demo-2", "type": "registry:example", + "title": "Shine Border Demo 2", + "description": "Second example showing an animated shining border effect.", "files": [ { "path": "registry/example/shine-border-demo-2.tsx", @@ -2262,6 +2416,8 @@ { "name": "confetti-demo", "type": "registry:example", + "title": "Confetti Demo", + "description": "Example showing confetti animations for celebrations.", "files": [ { "path": "registry/example/confetti-demo.tsx", @@ -2272,6 +2428,8 @@ { "name": "confetti-basic-cannon", "type": "registry:example", + "title": "Confetti Basic Cannon", + "description": "Example showing basic confetti cannon animation.", "files": [ { "path": "registry/example/confetti-basic-cannon.tsx", @@ -2282,6 +2440,8 @@ { "name": "confetti-random-direction", "type": "registry:example", + "title": "Confetti Random Direction", + "description": "Example showing confetti with random directions.", "files": [ { "path": "registry/example/confetti-random-direction.tsx", @@ -2292,6 +2452,8 @@ { "name": "confetti-fireworks", "type": "registry:example", + "title": "Confetti Fireworks", + "description": "Example showing fireworks-style confetti animation.", "files": [ { "path": "registry/example/confetti-fireworks.tsx", @@ -2302,6 +2464,8 @@ { "name": "confetti-stars", "type": "registry:example", + "title": "Confetti Stars", + "description": "Example showing star-shaped confetti animation.", "files": [ { "path": "registry/example/confetti-stars.tsx", @@ -2312,6 +2476,8 @@ { "name": "confetti-side-cannons", "type": "registry:example", + "title": "Confetti Side Cannons", + "description": "Example showing side-mounted confetti cannons.", "files": [ { "path": "registry/example/confetti-side-cannons.tsx", @@ -2322,6 +2488,8 @@ { "name": "confetti-custom-shapes", "type": "registry:example", + "title": "Confetti Custom Shapes", + "description": "Example showing confetti with custom shape particles.", "files": [ { "path": "registry/example/confetti-custom-shapes.tsx", @@ -2332,6 +2500,8 @@ { "name": "confetti-emoji", "type": "registry:example", + "title": "Confetti Emoji", + "description": "Example showing confetti with emoji particles.", "files": [ { "path": "registry/example/confetti-emoji.tsx", @@ -2342,6 +2512,8 @@ { "name": "animated-subscribe-button-demo", "type": "registry:example", + "title": "Animated Subscribe Button Demo", + "description": "Example showing an animated subscribe button with micro animations.", "files": [ { "path": "registry/example/animated-subscribe-button-demo.tsx", @@ -2352,6 +2524,8 @@ { "name": "cool-mode-demo", "type": "registry:example", + "title": "Cool Mode Demo", + "description": "Example showing cool mode effect for buttons and links.", "files": [ { "path": "registry/example/cool-mode-demo.tsx", @@ -2362,6 +2536,8 @@ { "name": "cool-mode-custom", "type": "registry:example", + "title": "Cool Mode Custom", + "description": "Example showing customized cool mode effects.", "files": [ { "path": "registry/example/cool-mode-custom.tsx", @@ -2372,6 +2548,8 @@ { "name": "pulsating-button-demo", "type": "registry:example", + "title": "Pulsating Button Demo", + "description": "Example showing an animated pulsating button.", "files": [ { "path": "registry/example/pulsating-button-demo.tsx", @@ -2382,6 +2560,8 @@ { "name": "ripple-button-demo", "type": "registry:example", + "title": "Ripple Button Demo", + "description": "Example showing an animated button with ripple effect.", "files": [ { "path": "registry/example/ripple-button-demo.tsx", @@ -2392,6 +2572,8 @@ { "name": "file-tree-demo", "type": "registry:example", + "title": "File Tree Demo", + "description": "Example showing a component that displays folder and file structure.", "files": [ { "path": "registry/example/file-tree-demo.tsx", @@ -2402,6 +2584,8 @@ { "name": "blur-fade-demo", "type": "registry:example", + "title": "Blur Fade Demo", + "description": "Example showing blur fade in and out animations.", "files": [ { "path": "registry/example/blur-fade-demo.tsx", @@ -2412,6 +2596,8 @@ { "name": "blur-fade-text-demo", "type": "registry:example", + "title": "Blur Fade Text Demo", + "description": "Example showing blur fade animations with text.", "files": [ { "path": "registry/example/blur-fade-text-demo.tsx", @@ -2422,6 +2608,8 @@ { "name": "safari-demo", "type": "registry:example", + "title": "Safari Demo", + "description": "Example showing a Safari browser mockup.", "files": [ { "path": "registry/example/safari-demo.tsx", @@ -2432,6 +2620,8 @@ { "name": "safari-demo-2", "type": "registry:example", + "title": "Safari Demo 2", + "description": "Second example showing a Safari browser mockup.", "files": [ { "path": "registry/example/safari-demo-2.tsx", @@ -2442,6 +2632,8 @@ { "name": "safari-demo-3", "type": "registry:example", + "title": "Safari Demo 3", + "description": "Third example showing a Safari browser mockup.", "files": [ { "path": "registry/example/safari-demo-3.tsx", @@ -2452,6 +2644,8 @@ { "name": "safari-demo-4", "type": "registry:example", + "title": "Safari Demo 4", + "description": "Fourth example showing a Safari browser mockup.", "files": [ { "path": "registry/example/safari-demo-4.tsx", @@ -2462,6 +2656,8 @@ { "name": "iphone-15-pro-demo", "type": "registry:example", + "title": "iPhone 15 Pro Demo", + "description": "Example showing an iPhone 15 Pro mockup.", "files": [ { "path": "registry/example/iphone-15-pro-demo.tsx", @@ -2472,6 +2668,8 @@ { "name": "iphone-15-pro-demo-2", "type": "registry:example", + "title": "iPhone 15 Pro Demo 2", + "description": "Second example showing an iPhone 15 Pro mockup.", "files": [ { "path": "registry/example/iphone-15-pro-demo-2.tsx", @@ -2482,6 +2680,8 @@ { "name": "iphone-15-pro-demo-3", "type": "registry:example", + "title": "iPhone 15 Pro Demo 3", + "description": "Third example showing an iPhone 15 Pro mockup.", "files": [ { "path": "registry/example/iphone-15-pro-demo-3.tsx", @@ -2492,6 +2692,8 @@ { "name": "rainbow-button-demo", "type": "registry:example", + "title": "Rainbow Button Demo", + "description": "Example showing an animated button with rainbow effect.", "files": [ { "path": "registry/example/rainbow-button-demo.tsx", @@ -2502,6 +2704,8 @@ { "name": "interactive-hover-button-demo", "type": "registry:example", + "title": "Interactive Hover Button Demo", + "description": "Example showing an interactive button with hover effects.", "files": [ { "path": "registry/example/interactive-hover-button-demo.tsx", From e08516b3aa6787f326cbd79ae8bae6ad1e833da3 Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 15:32:28 -0500 Subject: [PATCH 6/8] fix: typecheck --- registry/example/terminal-demo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/example/terminal-demo.tsx b/registry/example/terminal-demo.tsx index 9f192db27..d36aa6f56 100644 --- a/registry/example/terminal-demo.tsx +++ b/registry/example/terminal-demo.tsx @@ -2,7 +2,7 @@ import { AnimatedSpan, Terminal, TypingAnimation, -} from "@/registry/default/magicui/terminal"; +} from "@/registry/magicui/terminal"; export default function TerminalDemo() { return ( From 7ea39949cb437232284a122a88c2b839479a185a Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 15:34:07 -0500 Subject: [PATCH 7/8] fix: update contributing --- CONTRIBUTING.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 274444926..a866dadbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -160,8 +160,10 @@ export const ui: Registry = [ // ... existing components ... { name: "example-component", + description: "A component that does something", type: "registry:ui", - files: ["magicui/example-component.tsx"], + dependencies: ["motion"], + files: [{ path: "magicui/example-component.tsx", type: "registry:ui" }], // Add any dependencies or tailwind configurations if needed }, ]; @@ -174,9 +176,15 @@ export const examples: Registry = [ // ... existing examples ... { name: "example-component-demo", + description: "An example of the example-component", type: "registry:example", registryDependencies: ["example-component"], - files: ["example/example-component-demo.tsx"], + files: [ + { + path: "registry/example/example-component-demo.tsx", + type: "registry:example", + }, + ], }, ]; ``` From 9d4cb70167332885b676197ce38bf72b2b154b63 Mon Sep 17 00:00:00 2001 From: Dillion Verma Date: Wed, 5 Feb 2025 15:34:52 -0500 Subject: [PATCH 8/8] fix: update component --- components/component-preview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/component-preview.tsx b/components/component-preview.tsx index ae9606e69..eefe88847 100644 --- a/components/component-preview.tsx +++ b/components/component-preview.tsx @@ -11,7 +11,7 @@ interface ComponentPreviewProps extends React.HTMLAttributes { preview?: boolean; } -export async function ComponentPreview({ +export function ComponentPreview({ name, children, className,