diff --git a/catalog/inventory.json b/catalog/inventory.json index 584a1740..a70d5cbb 100644 --- a/catalog/inventory.json +++ b/catalog/inventory.json @@ -5456,7 +5456,7 @@ { "id": "aurora-chat-block", "title": "Aurora Interactive Chat", - "description": "Interactive Aurora chat workspace combining the new conversation primitives with steerable streaming, editable user turns, hover actions, code and source surfaces, model/reasoning selection, slash-command skills, file mentions, and an in-field composer.", + "description": "Interactive Aurora chat workspace combining composable conversation primitives with steerable streaming, markdown and citation-rich assistant responses, editable user turns, code/source surfaces, attachment previews, empty/error states, model/reasoning selection, slash-command skills, file mentions, and an in-field composer.", "registryType": "registry:block", "group": "Chat Primitives", "categories": [ @@ -5487,10 +5487,13 @@ "@aurora/aurora-bubble", "@aurora/aurora-chat-attachment", "@aurora/aurora-marker", + "@aurora/aurora-callout", + "@aurora/aurora-empty-state", "@aurora/aurora-code-block", "@aurora/aurora-ai-snippet", "@aurora/aurora-ai-sources", - "@aurora/aurora-ai-reasoning" + "@aurora/aurora-ai-reasoning", + "@aurora/aurora-ai-response" ], "fixtureId": null, "previewSlug": "chat-block", diff --git a/lib/client-catalog.json b/lib/client-catalog.json index 1d2ebc62..05b00077 100644 --- a/lib/client-catalog.json +++ b/lib/client-catalog.json @@ -588,7 +588,7 @@ "slug": "chat-block", "label": "Interactive Chat", "group": "Chat Primitives", - "description": "Interactive Aurora chat workspace combining the new conversation primitives with steerable streaming, editable user turns, hover actions, code and source surfaces, model/reasoning selection, slash-command skills, file mentions, and an in-field composer.", + "description": "Interactive Aurora chat workspace combining composable conversation primitives with steerable streaming, markdown and citation-rich assistant responses, editable user turns, code/source surfaces, attachment previews, empty/error states, model/reasoning selection, slash-command skills, file mentions, and an in-field composer.", "registry": "aurora-chat-block", "installUrl": "https://aurora.tootie.tv/r/aurora-chat-block.json" }, diff --git a/public/r/aurora-ai-inline-citation.json b/public/r/aurora-ai-inline-citation.json index 2cf56301..5a232616 100644 --- a/public/r/aurora-ai-inline-citation.json +++ b/public/r/aurora-ai-inline-citation.json @@ -15,7 +15,7 @@ "files": [ { "path": "registry/aurora/blocks/ai/elements/inline-citation.tsx", - "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { safeHttpUrl } from \"@/registry/aurora/lib/safe-url\"\n\nexport interface InlineCitationProps\n extends React.AnchorHTMLAttributes {\n /** 1-based citation number rendered inside the chip. */\n index: number\n /** Source title shown in the hover/focus preview popover. */\n title?: string\n /** Optional context line shown below the title. */\n description?: string\n /** Source URL shown in the hover/focus preview popover. */\n url?: string\n}\n\n/**\n * InlineCitation — a compact rose citation chip rendered inline with body text.\n * When `title`/`url` are supplied it reveals a source preview on hover and\n * keyboard focus; otherwise it renders as a plain numbered chip.\n */\nconst InlineCitation = (\n { ref,\n className,\n index,\n title,\n description,\n url,\n style,\n children,\n href,\n target,\n rel,\n tabIndex,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n ...props\n }: InlineCitationProps & { ref?: React.Ref }\n ) => {\n const [open, setOpen] = React.useState(false)\n const resolvedHref = safeHttpUrl(href ?? url)\n const hasPreview = Boolean(title || description || url)\n const previewId = React.useId()\n const resolvedTarget = target ?? (resolvedHref ? \"_blank\" : undefined)\n const resolvedRel = rel ?? (resolvedHref ? \"noreferrer noopener\" : undefined)\n\n const handleMouseEnter = React.useCallback(\n (event: React.MouseEvent) => {\n if (hasPreview) setOpen(true)\n onMouseEnter?.(event)\n },\n [hasPreview, onMouseEnter]\n )\n const handleMouseLeave = React.useCallback(\n (event: React.MouseEvent) => {\n if (hasPreview) setOpen(false)\n onMouseLeave?.(event)\n },\n [hasPreview, onMouseLeave]\n )\n const handleFocus = React.useCallback(\n (event: React.FocusEvent) => {\n if (hasPreview) setOpen(true)\n onFocus?.(event)\n },\n [hasPreview, onFocus]\n )\n const handleBlur = React.useCallback(\n (event: React.FocusEvent) => {\n if (hasPreview) setOpen(false)\n onBlur?.(event)\n },\n [hasPreview, onBlur]\n )\n\n const chip = (\n \n {children ?? index}\n \n )\n\n if (!hasPreview) return chip\n\n return (\n \n {chip}\n