{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "response-actions",
  "title": "AI Response Actions",
  "description": "Action buttons for AI responses: copy, regenerate, thumbs up/down, share",
  "dependencies": [
    "lucide-react"
  ],
  "registryDependencies": [
    "button",
    "tooltip"
  ],
  "files": [
    {
      "path": "registry/default/blocks/ai/ai-response-actions/components/elements/ai-response-actions.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n  Check,\n  Copy,\n  RefreshCw,\n  Share2,\n  ThumbsDown,\n  ThumbsUp,\n} from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype FeedbackType = \"positive\" | \"negative\" | null;\n\ninterface AiResponseActionsProps {\n  content?: string;\n  onRegenerate?: () => void;\n  onFeedback?: (type: FeedbackType) => void;\n  onShare?: () => void;\n  compact?: boolean;\n  className?: string;\n}\n\nexport function AiResponseActions({\n  content,\n  onRegenerate,\n  onFeedback,\n  onShare,\n  compact = false,\n  className,\n}: AiResponseActionsProps) {\n  const [copied, setCopied] = React.useState(false);\n  const [feedback, setFeedback] = React.useState<FeedbackType>(null);\n\n  const handleCopy = React.useCallback(async () => {\n    if (!content) return;\n    await navigator.clipboard.writeText(content);\n    setCopied(true);\n    setTimeout(() => setCopied(false), 2000);\n  }, [content]);\n\n  const handleFeedback = React.useCallback(\n    (type: FeedbackType) => {\n      const newFeedback = feedback === type ? null : type;\n      setFeedback(newFeedback);\n      onFeedback?.(newFeedback);\n    },\n    [feedback, onFeedback],\n  );\n\n  const buttonSize = compact ? \"size-7\" : \"size-8\";\n  const iconSize = compact ? \"size-3.5\" : \"size-4\";\n\n  return (\n    <TooltipProvider delayDuration={300}>\n      <div\n        data-slot=\"ai-response-actions\"\n        role=\"toolbar\"\n        aria-label=\"Response actions\"\n        className={cn(\n          \"inline-flex items-center gap-1 rounded-lg border bg-background p-1\",\n          className,\n        )}\n      >\n        {content && (\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className={buttonSize}\n                onClick={handleCopy}\n                aria-label={copied ? \"Copied\" : \"Copy response\"}\n              >\n                {copied ? (\n                  <Check className={cn(iconSize, \"text-green-500\")} />\n                ) : (\n                  <Copy className={iconSize} />\n                )}\n              </Button>\n            </TooltipTrigger>\n            <TooltipContent>\n              <p>{copied ? \"Copied!\" : \"Copy\"}</p>\n            </TooltipContent>\n          </Tooltip>\n        )}\n\n        {onRegenerate && (\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className={buttonSize}\n                onClick={onRegenerate}\n                aria-label=\"Regenerate response\"\n              >\n                <RefreshCw className={iconSize} />\n              </Button>\n            </TooltipTrigger>\n            <TooltipContent>\n              <p>Regenerate</p>\n            </TooltipContent>\n          </Tooltip>\n        )}\n\n        {onFeedback && (\n          <>\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <Button\n                  variant=\"ghost\"\n                  size=\"icon\"\n                  className={cn(\n                    buttonSize,\n                    feedback === \"positive\" &&\n                      \"bg-green-100 text-green-600 dark:bg-green-900/30\",\n                  )}\n                  onClick={() => handleFeedback(\"positive\")}\n                  aria-label=\"Rate positive\"\n                  aria-pressed={feedback === \"positive\"}\n                >\n                  <ThumbsUp className={iconSize} />\n                </Button>\n              </TooltipTrigger>\n              <TooltipContent>\n                <p>Good response</p>\n              </TooltipContent>\n            </Tooltip>\n\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <Button\n                  variant=\"ghost\"\n                  size=\"icon\"\n                  className={cn(\n                    buttonSize,\n                    feedback === \"negative\" &&\n                      \"bg-red-100 text-red-600 dark:bg-red-900/30\",\n                  )}\n                  onClick={() => handleFeedback(\"negative\")}\n                  aria-label=\"Rate negative\"\n                  aria-pressed={feedback === \"negative\"}\n                >\n                  <ThumbsDown className={iconSize} />\n                </Button>\n              </TooltipTrigger>\n              <TooltipContent>\n                <p>Bad response</p>\n              </TooltipContent>\n            </Tooltip>\n          </>\n        )}\n\n        {onShare && (\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className={buttonSize}\n                onClick={onShare}\n                aria-label=\"Share response\"\n              >\n                <Share2 className={iconSize} />\n              </Button>\n            </TooltipTrigger>\n            <TooltipContent>\n              <p>Share</p>\n            </TooltipContent>\n          </Tooltip>\n        )}\n      </div>\n    </TooltipProvider>\n  );\n}\n\nexport type { AiResponseActionsProps, FeedbackType };\n",
      "type": "registry:component"
    }
  ],
  "docs": "Toolbar with copy, regenerate, feedback, and share actions. Supports compact mode.",
  "categories": [
    "ai"
  ],
  "type": "registry:ui"
}