{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "motion-subtitle",
  "title": "Motion Subtitle",
  "description": "Animated subtitle text with per-character reveal, blur transition, speed control, and top/bottom direction.",
  "dependencies": [
    "framer-motion"
  ],
  "files": [
    {
      "path": "registry/components/unlumen/motion-subtitle/index.tsx",
      "content": "\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface MotionSubtitleProps {\n  text: string;\n  className?: string;\n  direction?: \"top\" | \"bottom\";\n  speed?: number;\n  stagger?: number;\n}\n\nexport function MotionSubtitle({\n  text,\n  className,\n  direction = \"top\",\n  speed = 1,\n  stagger = 0.018,\n}: MotionSubtitleProps) {\n  const chars = Array.from(text);\n  const safeSpeed = Math.min(3, Math.max(0.3, speed));\n  const speedFactor = 1 / safeSpeed;\n  const safeStagger = Math.min(0.08, Math.max(0, stagger));\n  const directionY = direction === \"bottom\" ? 10 : -10;\n  const exitY = direction === \"bottom\" ? -3 : 3;\n\n  return (\n    <span\n      className={cn(\n        \"inline-flex min-h-[1.3em] items-center justify-center\",\n        className,\n      )}\n      aria-live=\"polite\"\n    >\n      <AnimatePresence mode=\"wait\" initial={false}>\n        <motion.span\n          key={text}\n          className=\"inline-flex whitespace-nowrap\"\n          initial={{ opacity: 0, y: directionY * 0.8, filter: \"blur(5px)\" }}\n          animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n          exit={{ opacity: 0, y: exitY, filter: \"blur(4px)\" }}\n          transition={{ duration: 0.28 * speedFactor, ease: \"easeOut\" }}\n        >\n          {chars.map((char, index) => (\n            <motion.span\n              key={`${text}-${index}`}\n              className=\"inline-block\"\n              initial={{ opacity: 0, y: directionY, filter: \"blur(6px)\" }}\n              animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n              exit={{ opacity: 0, y: exitY, filter: \"blur(4px)\" }}\n              transition={{\n                duration: 0.24 * speedFactor,\n                ease: \"easeOut\",\n                delay: index * safeStagger * speedFactor,\n              }}\n            >\n              {char === \" \" ? \"\\u00A0\" : char}\n            </motion.span>\n          ))}\n        </motion.span>\n      </AnimatePresence>\n    </span>\n  );\n}\n\nexport default MotionSubtitle;\n",
      "type": "registry:component",
      "target": "components/unlumen-ui/motion-subtitle.tsx"
    }
  ],
  "type": "registry:component"
}