{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"agentui","homepage":"https://www.agentui.pro","items":[{"name":"message-bubble","type":"registry:component","title":"Message Bubble","description":"A focused conversational surface with visual tones, independent alignment, grouped messages, expandable content, and interactive link or button support.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"message","type":"registry:component","title":"Message","description":"Composable conversation primitives for message rows, grouped bubbles, avatars, metadata, live markers, and a mount-only trailing-edge pop-up for newly sent rows.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message.tsx","type":"registry:component","target":"@components/agents/message.tsx"},{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"message-scroller","type":"registry:component","title":"Message Scroller","description":"A reader-aware conversation viewport that follows streamed output at the live edge and releases control when the reader moves away.","author":"AgentUI","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.tsx"},{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"}]},{"name":"prompt-input","type":"registry:component","title":"Prompt Input","description":"An auto-growing agent composer with prompt actions, model selection, keyboard submission, and animated send and stop states.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/prompt-input.tsx","type":"registry:component","target":"@components/agents/prompt-input.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"todo-list","type":"registry:component","title":"Todo List","description":"A collapsible agent task plan with morphing status marks, a completion count, compact metadata, and smooth list updates.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/todo-list.tsx","type":"registry:component","target":"@components/agents/todo-list.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"}]},{"name":"code-block","type":"registry:component","title":"Code Block","description":"A syntax-highlighted code surface with stable streaming updates, line numbers, focused lines, smooth following, and copy feedback.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/code-block.tsx","type":"registry:component","target":"@components/agents/code-block.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"approval-card","type":"registry:component","title":"Approval Card","description":"A human-in-the-loop decision surface for approvals, single or multiple-choice questions, custom responses, and multi-step review flows.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/approval-card/index.tsx","type":"registry:component","target":"@components/agents/approval-card/index.tsx"},{"path":"components/agents/approval-card/types.ts","type":"registry:component","target":"@components/agents/approval-card/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/radio.tsx","type":"registry:component","target":"@components/motion/radio.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"}]},{"name":"file-diff","type":"registry:component","title":"File Diff","description":"A syntax-highlighted file change disclosure with progressive rows, line numbers, live change counts, smooth following, and completion collapse.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/file-diff.tsx","type":"registry:component","target":"@components/agents/file-diff.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tool-result","type":"registry:component","title":"Tool Result","description":"A lightweight execution disclosure for syntax-highlighted terminal output and request responses that collapses into a compact completed state.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/tool-result.tsx","type":"registry:component","target":"@components/agents/tool-result.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"}]},{"name":"streaming-response","type":"registry:component","title":"Streaming Response","description":"A stable response surface with completion actions, rendered content, and an expandable source summary.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/streaming-response.tsx","type":"registry:component","target":"@components/agents/streaming-response.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]},{"name":"image-generation","type":"registry:component","title":"Image Generation","description":"A stable generated-image surface that moves from queued work through progressive refinement to a completed result without layout shift.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/image-generation.tsx","type":"registry:component","target":"@components/agents/image-generation.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"tool-approval","type":"registry:component","title":"Tool Approval","description":"A human-in-the-loop permission card for reviewing tool details, allowing once, remembering access, or denying execution.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/tool-approval.tsx","type":"registry:component","target":"@components/agents/tool-approval.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"citations","type":"registry:component","title":"Citations","description":"Inline citation markers paired with a collapsible, progressively rendered reference collection for grounded agent responses.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]},{"name":"agent-activity","type":"registry:component","title":"Agent Activity","description":"One adaptive activity stream for reasoning, searches, tool calls, structured execution traces, or a chronological mix.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/agent-activity/index.tsx","type":"registry:component","target":"@components/agents/agent-activity/index.tsx"},{"path":"components/agents/agent-activity/activity-row.tsx","type":"registry:component","target":"@components/agents/agent-activity/activity-row.tsx"},{"path":"components/agents/agent-activity/types.ts","type":"registry:component","target":"@components/agents/agent-activity/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"reasoning-text","type":"registry:component","title":"Agent Loading States Reasoning Text","description":"Shimmering reasoning copy with an ASCII loader and cascade, phrase-swap, or per-letter scramble transitions.","author":"AgentUI","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/reasoning-text.tsx","type":"registry:component","target":"@components/agents/loading-states/reasoning-text.tsx"},{"path":"components/motion/loader.tsx","type":"registry:component","target":"@components/motion/loader.tsx"},{"path":"components/motion/text-scramble.tsx","type":"registry:component","target":"@components/motion/text-scramble.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"thinking-shimmer","type":"registry:component","title":"Agent Loading States Thinking Shimmer","description":"A quiet shimmer that keeps the agent's current status readable while work continues.","author":"AgentUI","dependencies":["clsx","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.tsx"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"}]},{"name":"agent-progress","type":"registry:component","title":"Agent Loading States Agent Progress","description":"A compact activity glyph, action verb, and live tabular timer for longer-running agent work.","author":"AgentUI","dependencies":["clsx","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/loading-states/agent-progress.tsx","type":"registry:component","target":"@components/agents/loading-states/agent-progress.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}]},{"name":"ai-sidebar","type":"registry:component","title":"AI Sidebar","description":"A collapsible AI workspace sidebar for folders, projects, files, and bookmarks with keyboard navigation, optimistic moves, inline rename, and overflow-aware labels.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/ai-sidebar.tsx","type":"registry:component","target":"@components/agents/ai-sidebar.tsx"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"lib/hooks/use-touch-capable.ts","type":"registry:hook","target":"@lib/hooks/use-touch-capable.ts"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"}]},{"name":"chat-app","type":"registry:component","title":"Chat App","description":"A complete agent conversation workspace composing navigation, messages, streaming, planning, approvals, tools, code, diffs, generated media, sources, and prompt input.","author":"AgentUI","dependencies":["clsx","lucide-react","motion","shiki","tailwind-merge"],"registryDependencies":[],"files":[{"path":"components/agents/chat-app.tsx","type":"registry:component","target":"@components/agents/chat-app.tsx"},{"path":"components/agents/agent-activity/index.tsx","type":"registry:component","target":"@components/agents/agent-activity/index.tsx"},{"path":"components/agents/ai-sidebar.tsx","type":"registry:component","target":"@components/agents/ai-sidebar.tsx"},{"path":"components/agents/approval-card/index.tsx","type":"registry:component","target":"@components/agents/approval-card/index.tsx"},{"path":"components/agents/code-block.tsx","type":"registry:component","target":"@components/agents/code-block.tsx"},{"path":"components/agents/file-diff.tsx","type":"registry:component","target":"@components/agents/file-diff.tsx"},{"path":"components/agents/image-generation.tsx","type":"registry:component","target":"@components/agents/image-generation.tsx"},{"path":"components/agents/loading-states/thinking-shimmer.tsx","type":"registry:component","target":"@components/agents/loading-states/thinking-shimmer.tsx"},{"path":"components/agents/message.tsx","type":"registry:component","target":"@components/agents/message.tsx"},{"path":"components/agents/message-bubble.tsx","type":"registry:component","target":"@components/agents/message-bubble.tsx"},{"path":"components/agents/message-scroller.tsx","type":"registry:component","target":"@components/agents/message-scroller.tsx"},{"path":"components/agents/prompt-input.tsx","type":"registry:component","target":"@components/agents/prompt-input.tsx"},{"path":"components/agents/streaming-response.tsx","type":"registry:component","target":"@components/agents/streaming-response.tsx"},{"path":"components/agents/todo-list.tsx","type":"registry:component","target":"@components/agents/todo-list.tsx"},{"path":"components/agents/tool-approval.tsx","type":"registry:component","target":"@components/agents/tool-approval.tsx"},{"path":"components/agents/tool-result.tsx","type":"registry:component","target":"@components/agents/tool-result.tsx"},{"path":"components/motion/animated-sidebar.tsx","type":"registry:component","target":"@components/motion/animated-sidebar.tsx"},{"path":"lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"},{"path":"components/agents/agent-activity/activity-row.tsx","type":"registry:component","target":"@components/agents/agent-activity/activity-row.tsx"},{"path":"components/agents/agent-activity/types.ts","type":"registry:component","target":"@components/agents/agent-activity/types.ts"},{"path":"components/agents/agent-disclosure.tsx","type":"registry:component","target":"@components/agents/agent-disclosure.tsx"},{"path":"lib/ease.ts","type":"registry:lib","target":"@lib/ease.ts"},{"path":"components/motion/popover-morph.tsx","type":"registry:component","target":"@components/motion/popover-morph.tsx"},{"path":"lib/hooks/use-touch-capable.ts","type":"registry:hook","target":"@lib/hooks/use-touch-capable.ts"},{"path":"components/agents/approval-card/types.ts","type":"registry:component","target":"@components/agents/approval-card/types.ts"},{"path":"components/motion/action-swap-roll.tsx","type":"registry:component","target":"@components/motion/action-swap-roll.tsx"},{"path":"components/motion/button/index.tsx","type":"registry:component","target":"@components/motion/button/index.tsx"},{"path":"components/motion/checkbox.tsx","type":"registry:component","target":"@components/motion/checkbox.tsx"},{"path":"components/motion/input.tsx","type":"registry:component","target":"@components/motion/input.tsx"},{"path":"components/motion/radio.tsx","type":"registry:component","target":"@components/motion/radio.tsx"},{"path":"components/agents/agent-code.tsx","type":"registry:component","target":"@components/agents/agent-code.tsx"},{"path":"lib/hooks/use-hover-capable.ts","type":"registry:hook","target":"@lib/hooks/use-hover-capable.ts"},{"path":"components/motion/text-shimmer.tsx","type":"registry:component","target":"@components/motion/text-shimmer.tsx"},{"path":"components/agents/message-context.tsx","type":"registry:component","target":"@components/agents/message-context.tsx"},{"path":"components/motion/preview-rail.tsx","type":"registry:component","target":"@components/motion/preview-rail.tsx"},{"path":"components/motion/select.tsx","type":"registry:component","target":"@components/motion/select.tsx"},{"path":"components/agents/citations.tsx","type":"registry:component","target":"@components/agents/citations.tsx"},{"path":"components/motion/shared-layout-bg.tsx","type":"registry:component","target":"@components/motion/shared-layout-bg.tsx"},{"path":"components/motion/popover-position.ts","type":"registry:component","target":"@components/motion/popover-position.ts"},{"path":"components/motion/action-swap.tsx","type":"registry:component","target":"@components/motion/action-swap.tsx"},{"path":"components/motion/button/base.tsx","type":"registry:component","target":"@components/motion/button/base.tsx"},{"path":"components/motion/button/magnetic.tsx","type":"registry:component","target":"@components/motion/button/magnetic.tsx"},{"path":"components/motion/button/stateful.tsx","type":"registry:component","target":"@components/motion/button/stateful.tsx"},{"path":"lib/text-shimmer.ts","type":"registry:lib","target":"@lib/text-shimmer.ts"},{"path":"lib/hooks/use-dismiss.ts","type":"registry:hook","target":"@lib/hooks/use-dismiss.ts"},{"path":"lib/hooks/use-hover-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-hover-gesture.ts"},{"path":"lib/hooks/use-tap-gesture.ts","type":"registry:hook","target":"@lib/hooks/use-tap-gesture.ts"},{"path":"lib/hooks/use-favicon.ts","type":"registry:hook","target":"@lib/hooks/use-favicon.ts"},{"path":"components/motion/magnetic.tsx","type":"registry:component","target":"@components/motion/magnetic.tsx"},{"path":"lib/touch.ts","type":"registry:lib","target":"@lib/touch.ts"},{"path":"lib/favicon.ts","type":"registry:lib","target":"@lib/favicon.ts"}]}]}