From 0db150eed7fbb75e13ac87d239a69adca33ed974 Mon Sep 17 00:00:00 2001
From: Col0ring <1561999073@qq.com>
Date: Tue, 15 Sep 2026 17:37:25 +0800
Subject: [PATCH 1/3] feat(webui): expand the file-type icon set
- add language, config, data and framework icons and drop the merged `web`
icon
- tighten the existing java, js, py and txt icons and the media badges
---
webui/frontend/app/assets/files/c.svg | 1 +
webui/frontend/app/assets/files/config.svg | 1 +
webui/frontend/app/assets/files/cpp.svg | 1 +
webui/frontend/app/assets/files/csharp.svg | 1 +
webui/frontend/app/assets/files/css.svg | 1 +
webui/frontend/app/assets/files/database.svg | 1 +
webui/frontend/app/assets/files/docker.svg | 1 +
webui/frontend/app/assets/files/git.svg | 1 +
webui/frontend/app/assets/files/go.svg | 1 +
webui/frontend/app/assets/files/html.svg | 1 +
webui/frontend/app/assets/files/java.svg | 2 +-
webui/frontend/app/assets/files/js.svg | 2 +-
webui/frontend/app/assets/files/json.svg | 1 +
webui/frontend/app/assets/files/kotlin.svg | 1 +
webui/frontend/app/assets/files/less.svg | 1 +
webui/frontend/app/assets/files/php.svg | 1 +
webui/frontend/app/assets/files/py.svg | 2 +-
webui/frontend/app/assets/files/ruby.svg | 1 +
webui/frontend/app/assets/files/rust.svg | 1 +
webui/frontend/app/assets/files/sass.svg | 1 +
webui/frontend/app/assets/files/shell.svg | 1 +
webui/frontend/app/assets/files/svelte.svg | 1 +
webui/frontend/app/assets/files/swift.svg | 1 +
webui/frontend/app/assets/files/ts.svg | 1 +
webui/frontend/app/assets/files/txt.svg | 2 +-
webui/frontend/app/assets/files/vue.svg | 1 +
webui/frontend/app/assets/files/web.svg | 1 -
webui/frontend/app/assets/files/xml.svg | 1 +
webui/frontend/app/assets/files/yaml.svg | 1 +
webui/frontend/app/assets/icons/audio.svg | 2 +-
webui/frontend/app/assets/icons/image.svg | 2 +-
webui/frontend/app/assets/icons/video.svg | 2 +-
32 files changed, 31 insertions(+), 8 deletions(-)
create mode 100644 webui/frontend/app/assets/files/c.svg
create mode 100644 webui/frontend/app/assets/files/config.svg
create mode 100644 webui/frontend/app/assets/files/cpp.svg
create mode 100644 webui/frontend/app/assets/files/csharp.svg
create mode 100644 webui/frontend/app/assets/files/css.svg
create mode 100644 webui/frontend/app/assets/files/database.svg
create mode 100644 webui/frontend/app/assets/files/docker.svg
create mode 100644 webui/frontend/app/assets/files/git.svg
create mode 100644 webui/frontend/app/assets/files/go.svg
create mode 100644 webui/frontend/app/assets/files/html.svg
create mode 100644 webui/frontend/app/assets/files/json.svg
create mode 100644 webui/frontend/app/assets/files/kotlin.svg
create mode 100644 webui/frontend/app/assets/files/less.svg
create mode 100644 webui/frontend/app/assets/files/php.svg
create mode 100644 webui/frontend/app/assets/files/ruby.svg
create mode 100644 webui/frontend/app/assets/files/rust.svg
create mode 100644 webui/frontend/app/assets/files/sass.svg
create mode 100644 webui/frontend/app/assets/files/shell.svg
create mode 100644 webui/frontend/app/assets/files/svelte.svg
create mode 100644 webui/frontend/app/assets/files/swift.svg
create mode 100644 webui/frontend/app/assets/files/ts.svg
create mode 100644 webui/frontend/app/assets/files/vue.svg
delete mode 100644 webui/frontend/app/assets/files/web.svg
create mode 100644 webui/frontend/app/assets/files/xml.svg
create mode 100644 webui/frontend/app/assets/files/yaml.svg
diff --git a/webui/frontend/app/assets/files/c.svg b/webui/frontend/app/assets/files/c.svg
new file mode 100644
index 000000000..fe76cf6c4
--- /dev/null
+++ b/webui/frontend/app/assets/files/c.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/config.svg b/webui/frontend/app/assets/files/config.svg
new file mode 100644
index 000000000..f9a5d9c31
--- /dev/null
+++ b/webui/frontend/app/assets/files/config.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/cpp.svg b/webui/frontend/app/assets/files/cpp.svg
new file mode 100644
index 000000000..6cdd95e06
--- /dev/null
+++ b/webui/frontend/app/assets/files/cpp.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/csharp.svg b/webui/frontend/app/assets/files/csharp.svg
new file mode 100644
index 000000000..57a6247de
--- /dev/null
+++ b/webui/frontend/app/assets/files/csharp.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/css.svg b/webui/frontend/app/assets/files/css.svg
new file mode 100644
index 000000000..795af688f
--- /dev/null
+++ b/webui/frontend/app/assets/files/css.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/database.svg b/webui/frontend/app/assets/files/database.svg
new file mode 100644
index 000000000..0e1a6d4ec
--- /dev/null
+++ b/webui/frontend/app/assets/files/database.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/docker.svg b/webui/frontend/app/assets/files/docker.svg
new file mode 100644
index 000000000..231b437d7
--- /dev/null
+++ b/webui/frontend/app/assets/files/docker.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/git.svg b/webui/frontend/app/assets/files/git.svg
new file mode 100644
index 000000000..4e51543b7
--- /dev/null
+++ b/webui/frontend/app/assets/files/git.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/go.svg b/webui/frontend/app/assets/files/go.svg
new file mode 100644
index 000000000..18127d882
--- /dev/null
+++ b/webui/frontend/app/assets/files/go.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/html.svg b/webui/frontend/app/assets/files/html.svg
new file mode 100644
index 000000000..a9b268c46
--- /dev/null
+++ b/webui/frontend/app/assets/files/html.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/java.svg b/webui/frontend/app/assets/files/java.svg
index b0158a127..9a275e628 100644
--- a/webui/frontend/app/assets/files/java.svg
+++ b/webui/frontend/app/assets/files/java.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/files/js.svg b/webui/frontend/app/assets/files/js.svg
index b966fdbc0..962b4de8c 100644
--- a/webui/frontend/app/assets/files/js.svg
+++ b/webui/frontend/app/assets/files/js.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/files/json.svg b/webui/frontend/app/assets/files/json.svg
new file mode 100644
index 000000000..fb074665f
--- /dev/null
+++ b/webui/frontend/app/assets/files/json.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/kotlin.svg b/webui/frontend/app/assets/files/kotlin.svg
new file mode 100644
index 000000000..e171021e6
--- /dev/null
+++ b/webui/frontend/app/assets/files/kotlin.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/less.svg b/webui/frontend/app/assets/files/less.svg
new file mode 100644
index 000000000..3371cbccd
--- /dev/null
+++ b/webui/frontend/app/assets/files/less.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/php.svg b/webui/frontend/app/assets/files/php.svg
new file mode 100644
index 000000000..ffc988285
--- /dev/null
+++ b/webui/frontend/app/assets/files/php.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/py.svg b/webui/frontend/app/assets/files/py.svg
index 663c0430d..0611ed0ea 100644
--- a/webui/frontend/app/assets/files/py.svg
+++ b/webui/frontend/app/assets/files/py.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/files/ruby.svg b/webui/frontend/app/assets/files/ruby.svg
new file mode 100644
index 000000000..719d27cf0
--- /dev/null
+++ b/webui/frontend/app/assets/files/ruby.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/rust.svg b/webui/frontend/app/assets/files/rust.svg
new file mode 100644
index 000000000..94fbb0283
--- /dev/null
+++ b/webui/frontend/app/assets/files/rust.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/sass.svg b/webui/frontend/app/assets/files/sass.svg
new file mode 100644
index 000000000..6baf76444
--- /dev/null
+++ b/webui/frontend/app/assets/files/sass.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/shell.svg b/webui/frontend/app/assets/files/shell.svg
new file mode 100644
index 000000000..d2216c85b
--- /dev/null
+++ b/webui/frontend/app/assets/files/shell.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/svelte.svg b/webui/frontend/app/assets/files/svelte.svg
new file mode 100644
index 000000000..53e34bebd
--- /dev/null
+++ b/webui/frontend/app/assets/files/svelte.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/swift.svg b/webui/frontend/app/assets/files/swift.svg
new file mode 100644
index 000000000..e55bc0f03
--- /dev/null
+++ b/webui/frontend/app/assets/files/swift.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/ts.svg b/webui/frontend/app/assets/files/ts.svg
new file mode 100644
index 000000000..ffd4a58a2
--- /dev/null
+++ b/webui/frontend/app/assets/files/ts.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/txt.svg b/webui/frontend/app/assets/files/txt.svg
index 148398ea3..1d6e14a2a 100644
--- a/webui/frontend/app/assets/files/txt.svg
+++ b/webui/frontend/app/assets/files/txt.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/files/vue.svg b/webui/frontend/app/assets/files/vue.svg
new file mode 100644
index 000000000..7ae688718
--- /dev/null
+++ b/webui/frontend/app/assets/files/vue.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/web.svg b/webui/frontend/app/assets/files/web.svg
deleted file mode 100644
index 2c4596185..000000000
--- a/webui/frontend/app/assets/files/web.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/webui/frontend/app/assets/files/xml.svg b/webui/frontend/app/assets/files/xml.svg
new file mode 100644
index 000000000..225972d2f
--- /dev/null
+++ b/webui/frontend/app/assets/files/xml.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/files/yaml.svg b/webui/frontend/app/assets/files/yaml.svg
new file mode 100644
index 000000000..92d1d71f3
--- /dev/null
+++ b/webui/frontend/app/assets/files/yaml.svg
@@ -0,0 +1 @@
+
diff --git a/webui/frontend/app/assets/icons/audio.svg b/webui/frontend/app/assets/icons/audio.svg
index e0627595c..143509b84 100644
--- a/webui/frontend/app/assets/icons/audio.svg
+++ b/webui/frontend/app/assets/icons/audio.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/icons/image.svg b/webui/frontend/app/assets/icons/image.svg
index f4c2a37b7..83e010717 100644
--- a/webui/frontend/app/assets/icons/image.svg
+++ b/webui/frontend/app/assets/icons/image.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/webui/frontend/app/assets/icons/video.svg b/webui/frontend/app/assets/icons/video.svg
index 185d7d9e0..5ae3686b2 100644
--- a/webui/frontend/app/assets/icons/video.svg
+++ b/webui/frontend/app/assets/icons/video.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
From a77bfb289d8466c8a0d182b4ef67bca0314befa4 Mon Sep 17 00:00:00 2001
From: Col0ring <1561999073@qq.com>
Date: Tue, 15 Sep 2026 17:37:43 +0800
Subject: [PATCH 2/3] feat(webui): map file icons from one shared resolver
- export `getFileIcon` from FileCard with extension and full-name lookups
- reuse it in the folder tree instead of a second mapping
- size the workspace row icons up to match
---
.../app/components/common/FileCard.tsx | 165 ++++++++++++++++--
.../app/components/common/FolderTree.tsx | 84 ++-------
.../project/ProjectOverviewView.tsx | 4 +-
3 files changed, 165 insertions(+), 88 deletions(-)
diff --git a/webui/frontend/app/components/common/FileCard.tsx b/webui/frontend/app/components/common/FileCard.tsx
index 6207740a8..adccbda5e 100644
--- a/webui/frontend/app/components/common/FileCard.tsx
+++ b/webui/frontend/app/components/common/FileCard.tsx
@@ -2,9 +2,7 @@ import { Image, Tooltip } from 'antd'
import type React from 'react'
import { useT } from '~/lib/i18n'
-// File type icons. Inlined (`?react`) instead of loaded as
URLs so the
-// theme-adaptive badges (e.g. web) can follow `currentColor` — an external SVG
-// referenced by
has no inherited color and would render black.
+// File type icons, inlined via `?react` so they render as sized SVG components.
import iconDefault from '~/assets/files/default.svg?react'
import iconPdf from '~/assets/files/pdf.svg?react'
import iconWord from '~/assets/files/word.svg?react'
@@ -17,7 +15,30 @@ import iconJavascript from '~/assets/files/js.svg?react'
import iconPython from '~/assets/files/py.svg?react'
import iconText from '~/assets/files/txt.svg?react'
import iconMp3 from '~/assets/files/mp3.svg?react'
-import iconWeb from '~/assets/files/web.svg?react'
+import iconHtml from '~/assets/files/html.svg?react'
+import iconCss from '~/assets/files/css.svg?react'
+import iconSass from '~/assets/files/sass.svg?react'
+import iconLess from '~/assets/files/less.svg?react'
+import iconJson from '~/assets/files/json.svg?react'
+import iconYaml from '~/assets/files/yaml.svg?react'
+import iconXml from '~/assets/files/xml.svg?react'
+import iconConfig from '~/assets/files/config.svg?react'
+import iconDatabase from '~/assets/files/database.svg?react'
+import iconShell from '~/assets/files/shell.svg?react'
+import iconDocker from '~/assets/files/docker.svg?react'
+import iconGit from '~/assets/files/git.svg?react'
+import iconTs from '~/assets/files/ts.svg?react'
+import iconGo from '~/assets/files/go.svg?react'
+import iconRust from '~/assets/files/rust.svg?react'
+import iconC from '~/assets/files/c.svg?react'
+import iconCpp from '~/assets/files/cpp.svg?react'
+import iconCsharp from '~/assets/files/csharp.svg?react'
+import iconRuby from '~/assets/files/ruby.svg?react'
+import iconPhp from '~/assets/files/php.svg?react'
+import iconSwift from '~/assets/files/swift.svg?react'
+import iconKotlin from '~/assets/files/kotlin.svg?react'
+import iconVue from '~/assets/files/vue.svg?react'
+import iconSvelte from '~/assets/files/svelte.svg?react'
import iconImage from '~/assets/icons/image.svg?react'
import iconAudio from '~/assets/icons/audio.svg?react'
import iconVideo from '~/assets/icons/video.svg?react'
@@ -76,43 +97,132 @@ function getFileExt(name: string): string {
type FileIcon = React.FC>
+// Full filename (lowercased) to icon, checked before the extension map.
+const fileNameIcons: Record = {
+ readme: iconMarkdown,
+ 'readme.md': iconMarkdown,
+ 'readme.txt': iconText,
+ changelog: iconText,
+ license: iconText,
+ licence: iconText,
+ copying: iconText,
+ notice: iconText,
+ authors: iconText,
+ dockerfile: iconDocker,
+ 'docker-compose.yml': iconDocker,
+ 'docker-compose.yaml': iconDocker,
+ '.dockerignore': iconDocker,
+ '.gitignore': iconGit,
+ '.gitattributes': iconGit,
+ '.gitmodules': iconGit,
+ '.gitkeep': iconGit,
+ gemfile: iconRuby,
+ 'go.mod': iconGo,
+ 'go.sum': iconGo
+}
+
// File extension to icon mapping
const fileIcons: Record = {
// Documents
PDF: iconPdf,
DOC: iconWord,
DOCX: iconWord,
+ RTF: iconWord,
+ ODT: iconWord,
// Spreadsheets
XLS: iconExcel,
XLSX: iconExcel,
CSV: iconExcel,
+ TSV: iconExcel,
+ ODS: iconExcel,
// Presentations
PPT: iconPpt,
PPTX: iconPpt,
+ ODP: iconPpt,
// Archives
ZIP: iconZip,
RAR: iconZip,
'7Z': iconZip,
TAR: iconZip,
GZ: iconZip,
+ TGZ: iconZip,
+ BZ2: iconZip,
+ XZ: iconZip,
+ ZST: iconZip,
+ JAR: iconZip,
+ WAR: iconZip,
// Code / Text
MD: iconMarkdown,
+ MDX: iconMarkdown,
+ MARKDOWN: iconMarkdown,
TXT: iconText,
+ TEXT: iconText,
LOG: iconText,
- // Web sources
- HTML: iconWeb,
- HTM: iconWeb,
- CSS: iconWeb,
- // .ipynb has no dedicated badge asset; use the generic file badge so doc
- // cards render uniformly (matching the composer upload card) instead of the
- // odd line-art glyph.
+ NFO: iconText,
IPYNB: iconDefault,
+ // Data / config
+ JSON: iconJson,
+ JSONC: iconJson,
+ JSON5: iconJson,
+ YAML: iconYaml,
+ YML: iconYaml,
+ XML: iconXml,
+ PLIST: iconXml,
+ TOML: iconConfig,
+ INI: iconConfig,
+ CFG: iconConfig,
+ CONF: iconConfig,
+ ENV: iconConfig,
+ PROPERTIES: iconConfig,
+ EDITORCONFIG: iconConfig,
+ // Database
+ SQL: iconDatabase,
+ DB: iconDatabase,
+ SQLITE: iconDatabase,
+ SQLITE3: iconDatabase,
+ // Shell
+ SH: iconShell,
+ BASH: iconShell,
+ ZSH: iconShell,
+ FISH: iconShell,
+ // Web sources
+ HTML: iconHtml,
+ HTM: iconHtml,
+ XHTML: iconHtml,
+ CSS: iconCss,
+ STYL: iconCss,
+ SCSS: iconSass,
+ SASS: iconSass,
+ LESS: iconLess,
JS: iconJavascript,
- TS: iconJavascript,
+ MJS: iconJavascript,
+ CJS: iconJavascript,
JSX: iconJavascript,
- TSX: iconJavascript,
+ TS: iconTs,
+ TSX: iconTs,
+ MTS: iconTs,
+ CTS: iconTs,
JAVA: iconJava,
PY: iconPython,
+ // Languages
+ GO: iconGo,
+ RS: iconRust,
+ C: iconC,
+ H: iconC,
+ CPP: iconCpp,
+ CC: iconCpp,
+ CXX: iconCpp,
+ HPP: iconCpp,
+ HH: iconCpp,
+ HXX: iconCpp,
+ CS: iconCsharp,
+ RB: iconRuby,
+ PHP: iconPhp,
+ SWIFT: iconSwift,
+ KT: iconKotlin,
+ KTS: iconKotlin,
+ VUE: iconVue,
+ SVELTE: iconSvelte,
// Media
PNG: iconImage,
JPG: iconImage,
@@ -120,19 +230,40 @@ const fileIcons: Record = {
GIF: iconImage,
SVG: iconImage,
WEBP: iconImage,
+ ICO: iconImage,
+ BMP: iconImage,
+ TIFF: iconImage,
+ TIF: iconImage,
+ AVIF: iconImage,
+ HEIC: iconImage,
+ HEIF: iconImage,
MP3: iconMp3,
WAV: iconAudio,
OGG: iconAudio,
FLAC: iconAudio,
+ M4A: iconAudio,
+ AAC: iconAudio,
+ OPUS: iconAudio,
+ AIFF: iconAudio,
+ WMA: iconAudio,
MP4: iconVideo,
MOV: iconVideo,
AVI: iconVideo,
WEBM: iconVideo,
- MKV: iconVideo
+ MKV: iconVideo,
+ MPG: iconVideo,
+ MPEG: iconVideo,
+ M4V: iconVideo,
+ FLV: iconVideo,
+ WMV: iconVideo,
+ '3GP': iconVideo,
+ OGV: iconVideo
}
-function getFileIcon(ext: string): FileIcon {
- return fileIcons[ext] ?? iconDefault
+export function getFileIcon(name: string): FileIcon {
+ const named = fileNameIcons[name.toLowerCase()]
+ if (named) return named
+ return fileIcons[getFileExt(name)] ?? iconDefault
}
/** File-type badge for a filename (extension-based, with fallback). The color
@@ -145,7 +276,7 @@ export function FileTypeIcon({
name: string
className?: string
}) {
- const Icon = getFileIcon(getFileExt(name))
+ const Icon = getFileIcon(name)
return
}
diff --git a/webui/frontend/app/components/common/FolderTree.tsx b/webui/frontend/app/components/common/FolderTree.tsx
index 479182f3a..b593d22b3 100644
--- a/webui/frontend/app/components/common/FolderTree.tsx
+++ b/webui/frontend/app/components/common/FolderTree.tsx
@@ -1,80 +1,18 @@
import { Dropdown, Tree } from 'antd'
import type { MenuProps, TreeDataNode, TreeProps } from 'antd'
-import {
- type FC,
- type ReactNode,
- type SVGProps,
- useEffect,
- useMemo,
- useRef,
- useState
-} from 'react'
+import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react'
import { collectDroppedFiles } from '~/lib/dropFiles'
import type { DroppedFile } from '~/lib/dropFiles'
import { useT } from '~/lib/i18n'
import { InlineNameInput } from './InlineNameInput'
import './FolderTree.css'
-// File type icons, inlined (`?react`) so the neutral ones can follow
-// `currentColor` (see FileCard).
-import iconDefault from '~/assets/files/default.svg?react'
-import iconPdf from '~/assets/files/pdf.svg?react'
-import iconWord from '~/assets/files/word.svg?react'
-import iconExcel from '~/assets/files/excel.svg?react'
-import iconPpt from '~/assets/files/ppt.svg?react'
-import iconZip from '~/assets/files/zip.svg?react'
-import iconMarkdown from '~/assets/files/md.svg?react'
-import iconJava from '~/assets/files/java.svg?react'
-import iconJavascript from '~/assets/files/js.svg?react'
-import iconPython from '~/assets/files/py.svg?react'
-import iconText from '~/assets/files/txt.svg?react'
-import iconMp3 from '~/assets/files/mp3.svg?react'
-import iconWeb from '~/assets/files/web.svg?react'
import iconFolder from '~/assets/icons/folder.svg?react'
-
-type FileIcon = FC>
-
-// Extension → icon mapping
-const FILE_ICONS: Record = {
- pdf: iconPdf,
- doc: iconWord,
- docx: iconWord,
- xls: iconExcel,
- xlsx: iconExcel,
- csv: iconExcel,
- ppt: iconPpt,
- pptx: iconPpt,
- zip: iconZip,
- rar: iconZip,
- '7z': iconZip,
- tar: iconZip,
- gz: iconZip,
- md: iconMarkdown,
- js: iconJavascript,
- ts: iconJavascript,
- jsx: iconJavascript,
- tsx: iconJavascript,
- java: iconJava,
- py: iconPython,
- json: iconJavascript,
- mp3: iconMp3,
- html: iconWeb,
- htm: iconWeb,
- css: iconWeb,
- log: iconText,
- txt: iconText,
- yaml: iconDefault,
- yml: iconDefault,
- bin: iconDefault,
- sh: iconDefault,
- xml: iconDefault,
- svg: iconDefault
-}
+import { getFileIcon } from './FileCard'
function iconFor(title: string, isDir: boolean): ReactNode {
- const ext = title.split('.').pop()?.toLowerCase() ?? ''
- const Icon = isDir ? iconFolder : FILE_ICONS[ext] ?? iconDefault
- return
+ const Icon = isDir ? iconFolder : getFileIcon(title)
+ return
}
// Key of the inline "new entry" row. Not a path, so it can never collide with a
@@ -321,7 +259,11 @@ export function FolderTree({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedKey, defaultExpandAll, dirSig])
- const menuItems = (isDir: boolean, path: string, key: string): MenuProps['items'] => {
+ const menuItems = (
+ isDir: boolean,
+ path: string,
+ key: string
+ ): MenuProps['items'] => {
if (!actions) return []
// When right-clicking a node that's part of a multi-selection, offer batch
// operations over the whole selection instead of single-node actions.
@@ -560,7 +502,9 @@ export function FolderTree({
useEffect(() => {
if (!draft?.dir) return
const parts = draft.dir.split('/')
- const ancestors = parts.map((_, i) => `dir:${parts.slice(0, i + 1).join('/')}`)
+ const ancestors = parts.map(
+ (_, i) => `dir:${parts.slice(0, i + 1).join('/')}`
+ )
setExpandedKeys((prev) => [...new Set([...prev, ...ancestors])])
}, [draft?.dir])
@@ -641,7 +585,9 @@ export function FolderTree({
'.ant-tree-treenode'
) as HTMLElement | null
if (!dt || !dt.setDragImage || !row) return
- const iconEl = row.querySelector('.ant-tree-title img') as HTMLImageElement | null
+ const iconEl = row.querySelector(
+ '.ant-tree-title img'
+ ) as HTMLImageElement | null
const name = row.querySelector('.ant-tree-title')?.textContent ?? ''
// Dragging any node of a multi-selection moves the whole set: show a count.
const dragKey = String(info.node.key)
diff --git a/webui/frontend/app/components/project/ProjectOverviewView.tsx b/webui/frontend/app/components/project/ProjectOverviewView.tsx
index 5933aa345..9cfd1b385 100644
--- a/webui/frontend/app/components/project/ProjectOverviewView.tsx
+++ b/webui/frontend/app/components/project/ProjectOverviewView.tsx
@@ -802,11 +802,11 @@ function WorkspacePanel({
return (
{record.kind === 'folder' ? (
-
+
) : (
)}
{record.kind === 'folder' ? (
From 29c1581eeedc5faca765524b74de66be06d3e6c9 Mon Sep 17 00:00:00 2001
From: Col0ring <1561999073@qq.com>
Date: Tue, 15 Sep 2026 17:48:56 +0800
Subject: [PATCH 3/3] fix: icon size
---
webui/frontend/app/components/common/FileCard.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/webui/frontend/app/components/common/FileCard.tsx b/webui/frontend/app/components/common/FileCard.tsx
index adccbda5e..54d33e6d9 100644
--- a/webui/frontend/app/components/common/FileCard.tsx
+++ b/webui/frontend/app/components/common/FileCard.tsx
@@ -321,9 +321,9 @@ function OpenButton({ onClick }: { onClick?: () => void }) {
e.stopPropagation()
onClick?.()
}}
- className="absolute -right-1.5 -top-1.5 z-10 flex h-[20px] w-[20px] cursor-pointer items-center justify-center rounded-full border-none bg-msa-fill-3 p-0 text-msa-text-2 opacity-0 shadow-sm outline-none transition-opacity hover:text-msa-text-1 group-hover:opacity-100"
+ className="absolute -right-1.5 -top-1.5 z-10 flex h-5 w-5 cursor-pointer items-center justify-center rounded-full border-none bg-msa-fill-3 p-0 text-msa-text-2 opacity-0 shadow-sm outline-none transition-opacity hover:text-msa-text-1 group-hover:opacity-100"
>
-
+
)
}