{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "example-pulse",
  "type": "registry:component",
  "title": "Example Pulse",
  "description": "Trivial Framer Motion pulse wrapper used to prove the registry build pipeline end-to-end. Will be deleted once a real first component lands.",
  "dependencies": [
    "framer-motion@^12.0.0"
  ],
  "files": [
    {
      "path": "pulse.tsx",
      "target": "components/safari/example-pulse/pulse.tsx",
      "type": "registry:component",
      "content": "\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nexport interface PulseProps {\n  children: ReactNode;\n  className?: string;\n  /** Pulse scale amplitude, e.g. 1.05 = grows to 105%. */\n  scale?: number;\n  /** Full pulse cycle duration in seconds. */\n  duration?: number;\n}\n\n/**\n * Wraps its children in a looping, gentle scale pulse.\n *\n * - Respects `prefers-reduced-motion` via `useReducedMotion` — the pulse\n *   is disabled entirely for users who opt out of motion.\n * - Only animates while in the viewport (`whileInView`) so offscreen\n *   instances don't spend cycles on animation work.\n *\n * This is a proof-of-pipeline component: it exists to validate the\n * registry build/validate flow end-to-end and will be removed once a\n * real first component lands.\n */\nexport function Pulse({\n  children,\n  className,\n  scale = 1.05,\n  duration = 2,\n}: PulseProps) {\n  const shouldReduceMotion = useReducedMotion();\n\n  if (shouldReduceMotion) {\n    return <div className={className}>{children}</div>;\n  }\n\n  return (\n    <motion.div\n      className={className}\n      whileInView={{\n        scale: [1, scale, 1],\n      }}\n      transition={{\n        duration,\n        repeat: Infinity,\n        ease: \"easeInOut\",\n      }}\n      viewport={{ once: false, amount: \"some\" }}\n    >\n      {children}\n    </motion.div>\n  );\n}\n"
    },
    {
      "path": "demo.tsx",
      "target": "components/safari/example-pulse/demo.tsx",
      "type": "registry:file",
      "content": "\"use client\";\n\nimport { Pulse } from \"./pulse\";\n\n/**\n * Isolated demo used by the future component catalog. Renders the\n * component with representative props — no external app state.\n */\nexport default function PulseDemo() {\n  return (\n    <div className=\"flex items-center justify-center p-12\">\n      <Pulse className=\"rounded-full bg-sm-accent px-6 py-3 text-white\">\n        Live\n      </Pulse>\n    </div>\n  );\n}\n"
    }
  ],
  "meta": {
    "name": "example-pulse",
    "title": "Example Pulse",
    "description": "Trivial Framer Motion pulse wrapper used to prove the registry build pipeline end-to-end. Will be deleted once a real first component lands.",
    "type": "component",
    "status": "experiment",
    "version": "0.1.0",
    "visibility": "internal",
    "tier": "free",
    "dependencies": {
      "framer-motion": "^12.0.0"
    },
    "registryDependencies": [],
    "files": [
      {
        "path": "pulse.tsx",
        "target": "components/safari/example-pulse/pulse.tsx",
        "type": "registry:component"
      },
      {
        "path": "demo.tsx",
        "target": "components/safari/example-pulse/demo.tsx",
        "type": "registry:file"
      }
    ],
    "compatibility": {
      "react": ">=19.0.0",
      "motionPackage": "framer-motion",
      "motionRange": "^12.0.0",
      "tailwind": ">=3.4.0",
      "ssr": "client-only",
      "browsers": [
        "chrome >= 100",
        "safari >= 16",
        "firefox >= 100"
      ]
    },
    "mobileStrategy": "full",
    "reducedMotion": "Pulse animation is fully disabled via useReducedMotion(); children render statically with no scale animation.",
    "performance": {
      "bundleCost": "~2KB gzip (excluding framer-motion itself)",
      "offscreenBehavior": "Animation is gated by whileInView and does not run while offscreen.",
      "notes": "No measurable layout cost; animates transform only."
    },
    "a11y": "No ARIA impact; purely visual scale animation on a wrapper div. Motion is suppressed for prefers-reduced-motion.",
    "knownLimitations": [
      "Proof-of-pipeline component only — not intended for production use.",
      "Will be deleted once a real first component is added to the registry."
    ],
    "license": "UNLICENSED",
    "origin": "internal",
    "author": "Viktor Veverka (https://viktorveverka.cz)",
    "relatedComponents": []
  }
}