From 06b907d228796adeba7dd252592e1f9d6671db40 Mon Sep 17 00:00:00 2001 From: zerob13 Date: Thu, 9 Apr 2026 14:22:19 +0800 Subject: [PATCH] fix(sidepanel): fill artifact viewer height --- src/renderer/src/App.vue | 6 +- .../src/components/artifacts/HTMLArtifact.vue | 49 +++--- .../components/artifacts/MermaidArtifact.vue | 22 +-- .../components/artifacts/ReactArtifact.vue | 5 +- .../src/components/artifacts/SvgArtifact.vue | 67 +++----- .../components/sidepanel/ChatSidePanel.vue | 4 +- .../components/sidepanel/WorkspacePanel.vue | 4 +- .../components/sidepanel/WorkspaceViewer.vue | 14 +- .../sidepanel/viewer/WorkspaceCodePane.vue | 72 ++++++++- .../sidepanel/viewer/WorkspaceInfoPane.vue | 5 +- .../sidepanel/viewer/WorkspacePreviewPane.vue | 149 ++++++++++-------- src/renderer/src/views/ChatTabView.vue | 4 +- test/renderer/components/HTMLArtifact.test.ts | 23 ++- .../components/MermaidArtifact.test.ts | 43 ++++- .../renderer/components/ReactArtifact.test.ts | 28 ++++ test/renderer/components/SvgArtifact.test.ts | 51 ++++++ .../components/WorkspacePreviewPane.test.ts | 62 +++++++- .../components/WorkspaceViewer.test.ts | 12 ++ 18 files changed, 451 insertions(+), 169 deletions(-) create mode 100644 test/renderer/components/ReactArtifact.test.ts create mode 100644 test/renderer/components/SvgArtifact.test.ts diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index accc1ca09..928eeeb6c 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -428,9 +428,11 @@ onBeforeUnmount(() => {
- +
+ +
diff --git a/src/renderer/src/components/artifacts/HTMLArtifact.vue b/src/renderer/src/components/artifacts/HTMLArtifact.vue index 6c784b53a..0ee4de172 100644 --- a/src/renderer/src/components/artifacts/HTMLArtifact.vue +++ b/src/renderer/src/components/artifacts/HTMLArtifact.vue @@ -1,18 +1,14 @@ @@ -39,9 +35,26 @@ const props = defineProps<{ }>() const iframeRef = ref() +const resolvedViewportSize = computed(() => props.viewportSize || 'desktop') + +const containerClasses = computed(() => { + if (resolvedViewportSize.value === 'desktop') { + return 'flex h-full min-h-0 w-full overflow-hidden' + } + + return 'flex h-full min-h-0 w-full items-center justify-center overflow-auto' +}) + +const frameContainerClasses = computed(() => { + if (resolvedViewportSize.value === 'desktop') { + return 'h-full min-h-0 w-full' + } + + return 'relative shrink-0' +}) const viewportClasses = computed(() => { - const size = props.viewportSize || 'desktop' + const size = resolvedViewportSize.value const baseClasses = 'html-iframe-wrapper transition-all duration-300 ease-in-out' switch (size) { @@ -49,12 +62,12 @@ const viewportClasses = computed(() => { case 'tablet': return `${baseClasses} border border-gray-300 dark:border-gray-600 relative` default: - return `${baseClasses} w-full h-full` + return `${baseClasses} block h-full min-h-0 w-full` } }) const viewportStyles = computed(() => { - const size = props.viewportSize || 'desktop' + const size = resolvedViewportSize.value if (size === 'mobile' || size === 'tablet') { const dimensions = VIEWPORT_SIZES[size] @@ -75,7 +88,7 @@ const setupIframe = () => { if (!doc) return // Add viewport meta tag - const viewportSize = props.viewportSize || 'desktop' + const viewportSize = resolvedViewportSize.value let viewportContent = 'width=device-width, initial-scale=1.0' if (viewportSize === 'mobile' || viewportSize === 'tablet') { diff --git a/src/renderer/src/components/artifacts/MermaidArtifact.vue b/src/renderer/src/components/artifacts/MermaidArtifact.vue index 38ed4182d..3f169be1f 100644 --- a/src/renderer/src/components/artifacts/MermaidArtifact.vue +++ b/src/renderer/src/components/artifacts/MermaidArtifact.vue @@ -1,13 +1,17 @@