{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "snap-cn",
  "homepage": "https://snapcn.dev",
  "items": [
    {
      "name": "answer-stream",
      "title": "Answer Stream",
      "description": "The beat after send: a macro shot on the button that cuts — hard, on its fastest frame — to the answer building itself on the page, while the camera pulls back 1.364× about a focal point above the frame to keep up with it. Every word arrives hot and cools to the foreground.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json",
        "https://snapcn.dev/r/input.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/answer-stream/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/answer-stream.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "text-reveal",
      "title": "Text Reveal",
      "description": "One staggered enter/exit text animator: fade, slide, blur, scale, mask and tracking effects over character, word, line or block units, with 14 classic looks as presets.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/text-reveal/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/text-reveal.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "text-highlight",
      "title": "Text Highlight",
      "description": "Animated emphasis on one span inside a static sentence — marker sweep, color shift, underline, strikethrough-replace, or shimmer.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/text-highlight/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/text-highlight.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "text-swap",
      "title": "Text Swap",
      "description": "Replaces one line of text with another using exit-then-enter scheduling, with five transition presets: fade-through, crossfade, shared-axis-y, shared-axis-z, and cut.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/text-swap/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/text-swap.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "text-swell",
      "title": "Text Swell",
      "description": "A title reveal where the lead word floats toward the viewer and hangs there while the sentence assembles around it — each trailing word pushes in and its letters bounce up off the baseline in a wave — before the whole line falls back to size.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/text-swell/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/text-swell.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "text-build",
      "title": "Text Build",
      "description": "Words enter one at a time while already-placed words physically reflow to stay centered — a growing line on the x axis or a growing stack on the y axis.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/text-build/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/text-build.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "word-flip",
      "title": "Word Flip",
      "description": "A headline types itself out, then one word cycles on a 3D flip — it sinks into an anticipation dip, throws up and away about its baseline under motion blur, and the next word unfurls from below. The slot is reserved from the first keystroke, so nothing in the sentence ever reflows.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/word-flip/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/word-flip.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "word-captions",
      "title": "Word Captions",
      "description": "Burned-in captions in the styles big channels actually use — heavy Montserrat, a real outside outline so they read on any footage, and the spoken word springing to an accent. Four presets: beast, hormozi, pop, clean.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/word-captions/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/word-captions.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "karaoke-captions",
      "title": "Karaoke Captions",
      "description": "A caption line that fills word by word as it is spoken — heavy outlined type that reads on any footage. Three presets: karaoke, highlight (the word rides an accent bar), clean.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/karaoke-captions/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/karaoke-captions.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "logo-assemble",
      "title": "Logo Assemble",
      "description": "A single ring of image cards revolves around a centred title, then spins inward and drains to the middle — giving birth to a simple logo that slides left as the brand name reveals to its right.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/logo-assemble/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/logo-assemble.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "logo-flicker",
      "title": "Logo Flicker",
      "description": "Images flip across a central card very fast, the flicker decelerates and fades, and the logo and brand name resolve underneath — a strobe of imagery settling onto the mark.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/logo-flicker/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/logo-flicker.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "phone-frame",
      "title": "Phone Frame",
      "description": "iPhone-style device frame with a dynamic island and a screen slot — flat or lightly 3D-tilted, with rise, rotate-in, or float entrances and a subtle float loop.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/phone-frame/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/phone-frame.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "laptop-frame",
      "title": "Laptop Frame",
      "description": "MacBook-style laptop that opens, runs a dynamic-island notch notification, then dives the camera into the screen until an image or video fills the frame.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/laptop-frame/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/laptop-frame.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "terminal-simulator",
      "title": "Terminal Simulator",
      "description": "Terminal window with chunked command playback, freeze-frame pauses, step scrolling, and an optional cursor-pinned zoom camera.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/terminal-simulator/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/terminal-simulator.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "pulsing-border",
      "title": "Pulsing Border",
      "description": "Glowing 'AI is working' frame — a soft pulsing border overlay that breathes around the scene edges while a response streams.",
      "dependencies": [
        "@paper-design/shaders-react"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/pulsing-border/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/pulsing-border.tsx"
        }
      ],
      "docs": "pulsing-border draws with WebGL, and Remotion's headless Chromium has no GL context by default — render it with `npx remotion render --gl=angle` (or set `Config.setChromiumOpenGlRenderer(\"angle\")`), or the render fails with 'WebGL is not supported in this browser'.",
      "type": "registry:component"
    },
    {
      "name": "follower-rush",
      "title": "Follower Rush",
      "description": "An X-style follower notification that piles up — avatars stack in and the count explodes, then the row bends into an undulating wave of faces.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/follower-rush/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/follower-rush.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "prompt-zoom",
      "title": "Prompt Zoom",
      "description": "An assistant landing screen that offers its suggestions, then cuts — hard, in a single frame — into the caret, where the prompt types itself. The push-in is a measured 2.547× anchored on the text insertion point, not an animated zoom.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json",
        "https://snapcn.dev/r/input.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/prompt-zoom/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/prompt-zoom.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "orbit-gallery",
      "title": "Orbit Gallery",
      "description": "An image-universe hero: a continuous stream of photos flows along an Archimedean spiral (a vortex) from the frame edges into the center — evenly spaced by arc length, shrinking and rotating to follow the coil, with the title held in the clear middle. A slow, cinematic opener for launch and editorial videos.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/orbit-gallery/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/orbit-gallery.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "hero-launch",
      "title": "Product Hero",
      "description": "Cinematic product-launch hero — two cards slide into formation as the headline reveals above.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/hero-launch/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/hero-launch.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "moodboard-reveal",
      "title": "Moodboard Reveal",
      "description": "A kinetic headline with a swapping inline image, then a scattered gallery of photos flies in, the camera pushes through it as the background lifts from near-black to off-white, and it lands on a single hero image.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/moodboard-reveal/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/moodboard-reveal.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "search-typing",
      "title": "Search Typing",
      "description": "A search field wider than the shot: two thirds in frame, then it comes forward, types across its left half, pages to its right half, and goes back. Every proportion is measured, and the scale pivots on the text baseline so the type never climbs the pixel grid.",
      "dependencies": [
        "remotion",
        "@remotion/google-fonts"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json",
        "https://snapcn.dev/r/caret.json",
        "https://snapcn.dev/r/input.json"
      ],
      "files": [
        {
          "path": "registry/snap-cn/search-typing/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/search-typing.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "snap-cn-ui",
      "title": "snapcn UI Core",
      "description": "Shared timeline-fold hook, theme context, and color math for snapcn UI primitives.",
      "dependencies": [
        "remotion",
        "culori"
      ],
      "devDependencies": [
        "@types/culori"
      ],
      "files": [
        {
          "path": "registry/snap-cn-ui/core/timeline.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/timeline.ts"
        },
        {
          "path": "registry/snap-cn-ui/core/theme.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/theme.ts"
        },
        {
          "path": "registry/snap-cn-ui/core/color.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/color.ts"
        },
        {
          "path": "registry/snap-cn-ui/core/motion.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/motion.ts"
        },
        {
          "path": "registry/snap-cn-ui/core/types.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/types.ts"
        },
        {
          "path": "registry/snap-cn-ui/core/index.ts",
          "type": "registry:lib",
          "target": "lib/snap-cn-ui/index.ts"
        }
      ],
      "docs": "snapcn components paint from a shadcn token set in lib/snap-cn-ui/theme.ts. Its defaults are shadcn's, so they will already sit correctly next to your Button and Input. To point them at your own palette instead, wrap your compositions in <SnapCnUIProvider theme={{ primary: '#...', ... }} mode=\"dark\">, or pass the same `theme`/`mode` props to a single component. Use concrete hex/oklch values, not var(--primary) — a Remotion render has none of your app's CSS.",
      "type": "registry:lib"
    },
    {
      "name": "caret",
      "title": "UI Caret",
      "description": "A blinking text caret — a controlled vertical bar, or a pure motion atom that blinks deterministically from useCurrentFrame.",
      "dependencies": [
        "remotion"
      ],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/snap-cn-ui/caret/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/caret.tsx"
        }
      ],
      "type": "registry:component"
    },
    {
      "name": "input",
      "title": "UI Input",
      "description": "A text input whose idle/hover/active/typing/invalid state is a pure function of the timeline; the focus ring, border, caret, and value reveal are keyframed presets.",
      "dependencies": [
        "remotion",
        "class-variance-authority"
      ],
      "registryDependencies": [
        "https://snapcn.dev/r/snap-cn-ui.json",
        "https://snapcn.dev/r/caret.json",
        "utils"
      ],
      "files": [
        {
          "path": "registry/snap-cn-ui/input/index.tsx",
          "type": "registry:component",
          "target": "components/snap-cn/input.tsx"
        },
        {
          "path": "registry/snap-cn-ui/input/use-input-transition.ts",
          "type": "registry:component",
          "target": "components/snap-cn/use-input-transition.ts"
        }
      ],
      "type": "registry:component"
    }
  ]
}