{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "liquid-button",
  "title": "Button",
  "description": "A liquid glass button.",
  "files": [
    {
      "path": "registry/components/button/index.tsx",
      "content": "'use client';\n\nimport React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';\nimport {\n  createLiquidButton,\n  LiquidButtonEventMap,\n  LiquidButtonHandle,\n  LiquidButtonOptions,\n} from '@avenra/liquid-glass';\n\n/**\n * Fully type-safe event handler mapping\n */\ntype LiquidButtonEvents = {\n  [K in keyof LiquidButtonEventMap]?: (event: LiquidButtonEventMap[K]) => void;\n};\n\nexport interface LiquidButtonProps extends Omit<\n  React.ButtonHTMLAttributes<HTMLButtonElement>,\n  'onClick'\n> {\n  label: string;\n  options?: LiquidButtonOptions;\n  events?: LiquidButtonEvents;\n}\n\nexport const LiquidButton = forwardRef<HTMLButtonElement, LiquidButtonProps>(\n  ({ label, options, events, ...props }, ref) => {\n    const buttonRef = useRef<HTMLButtonElement>(null);\n    const handleRef = useRef<LiquidButtonHandle | null>(null);\n\n    useImperativeHandle(ref, () => buttonRef.current as HTMLButtonElement);\n\n    /**\n     * Initialize + cleanup lifecycle\n     */\n    useEffect(() => {\n      if (!buttonRef.current) return;\n\n      handleRef.current = createLiquidButton(buttonRef.current, {\n        label,\n        ...options,\n      });\n\n      return () => {\n        handleRef.current?.destroy();\n        handleRef.current = null;\n      };\n    }, []);\n\n    /**\n     * Sync label updates\n     */\n    useEffect(() => {\n      handleRef.current?.setLabel(label);\n    }, [label]);\n\n    /**\n     * Strictly typed event binding (no unsafe iteration tricks)\n     */\n    useEffect(() => {\n      if (!handleRef.current || !events) return;\n      (Object.keys(events) as (keyof LiquidButtonEventMap)[]).forEach((event) => {\n        const handler = events[event];\n\n        if (handler) {\n          handleRef.current?.on(event, handler as (e: LiquidButtonEventMap[typeof event]) => void);\n        }\n      });\n\n      return () => {\n        if (!handleRef.current || !events) return;\n        (Object.keys(events) as (keyof LiquidButtonEventMap)[]).forEach((event) => {\n          handleRef.current?.off?.(event);\n        });\n      };\n    }, [events]);\n\n    return <button ref={buttonRef} {...props} />;\n  },\n);\n\nLiquidButton.displayName = 'LiquidButton';\n",
      "type": "registry:ui",
      "target": "@components/ui/liquid-button.tsx"
    }
  ],
  "type": "registry:ui"
}