{ "name": "toolbar-dynamic", "type": "registry:ui", "registryDependencies": [], "dependencies": [ "motion" ], "devDependencies": [], "tailwind": {}, "cssVars": { "light": {}, "dark": {} }, "files": [ { "path": "toolbar-dynamic.tsx", "content": "'use client';\nimport React, { useRef, useState } from 'react';\nimport { motion, MotionConfig } from 'motion/react';\nimport useClickOutside from '@/hooks/useClickOutside';\nimport { ArrowLeft, Search, User } from 'lucide-react';\n\nconst transition = {\n type: 'spring',\n bounce: 0.1,\n duration: 0.2,\n};\n\nfunction Button({\n children,\n onClick,\n disabled,\n ariaLabel,\n}: {\n children: React.ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n ariaLabel?: string;\n}) {\n return (\n \n {children}\n \n );\n}\n\nexport default function ToolbarDynamic() {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef(null);\n\n useClickOutside(containerRef, () => {\n setIsOpen(false);\n });\n\n return (\n \n
\n
\n \n
\n {!isOpen ? (\n
\n \n setIsOpen(true)}\n ariaLabel='Search notes'\n >\n \n \n
\n ) : (\n
\n \n
\n \n
\n
\n
\n )}\n
\n \n
\n
\n
\n );\n}\n", "type": "registry:ui" }, { "path": "hooks/useClickOutside.tsx", "content": "import { RefObject, useEffect } from 'react';\n\nfunction useClickOutside(\n ref: RefObject,\n handler: (event: MouseEvent | TouchEvent) => void\n): void {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (!ref || !ref.current || ref.current.contains(event.target as Node)) {\n return;\n }\n\n handler(event);\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('touchstart', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('touchstart', handleClickOutside);\n };\n }, [ref, handler]);\n}\n\nexport default useClickOutside;\n", "type": "registry:hook" } ] }