{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "discussion-block",
  "type": "registry:block",
  "title": "Discussion",
  "description": "Comment thread with ⌘ Enter posting, nested replies, inline editing, and hover actions.",
  "dependencies": [
    "lucide-react@^1.47.0"
  ],
  "registryDependencies": [
    "https://control-ui.dev/r/button.json",
    "https://control-ui.dev/r/chat-composer.json",
    "https://control-ui.dev/r/chat-message.json",
    "https://control-ui.dev/r/core.json",
    "https://control-ui.dev/r/kbd.json"
  ],
  "files": [
    {
      "path": "src/registry/blocks/control-ui/discussion.tsx",
      "target": "@components/control-ui/blocks/discussion.tsx",
      "type": "registry:block",
      "content": "\"use client\";\n\nimport { CornerDownRightIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n  ChatComposer,\n  ChatComposerShell,\n  ChatComposerSubmit,\n  ChatComposerTextarea,\n  ChatComposerToolbar,\n} from \"@/components/control-ui/chat-composer\";\nimport {\n  ChatMessage,\n  ChatMessageActions,\n  ChatMessageAuthor,\n  ChatMessageAvatar,\n  ChatMessageBody,\n  ChatMessageContent,\n  ChatMessageFooter,\n  ChatMessageHeader,\n  ChatMessageReplies,\n  ChatMessageRow,\n  ChatMessageTime,\n} from \"@/components/control-ui/chat-message\";\nimport { Button } from \"@/components/control-ui/ui/button\";\nimport { Kbd, KbdGroup } from \"@/components/control-ui/ui/kbd\";\n\nexport type DiscussionComposerProps = Omit<ComponentProps<typeof ChatComposer>, \"submitKey\" | \"children\"> & {\n  label: string;\n  placeholder?: string;\n  submitLabel?: ReactNode;\n  secondaryAction?: ReactNode;\n  hint?: ReactNode;\n  autoFocus?: boolean;\n};\n\nexport function DiscussionComposer({\n  label,\n  placeholder,\n  submitLabel = \"Post\",\n  secondaryAction,\n  hint = (\n    <>\n      <KbdGroup>\n        <Kbd>⌘</Kbd>\n        <Kbd>Enter</Kbd>\n      </KbdGroup>\n      <span>to post</span>\n    </>\n  ),\n  autoFocus,\n  ...props\n}: DiscussionComposerProps) {\n  return (\n    <ChatComposer submitKey=\"mod-enter\" {...props}>\n      <ChatComposerShell>\n        <ChatComposerTextarea\n          aria-label={label}\n          placeholder={placeholder}\n          autoFocus={autoFocus}\n          aria-keyshortcuts=\"Meta+Enter Control+Enter\"\n        />\n        <ChatComposerToolbar>\n          <span className=\"flex min-w-0 items-center gap-1.5 text-caption text-muted-foreground\">{hint}</span>\n          <span className=\"flex items-center gap-2\">\n            {secondaryAction}\n            <ChatComposerSubmit>{submitLabel}</ChatComposerSubmit>\n          </span>\n        </ChatComposerToolbar>\n      </ChatComposerShell>\n    </ChatComposer>\n  );\n}\n\nexport type DiscussionCommentProps = Omit<ComponentProps<typeof ChatMessage>, \"from\" | \"layout\" | \"authorLabel\" | \"children\"> & {\n  author: string;\n  avatar?: ReactNode;\n  sentAt: string;\n  timeLabel: ReactNode;\n  edited?: boolean;\n  children: ReactNode;\n  actions?: ReactNode;\n  onReply?: () => void;\n  replyLabel?: ReactNode;\n  replies?: ReactNode;\n  replyComposer?: ReactNode;\n};\n\nfunction initials(name: string) {\n  return name\n    .split(/\\s+/)\n    .slice(0, 2)\n    .map((word) => word.charAt(0).toUpperCase())\n    .join(\"\");\n}\n\nexport function DiscussionComment({\n  author,\n  avatar,\n  sentAt,\n  timeLabel,\n  edited = false,\n  children,\n  actions,\n  onReply,\n  replyLabel = \"Reply\",\n  replies,\n  replyComposer,\n  ...props\n}: DiscussionCommentProps) {\n  const hasReplies = Boolean(replies) || Boolean(replyComposer);\n\n  return (\n    <ChatMessage from=\"participant\" layout=\"flat\" authorLabel={author} {...props}>\n      <ChatMessageRow>\n        <ChatMessageAvatar>{avatar ?? <span aria-hidden=\"true\">{initials(author)}</span>}</ChatMessageAvatar>\n        <ChatMessageBody>\n          <ChatMessageHeader>\n            <ChatMessageAuthor>{author}</ChatMessageAuthor>\n            <ChatMessageTime dateTime={sentAt}>{timeLabel}</ChatMessageTime>\n            {edited ? <span>(edited)</span> : null}\n          </ChatMessageHeader>\n          <ChatMessageContent>{children}</ChatMessageContent>\n          {onReply ? (\n            <ChatMessageFooter>\n              <Button variant=\"ghost\" size=\"xs\" onClick={onReply} className=\"-ms-2\">\n                <CornerDownRightIcon aria-hidden=\"true\" />\n                {replyLabel}\n              </Button>\n            </ChatMessageFooter>\n          ) : null}\n          {hasReplies ? (\n            <ChatMessageReplies>\n              {replies}\n              {replyComposer}\n            </ChatMessageReplies>\n          ) : null}\n        </ChatMessageBody>\n        {actions ? <ChatMessageActions>{actions}</ChatMessageActions> : null}\n      </ChatMessageRow>\n    </ChatMessage>\n  );\n}\n"
    }
  ]
}
