diff --git a/components/changelog/changelog-preview.tsx b/components/changelog/changelog-preview.tsx index da0f98d6..169b5ba3 100644 --- a/components/changelog/changelog-preview.tsx +++ b/components/changelog/changelog-preview.tsx @@ -1,14 +1,14 @@ "use client"; -import { Suspense, useMemo } from "react"; -import { type ComponentConfig, getDefaults } from "@/lib/customizer-config"; import { PreviewStage } from "@/lib/ui-preview-internals"; import registry from "@/registry/__index__"; +import { previewManifest } from "@/registry/__manifest__"; export function ChangelogPreview({ name }: { name: string }) { const entry = registry[name]; + const preview = previewManifest[name]; - if (!entry) { + if (!entry || !preview) { return (
Unknown component: {name} @@ -16,43 +16,17 @@ export function ChangelogPreview({ name }: { name: string }) { ); } - return ( - - } - > - - - ); -} - -function Preview({ - name, - config, - load, -}: { - name: string; - config: ComponentConfig; - // biome-ignore lint/suspicious/noExplicitAny: dynamically-loaded Remotion composition, props shape varies per component - load: () => Promise<{ default: React.ComponentType }>; -}) { - const inputProps = useMemo( - () => getDefaults(config.controls), - [config.controls], - ); - return (
); diff --git a/components/docs/component-card.tsx b/components/docs/component-card.tsx index 2b192b3e..88803667 100644 --- a/components/docs/component-card.tsx +++ b/components/docs/component-card.tsx @@ -4,9 +4,9 @@ import { Player, type PlayerRef } from "@remotion/player"; import Link from "next/link"; import { useRef } from "react"; import { useAutoplay } from "@/app/(home)/components/use-autoplay"; -import { getDefaults } from "@/lib/customizer-config"; import { cn } from "@/lib/utils"; import registry from "@/registry/__index__"; +import { previewManifest } from "@/registry/__manifest__"; import type { CardItem } from "./component-card-grid"; function slugFromHref(href?: string) { @@ -21,11 +21,12 @@ function PreviewPlaceholder() { function CardPreview({ item }: { item: CardItem }) { const slug = slugFromHref(item.href); const entry = slug ? registry[slug] : undefined; + const preview = slug ? previewManifest[slug] : undefined; const playerRef = useRef(null); useAutoplay(playerRef); - if (!entry) { + if (!entry || !preview) { return (
@@ -33,19 +34,16 @@ function CardPreview({ item }: { item: CardItem }) { ); } - const { load, config } = entry; - const inputProps = getDefaults(config.controls); - return (
} > - + ); } function Preview({ name, - config, load, }: { name: string; - config: ComponentConfig; // biome-ignore lint/suspicious/noExplicitAny: dynamically-loaded Remotion composition, props shape varies per component load: () => Promise<{ default: React.ComponentType }>; }) { + // Suspends until this component's config chunk resolves, then returns + // synchronously from the cached promise. No other config is fetched. + const config = use(loadComponentConfig(name)); const trackEvent = useTrackEvent(); const { parsers, urlKeys } = useMemo( () => buildParsers(name, config.controls), diff --git a/components/docs/icons-gallery.tsx b/components/docs/icons-gallery.tsx index 72f8a519..75a60511 100644 --- a/components/docs/icons-gallery.tsx +++ b/components/docs/icons-gallery.tsx @@ -8,6 +8,10 @@ import { AbsoluteFill } from "remotion"; import { usePrefersReducedMotion } from "@/lib/use-prefers-reduced-motion"; import { cn } from "@/lib/utils"; import registry, { type RegistryEntry } from "@/registry/__index__"; +import { + type PreviewManifestEntry, + previewManifest, +} from "@/registry/__manifest__"; import { ActivityIconStatic } from "@/registry/remocn-icons/icon-activity"; import { AlertTriangleIconStatic } from "@/registry/remocn-icons/icon-alert-triangle"; import { ArrowDownIconStatic } from "@/registry/remocn-icons/icon-arrow-down"; @@ -838,8 +842,9 @@ function IconTile({ const reducedMotion = usePrefersReducedMotion(); const [copied, setCopied] = useState(false); const entry = registry[icon.name]; + const preview = previewManifest[icon.name]; const command = `npx shadcn@latest add @remocn/${icon.name}`; - const playing = active && !reducedMotion && Boolean(entry); + const playing = active && !reducedMotion && Boolean(entry && preview); const Static = icon.Static; const handleCopy = () => { @@ -867,8 +872,8 @@ function IconTile({ className="flex items-center justify-center" style={{ width: MEDIA_SIZE, height: MEDIA_SIZE }} > - {playing && entry ? ( - + {playing && entry && preview ? ( + ) : ( )} @@ -885,9 +890,14 @@ function IconTile({ ); } -function IconPlayer({ entry }: { entry: RegistryEntry }) { +function IconPlayer({ + load, + preview, +}: { + load: RegistryEntry["load"]; + preview: PreviewManifestEntry; +}) { const playerRef = useRef(null); - const { config, load } = entry; const centeredComponent = useMemo( () => () => @@ -931,8 +941,8 @@ function IconPlayer({ entry }: { entry: RegistryEntry }) { } > - + ); } @@ -52,16 +52,15 @@ export function UiComponentPreview({ name }: { name: string }) { function UiPreview({ name, timing, - controls, }: { name: string; timing: UiPreviewTiming; - controls: ControlConfig; }) { // Suspends on first render until this component's scene chunk resolves, then // returns synchronously from the cached promise. Gives us the scene component, // its honored-control list, and its code template — no other scene is fetched. const scene = use(loadUiScene(name)); + const controls: ControlConfig = use(loadComponentConfig(name)).controls; const honored = scene.controls; const trackEvent = useTrackEvent(); diff --git a/lib/customizer-config.ts b/lib/customizer-config.ts index cb80052e..40bbfb35 100644 --- a/lib/customizer-config.ts +++ b/lib/customizer-config.ts @@ -56,8 +56,8 @@ export const FONT_WEIGHT_OPTIONS = ["400", "500", "600", "700"]; /** * Controls present on every animation. Merged into each component's controls - * inside the registry index so every animation in the customizer exposes the - * same baseline knobs. + * by `resolveControls` so every animation in the customizer exposes the same + * baseline knobs. */ export const SHARED_CONTROLS: ControlConfig = { speed: { @@ -70,6 +70,59 @@ export const SHARED_CONTROLS: ControlConfig = { }, }; +/** Components that opt out of the shared `speed` control entirely. */ +const NO_SHARED_SPEED = new Set(["backdrop"]); + +/** + * Components whose animation rides a shared progress driver that must reach its + * final frame — a count-up landing on the last frame, a lockup revealed at a + * fixed point. A speed < 1 stalls the driver before the payoff, so these cap + * `speed` at a minimum of 1 instead of the shared 0.25. + */ +const SPEED_MIN_ONE = new Set([ + "chat-gpt", + "claude-chat", + "claude-code", + "github-sponsors", + "github-stars", + "number-wheel", + "opencode", + "rolling-number", + "v0", + "x-follow-card", + "x-followers-overview", +]); + +const SPEED_MIN_ONE_CONTROL: ControlType = { + type: "number", + default: 1, + min: 1, + max: 4, + step: 0.25, + label: "Speed", +}; + +export function resolveControls( + slug: string, + controls: ControlConfig, +): ControlConfig { + const out: ControlConfig = { ...controls, ...SHARED_CONTROLS }; + if (NO_SHARED_SPEED.has(slug)) { + delete out.speed; + return out; + } + // Reassigning the existing key keeps `speed` in its merged position. + if (SPEED_MIN_ONE.has(slug)) out.speed = SPEED_MIN_ONE_CONTROL; + return out; +} + +export function resolveConfig( + slug: string, + config: ComponentConfig, +): ComponentConfig { + return { ...config, controls: resolveControls(slug, config.controls) }; +} + export function getDefaults(controls: ControlConfig): Record { const out: Record = {}; for (const [key, ctrl] of Object.entries(controls)) { diff --git a/package.json b/package.json index 2b5170da..12104102 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "format": "biome format --write", "registry:build": "shadcn build --output registry-artifacts && biome format --write registry-artifacts", "registry:check": "shadcn build --output registry-artifacts && biome format --write registry-artifacts && git diff --quiet -- registry-artifacts || (echo 'registry-artifacts is out of sync with registry/ sources. Run: bun run registry:build and commit the result.' && exit 1)", + "manifest:build": "bun scripts/build-preview-manifest.mts && biome format --write registry/__manifest__.ts", + "manifest:check": "bun run manifest:build && git diff --quiet -- registry/__manifest__.ts || (echo 'registry/__manifest__.ts is out of sync with registry config sources. Run: bun run manifest:build and commit the result.' && exit 1)", "remotion:browser": "bun scripts/ensure-browser.mts", "bundle:remotion": "bun scripts/bundle-remotion.mts", "render:demos": "bun scripts/render-demos.mts", diff --git a/registry/__index__.tsx b/registry/__index__.tsx index 93e658fd..3f64690e 100644 --- a/registry/__index__.tsx +++ b/registry/__index__.tsx @@ -1,273 +1,10 @@ import type React from "react"; -import { type ComponentConfig, SHARED_CONTROLS } from "@/lib/customizer-config"; - -import { animatedBarChartConfig } from "@/registry/remocn/animated-bar-chart/config"; -import { animatedLineChartConfig } from "@/registry/remocn/animated-line-chart/config"; -import { asciiDissolveConfig } from "@/registry/remocn/ascii-dissolve/config"; -import { asciiRenderConfig } from "@/registry/remocn/ascii-render/config"; -import { backdropConfig } from "@/registry/remocn/backdrop/config"; -import { blurOutUpConfig } from "@/registry/remocn/blur-out-up/config"; -import { bottomUpLettersConfig } from "@/registry/remocn/bottom-up-letters/config"; -import { cameraLensConfig } from "@/registry/remocn/camera-lens/config"; -import { caretWipeConfig } from "@/registry/remocn/caret-wipe/config"; -import { chatGptConfig } from "@/registry/remocn/chat-gpt/config"; -import { chatToPreviewLayoutConfig } from "@/registry/remocn/chat-to-preview-layout/config"; -import { checkListConfig } from "@/registry/remocn/check-list/config"; -import { claudeChatConfig } from "@/registry/remocn/claude-chat/config"; -import { claudeCodeConfig } from "@/registry/remocn/claude-code/config"; -import { confettiConfig } from "@/registry/remocn/confetti/config"; -import { crtScreenConfig } from "@/registry/remocn/crt-screen/config"; -import { crumpleTossConfig } from "@/registry/remocn/crumple-toss/config"; -import { dataFlowPipesConfig } from "@/registry/remocn/data-flow-pipes/config"; -import { displacementConfig } from "@/registry/remocn/displacement/config"; -import { ditherDissolveConfig } from "@/registry/remocn/dither-dissolve/config"; -import { driftConfig } from "@/registry/remocn/drift/config"; -import { ecosystemConstellationConfig } from "@/registry/remocn/ecosystem-constellation/config"; -import { emberBurnConfig } from "@/registry/remocn/ember-burn/config"; -import { fadeThroughConfig } from "@/registry/remocn/fade-through/config"; -import { focusBlurResolveConfig } from "@/registry/remocn/focus-blur-resolve/config"; -import { focusPullConfig } from "@/registry/remocn/focus-pull/config"; -import { githubSponsorsConfig } from "@/registry/remocn/github-sponsors/config"; -import { githubStarsConfig } from "@/registry/remocn/github-stars/config"; -import { glassCodeBlockConfig } from "@/registry/remocn/glass-code-block/config"; -import { glassCodeWalkConfig } from "@/registry/remocn/glass-code-walk/config"; -import { glitchCutConfig } from "@/registry/remocn/glitch-cut/config"; -import { grainDissolveConfig } from "@/registry/remocn/grain-dissolve/config"; -import { gridWaveConfig } from "@/registry/remocn/grid-wave/config"; -import { halftonePrintConfig } from "@/registry/remocn/halftone-print/config"; -import { handCountConfig } from "@/registry/remocn/hand-count/config"; -import { handwriteConfig } from "@/registry/remocn/handwrite/config"; -import { hologramConfig } from "@/registry/remocn/hologram/config"; -import { iconScatterConfig } from "@/registry/remocn/icon-scatter/config"; -import { infiniteBentoPanConfig } from "@/registry/remocn/infinite-bento-pan/config"; -import { infiniteMarqueeConfig } from "@/registry/remocn/infinite-marquee/config"; -import { inkArrowConfig } from "@/registry/remocn/ink-arrow/config"; -import { inkUnderlineConfig } from "@/registry/remocn/ink-underline/config"; -import { inlineHighlightConfig } from "@/registry/remocn/inline-highlight/config"; -import { kineticCenterBuildConfig } from "@/registry/remocn/kinetic-center-build/config"; -import { lineByLineSlideConfig } from "@/registry/remocn/line-by-line-slide/config"; -import { liveCodeCompilationConfig } from "@/registry/remocn/live-code-compilation/config"; -import { logoEnterConfig } from "@/registry/remocn/logo-enter/config"; -import { markerHighlightConfig } from "@/registry/remocn/marker-highlight/config"; -import { maskRevealUpConfig } from "@/registry/remocn/mask-reveal-up/config"; -import { matrixDecodeConfig } from "@/registry/remocn/matrix-decode/config"; -import { microScaleFadeConfig } from "@/registry/remocn/micro-scale-fade/config"; -import { numberWheelConfig } from "@/registry/remocn/number-wheel/config"; -import { opencodeConfig } from "@/registry/remocn/opencode/config"; -import { pageTurnConfig } from "@/registry/remocn/page-turn/config"; -import { paperStickerConfig } from "@/registry/remocn/paper-sticker/config"; -import { paperWobbleConfig } from "@/registry/remocn/paper-wobble/config"; -import { particleDissolveConfig } from "@/registry/remocn/particle-dissolve/config"; -import { perCharacterRiseConfig } from "@/registry/remocn/per-character-rise/config"; -import { perWordCrossfadeConfig } from "@/registry/remocn/per-word-crossfade/config"; -import { perlinDissolveConfig } from "@/registry/remocn/perlin-dissolve/config"; -import { perspectiveMarqueeConfig } from "@/registry/remocn/perspective-marquee/config"; -import { pixelateRegionConfig } from "@/registry/remocn/pixelate-region/config"; -import { polaroidConfig } from "@/registry/remocn/polaroid/config"; -import { progressStepsConfig } from "@/registry/remocn/progress-steps/config"; -import { pushThroughConfig } from "@/registry/remocn/push-through/config"; -import { reelConfig } from "@/registry/remocn/reel/config"; -import { rgbGlitchTextConfig } from "@/registry/remocn/rgb-glitch-text/config"; -import { rippleZoomConfig } from "@/registry/remocn/ripple-zoom/config"; -import { rollingNumberConfig } from "@/registry/remocn/rolling-number/config"; -import { rolodexFlipConfig } from "@/registry/remocn/rolodex-flip/config"; -import { scaleDownFadeConfig } from "@/registry/remocn/scale-down-fade/config"; -import { scribbleCircleConfig } from "@/registry/remocn/scribble-circle/config"; -import { securityCamConfig } from "@/registry/remocn/security-cam/config"; -import { shaderCausticsConfig } from "@/registry/remocn/shader-caustics/config"; -import { shaderColorPanelsConfig } from "@/registry/remocn/shader-color-panels/config"; -import { shaderDitheringConfig } from "@/registry/remocn/shader-dithering/config"; -import { shaderDotOrbitConfig } from "@/registry/remocn/shader-dot-orbit/config"; -import { shaderGemSmokeConfig } from "@/registry/remocn/shader-gem-smoke/config"; -import { shaderGodRaysConfig } from "@/registry/remocn/shader-god-rays/config"; -import { shaderGrainGradientConfig } from "@/registry/remocn/shader-grain-gradient/config"; -import { shaderLiquidMetalConfig } from "@/registry/remocn/shader-liquid-metal/config"; -import { shaderMeshGradientConfig } from "@/registry/remocn/shader-mesh-gradient/config"; -import { shaderMetaballsConfig } from "@/registry/remocn/shader-metaballs/config"; -import { shaderNeuroNoiseConfig } from "@/registry/remocn/shader-neuro-noise/config"; -import { shaderPerlinNoiseConfig } from "@/registry/remocn/shader-perlin-noise/config"; -import { shaderPulsingBorderConfig } from "@/registry/remocn/shader-pulsing-border/config"; -import { shaderSimplexNoiseConfig } from "@/registry/remocn/shader-simplex-noise/config"; -import { shaderSmokeRingConfig } from "@/registry/remocn/shader-smoke-ring/config"; -import { shaderSpiralConfig } from "@/registry/remocn/shader-spiral/config"; -import { shaderStrataConfig } from "@/registry/remocn/shader-strata/config"; -import { shaderSwirlConfig } from "@/registry/remocn/shader-swirl/config"; -import { shaderVoronoiConfig } from "@/registry/remocn/shader-voronoi/config"; -import { shaderWarpConfig } from "@/registry/remocn/shader-warp/config"; -import { shaderWaterConfig } from "@/registry/remocn/shader-water/config"; -import { shaderWeaveConfig } from "@/registry/remocn/shader-weave/config"; -import { sharedAxisYConfig } from "@/registry/remocn/shared-axis-y/config"; -import { sharedAxisZConfig } from "@/registry/remocn/shared-axis-z/config"; -import { shimmerSweepConfig } from "@/registry/remocn/shimmer-sweep/config"; -import { shortSlideDownConfig } from "@/registry/remocn/short-slide-down/config"; -import { shortSlideRightConfig } from "@/registry/remocn/short-slide-right/config"; -import { simulatedCursorConfig } from "@/registry/remocn/simulated-cursor/config"; -import { slideSwapConfig } from "@/registry/remocn/slide-swap/config"; -import { slotMachineRollConfig } from "@/registry/remocn/slot-machine-roll/config"; -import { smokeDissolveConfig } from "@/registry/remocn/smoke-dissolve/config"; -import { softBlurInConfig } from "@/registry/remocn/soft-blur-in/config"; -import { springScaleInConfig } from "@/registry/remocn/spring-scale-in/config"; -import { springSettleConfig } from "@/registry/remocn/spring-settle/config"; -import { staggeredFadeUpConfig } from "@/registry/remocn/staggered-fade-up/config"; -import { strikethroughReplaceConfig } from "@/registry/remocn/strikethrough-replace/config"; -import { sustainedGlitchConfig } from "@/registry/remocn/sustained-glitch/config"; -import { swirlDissolveConfig } from "@/registry/remocn/swirl-dissolve/config"; -import { terminalCursorZoomConfig } from "@/registry/remocn/terminal-cursor-zoom/config"; -import { terminalSimulatorConfig } from "@/registry/remocn/terminal-simulator/config"; -import { topDownLettersConfig } from "@/registry/remocn/top-down-letters/config"; -import { trackingInConfig } from "@/registry/remocn/tracking-in/config"; -import { tvPowerOffConfig } from "@/registry/remocn/tv-power-off/config"; -import { typewriterConfig } from "@/registry/remocn/typewriter/config"; -import { underwaterRippleConfig } from "@/registry/remocn/underwater-ripple/config"; -import { v0Config } from "@/registry/remocn/v0/config"; -import { valueSwapConfig } from "@/registry/remocn/value-swap/config"; -import { vhsFilterConfig } from "@/registry/remocn/vhs-filter/config"; -import { warpDissolveConfig } from "@/registry/remocn/warp-dissolve/config"; -import { waveWipeConfig } from "@/registry/remocn/wave-wipe/config"; -import { whipPanConfig } from "@/registry/remocn/whip-pan/config"; -import { xFollowCardConfig } from "@/registry/remocn/x-follow-card/config"; -import { xFollowersOverviewConfig } from "@/registry/remocn/x-followers-overview/config"; -import { zoomBlurConfig } from "@/registry/remocn/zoom-blur/config"; -import { iconActivityConfig } from "@/registry/remocn-icons/icon-activity/config"; -import { iconAlertTriangleConfig } from "@/registry/remocn-icons/icon-alert-triangle/config"; -import { iconArrowDownConfig } from "@/registry/remocn-icons/icon-arrow-down/config"; -import { iconArrowLeftConfig } from "@/registry/remocn-icons/icon-arrow-left/config"; -import { iconArrowRightConfig } from "@/registry/remocn-icons/icon-arrow-right/config"; -import { iconArrowUpConfig } from "@/registry/remocn-icons/icon-arrow-up/config"; -import { iconAtSignConfig } from "@/registry/remocn-icons/icon-at-sign/config"; -import { iconAwardConfig } from "@/registry/remocn-icons/icon-award/config"; -import { iconBarChart3Config } from "@/registry/remocn-icons/icon-bar-chart-3/config"; -import { iconBellConfig } from "@/registry/remocn-icons/icon-bell/config"; -import { iconBookmarkConfig } from "@/registry/remocn-icons/icon-bookmark/config"; -import { iconCalendarConfig } from "@/registry/remocn-icons/icon-calendar/config"; -import { iconCameraConfig } from "@/registry/remocn-icons/icon-camera/config"; -import { iconCheckConfig } from "@/registry/remocn-icons/icon-check/config"; -import { iconCheckCircleConfig } from "@/registry/remocn-icons/icon-check-circle/config"; -import { iconChevronDownConfig } from "@/registry/remocn-icons/icon-chevron-down/config"; -import { iconChevronLeftConfig } from "@/registry/remocn-icons/icon-chevron-left/config"; -import { iconChevronRightConfig } from "@/registry/remocn-icons/icon-chevron-right/config"; -import { iconChevronUpConfig } from "@/registry/remocn-icons/icon-chevron-up/config"; -import { iconClockConfig } from "@/registry/remocn-icons/icon-clock/config"; -import { iconCloudConfig } from "@/registry/remocn-icons/icon-cloud/config"; -import { iconCodeConfig } from "@/registry/remocn-icons/icon-code/config"; -import { iconCopyConfig } from "@/registry/remocn-icons/icon-copy/config"; -import { iconCreditCardConfig } from "@/registry/remocn-icons/icon-credit-card/config"; -import { iconCrownConfig } from "@/registry/remocn-icons/icon-crown/config"; -import { iconDatabaseConfig } from "@/registry/remocn-icons/icon-database/config"; -import { iconDollarSignConfig } from "@/registry/remocn-icons/icon-dollar-sign/config"; -import { iconDownloadConfig } from "@/registry/remocn-icons/icon-download/config"; -import { iconExternalLinkConfig } from "@/registry/remocn-icons/icon-external-link/config"; -import { iconEyeConfig } from "@/registry/remocn-icons/icon-eye/config"; -import { iconEyeOffConfig } from "@/registry/remocn-icons/icon-eye-off/config"; -import { iconFileTextConfig } from "@/registry/remocn-icons/icon-file-text/config"; -import { iconFilterConfig } from "@/registry/remocn-icons/icon-filter/config"; -import { iconFlameConfig } from "@/registry/remocn-icons/icon-flame/config"; -import { iconFolderConfig } from "@/registry/remocn-icons/icon-folder/config"; -import { iconGemConfig } from "@/registry/remocn-icons/icon-gem/config"; -import { iconGiftConfig } from "@/registry/remocn-icons/icon-gift/config"; -import { iconGlobeConfig } from "@/registry/remocn-icons/icon-globe/config"; -import { iconHeartConfig } from "@/registry/remocn-icons/icon-heart/config"; -import { iconHelpCircleConfig } from "@/registry/remocn-icons/icon-help-circle/config"; -import { iconHomeConfig } from "@/registry/remocn-icons/icon-home/config"; -import { iconImageConfig } from "@/registry/remocn-icons/icon-image/config"; -import { iconInboxConfig } from "@/registry/remocn-icons/icon-inbox/config"; -import { iconInfoConfig } from "@/registry/remocn-icons/icon-info/config"; -import { iconKeyConfig } from "@/registry/remocn-icons/icon-key/config"; -import { iconLayoutGridConfig } from "@/registry/remocn-icons/icon-layout-grid/config"; -import { iconLinkConfig } from "@/registry/remocn-icons/icon-link/config"; -import { iconLoaderConfig } from "@/registry/remocn-icons/icon-loader/config"; -import { iconLockConfig } from "@/registry/remocn-icons/icon-lock/config"; -import { iconLogOutConfig } from "@/registry/remocn-icons/icon-log-out/config"; -import { iconMailConfig } from "@/registry/remocn-icons/icon-mail/config"; -import { iconMaximizeConfig } from "@/registry/remocn-icons/icon-maximize/config"; -import { iconMenuConfig } from "@/registry/remocn-icons/icon-menu/config"; -import { iconMessageCircleConfig } from "@/registry/remocn-icons/icon-message-circle/config"; -import { iconMicConfig } from "@/registry/remocn-icons/icon-mic/config"; -import { iconMonitorConfig } from "@/registry/remocn-icons/icon-monitor/config"; -import { iconMoonConfig } from "@/registry/remocn-icons/icon-moon/config"; -import { iconMoreHorizontalConfig } from "@/registry/remocn-icons/icon-more-horizontal/config"; -import { iconPackageConfig } from "@/registry/remocn-icons/icon-package/config"; -import { iconPartyPopperConfig } from "@/registry/remocn-icons/icon-party-popper/config"; -import { iconPauseConfig } from "@/registry/remocn-icons/icon-pause/config"; -import { iconPencilConfig } from "@/registry/remocn-icons/icon-pencil/config"; -import { iconPhoneConfig } from "@/registry/remocn-icons/icon-phone/config"; -import { iconPlayConfig } from "@/registry/remocn-icons/icon-play/config"; -import { iconPlusConfig } from "@/registry/remocn-icons/icon-plus/config"; -import { iconPlusCircleConfig } from "@/registry/remocn-icons/icon-plus-circle/config"; -import { iconRefreshCwConfig } from "@/registry/remocn-icons/icon-refresh-cw/config"; -import { iconRocketConfig } from "@/registry/remocn-icons/icon-rocket/config"; -import { iconSaveConfig } from "@/registry/remocn-icons/icon-save/config"; -import { iconSearchConfig } from "@/registry/remocn-icons/icon-search/config"; -import { iconSendConfig } from "@/registry/remocn-icons/icon-send/config"; -import { iconSettingsConfig } from "@/registry/remocn-icons/icon-settings/config"; -import { iconShare2Config } from "@/registry/remocn-icons/icon-share-2/config"; -import { iconShieldConfig } from "@/registry/remocn-icons/icon-shield/config"; -import { iconShoppingCartConfig } from "@/registry/remocn-icons/icon-shopping-cart/config"; -import { iconSkipForwardConfig } from "@/registry/remocn-icons/icon-skip-forward/config"; -import { iconSmartphoneConfig } from "@/registry/remocn-icons/icon-smartphone/config"; -import { iconSparklesConfig } from "@/registry/remocn-icons/icon-sparkles/config"; -import { iconStarConfig } from "@/registry/remocn-icons/icon-star/config"; -import { iconSunConfig } from "@/registry/remocn-icons/icon-sun/config"; -import { iconTagConfig } from "@/registry/remocn-icons/icon-tag/config"; -import { iconTargetConfig } from "@/registry/remocn-icons/icon-target/config"; -import { iconTerminalConfig } from "@/registry/remocn-icons/icon-terminal/config"; -import { iconThumbsUpConfig } from "@/registry/remocn-icons/icon-thumbs-up/config"; -import { iconTimerConfig } from "@/registry/remocn-icons/icon-timer/config"; -import { iconTrashConfig } from "@/registry/remocn-icons/icon-trash/config"; -import { iconTrendingDownConfig } from "@/registry/remocn-icons/icon-trending-down/config"; -import { iconTrendingUpConfig } from "@/registry/remocn-icons/icon-trending-up/config"; -import { iconTrophyConfig } from "@/registry/remocn-icons/icon-trophy/config"; -import { iconUploadConfig } from "@/registry/remocn-icons/icon-upload/config"; -import { iconUserConfig } from "@/registry/remocn-icons/icon-user/config"; -import { iconUserPlusConfig } from "@/registry/remocn-icons/icon-user-plus/config"; -import { iconUsersConfig } from "@/registry/remocn-icons/icon-users/config"; -import { iconVideoConfig } from "@/registry/remocn-icons/icon-video/config"; -import { iconVolume2Config } from "@/registry/remocn-icons/icon-volume-2/config"; -import { iconVolumeXConfig } from "@/registry/remocn-icons/icon-volume-x/config"; -import { iconWalletConfig } from "@/registry/remocn-icons/icon-wallet/config"; -import { iconXConfig } from "@/registry/remocn-icons/icon-x/config"; -import { iconXCircleConfig } from "@/registry/remocn-icons/icon-x-circle/config"; -import { iconZapConfig } from "@/registry/remocn-icons/icon-zap/config"; -import { accordionConfig } from "@/registry/remocn-ui/accordion/config"; -import { alertDialogConfig } from "@/registry/remocn-ui/alert-dialog/config"; -import { blurInConfig } from "@/registry/remocn-ui/blur-in/config"; -import { buttonConfig } from "@/registry/remocn-ui/button/config"; -import { caretConfig } from "@/registry/remocn-ui/caret/config"; -import { checkboxConfig } from "@/registry/remocn-ui/checkbox/config"; -import { comboboxConfig } from "@/registry/remocn-ui/combobox/config"; -import { commandMenuConfig } from "@/registry/remocn-ui/command-menu/config"; -import { commandMenuItemConfig } from "@/registry/remocn-ui/command-menu-item/config"; -import { contextMenuConfig } from "@/registry/remocn-ui/context-menu/config"; -import { cursorConfig } from "@/registry/remocn-ui/cursor/config"; -import { dialogConfig } from "@/registry/remocn-ui/dialog/config"; -import { drawerConfig } from "@/registry/remocn-ui/drawer/config"; -import { dropdownMenuConfig } from "@/registry/remocn-ui/dropdown-menu/config"; -import { dropdownMenuItemConfig } from "@/registry/remocn-ui/dropdown-menu-item/config"; -import { inputConfig } from "@/registry/remocn-ui/input/config"; -import { messageBubbleConfig } from "@/registry/remocn-ui/message-bubble/config"; -import { popoverConfig } from "@/registry/remocn-ui/popover/config"; -import { progressConfig } from "@/registry/remocn-ui/progress/config"; -import { radioConfig } from "@/registry/remocn-ui/radio/config"; -import { resizableConfig } from "@/registry/remocn-ui/resizable/config"; -import { selectConfig } from "@/registry/remocn-ui/select/config"; -import { selectItemConfig } from "@/registry/remocn-ui/select-item/config"; -import { sheetConfig } from "@/registry/remocn-ui/sheet/config"; -import { skeletonConfig } from "@/registry/remocn-ui/skeleton/config"; -import { skeletonBlockConfig } from "@/registry/remocn-ui/skeleton-block/config"; -import { sliderConfig } from "@/registry/remocn-ui/slider/config"; -import { spinnerConfig } from "@/registry/remocn-ui/spinner/config"; -import { stepperConfig } from "@/registry/remocn-ui/stepper/config"; -import { switchConfig } from "@/registry/remocn-ui/switch/config"; -import { tabsConfig } from "@/registry/remocn-ui/tabs/config"; -import { toastConfig } from "@/registry/remocn-ui/toast/config"; -import { toggleGroupConfig } from "@/registry/remocn-ui/toggle-group/config"; -import { tooltipConfig } from "@/registry/remocn-ui/tooltip/config"; -import { typingIndicatorConfig } from "@/registry/remocn-ui/typing-indicator/config"; +import { type ComponentConfig, resolveConfig } from "@/lib/customizer-config"; export interface RegistryEntry { // biome-ignore lint/suspicious/noExplicitAny: dynamically-loaded Remotion composition, props shape varies per component load: () => Promise<{ default: React.ComponentType }>; - config: ComponentConfig; + loadConfig: () => Promise; } const registry: Record = { @@ -276,1463 +13,2082 @@ const registry: Record = { import("@/registry/remocn/soft-blur-in").then((m) => ({ default: m.SoftBlurIn, })), - config: softBlurInConfig, + loadConfig: () => + import("@/registry/remocn/soft-blur-in/config").then( + (m) => m.softBlurInConfig, + ), }, "per-character-rise": { load: () => import("@/registry/remocn/per-character-rise").then((m) => ({ default: m.PerCharacterRise, })), - config: perCharacterRiseConfig, + loadConfig: () => + import("@/registry/remocn/per-character-rise/config").then( + (m) => m.perCharacterRiseConfig, + ), }, "bottom-up-letters": { load: () => import("@/registry/remocn/bottom-up-letters").then((m) => ({ default: m.BottomUpLetters, })), - config: bottomUpLettersConfig, + loadConfig: () => + import("@/registry/remocn/bottom-up-letters/config").then( + (m) => m.bottomUpLettersConfig, + ), }, "top-down-letters": { load: () => import("@/registry/remocn/top-down-letters").then((m) => ({ default: m.TopDownLetters, })), - config: topDownLettersConfig, + loadConfig: () => + import("@/registry/remocn/top-down-letters/config").then( + (m) => m.topDownLettersConfig, + ), }, "spring-scale-in": { load: () => import("@/registry/remocn/spring-scale-in").then((m) => ({ default: m.SpringScaleIn, })), - config: springScaleInConfig, + loadConfig: () => + import("@/registry/remocn/spring-scale-in/config").then( + (m) => m.springScaleInConfig, + ), }, "micro-scale-fade": { load: () => import("@/registry/remocn/micro-scale-fade").then((m) => ({ default: m.MicroScaleFade, })), - config: microScaleFadeConfig, + loadConfig: () => + import("@/registry/remocn/micro-scale-fade/config").then( + (m) => m.microScaleFadeConfig, + ), }, "scale-down-fade": { load: () => import("@/registry/remocn/scale-down-fade").then((m) => ({ default: m.ScaleDownFade, })), - config: scaleDownFadeConfig, + loadConfig: () => + import("@/registry/remocn/scale-down-fade/config").then( + (m) => m.scaleDownFadeConfig, + ), }, "blur-out-up": { load: () => import("@/registry/remocn/blur-out-up").then((m) => ({ default: m.BlurOutUp, })), - config: blurOutUpConfig, + loadConfig: () => + import("@/registry/remocn/blur-out-up/config").then( + (m) => m.blurOutUpConfig, + ), }, "focus-blur-resolve": { load: () => import("@/registry/remocn/focus-blur-resolve").then((m) => ({ default: m.FocusBlurResolve, })), - config: focusBlurResolveConfig, + loadConfig: () => + import("@/registry/remocn/focus-blur-resolve/config").then( + (m) => m.focusBlurResolveConfig, + ), }, "line-by-line-slide": { load: () => import("@/registry/remocn/line-by-line-slide").then((m) => ({ default: m.LineByLineSlide, })), - config: lineByLineSlideConfig, + loadConfig: () => + import("@/registry/remocn/line-by-line-slide/config").then( + (m) => m.lineByLineSlideConfig, + ), }, "per-word-crossfade": { load: () => import("@/registry/remocn/per-word-crossfade").then((m) => ({ default: m.PerWordCrossfade, })), - config: perWordCrossfadeConfig, + loadConfig: () => + import("@/registry/remocn/per-word-crossfade/config").then( + (m) => m.perWordCrossfadeConfig, + ), }, "fade-through": { load: () => import("@/registry/remocn/fade-through").then((m) => ({ default: m.FadeThrough, })), - config: fadeThroughConfig, + loadConfig: () => + import("@/registry/remocn/fade-through/config").then( + (m) => m.fadeThroughConfig, + ), }, "shared-axis-y": { load: () => import("@/registry/remocn/shared-axis-y").then((m) => ({ default: m.SharedAxisY, })), - config: sharedAxisYConfig, + loadConfig: () => + import("@/registry/remocn/shared-axis-y/config").then( + (m) => m.sharedAxisYConfig, + ), }, "shared-axis-z": { load: () => import("@/registry/remocn/shared-axis-z").then((m) => ({ default: m.SharedAxisZ, })), - config: sharedAxisZConfig, + loadConfig: () => + import("@/registry/remocn/shared-axis-z/config").then( + (m) => m.sharedAxisZConfig, + ), }, "short-slide-right": { load: () => import("@/registry/remocn/short-slide-right").then((m) => ({ default: m.ShortSlideRight, })), - config: shortSlideRightConfig, + loadConfig: () => + import("@/registry/remocn/short-slide-right/config").then( + (m) => m.shortSlideRightConfig, + ), }, "kinetic-center-build": { load: () => import("@/registry/remocn/kinetic-center-build").then((m) => ({ default: m.KineticCenterBuild, })), - config: kineticCenterBuildConfig, + loadConfig: () => + import("@/registry/remocn/kinetic-center-build/config").then( + (m) => m.kineticCenterBuildConfig, + ), }, "short-slide-down": { load: () => import("@/registry/remocn/short-slide-down").then((m) => ({ default: m.ShortSlideDown, })), - config: shortSlideDownConfig, + loadConfig: () => + import("@/registry/remocn/short-slide-down/config").then( + (m) => m.shortSlideDownConfig, + ), }, typewriter: { load: () => import("@/registry/remocn/typewriter").then((m) => ({ default: m.Typewriter, })), - config: typewriterConfig, + loadConfig: () => + import("@/registry/remocn/typewriter/config").then( + (m) => m.typewriterConfig, + ), }, "hand-count": { load: () => import("@/registry/remocn/hand-count").then((m) => ({ default: m.HandCount, })), - config: handCountConfig, + loadConfig: () => + import("@/registry/remocn/hand-count/config").then( + (m) => m.handCountConfig, + ), }, handwrite: { load: () => import("@/registry/remocn/handwrite").then((m) => ({ default: m.Handwrite, })), - config: handwriteConfig, + loadConfig: () => + import("@/registry/remocn/handwrite/config").then( + (m) => m.handwriteConfig, + ), }, "inline-highlight": { load: () => import("@/registry/remocn/inline-highlight").then((m) => ({ default: m.InlineHighlight, })), - config: inlineHighlightConfig, + loadConfig: () => + import("@/registry/remocn/inline-highlight/config").then( + (m) => m.inlineHighlightConfig, + ), }, "strikethrough-replace": { load: () => import("@/registry/remocn/strikethrough-replace").then((m) => ({ default: m.StrikethroughReplace, })), - config: strikethroughReplaceConfig, + loadConfig: () => + import("@/registry/remocn/strikethrough-replace/config").then( + (m) => m.strikethroughReplaceConfig, + ), }, "staggered-fade-up": { load: () => import("@/registry/remocn/staggered-fade-up").then((m) => ({ default: m.StaggeredFadeUp, })), - config: staggeredFadeUpConfig, + loadConfig: () => + import("@/registry/remocn/staggered-fade-up/config").then( + (m) => m.staggeredFadeUpConfig, + ), }, "mask-reveal-up": { load: () => import("@/registry/remocn/mask-reveal-up").then((m) => ({ default: m.MaskRevealUp, })), - config: maskRevealUpConfig, + loadConfig: () => + import("@/registry/remocn/mask-reveal-up/config").then( + (m) => m.maskRevealUpConfig, + ), }, "tracking-in": { load: () => import("@/registry/remocn/tracking-in").then((m) => ({ default: m.TrackingIn, })), - config: trackingInConfig, + loadConfig: () => + import("@/registry/remocn/tracking-in/config").then( + (m) => m.trackingInConfig, + ), }, "shimmer-sweep": { load: () => import("@/registry/remocn/shimmer-sweep").then((m) => ({ default: m.ShimmerSweep, })), - config: shimmerSweepConfig, + loadConfig: () => + import("@/registry/remocn/shimmer-sweep/config").then( + (m) => m.shimmerSweepConfig, + ), }, "marker-highlight": { load: () => import("@/registry/remocn/marker-highlight").then((m) => ({ default: m.MarkerHighlight, })), - config: markerHighlightConfig, + loadConfig: () => + import("@/registry/remocn/marker-highlight/config").then( + (m) => m.markerHighlightConfig, + ), }, "ink-underline": { load: () => import("@/components/docs/examples/ink-underline-example").then((m) => ({ default: m.InkUnderlineExampleScene, })), - config: inkUnderlineConfig, + loadConfig: () => + import("@/registry/remocn/ink-underline/config").then( + (m) => m.inkUnderlineConfig, + ), }, "slot-machine-roll": { load: () => import("@/registry/remocn/slot-machine-roll").then((m) => ({ default: m.SlotMachineRoll, })), - config: slotMachineRollConfig, + loadConfig: () => + import("@/registry/remocn/slot-machine-roll/config").then( + (m) => m.slotMachineRollConfig, + ), }, "matrix-decode": { load: () => import("@/registry/remocn/matrix-decode").then((m) => ({ default: m.MatrixDecode, })), - config: matrixDecodeConfig, + loadConfig: () => + import("@/registry/remocn/matrix-decode/config").then( + (m) => m.matrixDecodeConfig, + ), }, "rgb-glitch-text": { load: () => import("@/registry/remocn/rgb-glitch-text").then((m) => ({ default: m.RGBGlitchText, })), - config: rgbGlitchTextConfig, + loadConfig: () => + import("@/registry/remocn/rgb-glitch-text/config").then( + (m) => m.rgbGlitchTextConfig, + ), }, "infinite-marquee": { load: () => import("@/registry/remocn/infinite-marquee").then((m) => ({ default: m.InfiniteMarquee, })), - config: infiniteMarqueeConfig, + loadConfig: () => + import("@/registry/remocn/infinite-marquee/config").then( + (m) => m.infiniteMarqueeConfig, + ), }, "perspective-marquee": { load: () => import("@/registry/remocn/perspective-marquee").then((m) => ({ default: m.PerspectiveMarquee, })), - config: perspectiveMarqueeConfig, + loadConfig: () => + import("@/registry/remocn/perspective-marquee/config").then( + (m) => m.perspectiveMarqueeConfig, + ), }, "glass-code-block": { load: () => import("@/registry/remocn/glass-code-block").then((m) => ({ default: m.GlassCodeBlock, })), - config: glassCodeBlockConfig, + loadConfig: () => + import("@/registry/remocn/glass-code-block/config").then( + (m) => m.glassCodeBlockConfig, + ), }, "glass-code-walk": { load: () => import("@/registry/remocn/glass-code-walk").then((m) => ({ default: m.GlassCodeWalk, })), - config: glassCodeWalkConfig, + loadConfig: () => + import("@/registry/remocn/glass-code-walk/config").then( + (m) => m.glassCodeWalkConfig, + ), }, "data-flow-pipes": { load: () => import("@/registry/remocn/data-flow-pipes").then((m) => ({ default: m.DataFlowPipes, })), - config: dataFlowPipesConfig, + loadConfig: () => + import("@/registry/remocn/data-flow-pipes/config").then( + (m) => m.dataFlowPipesConfig, + ), }, "shader-mesh-gradient": { load: () => import("@/registry/remocn/shader-mesh-gradient").then((m) => ({ default: m.ShaderMeshGradient, })), - config: shaderMeshGradientConfig, + loadConfig: () => + import("@/registry/remocn/shader-mesh-gradient/config").then( + (m) => m.shaderMeshGradientConfig, + ), }, "shader-grain-gradient": { load: () => import("@/registry/remocn/shader-grain-gradient").then((m) => ({ default: m.ShaderGrainGradient, })), - config: shaderGrainGradientConfig, + loadConfig: () => + import("@/registry/remocn/shader-grain-gradient/config").then( + (m) => m.shaderGrainGradientConfig, + ), }, "shader-warp": { load: () => import("@/registry/remocn/shader-warp").then((m) => ({ default: m.ShaderWarp, })), - config: shaderWarpConfig, + loadConfig: () => + import("@/registry/remocn/shader-warp/config").then( + (m) => m.shaderWarpConfig, + ), }, "shader-swirl": { load: () => import("@/registry/remocn/shader-swirl").then((m) => ({ default: m.ShaderSwirl, })), - config: shaderSwirlConfig, + loadConfig: () => + import("@/registry/remocn/shader-swirl/config").then( + (m) => m.shaderSwirlConfig, + ), }, "shader-water": { load: () => import("@/registry/remocn/shader-water").then((m) => ({ default: m.ShaderWater, })), - config: shaderWaterConfig, + loadConfig: () => + import("@/registry/remocn/shader-water/config").then( + (m) => m.shaderWaterConfig, + ), }, "shader-spiral": { load: () => import("@/registry/remocn/shader-spiral").then((m) => ({ default: m.ShaderSpiral, })), - config: shaderSpiralConfig, + loadConfig: () => + import("@/registry/remocn/shader-spiral/config").then( + (m) => m.shaderSpiralConfig, + ), }, "shader-liquid-metal": { load: () => import("@/registry/remocn/shader-liquid-metal").then((m) => ({ default: m.ShaderLiquidMetal, })), - config: shaderLiquidMetalConfig, + loadConfig: () => + import("@/registry/remocn/shader-liquid-metal/config").then( + (m) => m.shaderLiquidMetalConfig, + ), }, "shader-color-panels": { load: () => import("@/registry/remocn/shader-color-panels").then((m) => ({ default: m.ShaderColorPanels, })), - config: shaderColorPanelsConfig, + loadConfig: () => + import("@/registry/remocn/shader-color-panels/config").then( + (m) => m.shaderColorPanelsConfig, + ), }, "shader-neuro-noise": { load: () => import("@/registry/remocn/shader-neuro-noise").then((m) => ({ default: m.ShaderNeuroNoise, })), - config: shaderNeuroNoiseConfig, + loadConfig: () => + import("@/registry/remocn/shader-neuro-noise/config").then( + (m) => m.shaderNeuroNoiseConfig, + ), }, "shader-perlin-noise": { load: () => import("@/registry/remocn/shader-perlin-noise").then((m) => ({ default: m.ShaderPerlinNoise, })), - config: shaderPerlinNoiseConfig, + loadConfig: () => + import("@/registry/remocn/shader-perlin-noise/config").then( + (m) => m.shaderPerlinNoiseConfig, + ), }, "shader-simplex-noise": { load: () => import("@/registry/remocn/shader-simplex-noise").then((m) => ({ default: m.ShaderSimplexNoise, })), - config: shaderSimplexNoiseConfig, + loadConfig: () => + import("@/registry/remocn/shader-simplex-noise/config").then( + (m) => m.shaderSimplexNoiseConfig, + ), }, "shader-voronoi": { load: () => import("@/registry/remocn/shader-voronoi").then((m) => ({ default: m.ShaderVoronoi, })), - config: shaderVoronoiConfig, + loadConfig: () => + import("@/registry/remocn/shader-voronoi/config").then( + (m) => m.shaderVoronoiConfig, + ), }, "shader-dot-orbit": { load: () => import("@/registry/remocn/shader-dot-orbit").then((m) => ({ default: m.ShaderDotOrbit, })), - config: shaderDotOrbitConfig, + loadConfig: () => + import("@/registry/remocn/shader-dot-orbit/config").then( + (m) => m.shaderDotOrbitConfig, + ), }, "shader-dithering": { load: () => import("@/registry/remocn/shader-dithering").then((m) => ({ default: m.ShaderDithering, })), - config: shaderDitheringConfig, + loadConfig: () => + import("@/registry/remocn/shader-dithering/config").then( + (m) => m.shaderDitheringConfig, + ), }, "shader-god-rays": { load: () => import("@/registry/remocn/shader-god-rays").then((m) => ({ default: m.ShaderGodRays, })), - config: shaderGodRaysConfig, + loadConfig: () => + import("@/registry/remocn/shader-god-rays/config").then( + (m) => m.shaderGodRaysConfig, + ), }, "shader-smoke-ring": { load: () => import("@/registry/remocn/shader-smoke-ring").then((m) => ({ default: m.ShaderSmokeRing, })), - config: shaderSmokeRingConfig, + loadConfig: () => + import("@/registry/remocn/shader-smoke-ring/config").then( + (m) => m.shaderSmokeRingConfig, + ), }, "shader-metaballs": { load: () => import("@/registry/remocn/shader-metaballs").then((m) => ({ default: m.ShaderMetaballs, })), - config: shaderMetaballsConfig, + loadConfig: () => + import("@/registry/remocn/shader-metaballs/config").then( + (m) => m.shaderMetaballsConfig, + ), }, "shader-pulsing-border": { load: () => import("@/registry/remocn/shader-pulsing-border").then((m) => ({ default: m.ShaderPulsingBorder, })), - config: shaderPulsingBorderConfig, + loadConfig: () => + import("@/registry/remocn/shader-pulsing-border/config").then( + (m) => m.shaderPulsingBorderConfig, + ), }, "simulated-cursor": { load: () => import("@/registry/remocn/simulated-cursor").then((m) => ({ default: m.SimulatedCursor, })), - config: simulatedCursorConfig, + loadConfig: () => + import("@/registry/remocn/simulated-cursor/config").then( + (m) => m.simulatedCursorConfig, + ), }, "swirl-dissolve": { load: () => import("@/components/docs/examples/swirl-dissolve-example").then((m) => ({ default: m.SwirlDissolveExampleScene, })), - config: swirlDissolveConfig, + loadConfig: () => + import("@/registry/remocn/swirl-dissolve/config").then( + (m) => m.swirlDissolveConfig, + ), }, "dither-dissolve": { load: () => import("@/components/docs/examples/dither-dissolve-example").then( (m) => ({ default: m.DitherDissolveExampleScene }), ), - config: ditherDissolveConfig, + loadConfig: () => + import("@/registry/remocn/dither-dissolve/config").then( + (m) => m.ditherDissolveConfig, + ), }, "perlin-dissolve": { load: () => import("@/components/docs/examples/perlin-dissolve-example").then( (m) => ({ default: m.PerlinDissolveExampleScene }), ), - config: perlinDissolveConfig, + loadConfig: () => + import("@/registry/remocn/perlin-dissolve/config").then( + (m) => m.perlinDissolveConfig, + ), }, "smoke-dissolve": { load: () => import("@/components/docs/examples/smoke-dissolve-example").then((m) => ({ default: m.SmokeDissolveExampleScene, })), - config: smokeDissolveConfig, + loadConfig: () => + import("@/registry/remocn/smoke-dissolve/config").then( + (m) => m.smokeDissolveConfig, + ), }, "grain-dissolve": { load: () => import("@/components/docs/examples/grain-dissolve-example").then((m) => ({ default: m.GrainDissolveExampleScene, })), - config: grainDissolveConfig, + loadConfig: () => + import("@/registry/remocn/grain-dissolve/config").then( + (m) => m.grainDissolveConfig, + ), }, "icon-activity": { load: () => import("@/registry/remocn-icons/icon-activity").then((m) => ({ default: m.ActivityIcon, })), - config: iconActivityConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-activity/config").then( + (m) => m.iconActivityConfig, + ), }, "icon-alert-triangle": { load: () => import("@/registry/remocn-icons/icon-alert-triangle").then((m) => ({ default: m.AlertTriangleIcon, })), - config: iconAlertTriangleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-alert-triangle/config").then( + (m) => m.iconAlertTriangleConfig, + ), }, "icon-arrow-down": { load: () => import("@/registry/remocn-icons/icon-arrow-down").then((m) => ({ default: m.ArrowDownIcon, })), - config: iconArrowDownConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-arrow-down/config").then( + (m) => m.iconArrowDownConfig, + ), }, "icon-arrow-left": { load: () => import("@/registry/remocn-icons/icon-arrow-left").then((m) => ({ default: m.ArrowLeftIcon, })), - config: iconArrowLeftConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-arrow-left/config").then( + (m) => m.iconArrowLeftConfig, + ), }, "icon-arrow-right": { load: () => import("@/registry/remocn-icons/icon-arrow-right").then((m) => ({ default: m.ArrowRightIcon, })), - config: iconArrowRightConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-arrow-right/config").then( + (m) => m.iconArrowRightConfig, + ), }, "icon-arrow-up": { load: () => import("@/registry/remocn-icons/icon-arrow-up").then((m) => ({ default: m.ArrowUpIcon, })), - config: iconArrowUpConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-arrow-up/config").then( + (m) => m.iconArrowUpConfig, + ), }, "icon-at-sign": { load: () => import("@/registry/remocn-icons/icon-at-sign").then((m) => ({ default: m.AtSignIcon, })), - config: iconAtSignConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-at-sign/config").then( + (m) => m.iconAtSignConfig, + ), }, "icon-award": { load: () => import("@/registry/remocn-icons/icon-award").then((m) => ({ default: m.AwardIcon, })), - config: iconAwardConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-award/config").then( + (m) => m.iconAwardConfig, + ), }, "icon-bar-chart-3": { load: () => import("@/registry/remocn-icons/icon-bar-chart-3").then((m) => ({ default: m.BarChart3Icon, })), - config: iconBarChart3Config, + loadConfig: () => + import("@/registry/remocn-icons/icon-bar-chart-3/config").then( + (m) => m.iconBarChart3Config, + ), }, "icon-bell": { load: () => import("@/registry/remocn-icons/icon-bell").then((m) => ({ default: m.BellIcon, })), - config: iconBellConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-bell/config").then( + (m) => m.iconBellConfig, + ), }, "icon-bookmark": { load: () => import("@/registry/remocn-icons/icon-bookmark").then((m) => ({ default: m.BookmarkIcon, })), - config: iconBookmarkConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-bookmark/config").then( + (m) => m.iconBookmarkConfig, + ), }, "icon-calendar": { load: () => import("@/registry/remocn-icons/icon-calendar").then((m) => ({ default: m.CalendarIcon, })), - config: iconCalendarConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-calendar/config").then( + (m) => m.iconCalendarConfig, + ), }, "icon-camera": { load: () => import("@/registry/remocn-icons/icon-camera").then((m) => ({ default: m.CameraIcon, })), - config: iconCameraConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-camera/config").then( + (m) => m.iconCameraConfig, + ), }, "icon-check": { load: () => import("@/registry/remocn-icons/icon-check").then((m) => ({ default: m.CheckIcon, })), - config: iconCheckConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-check/config").then( + (m) => m.iconCheckConfig, + ), }, "icon-chevron-down": { load: () => import("@/registry/remocn-icons/icon-chevron-down").then((m) => ({ default: m.ChevronDownIcon, })), - config: iconChevronDownConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-chevron-down/config").then( + (m) => m.iconChevronDownConfig, + ), }, "icon-chevron-left": { load: () => import("@/registry/remocn-icons/icon-chevron-left").then((m) => ({ default: m.ChevronLeftIcon, })), - config: iconChevronLeftConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-chevron-left/config").then( + (m) => m.iconChevronLeftConfig, + ), }, "icon-chevron-right": { load: () => import("@/registry/remocn-icons/icon-chevron-right").then((m) => ({ default: m.ChevronRightIcon, })), - config: iconChevronRightConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-chevron-right/config").then( + (m) => m.iconChevronRightConfig, + ), }, "icon-chevron-up": { load: () => import("@/registry/remocn-icons/icon-chevron-up").then((m) => ({ default: m.ChevronUpIcon, })), - config: iconChevronUpConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-chevron-up/config").then( + (m) => m.iconChevronUpConfig, + ), }, "icon-clock": { load: () => import("@/registry/remocn-icons/icon-clock").then((m) => ({ default: m.ClockIcon, })), - config: iconClockConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-clock/config").then( + (m) => m.iconClockConfig, + ), }, "icon-cloud": { load: () => import("@/registry/remocn-icons/icon-cloud").then((m) => ({ default: m.CloudIcon, })), - config: iconCloudConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-cloud/config").then( + (m) => m.iconCloudConfig, + ), }, "icon-code": { load: () => import("@/registry/remocn-icons/icon-code").then((m) => ({ default: m.CodeIcon, })), - config: iconCodeConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-code/config").then( + (m) => m.iconCodeConfig, + ), }, "icon-copy": { load: () => import("@/registry/remocn-icons/icon-copy").then((m) => ({ default: m.CopyIcon, })), - config: iconCopyConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-copy/config").then( + (m) => m.iconCopyConfig, + ), }, "icon-credit-card": { load: () => import("@/registry/remocn-icons/icon-credit-card").then((m) => ({ default: m.CreditCardIcon, })), - config: iconCreditCardConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-credit-card/config").then( + (m) => m.iconCreditCardConfig, + ), }, "icon-crown": { load: () => import("@/registry/remocn-icons/icon-crown").then((m) => ({ default: m.CrownIcon, })), - config: iconCrownConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-crown/config").then( + (m) => m.iconCrownConfig, + ), }, "icon-database": { load: () => import("@/registry/remocn-icons/icon-database").then((m) => ({ default: m.DatabaseIcon, })), - config: iconDatabaseConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-database/config").then( + (m) => m.iconDatabaseConfig, + ), }, "icon-dollar-sign": { load: () => import("@/registry/remocn-icons/icon-dollar-sign").then((m) => ({ default: m.DollarSignIcon, })), - config: iconDollarSignConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-dollar-sign/config").then( + (m) => m.iconDollarSignConfig, + ), }, "icon-download": { load: () => import("@/registry/remocn-icons/icon-download").then((m) => ({ default: m.DownloadIcon, })), - config: iconDownloadConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-download/config").then( + (m) => m.iconDownloadConfig, + ), }, "icon-external-link": { load: () => import("@/registry/remocn-icons/icon-external-link").then((m) => ({ default: m.ExternalLinkIcon, })), - config: iconExternalLinkConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-external-link/config").then( + (m) => m.iconExternalLinkConfig, + ), }, "icon-eye-off": { load: () => import("@/registry/remocn-icons/icon-eye-off").then((m) => ({ default: m.EyeOffIcon, })), - config: iconEyeOffConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-eye-off/config").then( + (m) => m.iconEyeOffConfig, + ), }, "icon-eye": { load: () => import("@/registry/remocn-icons/icon-eye").then((m) => ({ default: m.EyeIcon, })), - config: iconEyeConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-eye/config").then( + (m) => m.iconEyeConfig, + ), }, "icon-file-text": { load: () => import("@/registry/remocn-icons/icon-file-text").then((m) => ({ default: m.FileTextIcon, })), - config: iconFileTextConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-file-text/config").then( + (m) => m.iconFileTextConfig, + ), }, "icon-filter": { load: () => import("@/registry/remocn-icons/icon-filter").then((m) => ({ default: m.FilterIcon, })), - config: iconFilterConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-filter/config").then( + (m) => m.iconFilterConfig, + ), }, "icon-flame": { load: () => import("@/registry/remocn-icons/icon-flame").then((m) => ({ default: m.FlameIcon, })), - config: iconFlameConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-flame/config").then( + (m) => m.iconFlameConfig, + ), }, "icon-folder": { load: () => import("@/registry/remocn-icons/icon-folder").then((m) => ({ default: m.FolderIcon, })), - config: iconFolderConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-folder/config").then( + (m) => m.iconFolderConfig, + ), }, "icon-gem": { load: () => import("@/registry/remocn-icons/icon-gem").then((m) => ({ default: m.GemIcon, })), - config: iconGemConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-gem/config").then( + (m) => m.iconGemConfig, + ), }, "icon-gift": { load: () => import("@/registry/remocn-icons/icon-gift").then((m) => ({ default: m.GiftIcon, })), - config: iconGiftConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-gift/config").then( + (m) => m.iconGiftConfig, + ), }, "icon-globe": { load: () => import("@/registry/remocn-icons/icon-globe").then((m) => ({ default: m.GlobeIcon, })), - config: iconGlobeConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-globe/config").then( + (m) => m.iconGlobeConfig, + ), }, "icon-heart": { load: () => import("@/registry/remocn-icons/icon-heart").then((m) => ({ default: m.HeartIcon, })), - config: iconHeartConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-heart/config").then( + (m) => m.iconHeartConfig, + ), }, "icon-help-circle": { load: () => import("@/registry/remocn-icons/icon-help-circle").then((m) => ({ default: m.HelpCircleIcon, })), - config: iconHelpCircleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-help-circle/config").then( + (m) => m.iconHelpCircleConfig, + ), }, "icon-home": { load: () => import("@/registry/remocn-icons/icon-home").then((m) => ({ default: m.HomeIcon, })), - config: iconHomeConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-home/config").then( + (m) => m.iconHomeConfig, + ), }, "icon-image": { load: () => import("@/registry/remocn-icons/icon-image").then((m) => ({ default: m.ImageIcon, })), - config: iconImageConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-image/config").then( + (m) => m.iconImageConfig, + ), }, "icon-inbox": { load: () => import("@/registry/remocn-icons/icon-inbox").then((m) => ({ default: m.InboxIcon, })), - config: iconInboxConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-inbox/config").then( + (m) => m.iconInboxConfig, + ), }, "icon-info": { load: () => import("@/registry/remocn-icons/icon-info").then((m) => ({ default: m.InfoIcon, })), - config: iconInfoConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-info/config").then( + (m) => m.iconInfoConfig, + ), }, "icon-key": { load: () => import("@/registry/remocn-icons/icon-key").then((m) => ({ default: m.KeyIcon, })), - config: iconKeyConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-key/config").then( + (m) => m.iconKeyConfig, + ), }, "icon-layout-grid": { load: () => import("@/registry/remocn-icons/icon-layout-grid").then((m) => ({ default: m.LayoutGridIcon, })), - config: iconLayoutGridConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-layout-grid/config").then( + (m) => m.iconLayoutGridConfig, + ), }, "icon-link": { load: () => import("@/registry/remocn-icons/icon-link").then((m) => ({ default: m.LinkIcon, })), - config: iconLinkConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-link/config").then( + (m) => m.iconLinkConfig, + ), }, "icon-loader": { load: () => import("@/registry/remocn-icons/icon-loader").then((m) => ({ default: m.LoaderIcon, })), - config: iconLoaderConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-loader/config").then( + (m) => m.iconLoaderConfig, + ), }, "icon-lock": { load: () => import("@/registry/remocn-icons/icon-lock").then((m) => ({ default: m.LockIcon, })), - config: iconLockConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-lock/config").then( + (m) => m.iconLockConfig, + ), }, "icon-log-out": { load: () => import("@/registry/remocn-icons/icon-log-out").then((m) => ({ default: m.LogOutIcon, })), - config: iconLogOutConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-log-out/config").then( + (m) => m.iconLogOutConfig, + ), }, "icon-mail": { load: () => import("@/registry/remocn-icons/icon-mail").then((m) => ({ default: m.MailIcon, })), - config: iconMailConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-mail/config").then( + (m) => m.iconMailConfig, + ), }, "icon-maximize": { load: () => import("@/registry/remocn-icons/icon-maximize").then((m) => ({ default: m.MaximizeIcon, })), - config: iconMaximizeConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-maximize/config").then( + (m) => m.iconMaximizeConfig, + ), }, "icon-menu": { load: () => import("@/registry/remocn-icons/icon-menu").then((m) => ({ default: m.MenuIcon, })), - config: iconMenuConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-menu/config").then( + (m) => m.iconMenuConfig, + ), }, "icon-message-circle": { load: () => import("@/registry/remocn-icons/icon-message-circle").then((m) => ({ default: m.MessageCircleIcon, })), - config: iconMessageCircleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-message-circle/config").then( + (m) => m.iconMessageCircleConfig, + ), }, "icon-mic": { load: () => import("@/registry/remocn-icons/icon-mic").then((m) => ({ default: m.MicIcon, })), - config: iconMicConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-mic/config").then( + (m) => m.iconMicConfig, + ), }, "icon-monitor": { load: () => import("@/registry/remocn-icons/icon-monitor").then((m) => ({ default: m.MonitorIcon, })), - config: iconMonitorConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-monitor/config").then( + (m) => m.iconMonitorConfig, + ), }, "icon-moon": { load: () => import("@/registry/remocn-icons/icon-moon").then((m) => ({ default: m.MoonIcon, })), - config: iconMoonConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-moon/config").then( + (m) => m.iconMoonConfig, + ), }, "icon-more-horizontal": { load: () => import("@/registry/remocn-icons/icon-more-horizontal").then((m) => ({ default: m.MoreHorizontalIcon, })), - config: iconMoreHorizontalConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-more-horizontal/config").then( + (m) => m.iconMoreHorizontalConfig, + ), }, "icon-package": { load: () => import("@/registry/remocn-icons/icon-package").then((m) => ({ default: m.PackageIcon, })), - config: iconPackageConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-package/config").then( + (m) => m.iconPackageConfig, + ), }, "icon-party-popper": { load: () => import("@/registry/remocn-icons/icon-party-popper").then((m) => ({ default: m.PartyPopperIcon, })), - config: iconPartyPopperConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-party-popper/config").then( + (m) => m.iconPartyPopperConfig, + ), }, "icon-pause": { load: () => import("@/registry/remocn-icons/icon-pause").then((m) => ({ default: m.PauseIcon, })), - config: iconPauseConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-pause/config").then( + (m) => m.iconPauseConfig, + ), }, "icon-pencil": { load: () => import("@/registry/remocn-icons/icon-pencil").then((m) => ({ default: m.PencilIcon, })), - config: iconPencilConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-pencil/config").then( + (m) => m.iconPencilConfig, + ), }, "icon-phone": { load: () => import("@/registry/remocn-icons/icon-phone").then((m) => ({ default: m.PhoneIcon, })), - config: iconPhoneConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-phone/config").then( + (m) => m.iconPhoneConfig, + ), }, "icon-play": { load: () => import("@/registry/remocn-icons/icon-play").then((m) => ({ default: m.PlayIcon, })), - config: iconPlayConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-play/config").then( + (m) => m.iconPlayConfig, + ), }, "icon-plus": { load: () => import("@/registry/remocn-icons/icon-plus").then((m) => ({ default: m.PlusIcon, })), - config: iconPlusConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-plus/config").then( + (m) => m.iconPlusConfig, + ), }, "icon-plus-circle": { load: () => import("@/registry/remocn-icons/icon-plus-circle").then((m) => ({ default: m.PlusCircleIcon, })), - config: iconPlusCircleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-plus-circle/config").then( + (m) => m.iconPlusCircleConfig, + ), }, "icon-refresh-cw": { load: () => import("@/registry/remocn-icons/icon-refresh-cw").then((m) => ({ default: m.RefreshCwIcon, })), - config: iconRefreshCwConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-refresh-cw/config").then( + (m) => m.iconRefreshCwConfig, + ), }, "icon-rocket": { load: () => import("@/registry/remocn-icons/icon-rocket").then((m) => ({ default: m.RocketIcon, })), - config: iconRocketConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-rocket/config").then( + (m) => m.iconRocketConfig, + ), }, "icon-save": { load: () => import("@/registry/remocn-icons/icon-save").then((m) => ({ default: m.SaveIcon, })), - config: iconSaveConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-save/config").then( + (m) => m.iconSaveConfig, + ), }, "icon-search": { load: () => import("@/registry/remocn-icons/icon-search").then((m) => ({ default: m.SearchIcon, })), - config: iconSearchConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-search/config").then( + (m) => m.iconSearchConfig, + ), }, "icon-send": { load: () => import("@/registry/remocn-icons/icon-send").then((m) => ({ default: m.SendIcon, })), - config: iconSendConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-send/config").then( + (m) => m.iconSendConfig, + ), }, "icon-settings": { load: () => import("@/registry/remocn-icons/icon-settings").then((m) => ({ default: m.SettingsIcon, })), - config: iconSettingsConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-settings/config").then( + (m) => m.iconSettingsConfig, + ), }, "icon-share-2": { load: () => import("@/registry/remocn-icons/icon-share-2").then((m) => ({ default: m.Share2Icon, })), - config: iconShare2Config, + loadConfig: () => + import("@/registry/remocn-icons/icon-share-2/config").then( + (m) => m.iconShare2Config, + ), }, "icon-shield": { load: () => import("@/registry/remocn-icons/icon-shield").then((m) => ({ default: m.ShieldIcon, })), - config: iconShieldConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-shield/config").then( + (m) => m.iconShieldConfig, + ), }, "icon-shopping-cart": { load: () => import("@/registry/remocn-icons/icon-shopping-cart").then((m) => ({ default: m.ShoppingCartIcon, })), - config: iconShoppingCartConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-shopping-cart/config").then( + (m) => m.iconShoppingCartConfig, + ), }, "icon-skip-forward": { load: () => import("@/registry/remocn-icons/icon-skip-forward").then((m) => ({ default: m.SkipForwardIcon, })), - config: iconSkipForwardConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-skip-forward/config").then( + (m) => m.iconSkipForwardConfig, + ), }, "icon-smartphone": { load: () => import("@/registry/remocn-icons/icon-smartphone").then((m) => ({ default: m.SmartphoneIcon, })), - config: iconSmartphoneConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-smartphone/config").then( + (m) => m.iconSmartphoneConfig, + ), }, "icon-sparkles": { load: () => import("@/registry/remocn-icons/icon-sparkles").then((m) => ({ default: m.SparklesIcon, })), - config: iconSparklesConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-sparkles/config").then( + (m) => m.iconSparklesConfig, + ), }, "icon-star": { load: () => import("@/registry/remocn-icons/icon-star").then((m) => ({ default: m.StarIcon, })), - config: iconStarConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-star/config").then( + (m) => m.iconStarConfig, + ), }, "icon-sun": { load: () => import("@/registry/remocn-icons/icon-sun").then((m) => ({ default: m.SunIcon, })), - config: iconSunConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-sun/config").then( + (m) => m.iconSunConfig, + ), }, "icon-tag": { load: () => import("@/registry/remocn-icons/icon-tag").then((m) => ({ default: m.TagIcon, })), - config: iconTagConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-tag/config").then( + (m) => m.iconTagConfig, + ), }, "icon-target": { load: () => import("@/registry/remocn-icons/icon-target").then((m) => ({ default: m.TargetIcon, })), - config: iconTargetConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-target/config").then( + (m) => m.iconTargetConfig, + ), }, "icon-terminal": { load: () => import("@/registry/remocn-icons/icon-terminal").then((m) => ({ default: m.TerminalIcon, })), - config: iconTerminalConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-terminal/config").then( + (m) => m.iconTerminalConfig, + ), }, "icon-thumbs-up": { load: () => import("@/registry/remocn-icons/icon-thumbs-up").then((m) => ({ default: m.ThumbsUpIcon, })), - config: iconThumbsUpConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-thumbs-up/config").then( + (m) => m.iconThumbsUpConfig, + ), }, "icon-timer": { load: () => import("@/registry/remocn-icons/icon-timer").then((m) => ({ default: m.TimerIcon, })), - config: iconTimerConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-timer/config").then( + (m) => m.iconTimerConfig, + ), }, "icon-trash": { load: () => import("@/registry/remocn-icons/icon-trash").then((m) => ({ default: m.TrashIcon, })), - config: iconTrashConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-trash/config").then( + (m) => m.iconTrashConfig, + ), }, "icon-trending-down": { load: () => import("@/registry/remocn-icons/icon-trending-down").then((m) => ({ default: m.TrendingDownIcon, })), - config: iconTrendingDownConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-trending-down/config").then( + (m) => m.iconTrendingDownConfig, + ), }, "icon-trending-up": { load: () => import("@/registry/remocn-icons/icon-trending-up").then((m) => ({ default: m.TrendingUpIcon, })), - config: iconTrendingUpConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-trending-up/config").then( + (m) => m.iconTrendingUpConfig, + ), }, "icon-trophy": { load: () => import("@/registry/remocn-icons/icon-trophy").then((m) => ({ default: m.TrophyIcon, })), - config: iconTrophyConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-trophy/config").then( + (m) => m.iconTrophyConfig, + ), }, "icon-upload": { load: () => import("@/registry/remocn-icons/icon-upload").then((m) => ({ default: m.UploadIcon, })), - config: iconUploadConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-upload/config").then( + (m) => m.iconUploadConfig, + ), }, "icon-user-plus": { load: () => import("@/registry/remocn-icons/icon-user-plus").then((m) => ({ default: m.UserPlusIcon, })), - config: iconUserPlusConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-user-plus/config").then( + (m) => m.iconUserPlusConfig, + ), }, "icon-user": { load: () => import("@/registry/remocn-icons/icon-user").then((m) => ({ default: m.UserIcon, })), - config: iconUserConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-user/config").then( + (m) => m.iconUserConfig, + ), }, "icon-users": { load: () => import("@/registry/remocn-icons/icon-users").then((m) => ({ default: m.UsersIcon, })), - config: iconUsersConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-users/config").then( + (m) => m.iconUsersConfig, + ), }, "icon-video": { load: () => import("@/registry/remocn-icons/icon-video").then((m) => ({ default: m.VideoIcon, })), - config: iconVideoConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-video/config").then( + (m) => m.iconVideoConfig, + ), }, "icon-volume-2": { load: () => import("@/registry/remocn-icons/icon-volume-2").then((m) => ({ default: m.Volume2Icon, })), - config: iconVolume2Config, + loadConfig: () => + import("@/registry/remocn-icons/icon-volume-2/config").then( + (m) => m.iconVolume2Config, + ), }, "icon-volume-x": { load: () => import("@/registry/remocn-icons/icon-volume-x").then((m) => ({ default: m.VolumeXIcon, })), - config: iconVolumeXConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-volume-x/config").then( + (m) => m.iconVolumeXConfig, + ), }, "icon-wallet": { load: () => import("@/registry/remocn-icons/icon-wallet").then((m) => ({ default: m.WalletIcon, })), - config: iconWalletConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-wallet/config").then( + (m) => m.iconWalletConfig, + ), }, "icon-check-circle": { load: () => import("@/registry/remocn-icons/icon-check-circle").then((m) => ({ default: m.CheckCircleIcon, })), - config: iconCheckCircleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-check-circle/config").then( + (m) => m.iconCheckCircleConfig, + ), }, "icon-x": { load: () => import("@/registry/remocn-icons/icon-x").then((m) => ({ default: m.XIcon, })), - config: iconXConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-x/config").then( + (m) => m.iconXConfig, + ), }, "icon-x-circle": { load: () => import("@/registry/remocn-icons/icon-x-circle").then((m) => ({ default: m.XCircleIcon, })), - config: iconXCircleConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-x-circle/config").then( + (m) => m.iconXCircleConfig, + ), }, "icon-zap": { load: () => import("@/registry/remocn-icons/icon-zap").then((m) => ({ default: m.ZapIcon, })), - config: iconZapConfig, + loadConfig: () => + import("@/registry/remocn-icons/icon-zap/config").then( + (m) => m.iconZapConfig, + ), }, "wave-wipe": { load: () => import("@/components/docs/examples/wave-wipe-example").then((m) => ({ default: m.WaveWipeExampleScene, })), - config: waveWipeConfig, + loadConfig: () => + import("@/registry/remocn/wave-wipe/config").then( + (m) => m.waveWipeConfig, + ), }, "ripple-zoom": { load: () => import("@/components/docs/examples/ripple-zoom-example").then((m) => ({ default: m.RippleZoomExampleScene, })), - config: rippleZoomConfig, + loadConfig: () => + import("@/registry/remocn/ripple-zoom/config").then( + (m) => m.rippleZoomConfig, + ), }, "whip-pan": { load: () => import("@/components/docs/examples/whip-pan-example").then((m) => ({ default: m.WhipPanExampleScene, })), - config: whipPanConfig, + loadConfig: () => + import("@/registry/remocn/whip-pan/config").then((m) => m.whipPanConfig), }, "push-through": { load: () => import("@/components/docs/examples/push-through-example").then((m) => ({ default: m.PushThroughExampleScene, })), - config: pushThroughConfig, + loadConfig: () => + import("@/registry/remocn/push-through/config").then( + (m) => m.pushThroughConfig, + ), }, "focus-pull": { load: () => import("@/components/docs/examples/focus-pull-example").then((m) => ({ default: m.FocusPullExampleScene, })), - config: focusPullConfig, + loadConfig: () => + import("@/registry/remocn/focus-pull/config").then( + (m) => m.focusPullConfig, + ), }, "zoom-blur": { load: () => import("@/components/docs/examples/zoom-blur-example").then((m) => ({ default: m.ZoomBlurExampleScene, })), - config: zoomBlurConfig, + loadConfig: () => + import("@/registry/remocn/zoom-blur/config").then( + (m) => m.zoomBlurConfig, + ), }, "glitch-cut": { load: () => import("@/components/docs/examples/glitch-cut-example").then((m) => ({ default: m.GlitchCutExampleScene, })), - config: glitchCutConfig, + loadConfig: () => + import("@/registry/remocn/glitch-cut/config").then( + (m) => m.glitchCutConfig, + ), }, "ember-burn": { load: () => import("@/components/docs/examples/ember-burn-example").then((m) => ({ default: m.EmberBurnExampleScene, })), - config: emberBurnConfig, + loadConfig: () => + import("@/registry/remocn/ember-burn/config").then( + (m) => m.emberBurnConfig, + ), }, "particle-dissolve": { load: () => import("@/components/docs/examples/particle-dissolve-example").then( (m) => ({ default: m.ParticleDissolveExampleScene }), ), - config: particleDissolveConfig, + loadConfig: () => + import("@/registry/remocn/particle-dissolve/config").then( + (m) => m.particleDissolveConfig, + ), }, "grid-wave": { load: () => import("@/components/docs/examples/grid-wave-example").then((m) => ({ default: m.GridWaveExampleScene, })), - config: gridWaveConfig, + loadConfig: () => + import("@/registry/remocn/grid-wave/config").then( + (m) => m.gridWaveConfig, + ), }, displacement: { load: () => import("@/components/docs/examples/displacement-example").then((m) => ({ default: m.DisplacementExampleScene, })), - config: displacementConfig, + loadConfig: () => + import("@/registry/remocn/displacement/config").then( + (m) => m.displacementConfig, + ), }, "vhs-filter": { load: () => import("@/components/docs/examples/vhs-filter-example").then((m) => ({ default: m.VhsFilterExampleScene, })), - config: vhsFilterConfig, + loadConfig: () => + import("@/registry/remocn/vhs-filter/config").then( + (m) => m.vhsFilterConfig, + ), }, "crt-screen": { load: () => import("@/components/docs/examples/crt-screen-example").then((m) => ({ default: m.CrtScreenExampleScene, })), - config: crtScreenConfig, + loadConfig: () => + import("@/registry/remocn/crt-screen/config").then( + (m) => m.crtScreenConfig, + ), }, "sustained-glitch": { load: () => import("@/components/docs/examples/sustained-glitch-example").then( (m) => ({ default: m.SustainedGlitchExampleScene }), ), - config: sustainedGlitchConfig, + loadConfig: () => + import("@/registry/remocn/sustained-glitch/config").then( + (m) => m.sustainedGlitchConfig, + ), }, "pixelate-region": { load: () => import("@/components/docs/examples/pixelate-region-example").then( (m) => ({ default: m.PixelateRegionExampleScene }), ), - config: pixelateRegionConfig, + loadConfig: () => + import("@/registry/remocn/pixelate-region/config").then( + (m) => m.pixelateRegionConfig, + ), }, "ascii-render": { load: () => import("@/components/docs/examples/ascii-render-example").then((m) => ({ default: m.AsciiRenderExampleScene, })), - config: asciiRenderConfig, + loadConfig: () => + import("@/registry/remocn/ascii-render/config").then( + (m) => m.asciiRenderConfig, + ), }, "halftone-print": { load: () => import("@/components/docs/examples/halftone-print-example").then((m) => ({ default: m.HalftonePrintExampleScene, })), - config: halftonePrintConfig, + loadConfig: () => + import("@/registry/remocn/halftone-print/config").then( + (m) => m.halftonePrintConfig, + ), }, "underwater-ripple": { load: () => import("@/components/docs/examples/underwater-ripple-example").then( (m) => ({ default: m.UnderwaterRippleExampleScene }), ), - config: underwaterRippleConfig, + loadConfig: () => + import("@/registry/remocn/underwater-ripple/config").then( + (m) => m.underwaterRippleConfig, + ), }, "camera-lens": { load: () => import("@/components/docs/examples/camera-lens-example").then((m) => ({ default: m.CameraLensExampleScene, })), - config: cameraLensConfig, + loadConfig: () => + import("@/registry/remocn/camera-lens/config").then( + (m) => m.cameraLensConfig, + ), }, "security-cam": { load: () => import("@/components/docs/examples/security-cam-example").then((m) => ({ default: m.SecurityCamExampleScene, })), - config: securityCamConfig, + loadConfig: () => + import("@/registry/remocn/security-cam/config").then( + (m) => m.securityCamConfig, + ), }, hologram: { load: () => import("@/components/docs/examples/hologram-example").then((m) => ({ default: m.HologramExampleScene, })), - config: hologramConfig, + loadConfig: () => + import("@/registry/remocn/hologram/config").then((m) => m.hologramConfig), }, "tv-power-off": { load: () => import("@/components/docs/examples/tv-power-off-example").then((m) => ({ default: m.TvPowerOffExampleScene, })), - config: tvPowerOffConfig, + loadConfig: () => + import("@/registry/remocn/tv-power-off/config").then( + (m) => m.tvPowerOffConfig, + ), }, "slide-swap": { load: () => import("@/components/docs/examples/slide-swap-example").then((m) => ({ default: m.SlideSwapExampleScene, })), - config: slideSwapConfig, + loadConfig: () => + import("@/registry/remocn/slide-swap/config").then( + (m) => m.slideSwapConfig, + ), }, "spring-settle": { load: () => import("@/components/docs/examples/spring-settle-example").then((m) => ({ default: m.SpringSettleExampleScene, })), - config: springSettleConfig, + loadConfig: () => + import("@/registry/remocn/spring-settle/config").then( + (m) => m.springSettleConfig, + ), }, "warp-dissolve": { load: () => import("@/components/docs/examples/warp-dissolve-example").then((m) => ({ default: m.WarpDissolveExampleScene, })), - config: warpDissolveConfig, + loadConfig: () => + import("@/registry/remocn/warp-dissolve/config").then( + (m) => m.warpDissolveConfig, + ), }, "chat-to-preview-layout": { load: () => import("@/registry/remocn/chat-to-preview-layout").then((m) => ({ default: m.ChatToPreviewLayout, })), - config: chatToPreviewLayoutConfig, + loadConfig: () => + import("@/registry/remocn/chat-to-preview-layout/config").then( + (m) => m.chatToPreviewLayoutConfig, + ), }, "animated-line-chart": { load: () => import("@/registry/remocn/animated-line-chart").then((m) => ({ default: m.AnimatedLineChart, })), - config: animatedLineChartConfig, + loadConfig: () => + import("@/registry/remocn/animated-line-chart/config").then( + (m) => m.animatedLineChartConfig, + ), }, "animated-bar-chart": { load: () => import("@/registry/remocn/animated-bar-chart").then((m) => ({ default: m.AnimatedBarChart, })), - config: animatedBarChartConfig, + loadConfig: () => + import("@/registry/remocn/animated-bar-chart/config").then( + (m) => m.animatedBarChartConfig, + ), }, "terminal-simulator": { load: () => import("@/registry/remocn/terminal-simulator").then((m) => ({ default: m.TerminalSimulator, })), - config: terminalSimulatorConfig, + loadConfig: () => + import("@/registry/remocn/terminal-simulator/config").then( + (m) => m.terminalSimulatorConfig, + ), }, "terminal-cursor-zoom": { load: () => import("@/registry/remocn/terminal-cursor-zoom").then((m) => ({ default: m.TerminalCursorZoom, })), - config: terminalCursorZoomConfig, + loadConfig: () => + import("@/registry/remocn/terminal-cursor-zoom/config").then( + (m) => m.terminalCursorZoomConfig, + ), }, "progress-steps": { load: () => import("@/registry/remocn/progress-steps").then((m) => ({ default: m.ProgressSteps, })), - config: progressStepsConfig, + loadConfig: () => + import("@/registry/remocn/progress-steps/config").then( + (m) => m.progressStepsConfig, + ), }, "ecosystem-constellation": { load: () => import("@/registry/remocn/ecosystem-constellation").then((m) => ({ default: m.EcosystemConstellation, })), - config: ecosystemConstellationConfig, + loadConfig: () => + import("@/registry/remocn/ecosystem-constellation/config").then( + (m) => m.ecosystemConstellationConfig, + ), }, "live-code-compilation": { load: () => import("@/registry/remocn/live-code-compilation").then((m) => ({ default: m.LiveCodeCompilation, })), - config: liveCodeCompilationConfig, + loadConfig: () => + import("@/registry/remocn/live-code-compilation/config").then( + (m) => m.liveCodeCompilationConfig, + ), }, "infinite-bento-pan": { load: () => import("@/registry/remocn/infinite-bento-pan").then((m) => ({ default: m.InfiniteBentoPan, })), - config: infiniteBentoPanConfig, + loadConfig: () => + import("@/registry/remocn/infinite-bento-pan/config").then( + (m) => m.infiniteBentoPanConfig, + ), }, "github-sponsors": { load: () => import("@/registry/remocn/github-sponsors").then((m) => ({ default: m.GitHubSponsors, })), - config: githubSponsorsConfig, + loadConfig: () => + import("@/registry/remocn/github-sponsors/config").then( + (m) => m.githubSponsorsConfig, + ), }, "github-stars": { load: () => import("@/registry/remocn/github-stars").then((m) => ({ default: m.GitHubStars, })), - config: githubStarsConfig, + loadConfig: () => + import("@/registry/remocn/github-stars/config").then( + (m) => m.githubStarsConfig, + ), }, "logo-enter": { load: () => import("@/registry/remocn/logo-enter").then((m) => ({ default: m.LogoEnter, })), - config: logoEnterConfig, + loadConfig: () => + import("@/registry/remocn/logo-enter/config").then( + (m) => m.logoEnterConfig, + ), }, "number-wheel": { load: () => import("@/registry/remocn/number-wheel").then((m) => ({ default: m.NumberWheel, })), - config: numberWheelConfig, + loadConfig: () => + import("@/registry/remocn/number-wheel/config").then( + (m) => m.numberWheelConfig, + ), }, "rolling-number": { load: () => import("@/registry/remocn/rolling-number").then((m) => ({ default: m.RollingNumber, })), - config: rollingNumberConfig, + loadConfig: () => + import("@/registry/remocn/rolling-number/config").then( + (m) => m.rollingNumberConfig, + ), }, "rolodex-flip": { load: () => import("@/components/docs/examples/rolodex-flip-example").then((m) => ({ default: m.RolodexFlipExampleScene, })), - config: rolodexFlipConfig, + loadConfig: () => + import("@/registry/remocn/rolodex-flip/config").then( + (m) => m.rolodexFlipConfig, + ), }, "value-swap": { load: () => import("@/components/docs/examples/value-swap-example").then((m) => ({ default: m.ValueSwapExampleScene, })), - config: valueSwapConfig, + loadConfig: () => + import("@/registry/remocn/value-swap/config").then( + (m) => m.valueSwapConfig, + ), }, "x-follow-card": { load: () => import("@/registry/remocn/x-follow-card").then((m) => ({ default: m.XFollowCard, })), - config: xFollowCardConfig, + loadConfig: () => + import("@/registry/remocn/x-follow-card/config").then( + (m) => m.xFollowCardConfig, + ), }, "x-followers-overview": { load: () => import("@/registry/remocn/x-followers-overview").then((m) => ({ default: m.XFollowersOverview, })), - config: xFollowersOverviewConfig, + loadConfig: () => + import("@/registry/remocn/x-followers-overview/config").then( + (m) => m.xFollowersOverviewConfig, + ), }, confetti: { load: () => import("@/registry/remocn/confetti").then((m) => ({ default: m.Confetti, })), - config: confettiConfig, + loadConfig: () => + import("@/registry/remocn/confetti/config").then((m) => m.confettiConfig), }, "paper-wobble": { load: () => import("@/components/docs/examples/paper-wobble-example").then((m) => ({ default: m.PaperWobbleExampleScene, })), - config: paperWobbleConfig, + loadConfig: () => + import("@/registry/remocn/paper-wobble/config").then( + (m) => m.paperWobbleConfig, + ), }, "paper-sticker": { load: () => import("@/components/docs/examples/paper-sticker-example").then((m) => ({ default: m.PaperStickerExampleScene, })), - config: paperStickerConfig, + loadConfig: () => + import("@/registry/remocn/paper-sticker/config").then( + (m) => m.paperStickerConfig, + ), }, polaroid: { load: () => import("@/components/docs/examples/polaroid-example").then((m) => ({ default: m.PolaroidExampleScene, })), - config: polaroidConfig, + loadConfig: () => + import("@/registry/remocn/polaroid/config").then((m) => m.polaroidConfig), }, "check-list": { load: () => import("@/components/docs/examples/check-list-example").then((m) => ({ default: m.CheckListExampleScene, })), - config: checkListConfig, + loadConfig: () => + import("@/registry/remocn/check-list/config").then( + (m) => m.checkListConfig, + ), }, "crumple-toss": { load: () => import("@/components/docs/examples/crumple-toss-example").then((m) => ({ default: m.CrumpleTossExampleScene, })), - config: crumpleTossConfig, + loadConfig: () => + import("@/registry/remocn/crumple-toss/config").then( + (m) => m.crumpleTossConfig, + ), }, "scribble-circle": { load: () => @@ -1741,119 +2097,153 @@ const registry: Record = { default: m.ScribbleCircleExampleScene, }), ), - config: scribbleCircleConfig, + loadConfig: () => + import("@/registry/remocn/scribble-circle/config").then( + (m) => m.scribbleCircleConfig, + ), }, "page-turn": { load: () => import("@/components/docs/examples/page-turn-example").then((m) => ({ default: m.PageTurnExampleScene, })), - config: pageTurnConfig, + loadConfig: () => + import("@/registry/remocn/page-turn/config").then( + (m) => m.pageTurnConfig, + ), }, "ink-arrow": { load: () => import("@/components/docs/examples/ink-arrow-example").then((m) => ({ default: m.InkArrowExampleScene, })), - config: inkArrowConfig, + loadConfig: () => + import("@/registry/remocn/ink-arrow/config").then( + (m) => m.inkArrowConfig, + ), }, backdrop: { load: () => import("@/components/docs/examples/backdrop-demo").then((m) => ({ default: m.BackdropDemo, })), - config: backdropConfig, + loadConfig: () => + import("@/registry/remocn/backdrop/config").then((m) => m.backdropConfig), }, drift: { load: () => import("@/components/docs/examples/drift-example").then((m) => ({ default: m.DriftExampleScene, })), - config: driftConfig, + loadConfig: () => + import("@/registry/remocn/drift/config").then((m) => m.driftConfig), }, "claude-chat": { load: () => import("@/registry/remocn/claude-chat").then((m) => ({ default: m.ClaudeChat, })), - config: claudeChatConfig, + loadConfig: () => + import("@/registry/remocn/claude-chat/config").then( + (m) => m.claudeChatConfig, + ), }, "chat-gpt": { load: () => import("@/registry/remocn/chat-gpt").then((m) => ({ default: m.ChatGpt, })), - config: chatGptConfig, + loadConfig: () => + import("@/registry/remocn/chat-gpt/config").then((m) => m.chatGptConfig), }, v0: { load: () => import("@/registry/remocn/v0").then((m) => ({ default: m.V0 })), - config: v0Config, + loadConfig: () => + import("@/registry/remocn/v0/config").then((m) => m.v0Config), }, "claude-code": { load: () => import("@/registry/remocn/claude-code").then((m) => ({ default: m.ClaudeCode, })), - config: claudeCodeConfig, + loadConfig: () => + import("@/registry/remocn/claude-code/config").then( + (m) => m.claudeCodeConfig, + ), }, opencode: { load: () => import("@/registry/remocn/opencode").then((m) => ({ default: m.OpenCode, })), - config: opencodeConfig, + loadConfig: () => + import("@/registry/remocn/opencode/config").then((m) => m.opencodeConfig), }, button: { load: () => import("@/registry/remocn-ui/button").then((m) => ({ default: m.Button, })), - config: buttonConfig, + loadConfig: () => + import("@/registry/remocn-ui/button/config").then((m) => m.buttonConfig), }, accordion: { load: () => import("@/registry/remocn-ui/accordion").then((m) => ({ default: m.Accordion, })), - config: accordionConfig, + loadConfig: () => + import("@/registry/remocn-ui/accordion/config").then( + (m) => m.accordionConfig, + ), }, "alert-dialog": { load: () => import("@/registry/remocn-ui/alert-dialog").then((m) => ({ default: m.AlertDialog, })), - config: alertDialogConfig, + loadConfig: () => + import("@/registry/remocn-ui/alert-dialog/config").then( + (m) => m.alertDialogConfig, + ), }, dialog: { load: () => import("@/registry/remocn-ui/dialog").then((m) => ({ default: m.Dialog, })), - config: dialogConfig, + loadConfig: () => + import("@/registry/remocn-ui/dialog/config").then((m) => m.dialogConfig), }, sheet: { load: () => import("@/registry/remocn-ui/sheet").then((m) => ({ default: m.Sheet })), - config: sheetConfig, + loadConfig: () => + import("@/registry/remocn-ui/sheet/config").then((m) => m.sheetConfig), }, drawer: { load: () => import("@/registry/remocn-ui/drawer").then((m) => ({ default: m.Drawer, })), - config: drawerConfig, + loadConfig: () => + import("@/registry/remocn-ui/drawer/config").then((m) => m.drawerConfig), }, checkbox: { load: () => import("@/registry/remocn-ui/checkbox").then((m) => ({ default: m.Checkbox, })), - config: checkboxConfig, + loadConfig: () => + import("@/registry/remocn-ui/checkbox/config").then( + (m) => m.checkboxConfig, + ), }, input: { load: () => import("@/registry/remocn-ui/input").then((m) => ({ default: m.Input })), - config: inputConfig, + loadConfig: () => + import("@/registry/remocn-ui/input/config").then((m) => m.inputConfig), }, // blur-in WRAPS a single child, so the customizer Component is the // preview-only BlurInPreview wrapper (it supplies a fixed sample card and @@ -1863,52 +2253,66 @@ const registry: Record = { import("@/registry/remocn-ui/blur-in/preview").then((m) => ({ default: m.BlurInPreview, })), - config: blurInConfig, + loadConfig: () => + import("@/registry/remocn-ui/blur-in/config").then((m) => m.blurInConfig), }, radio: { load: () => import("@/registry/remocn-ui/radio").then((m) => ({ default: m.Radio })), - config: radioConfig, + loadConfig: () => + import("@/registry/remocn-ui/radio/config").then((m) => m.radioConfig), }, switch: { load: () => import("@/registry/remocn-ui/switch").then((m) => ({ default: m.Switch, })), - config: switchConfig, + loadConfig: () => + import("@/registry/remocn-ui/switch/config").then((m) => m.switchConfig), }, select: { load: () => import("@/registry/remocn-ui/select").then((m) => ({ default: m.Select, })), - config: selectConfig, + loadConfig: () => + import("@/registry/remocn-ui/select/config").then((m) => m.selectConfig), }, "select-item": { load: () => import("@/registry/remocn-ui/select-item").then((m) => ({ default: m.SelectItem, })), - config: selectItemConfig, + loadConfig: () => + import("@/registry/remocn-ui/select-item/config").then( + (m) => m.selectItemConfig, + ), }, "dropdown-menu": { load: () => import("@/registry/remocn-ui/dropdown-menu").then((m) => ({ default: m.DropdownMenu, })), - config: dropdownMenuConfig, + loadConfig: () => + import("@/registry/remocn-ui/dropdown-menu/config").then( + (m) => m.dropdownMenuConfig, + ), }, "dropdown-menu-item": { load: () => import("@/registry/remocn-ui/dropdown-menu-item").then((m) => ({ default: m.DropdownMenuItem, })), - config: dropdownMenuItemConfig, + loadConfig: () => + import("@/registry/remocn-ui/dropdown-menu-item/config").then( + (m) => m.dropdownMenuItemConfig, + ), }, tabs: { load: () => import("@/registry/remocn-ui/tabs").then((m) => ({ default: m.Tabs })), - config: tabsConfig, + loadConfig: () => + import("@/registry/remocn-ui/tabs/config").then((m) => m.tabsConfig), }, // cursor's customizer Component is the preview-only CursorPreview wrapper (it // runs a fixed demo path through useCursorPath); the shipped Cursor is pure. @@ -1917,7 +2321,8 @@ const registry: Record = { import("@/registry/remocn-ui/cursor/preview").then((m) => ({ default: m.CursorPreview, })), - config: cursorConfig, + loadConfig: () => + import("@/registry/remocn-ui/cursor/config").then((m) => m.cursorConfig), }, // toast's customizer Component is the preview-only ToastPreview wrapper (it // centers the toast on a theme-background stage); the shipped Toast is a @@ -1927,28 +2332,38 @@ const registry: Record = { import("@/registry/remocn-ui/toast/preview").then((m) => ({ default: m.ToastPreview, })), - config: toastConfig, + loadConfig: () => + import("@/registry/remocn-ui/toast/config").then((m) => m.toastConfig), }, "message-bubble": { load: () => import("@/registry/remocn-ui/message-bubble/preview").then((m) => ({ default: m.MessageBubblePreview, })), - config: messageBubbleConfig, + loadConfig: () => + import("@/registry/remocn-ui/message-bubble/config").then( + (m) => m.messageBubbleConfig, + ), }, "typing-indicator": { load: () => import("@/registry/remocn-ui/typing-indicator/preview").then((m) => ({ default: m.TypingIndicatorPreview, })), - config: typingIndicatorConfig, + loadConfig: () => + import("@/registry/remocn-ui/typing-indicator/config").then( + (m) => m.typingIndicatorConfig, + ), }, "command-menu-item": { load: () => import("@/registry/remocn-ui/command-menu-item").then((m) => ({ default: m.CommandMenuItem, })), - config: commandMenuItemConfig, + loadConfig: () => + import("@/registry/remocn-ui/command-menu-item/config").then( + (m) => m.commandMenuItemConfig, + ), }, // command-menu needs NO preview wrapper: like dialog it renders an intrinsic // inset:0 backdrop + centered panel, so the customizer mounts it directly. @@ -1957,7 +2372,10 @@ const registry: Record = { import("@/registry/remocn-ui/command-menu").then((m) => ({ default: m.CommandMenu, })), - config: commandMenuConfig, + loadConfig: () => + import("@/registry/remocn-ui/command-menu/config").then( + (m) => m.commandMenuConfig, + ), }, // tooltip's customizer Component is the preview-only TooltipPreview wrapper: a // bare bubble has no backdrop and would not center as the composition root. @@ -1966,7 +2384,10 @@ const registry: Record = { import("@/registry/remocn-ui/tooltip/preview").then((m) => ({ default: m.TooltipPreview, })), - config: tooltipConfig, + loadConfig: () => + import("@/registry/remocn-ui/tooltip/config").then( + (m) => m.tooltipConfig, + ), }, // progress's customizer Component is the preview-only ProgressPreview wrapper: // a bare inline bar would sit top-left, so the wrapper centers it on a stage. @@ -1975,7 +2396,10 @@ const registry: Record = { import("@/registry/remocn-ui/progress/preview").then((m) => ({ default: m.ProgressPreview, })), - config: progressConfig, + loadConfig: () => + import("@/registry/remocn-ui/progress/config").then( + (m) => m.progressConfig, + ), }, // skeleton-block is the shimmer motion atom; its preview centers the bare block // on a stage. skeleton is the state atom whose preview supplies demo content + @@ -1985,14 +2409,20 @@ const registry: Record = { import("@/registry/remocn-ui/skeleton-block/preview").then((m) => ({ default: m.SkeletonBlockPreview, })), - config: skeletonBlockConfig, + loadConfig: () => + import("@/registry/remocn-ui/skeleton-block/config").then( + (m) => m.skeletonBlockConfig, + ), }, skeleton: { load: () => import("@/registry/remocn-ui/skeleton/preview").then((m) => ({ default: m.SkeletonPreview, })), - config: skeletonConfig, + loadConfig: () => + import("@/registry/remocn-ui/skeleton/config").then( + (m) => m.skeletonConfig, + ), }, // slider's customizer Component is the preview-only SliderPreview wrapper: a // bare inline bar would sit top-left, so the wrapper centers it on a stage. @@ -2001,7 +2431,8 @@ const registry: Record = { import("@/registry/remocn-ui/slider/preview").then((m) => ({ default: m.SliderPreview, })), - config: sliderConfig, + loadConfig: () => + import("@/registry/remocn-ui/slider/config").then((m) => m.sliderConfig), }, // combobox registers RAW (no preview wrapper): like select it paints its own // opaque inset:0 wrapper, so the customizer mounts it directly and it centers. @@ -2010,7 +2441,10 @@ const registry: Record = { import("@/registry/remocn-ui/combobox").then((m) => ({ default: m.Combobox, })), - config: comboboxConfig, + loadConfig: () => + import("@/registry/remocn-ui/combobox/config").then( + (m) => m.comboboxConfig, + ), }, // popover's customizer Component is the preview-only PopoverPreview wrapper: a // bare card has no backdrop and would not center as the composition root. @@ -2019,7 +2453,10 @@ const registry: Record = { import("@/registry/remocn-ui/popover/preview").then((m) => ({ default: m.PopoverPreview, })), - config: popoverConfig, + loadConfig: () => + import("@/registry/remocn-ui/popover/config").then( + (m) => m.popoverConfig, + ), }, // context-menu's customizer Component is the preview-only ContextMenuPreview // wrapper: a bare panel (transparent, caller-positioned) would sit top-left, @@ -2029,7 +2466,10 @@ const registry: Record = { import("@/registry/remocn-ui/context-menu/preview").then((m) => ({ default: m.ContextMenuPreview, })), - config: contextMenuConfig, + loadConfig: () => + import("@/registry/remocn-ui/context-menu/config").then( + (m) => m.contextMenuConfig, + ), }, // toggle-group registers RAW (no preview wrapper): like tabs it paints its own // opaque inset:0 centered stage, so the customizer mounts it directly. @@ -2038,7 +2478,10 @@ const registry: Record = { import("@/registry/remocn-ui/toggle-group").then((m) => ({ default: m.ToggleGroup, })), - config: toggleGroupConfig, + loadConfig: () => + import("@/registry/remocn-ui/toggle-group/config").then( + (m) => m.toggleGroupConfig, + ), }, // stepper's customizer Component is the preview-only StepperPreview wrapper: a // bare wide horizontal element would sit top-left, so the wrapper centers it. @@ -2047,7 +2490,10 @@ const registry: Record = { import("@/registry/remocn-ui/stepper/preview").then((m) => ({ default: m.StepperPreview, })), - config: stepperConfig, + loadConfig: () => + import("@/registry/remocn-ui/stepper/config").then( + (m) => m.stepperConfig, + ), }, // resizable registers RAW (no preview wrapper): its index.tsx already paints // an opaque inset:0 stage that centers the fixed-size bordered box, like tabs. @@ -2056,231 +2502,120 @@ const registry: Record = { import("@/registry/remocn-ui/resizable").then((m) => ({ default: m.Resizable, })), - config: resizableConfig, + loadConfig: () => + import("@/registry/remocn-ui/resizable/config").then( + (m) => m.resizableConfig, + ), }, spinner: { load: () => import("@/registry/remocn-ui/spinner").then((m) => ({ default: m.Spinner, })), - config: spinnerConfig, + loadConfig: () => + import("@/registry/remocn-ui/spinner/config").then( + (m) => m.spinnerConfig, + ), }, caret: { load: () => import("@/registry/remocn-ui/caret/preview").then((m) => ({ default: m.CaretPreview, })), - config: caretConfig, + loadConfig: () => + import("@/registry/remocn-ui/caret/config").then((m) => m.caretConfig), }, "ascii-dissolve": { load: () => import("@/components/docs/examples/ascii-dissolve-example").then((m) => ({ default: m.AsciiDissolveExampleScene, })), - config: asciiDissolveConfig, + loadConfig: () => + import("@/registry/remocn/ascii-dissolve/config").then( + (m) => m.asciiDissolveConfig, + ), }, "caret-wipe": { load: () => import("@/components/docs/examples/caret-wipe-example").then((m) => ({ default: m.CaretWipeExampleScene, })), - config: caretWipeConfig, + loadConfig: () => + import("@/registry/remocn/caret-wipe/config").then( + (m) => m.caretWipeConfig, + ), }, "icon-scatter": { load: () => import("@/components/docs/examples/icon-scatter-example").then((m) => ({ default: m.IconScatterExampleScene, })), - config: iconScatterConfig, + loadConfig: () => + import("@/registry/remocn/icon-scatter/config").then( + (m) => m.iconScatterConfig, + ), }, "shader-caustics": { load: () => import("@/registry/remocn/shader-caustics").then((m) => ({ default: m.ShaderCaustics, })), - config: shaderCausticsConfig, + loadConfig: () => + import("@/registry/remocn/shader-caustics/config").then( + (m) => m.shaderCausticsConfig, + ), }, "shader-gem-smoke": { load: () => import("@/registry/remocn/shader-gem-smoke").then((m) => ({ default: m.ShaderGemSmoke, })), - config: shaderGemSmokeConfig, + loadConfig: () => + import("@/registry/remocn/shader-gem-smoke/config").then( + (m) => m.shaderGemSmokeConfig, + ), }, "shader-strata": { load: () => import("@/registry/remocn/shader-strata").then((m) => ({ default: m.ShaderStrata, })), - config: shaderStrataConfig, + loadConfig: () => + import("@/registry/remocn/shader-strata/config").then( + (m) => m.shaderStrataConfig, + ), }, "shader-weave": { load: () => import("@/registry/remocn/shader-weave").then((m) => ({ default: m.ShaderWeave, })), - config: shaderWeaveConfig, + loadConfig: () => + import("@/registry/remocn/shader-weave/config").then( + (m) => m.shaderWeaveConfig, + ), }, reel: { load: () => import("@/components/docs/examples/reel-example").then((m) => ({ default: m.ReelExampleScene, })), - config: reelConfig, + loadConfig: () => + import("@/registry/remocn/reel/config").then((m) => m.reelConfig), }, }; -// Append the shared controls (e.g. `speed`) to every component config so -// every animation in the customizer exposes the same baseline knobs. -for (const { config } of Object.values(registry)) { - config.controls = { ...config.controls, ...SHARED_CONTROLS }; -} - -const backdrop = registry.backdrop; -if (backdrop) { - delete backdrop.config.controls.speed; -} - -// github-stars must land its count-up exactly on the final frame. A speed < 1 -// would stop the shared progress driver short (the count never reaches the -// total), so this component intentionally deviates from SHARED_CONTROLS and -// caps `speed` at a minimum of 1. Reassigning the existing key keeps its order. -const githubStars = registry["github-stars"]; -if (githubStars) { - githubStars.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -// github-sponsors plays its heart draw, avatar blur-stagger, and headline/CTA -// off the shared progress timeline; a speed < 1 would stall the driver before -// the lockup completes, so cap min:1 like github-stars. -const githubSponsors = registry["github-sponsors"]; -if (githubSponsors) { - githubSponsors.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const numberWheel = registry["number-wheel"]; -if (numberWheel) { - numberWheel.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const rollingNumber = registry["rolling-number"]; -if (rollingNumber) { - rollingNumber.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const xFollowCard = registry["x-follow-card"]; -if (xFollowCard) { - xFollowCard.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -// x-followers-overview cycles notifications then blur-reveals the total at a -// fixed point in the timeline. A speed < 1 would stall the driver before the -// reveal frame, so cap min:1 like github-stars. -const xFollowersOverview = registry["x-followers-overview"]; -if (xFollowersOverview) { - xFollowersOverview.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const claudeChat = registry["claude-chat"]; -if (claudeChat) { - claudeChat.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const chatGpt = registry["chat-gpt"]; -if (chatGpt) { - chatGpt.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const v0 = registry.v0; -if (v0) { - v0.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} - -const claudeCode = registry["claude-code"]; -if (claudeCode) { - claudeCode.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; -} +const configCache = new Map>(); -const opencode = registry.opencode; -if (opencode) { - opencode.config.controls.speed = { - type: "number", - default: 1, - min: 1, - max: 4, - step: 0.25, - label: "Speed", - }; +export function loadComponentConfig(slug: string): Promise { + let promise = configCache.get(slug); + if (!promise) { + const entry = registry[slug]; + if (!entry) throw new Error(`Unknown registry entry: ${slug}`); + promise = entry.loadConfig().then((config) => resolveConfig(slug, config)); + configCache.set(slug, promise); + } + return promise; } export default registry; diff --git a/registry/__manifest__.ts b/registry/__manifest__.ts new file mode 100644 index 00000000..4b551f48 --- /dev/null +++ b/registry/__manifest__.ts @@ -0,0 +1,4095 @@ +// GENERATED FILE — do not edit by hand. +// Run `bun run manifest:build` after changing any registry config. +// +// The playback slice of every registry config: everything a preview needs to +// mount a Player, and nothing it needs only to render the customizer panel. +// Consumers that just play a component (cards, changelog, icon gallery) read +// this instead of importing 263 config modules into the client bundle. + +import type { BackdropFill } from "@/registry/remocn/backdrop"; + +export interface PreviewManifestEntry { + durationInFrames: number; + fps: number; + compositionWidth: number; + compositionHeight: number; + previewBackdrop?: BackdropFill; + defaults: Record; +} + +export const previewManifest: Record = { + accordion: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Is it accessible?", + content: "Yes. It adheres to the WAI-ARIA design pattern.", + variant: "default", + state: "opened", + speed: 1, + }, + }, + "alert-dialog": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Delete account?", + description: + "This action cannot be undone. This will permanently remove your data from our servers.", + actionLabel: "Delete", + cancelLabel: "Cancel", + state: "opened", + speed: 1, + }, + }, + "animated-bar-chart": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + barColor: "#0ea5e9", + gap: 16, + staggerFrames: 6, + speed: 1, + }, + }, + "animated-line-chart": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + strokeColor: "#22c55e", + strokeWidth: 4, + gridColor: "#27272a", + showDot: true, + speed: 1, + }, + }, + "ascii-dissolve": { + durationInFrames: 100, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0d0d10", + }, + defaults: { + colorBack: "#0d0d10", + colorFront: "#f2f2f2", + cellSize: 22, + speed: 1, + }, + }, + "ascii-render": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + glyphSize: 26, + charset: " .:-=+*#%@", + colored: false, + ink: "#9dff9d", + intensity: 1, + speed: 1, + }, + }, + backdrop: { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + fillType: "gradient", + color: "#6366f1", + gradient: "linear-gradient(135deg, #6366f1 0%, #a855f7 100%)", + image: "/hero.png", + padding: 4, + radius: 1, + shadow: "0 20px 60px rgba(0,0,0,0.4)", + }, + }, + "blur-in": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + state: "revealed", + blur: 8, + distance: 12, + direction: "up", + speed: 1, + }, + }, + "blur-out-up": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Clear in, airy out.", + staggerDelay: 1, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "bottom-up-letters": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Shift", + staggerDelay: 3, + distance: 46, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + button: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Continue", + variant: "default", + size: "default", + state: "loading", + primary: "#171717", + speed: 1, + }, + }, + "camera-lens": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + softness: 0.5, + bloom: 0.5, + aberration: 0.5, + vignette: 0.5, + distortion: 0.05, + speed: 1, + }, + }, + caret: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + height: 28, + width: 3, + radius: 1, + blink: true, + blinkPerSecond: 1, + color: "#1F1E1D", + speed: 1, + }, + }, + "caret-wipe": { + durationInFrames: 100, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0d0d10", + }, + defaults: { + direction: "right", + caretColor: "#C3E88D", + caretWidth: 3, + speed: 1, + }, + }, + "chat-gpt": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#FFFFFF", + }, + defaults: { + greeting: "What's on your mind today?", + placeholder: "Ask anything", + prompt: "Make a sunset over a calm ocean", + accentColor: "#2F6FED", + speed: 1, + }, + }, + "chat-to-preview-layout": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + startChatRatio: 0.5, + endChatRatio: 0.25, + speed: 1, + }, + }, + "check-list": { + durationInFrames: 360, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + fontSize: 40, + itemGap: 18, + closeGap: 9, + perStep: 1.6, + strokeWidth: 3, + color: "#26242c", + tickColor: "#6f7f35", + step: 3, + speed: 1, + }, + }, + checkbox: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "", + size: "default", + state: "checked", + primary: "#171717", + speed: 1, + }, + }, + "claude-chat": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#F5F4EF", + }, + defaults: { + greeting: "Back at it, Dima", + placeholder: "Try: draft an email · summarize a doc · plan your week", + prompt: "Draft a launch tweet for our new release", + modelName: "Opus 4.8", + modelTier: "Max", + accentColor: "#D97757", + speed: 1, + }, + }, + "claude-code": { + durationInFrames: 160, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#2B2A28", + }, + defaults: { + title: "Claude Code v2.0.0", + userName: "Remocn", + model: "Opus 4.8 • Max 20x", + cwd: "/users/remocn/code/apps", + placeholder: 'Try "edit to ..."', + prompt: "edit src/theme.ts to add a dark mode toggle", + accentColor: "#D97757", + speed: 1, + }, + }, + combobox: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + state: "opened", + query: "", + revealCount: 0, + placeholder: "Select a fruit…", + selectedIndex: -1, + highlightedIndex: 0, + speed: 1, + }, + }, + "command-menu": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + state: "opened", + query: "", + revealCount: 0, + selectedIndex: -1, + highlightedIndex: 0, + speed: 1, + }, + }, + "command-menu-item": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Settings", + icon: "settings", + shortcut: "⌘ S", + state: "selected", + speed: 1, + }, + }, + confetti: { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + particleCount: 140, + power: 17, + gravity: 0.45, + size: 13, + seed: 1, + speed: 1, + }, + }, + "context-menu": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + state: "opened", + highlightedIndex: 1, + speed: 1, + }, + }, + "crt-screen": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + curvature: 1, + scanlines: 1, + maskScale: 2, + vignette: 1, + speed: 1, + }, + }, + "crumple-toss": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + at: 6, + crumpleSteps: 4, + tossSteps: 5, + direction: -35, + distance: 440, + spin: 220, + segments: 9, + layers: 2, + randomness: 0.6, + crushTo: 0.34, + seed: "toss", + step: 3, + speed: 1, + }, + }, + cursor: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + variant: "arrow", + size: 28, + rippleColor: "#171717", + speed: 1, + }, + }, + "data-flow-pipes": { + durationInFrames: 180, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#050505", + }, + defaults: { + pipeColor: "#1f1f23", + pulseColor: "#22d3ee", + pulseLength: 60, + pulseDuration: 36, + nodeColor: "#0a0a0a", + textColor: "#fafafa", + speed: 1, + }, + }, + dialog: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Edit profile", + description: + "Make changes to your profile here. Click save when you're done.", + actionLabel: "Save changes", + cancelLabel: "Cancel", + state: "opened", + speed: 1, + }, + }, + displacement: { + durationInFrames: 72, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + grid: 60, + cellAspect: 1, + shift: 1, + aberration: 1, + grain: 0.5, + stagger: 0.45, + speed: 1, + }, + }, + "dither-dissolve": { + durationInFrames: 100, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + shape: "simplex", + colorBack: "#141318", + colorFront: "#8f88ae", + speed: 1, + }, + }, + drawer: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Edit profile", + description: + "Make changes to your profile here. Click save when you're done.", + actionLabel: "Save changes", + cancelLabel: "Cancel", + state: "opened", + speed: 1, + }, + }, + drift: { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + grow: 0.035, + speed: 1, + }, + }, + "dropdown-menu": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Options", + state: "opened", + highlightedIndex: 0, + speed: 1, + }, + }, + "dropdown-menu-item": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Profile", + state: "hover", + speed: 1, + }, + }, + "ecosystem-constellation": { + durationInFrames: 240, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "gradient", + value: "radial-gradient(ellipse at center, #14101e 0%, #05030a 75%)", + }, + defaults: { + satelliteCount: 6, + centerLabel: "V", + accentColor: "#a855f7", + speed: 1, + }, + }, + "ember-burn": { + durationInFrames: 80, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + patches: 5, + edgeSoftness: 0.07, + contentBias: 0.6, + heat: 0.5, + glowColor: "#ff7a2f", + emberAmount: 0.5, + speed: 1, + }, + }, + "fade-through": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + fromText: "Calm transitions.", + toText: "Fade through content.", + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "focus-blur-resolve": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Focus resolves clearly.", + blur: 14, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "focus-pull": { + durationInFrames: 114, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + blur: 16, + speed: 1, + }, + }, + "github-sponsors": { + durationInFrames: 270, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + account: "remocn", + accentColor: "#db61a2", + theme: "light", + speed: 1, + }, + }, + "github-stars": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + repo: "Remocn/remocn", + totalStars: 24813, + orientation: "horizontal", + accentColor: "#ffbb00", + theme: "light", + speed: 1, + }, + }, + "glass-code-block": { + durationInFrames: 180, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "image", + src: "/bg.jpg", + }, + defaults: { + title: "hero.tsx", + width: 760, + height: 460, + fontSize: 16, + glassColor: "rgba(10, 10, 10, 0.6)", + staggerFrames: 4, + showTrafficLights: true, + speed: 1, + }, + }, + "glass-code-walk": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "image", + src: "/bg.jpg", + }, + defaults: { + title: "scene.tsx", + zoom: 2.6, + fontSize: 18, + staggerFrames: 10, + width: 880, + height: 420, + speed: 1, + }, + }, + "glitch-cut": { + durationInFrames: 78, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + intensity: 1, + slices: 24, + rgbSplit: 1, + blockNoise: 0.6, + speed: 1, + }, + }, + "grain-dissolve": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + shape: "blob", + noise: 0.3, + zoom: 2, + colorBack: "#141318", + speed: 1, + }, + }, + "grid-wave": { + durationInFrames: 84, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + tileSize: 90, + waveWidth: 0.16, + lift: 2, + gap: 0.12, + tint: "#8fb4ff", + direction: "ripple", + speed: 1, + }, + }, + "halftone-print": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#26231d", + }, + defaults: { + dotSize: 10, + angle: 0, + misregistration: 1.2, + paperTint: "#f4efe4", + speed: 1, + }, + }, + "hand-count": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + to: 1284, + from: 0, + durationSteps: 18, + decimals: 0, + prefix: "", + suffix: "", + fontSize: 96, + color: "#26242c", + ease: "in-out", + seed: "count", + step: 3, + speed: 1, + }, + }, + handwrite: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + text: "Made by hand", + fontSize: 72, + perStep: 1.6, + weight: "600", + color: "#26242c", + align: "center", + step: 3, + speed: 1, + }, + }, + hologram: { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#04070d", + }, + defaults: { + tint: "#63e8ff", + glow: 1, + ghost: 1, + flicker: 1, + intensity: 1, + speed: 1, + }, + }, + "icon-activity": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-alert-triangle": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-arrow-down": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-arrow-left": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-arrow-right": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-arrow-up": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-at-sign": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-award": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-bar-chart-3": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-bell": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-bookmark": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-calendar": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-camera": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-check": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-check-circle": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-chevron-down": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-chevron-left": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-chevron-right": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-chevron-up": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-clock": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-cloud": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-code": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-copy": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-credit-card": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-crown": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-database": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-dollar-sign": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-download": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-external-link": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-eye": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-eye-off": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-file-text": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-filter": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-flame": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-folder": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-gem": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-gift": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-globe": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-heart": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-help-circle": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-home": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-image": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-inbox": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-info": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-key": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-layout-grid": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-link": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-loader": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-lock": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-log-out": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-mail": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-maximize": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-menu": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-message-circle": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-mic": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-monitor": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-moon": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-more-horizontal": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-package": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-party-popper": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-pause": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-pencil": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-phone": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-play": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-plus": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-plus-circle": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-refresh-cw": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-rocket": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-save": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-scatter": { + durationInFrames: 100, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + count: 15, + color: "#fafafa", + coverColor: "#0a0a0a", + flyDistance: 260, + speed: 1, + }, + }, + "icon-search": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-send": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-settings": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-share-2": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-shield": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-shopping-cart": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-skip-forward": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-smartphone": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-sparkles": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: true, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-star": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-sun": { + durationInFrames: 85, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-tag": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-target": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-terminal": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-thumbs-up": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-timer": { + durationInFrames: 90, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-trash": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-trending-down": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-trending-up": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-trophy": { + durationInFrames: 85, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-upload": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-user": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-user-plus": { + durationInFrames: 75, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-users": { + durationInFrames: 80, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-video": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-volume-2": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-volume-x": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-wallet": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-x": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-x-circle": { + durationInFrames: 70, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "icon-zap": { + durationInFrames: 60, + fps: 30, + compositionWidth: 48, + compositionHeight: 48, + defaults: { + animation: "both", + loop: false, + size: 48, + color: "#171717", + strokeWidth: 2, + speed: 1, + }, + }, + "infinite-bento-pan": { + durationInFrames: 300, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#050505", + }, + defaults: { + panSpeed: 1, + accentColor: "#7c3aed", + speed: 1, + }, + }, + "infinite-marquee": { + durationInFrames: 180, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#fafafa", + }, + defaults: { + text: "ship · build · animate · ", + fontSize: 120, + color: "#171717", + fontWeight: "700", + pixelsPerFrame: 4, + stroke: false, + strokeColor: "#171717", + speed: 1, + }, + }, + "ink-arrow": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + curvature: 0.35, + strokeWidth: 8, + pressure: 0.2, + release: 1, + grain: 1, + headSize: 24, + drawDur: 36, + headDur: 12, + color: "#26242c", + seed: "arrow", + step: 3, + speed: 1, + }, + }, + "ink-underline": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + width: 420, + color: "#6f7f35", + thickness: 9, + pressure: 1, + release: 0.15, + grain: 1, + durationSteps: 5, + seed: "ink", + step: 3, + speed: 1, + }, + }, + "inline-highlight": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + before: "Ship faster with ", + highlight: "remocn", + after: ".", + baseColor: "#171717", + highlightColor: "#ff5e3a", + fontSize: 72, + fontWeight: "600", + speed: 1, + }, + }, + input: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + placeholder: "you@example.com", + value: "remotion@remocn.dev", + size: "default", + state: "typing", + primary: "#171717", + speed: 1, + }, + }, + "kinetic-center-build": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Words push left.", + entryOffset: 88, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "line-by-line-slide": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Think different.\nDo more.", + distance: 48, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "live-code-compilation": { + durationInFrames: 260, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + accentColor: "#3b82f6", + speed: 1, + }, + }, + "logo-enter": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + diameter: 118, + overlap: 38, + ringColor: "#fff", + orientation: "horizontal", + stagger: 7, + speed: 1, + }, + }, + "marker-highlight": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + before: "Made for ", + highlight: "builders", + after: ".", + markerColor: "#facc15", + baseColor: "#171717", + highlightedTextColor: "#171717", + fontSize: 72, + fontWeight: "600", + speed: 1, + }, + }, + "mask-reveal-up": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Designed to move.\nBuilt to focus.", + distance: 30, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "matrix-decode": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "DECRYPTED", + charset: "!@#$%^&*()_+-=<>?/\\|", + fontSize: 72, + color: "#22c55e", + fontWeight: "600", + revealDuration: 60, + speed: 1, + }, + }, + "message-bubble": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + text: "Yep, pushing it live now", + variant: "incoming", + reaction: "🔥", + state: "visible", + speed: 1, + }, + }, + "micro-scale-fade": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Welcome to motion.", + scaleFrom: 0.96, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "number-wheel": { + durationInFrames: 112, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + from: 0, + to: 24813, + fontSize: 120, + color: "#171717", + speed: 1, + }, + }, + opencode: { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#000000", + }, + defaults: { + placeholder: "Ask anything... ", + query: '"What is the tech stack of this project?"', + agentName: "Build", + modelName: "Kimi K2.5", + provider: "Moonshot AI", + accentColor: "#2B7FFF", + speed: 1, + }, + }, + "page-turn": { + durationInFrames: 128, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + angle: -7, + poses: 8, + speed: 1, + }, + }, + "paper-sticker": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + at: 0, + padding: "10px 16px", + background: "#fbfaf6", + maxTilt: 2.6, + seed: "sticker", + step: 3, + speed: 1, + }, + }, + "paper-wobble": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + amp: 1.4, + rotAmp: 0.35, + seed: "wobble", + step: 3, + speed: 1, + }, + }, + "particle-dissolve": { + durationInFrames: 84, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + particleSize: 4, + scatter: 0.08, + shimmer: 0.6, + aberration: 0.5, + direction: "reveal", + stagger: 0.55, + speed: 1, + }, + }, + "per-character-rise": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "One more thing.", + distance: 32, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "per-word-crossfade": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + fromText: "Beautifully simple.", + toText: "Designed for focus.", + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "perlin-dissolve": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + colorFront: "#8f88ae", + colorBack: "#141318", + softness: 0.1, + speed: 1, + }, + }, + "perspective-marquee": { + durationInFrames: 240, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#050505", + }, + defaults: { + fontSize: 84, + color: "#fafafa", + fontWeight: "700", + pixelsPerFrame: 2, + rotateY: -28, + rotateX: 8, + perspective: 1200, + fadeColor: "#050505", + speed: 1, + }, + }, + "pixelate-region": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + cellSize: 24, + speed: 1, + }, + }, + polaroid: { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + caption: "first light", + captionAt: 0, + width: 652, + captionSize: 36, + step: 3, + speed: 1, + }, + }, + popover: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Dimensions", + description: "Set the dimensions for the layer.", + side: "bottom", + width: 288, + state: "opened", + speed: 1, + }, + }, + progress: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + value: 62, + width: 320, + showLabel: true, + speed: 1, + }, + }, + "progress-steps": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + orientation: "horizontal", + activeColor: "#22c55e", + inactiveColor: "#27272a", + textColor: "#ffffff", + stepDuration: 30, + speed: 1, + }, + }, + "push-through": { + durationInFrames: 112, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + zoom: 2.4, + blur: 14, + speed: 1, + }, + }, + radio: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "", + size: "default", + state: "checked", + primary: "#171717", + speed: 1, + }, + }, + reel: { + durationInFrames: 160, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0b0b0c", + }, + defaults: { + width: 1180, + height: 676, + radius: 16, + step: 20, + reveal: 13, + speed: 1, + }, + }, + resizable: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + ratio: 0.5, + handleState: "idle", + direction: "horizontal", + speed: 1, + }, + }, + "rgb-glitch-text": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "GLITCH", + fontSize: 96, + color: "#171717", + fontWeight: "700", + glitchAt: 20, + glitchDuration: 8, + intensity: 6, + seed: "glitch", + speed: 1, + }, + }, + "ripple-zoom": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + zoom: 4, + intensity: 0.5, + softness: 0.5, + colorBack: "#141318", + speed: 1, + }, + }, + "rolling-number": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + from: 0, + to: 24813, + fontSize: 120, + color: "#171717", + speed: 1, + }, + }, + "rolodex-flip": { + durationInFrames: 110, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + interval: 20, + flipDuration: 10, + speed: 1, + }, + }, + "scale-down-fade": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Quietly refined.", + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "scribble-circle": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f1eee7", + }, + defaults: { + laps: 1.15, + strokeWidth: 14, + pressure: 0.2, + grain: 1, + durationSteps: 10, + color: "#6f7f35", + seed: "scribble", + step: 3, + speed: 1, + }, + }, + "security-cam": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + compression: 0.7, + blockSize: 10, + noise: 0.6, + intensity: 1, + speed: 1, + }, + }, + select: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Select a fruit", + state: "opened", + selectedIndex: 1, + highlightedIndex: -1, + speed: 1, + }, + }, + "select-item": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Banana", + state: "selected", + speed: 1, + }, + }, + "shader-caustics": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + scale: 5.2, + intensity: 1, + accent: "#7F57FF", + accentAmount: 0, + }, + }, + "shader-color-panels": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + density: 3, + length: 1.1, + colorBack: "#12121a", + }, + }, + "shader-dithering": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + size: 2, + colorBack: "#12121a", + colorFront: "#6a6a85", + }, + }, + "shader-dot-orbit": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + size: 1, + spreading: 1, + colorBack: "#12121a", + }, + }, + "shader-gem-smoke": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + colorBack: "#0a0a10", + innerDistortion: 0.8, + outerDistortion: 0.6, + size: 0.8, + }, + }, + "shader-god-rays": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + intensity: 0.8, + density: 0.3, + bloom: 0.4, + colorBack: "#12121a", + }, + }, + "shader-grain-gradient": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + softness: 0.6, + intensity: 0.2, + noise: 0.15, + colorBack: "#12121a", + }, + }, + "shader-liquid-metal": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + distortion: 0.1, + repetition: 1.5, + contour: 0.4, + colorBack: "#2a2a30", + colorTint: "#8a8a95", + }, + }, + "shader-mesh-gradient": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + distortion: 0.6, + swirl: 0.1, + }, + }, + "shader-metaballs": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + count: 10, + size: 0.83, + colorBack: "#12121a", + }, + }, + "shader-neuro-noise": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + brightness: 0.05, + contrast: 0.3, + colorBack: "#12121a", + colorMid: "#4a4a68", + }, + }, + "shader-perlin-noise": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + proportion: 0.35, + softness: 0.1, + colorBack: "#12121a", + colorFront: "#6a6a85", + }, + }, + "shader-pulsing-border": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + thickness: 0.1, + roundness: 0.25, + intensity: 0.2, + colorBack: "#12121a", + }, + }, + "shader-simplex-noise": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + stepsPerColor: 2, + softness: 0.1, + }, + }, + "shader-smoke-ring": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + radius: 0.25, + thickness: 0.65, + scale: 0.8, + colorBack: "#12121a", + }, + }, + "shader-spiral": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + density: 1, + strokeWidth: 0.5, + softness: 0.2, + colorBack: "#12121a", + }, + }, + "shader-strata": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + layers: 14, + amplitude: 0.16, + accent: "#6733FF", + accentAmount: 0, + }, + }, + "shader-swirl": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + bandCount: 4, + twist: 0.1, + softness: 0.2, + colorBack: "#12121a", + }, + }, + "shader-voronoi": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + distortion: 0.4, + gap: 0.04, + glow: 0, + colorGap: "#12121a", + }, + }, + "shader-warp": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + distortion: 0.2, + swirl: 0.4, + softness: 1, + proportion: 0.5, + }, + }, + "shader-water": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + waves: 0.3, + caustic: 0.08, + highlights: 0.06, + colorBack: "#16202b", + }, + }, + "shader-weave": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + speed: 1, + scale: 22, + warp: 0.03, + accent: "#6733FF", + accentAmount: 0, + }, + }, + "shared-axis-y": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + fromText: "Layered navigation.", + toText: "Hierarchy made clear.", + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "shared-axis-z": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + fromText: "Zooming between states.", + toText: "Elevate and settle.", + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + sheet: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Edit profile", + description: + "Make changes to your profile here. Click save when you're done.", + actionLabel: "Save changes", + cancelLabel: "Cancel", + state: "opened", + speed: 1, + }, + }, + "shimmer-sweep": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "Generating", + baseColor: "#3f3f46", + shineColor: "#fafafa", + fontSize: 96, + fontWeight: "700", + speed: 1, + }, + }, + "short-slide-down": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Build from above.", + entryOffset: 28, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "short-slide-right": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Move with intent.", + distance: 24, + staggerDelay: 3, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "simulated-cursor": { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + color: "#ffffff", + size: 32, + speed: 1, + }, + }, + skeleton: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + layout: "card", + state: "loading", + speed: 1, + }, + }, + "skeleton-block": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + width: 240, + height: 20, + radius: 6, + speed: 1, + }, + }, + "slide-swap": { + durationInFrames: 210, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + axis: "x", + inDistance: 0.28, + outDistance: 0.1, + slideFrames: 30, + speed: 1, + }, + }, + slider: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + value: 40, + thumbState: "idle", + width: 320, + showValue: true, + speed: 1, + }, + }, + "slot-machine-roll": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + from: "$99", + to: "$199", + fontSize: 120, + color: "#171717", + fontWeight: "700", + speed: 1, + }, + }, + "smoke-dissolve": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + ringColor: "#8f88ae", + colorBack: "#141318", + speed: 1, + }, + }, + "soft-blur-in": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Think different.", + blur: 12, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + spinner: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + size: 20, + strokeWidth: 2.5, + speed: 1, + }, + }, + "spring-scale-in": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Fast. Crisp. Fluid.", + staggerDelay: 3, + scaleFrom: 0.7, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "spring-settle": { + durationInFrames: 213, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + enterScale: 1.24, + enterStagger: 3, + exitScale: 0.84, + exitFrames: 6, + speed: 1, + }, + }, + "staggered-fade-up": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "Ship faster with remocn", + staggerDelay: 4, + distance: 20, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + stepper: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + activeIndex: 1, + speed: 1, + }, + }, + "strikethrough-replace": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + from: "$49/mo", + to: "Free", + lineColor: "#ff5e3a", + fontSize: 96, + color: "#171717", + fontWeight: "700", + speed: 1, + }, + }, + "sustained-glitch": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + intensity: 1, + frequency: 1, + slices: 24, + seed: 1, + speed: 1, + }, + }, + "swirl-dissolve": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + bandCount: 10, + softness: 0.35, + colorBack: "#141318", + speed: 1, + }, + }, + switch: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "", + size: "default", + state: "checked", + primary: "#171717", + speed: 1, + }, + }, + tabs: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + state: "Account", + variant: "pill", + speed: 1, + }, + }, + "terminal-cursor-zoom": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0B0B0C", + }, + defaults: { + command: "npx shadcn add @remocn/terminal-cursor-zoom", + zoom: 2.8, + fontSize: 20, + prompt: "$", + title: "~/code/remocn-demo", + speed: 1, + }, + }, + "terminal-simulator": { + durationInFrames: 240, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#050505", + }, + defaults: { + prompt: "$", + title: "~/projects/remocn", + background: "#0a0a0a", + chromeColor: "#1a1a1a", + fontSize: 18, + charsPerFrame: 1, + chunkSize: 1, + speed: 1, + }, + }, + toast: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + title: "Changes saved", + description: "Your profile has been updated.", + variant: "success", + state: "visible", + speed: 1, + }, + }, + "toggle-group": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + state: "Monthly", + size: "default", + speed: 1, + }, + }, + tooltip: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + label: "Add to library", + side: "top", + state: "visible", + speed: 1, + }, + }, + "top-down-letters": { + durationInFrames: 60, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + text: "Signal", + staggerDelay: 3, + distance: 46, + fontSize: 72, + color: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "tracking-in": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "tracking in", + startTracking: 0.5, + startBlur: 12, + fontSize: 96, + color: "#171717", + fontWeight: "700", + speed: 1, + }, + }, + "tv-power-off": { + durationInFrames: 62, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#050505", + }, + defaults: { + durationInFrames: 18, + gain: 1, + afterglow: 1, + phosphor: "#d8ecff", + speed: 1, + }, + }, + typewriter: { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + defaults: { + text: "console.log('hello, world')", + cursor: true, + charsPerSecond: 22, + fontSize: 72, + color: "#171717", + cursorColor: "#171717", + fontWeight: "600", + speed: 1, + }, + }, + "typing-indicator": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "oklch(1 0 0)", + }, + defaults: { + dotCount: 3, + size: 8, + amplitude: 5, + speed: 1, + }, + }, + "underwater-ripple": { + durationInFrames: 120, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#06171c", + }, + defaults: { + amplitude: 7, + scale: 1, + speed: 1, + dispersion: 1, + }, + }, + v0: { + durationInFrames: 150, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#000000", + }, + defaults: { + greeting: "What do you want to create?", + placeholder: "Ask v0 to build…", + prompt: "a landing page for my SaaS with pricing and testimonials", + modelName: "v0 Max", + projectName: "Project", + speed: 1, + }, + }, + "value-swap": { + durationInFrames: 100, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + duration: 10, + distance: 12, + direction: "up", + speed: 1, + }, + }, + "vhs-filter": { + durationInFrames: 90, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#0a0a0a", + }, + defaults: { + bleed: 1, + wobble: 1, + noise: 1, + intensity: 1, + speed: 1, + }, + }, + "warp-dissolve": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + distortion: 0.8, + swirl: 0.6, + softness: 1, + speed: 1, + }, + }, + "wave-wipe": { + durationInFrames: 116, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + intensity: 0.2, + softness: 0.7, + noise: 0.4, + colorBack: "#141318", + speed: 1, + }, + }, + "whip-pan": { + durationInFrames: 114, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + direction: "left", + blur: 24, + speed: 1, + }, + }, + "x-follow-card": { + durationInFrames: 165, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#f5f7f9", + }, + defaults: { + name: "remocn", + handle: "remocn", + bio: "Production-ready components for Remotion - text animations, backgrounds, transitions, UI blocks, and full scene compositions", + avatarUrl: "/logo.svg", + coverUrl: "/imgs/x-cover.png", + location: "Ukraine", + website: "remocn.dev", + joined: "January 2024", + verified: true, + accentColor: "#1d9bf0", + orientation: "horizontal", + speed: 1, + }, + }, + "x-followers-overview": { + durationInFrames: 360, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#ffffff", + }, + defaults: { + totalFollowers: 1709, + handle: "remocn", + avatarUrl: "/logo.svg", + accentColor: "#1d9bf0", + orientation: "horizontal", + speed: 1, + }, + }, + "zoom-blur": { + durationInFrames: 114, + fps: 30, + compositionWidth: 1280, + compositionHeight: 720, + previewBackdrop: { + type: "color", + value: "#141318", + }, + defaults: { + blur: 16, + rise: 0, + speed: 1, + }, + }, +}; + +export default previewManifest; diff --git a/scripts/21st/generate.mts b/scripts/21st/generate.mts index 3147fced..431700a5 100644 --- a/scripts/21st/generate.mts +++ b/scripts/21st/generate.mts @@ -7,7 +7,7 @@ import { } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import registry from "@/registry/__index__"; +import registry, { loadComponentConfig } from "@/registry/__index__"; const here = path.dirname(fileURLToPath(import.meta.url)); const root = path.resolve(here, "..", ".."); @@ -259,7 +259,7 @@ for (const ns of ["remocn", "remocn-icons"] as const) { continue; } - const config = entry.config; + const config = await loadComponentConfig(slug); const backdrop = config.previewBackdrop; const background = backdrop && (backdrop.type === "color" || backdrop.type === "gradient") diff --git a/scripts/build-preview-manifest.mts b/scripts/build-preview-manifest.mts new file mode 100644 index 00000000..341b35ed --- /dev/null +++ b/scripts/build-preview-manifest.mts @@ -0,0 +1,60 @@ +import { writeFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { getDefaults } from "@/lib/customizer-config"; +import registry, { loadComponentConfig } from "@/registry/__index__"; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const root = path.resolve(here, ".."); +const outFile = path.join(root, "registry", "__manifest__.ts"); + +const HEADER = `// GENERATED FILE — do not edit by hand. +// Run \`bun run manifest:build\` after changing any registry config. +// +// The playback slice of every registry config: everything a preview needs to +// mount a Player, and nothing it needs only to render the customizer panel. +// Consumers that just play a component (cards, changelog, icon gallery) read +// this instead of importing 263 config modules into the client bundle. + +import type { BackdropFill } from "@/registry/remocn/backdrop"; + +export interface PreviewManifestEntry { + durationInFrames: number; + fps: number; + compositionWidth: number; + compositionHeight: number; + previewBackdrop?: BackdropFill; + defaults: Record; +} + +export const previewManifest: Record = `; + +async function main() { + const slugs = Object.keys(registry).sort(); + const manifest: Record = {}; + + for (const slug of slugs) { + const config = await loadComponentConfig(slug); + const entry: Record = { + durationInFrames: config.durationInFrames, + fps: config.fps, + compositionWidth: config.compositionWidth, + compositionHeight: config.compositionHeight, + }; + if (config.previewBackdrop) entry.previewBackdrop = config.previewBackdrop; + entry.defaults = getDefaults(config.controls); + manifest[slug] = entry; + } + + const body = JSON.stringify(manifest, null, 2); + writeFileSync( + outFile, + `${HEADER}${body};\n\nexport default previewManifest;\n`, + ); + console.log(`wrote ${slugs.length} entries to registry/__manifest__.ts`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +});