diff --git a/packages/genui/a2ui-playground/src/components/PreviewPanel.tsx b/packages/genui/a2ui-playground/src/components/PreviewPanel.tsx index 86d1bad03f..36db5f5858 100644 --- a/packages/genui/a2ui-playground/src/components/PreviewPanel.tsx +++ b/packages/genui/a2ui-playground/src/components/PreviewPanel.tsx @@ -47,6 +47,7 @@ export interface PreviewQrItem { variant?: 'default' | 'alt'; placeholder?: ReactNode; errorDescription?: ReactNode; + showQrCode?: boolean; } interface A2UIPreviewSource { @@ -445,6 +446,8 @@ export function PreviewPanel(props: PreviewPanelProps) { return []; } + const showQrCode = previewSource.kind !== 'a2ui' || !!previewSource.demoId; + const cards: Array<{ key: string; item: PreviewQrItem }> = []; if (renderShareUrl) { cards.push({ @@ -455,6 +458,7 @@ export function PreviewPanel(props: PreviewPanelProps) { url: renderShareUrl, urlTitle: formatUrlForDisplay(renderShareUrl), copyButtonTitle: 'Copy render URL', + showQrCode, }, }); } @@ -468,6 +472,7 @@ export function PreviewPanel(props: PreviewPanelProps) { urlTitle: formatUrlForDisplay(lynxDevUrl), copyButtonTitle: 'Copy Lynx dev bundle URL', variant: 'alt', + showQrCode, }, }); } @@ -655,7 +660,7 @@ export function PreviewPanel(props: PreviewPanelProps) { - {item.url + {item.url && item.showQrCode !== false ? ( (''); const [renderUrl, setRenderUrl] = useState(''); const [generatedJson, setGeneratedJson] = useState(''); + const [previewMessages, setPreviewMessages] = useState( + null, + ); const [isGenerating, setIsGenerating] = useState(false); const messagesEndRef = useRef(null); const previewFrameRef = useRef(null); @@ -366,11 +371,22 @@ export function AIChatPage(props: { protocol: Protocol }) { }); const baseUrl = useMemo(() => window.location.href.replace(/#.*$/, ''), []); + const previewSource = useMemo(() => { + if (!previewMessages) return undefined; + return { + kind: 'a2ui' as const, + protocol, + demoUrl: DEFAULT_A2UI_DEMO_URL, + theme: 'light' as const, + messages: previewMessages, + }; + }, [previewMessages, protocol]); const publishPreviewMessages = useCallback( (nextMessages: unknown[]) => { if (nextMessages.length === 0) return; latestPreviewMessagesRef.current = nextMessages; + setPreviewMessages(nextMessages); const initData = { protocol, @@ -425,6 +441,8 @@ export function AIChatPage(props: { protocol: Protocol }) { ]); setInputValue(''); setGeneratedJson(''); + setPreviewMessages(null); + latestPreviewMessagesRef.current = []; setIsGenerating(true); void (async () => { @@ -533,6 +551,30 @@ export function AIChatPage(props: { protocol: Protocol }) { {msg.content} ))} + {generatedJson + ? ( +
+
+ Generated Output + JSON +
+ +
+ ) + : null}
@@ -569,38 +611,7 @@ export function AIChatPage(props: { protocol: Protocol }) { style={previewPanelStyle} title='Lynx Preview' showPreviewModeSwitch - afterBody={ - <> - {generatedJson - ? ( -
-
Generated JSON
-
{generatedJson}
-
- ) - : null} - -
-
-
-
View on Device
-
- Scan the QR code to preview on your mobile device. -
-
- {renderUrl - ? - : ( -
- - No render - -
- )} -
-
- - } + previewSource={previewSource} >