From 9ea557d23e614f942b0b3a1ea733713c1bcba977 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Mon, 15 Jun 2026 18:23:59 +0300 Subject: [PATCH] feat(markdown): open mermaid fullscreen preview on diagram click in chat Thread onShowPopup from MessageBody through AssistantTextPart into the markdown renderer so clicking a rendered mermaid diagram in assistant messages opens the existing pan/zoom fullscreen preview dialog. --- packages/ui/src/components/chat/message/MessageBody.tsx | 2 ++ .../src/components/chat/message/parts/AssistantTextPart.tsx | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/chat/message/MessageBody.tsx b/packages/ui/src/components/chat/message/MessageBody.tsx index 77e3aed9..309e597a 100644 --- a/packages/ui/src/components/chat/message/MessageBody.tsx +++ b/packages/ui/src/components/chat/message/MessageBody.tsx @@ -1696,6 +1696,7 @@ const AssistantMessageBody = React.memo(({ streamPhase={effectiveStreamPhase} chatRenderMode={chatRenderMode} onContentChange={onContentChange} + onShowPopup={onShowPopup} /> ); @@ -1730,6 +1731,7 @@ const AssistantMessageBody = React.memo(({ streamPhase={effectiveStreamPhase} chatRenderMode={chatRenderMode} onContentChange={onContentChange} + onShowPopup={onShowPopup} /> ); } else if (groupReasoningBlocks) { diff --git a/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx b/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx index 3fa97788..74b34b24 100644 --- a/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx +++ b/packages/ui/src/components/chat/message/parts/AssistantTextPart.tsx @@ -1,7 +1,7 @@ import React from 'react'; import type { Part } from '@opencode-ai/sdk/v2'; import { MarkdownRenderer } from '../../MarkdownRenderer'; -import type { StreamPhase } from '../types'; +import type { StreamPhase, ToolPopupContent } from '../types'; import type { ContentChangeReason } from '@/hooks/useChatAutoFollow'; import { useStreamingTextThrottle } from '../../hooks/useStreamingTextThrottle'; import { resolveAssistantDisplayText, shouldRenderAssistantText } from './assistantTextVisibility'; @@ -18,6 +18,7 @@ interface AssistantTextPartProps { streamPhase: StreamPhase; chatRenderMode?: 'sorted' | 'live'; onContentChange?: (reason?: ContentChangeReason, messageId?: string) => void; + onShowPopup?: (content: ToolPopupContent) => void; } const AssistantTextPart: React.FC = ({ @@ -25,6 +26,7 @@ const AssistantTextPart: React.FC = ({ messageId, streamPhase, chatRenderMode = 'live', + onShowPopup, }) => { // Use part directly from props — parent provides the latest version from the store. // No store subscription here to avoid re-render cascade from unrelated delta events. @@ -99,6 +101,7 @@ const AssistantTextPart: React.FC = ({ disableStreamAnimation={chatRenderMode === 'sorted'} variant={part.type === 'reasoning' ? 'reasoning' : 'assistant'} enableFileReferences={isFinalized} + onShowPopup={onShowPopup} /> );