diff --git a/frontend/src/components/workspace/artifacts/artifact-file-detail.tsx b/frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
index 4d9af67a6..8c70d91db 100644
--- a/frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
+++ b/frontend/src/components/workspace/artifacts/artifact-file-detail.tsx
@@ -20,6 +20,7 @@ import {
ArtifactTitle,
} from "@/components/ai-elements/artifact";
import { ClipboardSafeStreamdown } from "@/components/ai-elements/streamdown";
+import { Button } from "@/components/ui/button";
import { Select, SelectItem } from "@/components/ui/select";
import {
SelectContent,
@@ -43,7 +44,13 @@ import { useI18n } from "@/core/i18n/hooks";
import { findToolCallResult } from "@/core/messages/utils";
import { installSkill } from "@/core/skills/api";
import { streamdownPlugins } from "@/core/streamdown";
-import { checkCodeFile, getFileName } from "@/core/utils/files";
+import {
+ canBrowserPreviewFile,
+ checkCodeFile,
+ getFileExtensionDisplayName,
+ getFileIcon,
+ getFileName,
+} from "@/core/utils/files";
import { env } from "@/env";
import { cn } from "@/lib/utils";
@@ -92,6 +99,9 @@ export function ArtifactFileDetail({
}
return checkCodeFile(filepath);
}, [filepath, isWriteFile, isSkillFile]);
+ const canPreviewInBrowser = useMemo(() => {
+ return canBrowserPreviewFile(filepath);
+ }, [filepath]);
const isSupportPreview = useMemo(() => {
return language === "html" || language === "markdown";
}, [language]);
@@ -303,17 +313,69 @@ export function ArtifactFileDetail({
readonly
/>
)}
- {!isCodeFile && (
+ {!isCodeFile && canPreviewInBrowser && (
)}
+ {!isCodeFile && !canPreviewInBrowser && (
+
+ This file type cannot be previewed in the browser. +
+ +