{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "chatgpt-message",
  "title": "ChatGPT Message",
  "description": "User bubbles and bubble-less assistant turns with reasoning and hover actions.",
  "dependencies": [
    "cn"
  ],
  "registryDependencies": [
    "avatar",
    "button",
    "collapsible",
    "sheet"
  ],
  "files": [
    {
      "path": "registry/notra/chatgpt/components/chatgpt-message.tsx",
      "content": "import { cn } from \"cn\";\n\nimport type { ChatgptMessageProps } from \"../types/chatgpt\";\n\nexport const ChatgptMessage = ({\n  actions,\n  children,\n  className,\n  from,\n  reasoning,\n  ...props\n}: ChatgptMessageProps) => {\n  if (from === \"user\") {\n    return (\n      <div\n        className={cn(\"font-chatgpt flex justify-end\", className)}\n        data-from=\"user\"\n        data-slot=\"chatgpt-message\"\n        {...props}\n      >\n        <div className=\"bg-chatgpt-bubble text-chatgpt-fg max-w-[70%] rounded-[1.125rem] px-4 py-1.5 text-base leading-6 wrap-break-word\">\n          {children}\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div\n      className={cn(\n        \"group/chatgpt-message font-chatgpt flex flex-col items-start gap-2\",\n        className\n      )}\n      data-from=\"assistant\"\n      data-slot=\"chatgpt-message\"\n      {...props}\n    >\n      {reasoning}\n      <div className=\"text-chatgpt-fg max-w-full text-base leading-7 wrap-break-word\">\n        {children}\n      </div>\n      {actions && (\n        <div className=\"-ms-2 opacity-0 transition-opacity duration-150 group-focus-within/chatgpt-message:opacity-100 motion-reduce:transition-none [@media(hover:hover)]:group-hover/chatgpt-message:opacity-100 [@media(hover:none)]:opacity-100\">\n          {actions}\n        </div>\n      )}\n    </div>\n  );\n};\n",
      "type": "registry:component",
      "target": "components/chatgpt/components/chatgpt-message.tsx"
    },
    {
      "path": "registry/notra/chatgpt/types/chatgpt.ts",
      "content": "import type { ComponentProps, ReactNode } from \"react\";\n\nimport type { Avatar } from \"@/components/ui/avatar\";\nimport type { Button } from \"@/components/ui/button\";\nimport type { Collapsible } from \"@/components/ui/collapsible\";\nimport type { Sheet } from \"@/components/ui/sheet\";\n\nexport type ChatgptModelId =\n  | \"latest\"\n  | \"sol\"\n  | \"terra\"\n  | \"luna\"\n  | \"gpt-5.5\"\n  | \"gpt-5.4\"\n  | \"gpt-5.4-mini\";\n\nexport type ChatgptEffortId =\n  | \"instant\"\n  | \"medium\"\n  | \"high\"\n  | \"extra-high\"\n  | \"pro\";\n\nexport type ChatgptMessageRole = \"user\" | \"assistant\";\n\nexport interface ChatgptModelOption {\n  description?: string;\n  id: ChatgptModelId;\n  label: string;\n  shortLabel: string;\n}\n\nexport interface ChatgptEffortOption {\n  id: ChatgptEffortId;\n  label: string;\n}\n\nexport interface ChatgptActivitySite {\n  domain: string;\n  favicon?: string;\n  label: string;\n}\n\nexport interface ChatgptActivitySource {\n  domain: string;\n  favicon?: string;\n  href?: string;\n  id: string;\n  publisher: string;\n  snippet: string;\n  timeLabel: string;\n  title: string;\n}\n\nexport interface ChatgptThreadProps extends ComponentProps<\"div\"> {\n  autoScroll?: boolean;\n  footer?: ReactNode;\n}\n\nexport interface ChatgptMessageProps extends ComponentProps<\"div\"> {\n  actions?: ReactNode;\n  from: ChatgptMessageRole;\n  reasoning?: ReactNode;\n}\n\nexport interface ChatgptReasoningProps extends Omit<\n  ComponentProps<typeof Collapsible>,\n  \"children\"\n> {\n  children?: ReactNode;\n  complete?: boolean;\n  search?: ReactNode;\n  seconds: number;\n}\n\nexport interface ChatgptSearchProps extends Omit<\n  ComponentProps<typeof Button>,\n  \"children\"\n> {\n  sites?: readonly ChatgptActivitySite[];\n  websites: number;\n}\n\nexport interface ChatgptActivityProps extends Omit<\n  ComponentProps<typeof Sheet>,\n  \"children\"\n> {\n  className?: string;\n  seconds: number;\n  sites: readonly ChatgptActivitySite[];\n  sourceCount?: number;\n  sources: readonly ChatgptActivitySource[];\n  websites: number;\n}\n\nexport interface ChatgptFaviconProps extends Omit<\n  ComponentProps<typeof Avatar>,\n  \"children\"\n> {\n  domain: string;\n  src?: string;\n}\n\nexport interface ChatgptThinkingProps extends ComponentProps<\"div\"> {\n  label?: ReactNode;\n}\n\nexport interface ChatgptAppCallProps extends ComponentProps<\"div\"> {\n  label?: ReactNode;\n  logo?: ReactNode;\n  name: ReactNode;\n}\n\nexport interface ChatgptActionsProps extends ComponentProps<\"div\"> {\n  onMore?: () => void;\n  onRedo?: () => void;\n  onShare?: () => void;\n  text: string;\n}\n\nexport interface ChatgptActionButtonProps extends ComponentProps<\n  typeof Button\n> {\n  label: string;\n}\n\nexport interface ChatgptModelSelectorProps extends Omit<\n  ComponentProps<typeof Button>,\n  \"children\"\n> {\n  effort: ChatgptEffortId;\n  efforts?: readonly ChatgptEffortOption[];\n  model: ChatgptModelId;\n  models?: readonly ChatgptModelOption[];\n  onEffortChange?: (effort: ChatgptEffortId) => void;\n  onModelChange?: (model: ChatgptModelId) => void;\n}\n\nexport interface ChatgptComposerProps extends Omit<\n  ComponentProps<\"form\">,\n  \"onSubmit\"\n> {\n  busy?: boolean;\n  defaultEffort?: ChatgptEffortId;\n  defaultModel?: ChatgptModelId;\n  effort?: ChatgptEffortId;\n  efforts?: readonly ChatgptEffortOption[];\n  model?: ChatgptModelId;\n  models?: readonly ChatgptModelOption[];\n  onEffortChange?: (effort: ChatgptEffortId) => void;\n  onModelChange?: (model: ChatgptModelId) => void;\n  onSend?: (text: string) => void;\n  onStop?: () => void;\n  placeholder?: string;\n}\n\nexport interface ChatgptStorySearch {\n  sites: readonly ChatgptActivitySite[];\n  sourceCount?: number;\n  sources: readonly ChatgptActivitySource[];\n  websites: number;\n}\n\nexport type ChatgptStoryReasoningStep =\n  | { kind: \"search\"; search: ChatgptStorySearch }\n  | { kind: \"text\"; muted?: boolean; text: string };\n\nexport interface ChatgptStoryReasoning {\n  search?: ChatgptStorySearch;\n  seconds: number;\n  steps?: readonly ChatgptStoryReasoningStep[];\n  text: string;\n}\n\nexport interface ChatgptStoryMessage {\n  from: ChatgptMessageRole;\n  id: string;\n  reasoning?: ChatgptStoryReasoning;\n  text: string;\n}\n\nexport interface ChatgptPlayback {\n  completeIds: ReadonlySet<string>;\n  messages: ChatgptStoryMessage[];\n  play: () => Promise<void>;\n  playing: boolean;\n  send: (text: string, reply: string) => Promise<void>;\n  stop: () => void;\n  thinking: boolean;\n}\n\nexport interface ChatgptTextSegment {\n  offset: number;\n  text: string;\n}\n\nexport interface ChatgptSourceChipProps extends Omit<\n  ComponentProps<\"a\">,\n  \"children\" | \"href\"\n> {\n  sources: readonly ChatgptActivitySource[];\n}\n\nexport type ChatgptPlaybackPhase =\n  | { status: \"idle\" }\n  | { status: \"playing\"; source: \"script\" | \"send\"; thinking: boolean };\n",
      "type": "registry:lib",
      "target": "components/chatgpt/types/chatgpt.ts"
    }
  ],
  "cssVars": {
    "theme": {
      "color-chatgpt-bg": "var(--chatgpt-bg)",
      "color-chatgpt-fg": "var(--chatgpt-fg)",
      "color-chatgpt-muted": "var(--chatgpt-muted)",
      "color-chatgpt-hover": "var(--chatgpt-hover)",
      "color-chatgpt-border": "var(--chatgpt-border)",
      "color-chatgpt-bubble": "var(--chatgpt-bubble)",
      "color-chatgpt-composer": "var(--chatgpt-composer)",
      "color-chatgpt-composer-border": "var(--chatgpt-composer-border)",
      "color-chatgpt-popover": "var(--chatgpt-popover)",
      "color-chatgpt-tooltip": "var(--chatgpt-tooltip)",
      "color-chatgpt-tooltip-fg": "var(--chatgpt-tooltip-fg)",
      "color-chatgpt-send": "var(--chatgpt-send)",
      "color-chatgpt-send-hover": "var(--chatgpt-send-hover)",
      "color-chatgpt-send-fg": "var(--chatgpt-send-fg)",
      "color-chatgpt-focus": "var(--chatgpt-focus)",
      "color-chatgpt-search": "var(--chatgpt-search)",
      "shadow-chatgpt-composer": "var(--chatgpt-composer-shadow)",
      "shadow-chatgpt-menu": "var(--chatgpt-menu-shadow)",
      "font-chatgpt": "ui-sans-serif, -apple-system, system-ui, \"Segoe UI\", Helvetica, \"Apple Color Emoji\", Arial, sans-serif, \"Segoe UI Emoji\", \"Segoe UI Symbol\"",
      "color-chatgpt-slider-track": "var(--chatgpt-slider-track)",
      "color-chatgpt-slider-fill": "var(--chatgpt-slider-fill)",
      "color-chatgpt-slider-thumb": "var(--chatgpt-slider-thumb)",
      "color-chatgpt-slider-dot": "var(--chatgpt-slider-dot)",
      "color-chatgpt-slider-dot-fill": "var(--chatgpt-slider-dot-fill)",
      "color-chatgpt-pro": "var(--chatgpt-pro)"
    },
    "light": {
      "chatgpt-bg": "#ffffff",
      "chatgpt-fg": "#0d0d0d",
      "chatgpt-muted": "#5d5d5d",
      "chatgpt-hover": "#f3f3f3",
      "chatgpt-border": "#e5e5e5",
      "chatgpt-bubble": "#f4f4f4",
      "chatgpt-composer": "#ffffff",
      "chatgpt-composer-border": "#00000014",
      "chatgpt-composer-shadow": "0 1px 2px rgb(0 0 0 / 0.04), 0 2px 8px rgb(0 0 0 / 0.04)",
      "chatgpt-popover": "#ffffff",
      "chatgpt-menu-shadow": "0 0 0 1px rgb(0 0 0 / 0.05), 0 4px 16px rgb(0 0 0 / 0.08)",
      "chatgpt-tooltip": "#0d0d0d",
      "chatgpt-tooltip-fg": "#ffffff",
      "chatgpt-send": "#2563eb",
      "chatgpt-send-hover": "#1d4ed8",
      "chatgpt-send-fg": "#ffffff",
      "chatgpt-focus": "#2563eb",
      "chatgpt-search": "#e4543a",
      "chatgpt-slider-track": "#e4e4e4",
      "chatgpt-slider-fill": "#3b82f6",
      "chatgpt-slider-thumb": "#ffffff",
      "chatgpt-slider-dot": "#a3a3a3",
      "chatgpt-slider-dot-fill": "rgb(255 255 255 / 60%)",
      "chatgpt-pro": "#7c3aed",
      "chatgpt-pro-gradient": "linear-gradient(90deg, #2b3fd6 0%, #6a5be2 25%, #b58cf5 50%, #6a5be2 75%, #2b3fd6 100%)"
    },
    "dark": {
      "chatgpt-bg": "#212121",
      "chatgpt-fg": "#ececec",
      "chatgpt-muted": "#afafaf",
      "chatgpt-hover": "#303030",
      "chatgpt-border": "#3a3a3a",
      "chatgpt-bubble": "#303030",
      "chatgpt-composer": "#303030",
      "chatgpt-composer-border": "#ffffff1a",
      "chatgpt-composer-shadow": "0 1px 2px rgb(0 0 0 / 0.2)",
      "chatgpt-popover": "#353535",
      "chatgpt-menu-shadow": "0 0 0 1px rgb(255 255 255 / 0.08), 0 8px 24px rgb(0 0 0 / 0.4)",
      "chatgpt-tooltip": "#000000",
      "chatgpt-tooltip-fg": "#ffffff",
      "chatgpt-send": "#2563eb",
      "chatgpt-send-hover": "#1d4ed8",
      "chatgpt-send-fg": "#ffffff",
      "chatgpt-focus": "#2563eb",
      "chatgpt-search": "#e4543a",
      "chatgpt-slider-track": "#454545",
      "chatgpt-slider-fill": "#3b82f6",
      "chatgpt-slider-thumb": "#ffffff",
      "chatgpt-slider-dot": "#8c8c8c",
      "chatgpt-slider-dot-fill": "rgb(255 255 255 / 55%)",
      "chatgpt-pro": "#b794f6",
      "chatgpt-pro-gradient": "linear-gradient(90deg, #2b3fd6 0%, #6a5be2 25%, #b58cf5 50%, #6a5be2 75%, #2b3fd6 100%)"
    }
  },
  "type": "registry:component"
}