summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-05 07:07:50 -0600
committerAdam <[email protected]>2026-03-05 08:00:41 -0600
commit8cbe7b4a017fe3087d817e776e46adb0dfce3fa6 (patch)
treeb8d77b01ea11a99392e18edec1b74e3fca74a505 /packages/ui/src
parent07348d14a2013b25434b91aecb30a82546bed1c5 (diff)
downloadopencode-8cbe7b4a017fe3087d817e776e46adb0dfce3fa6.tar.gz
opencode-8cbe7b4a017fe3087d817e776e46adb0dfce3fa6.zip
fix(app): file icon stability
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/file-icon.css1
-rw-r--r--packages/ui/src/components/file-icon.tsx17
2 files changed, 8 insertions, 10 deletions
diff --git a/packages/ui/src/components/file-icon.css b/packages/ui/src/components/file-icon.css
index a49674a90..5776425de 100644
--- a/packages/ui/src/components/file-icon.css
+++ b/packages/ui/src/components/file-icon.css
@@ -1,4 +1,5 @@
[data-component="file-icon"] {
+ display: block;
flex-shrink: 0;
width: 16px;
height: 16px;
diff --git a/packages/ui/src/components/file-icon.tsx b/packages/ui/src/components/file-icon.tsx
index 405cbe163..133cb169c 100644
--- a/packages/ui/src/components/file-icon.tsx
+++ b/packages/ui/src/components/file-icon.tsx
@@ -1,10 +1,8 @@
import type { Component, JSX } from "solid-js"
-import { createMemo, splitProps, Show } from "solid-js"
+import { createMemo, createUniqueId, splitProps, Show } from "solid-js"
import sprite from "./file-icons/sprite.svg"
import type { IconName } from "./file-icons/types"
-let filter = 0
-
export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & {
node: { path: string; type: "file" | "directory" }
expanded?: boolean
@@ -14,7 +12,7 @@ export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & {
export const FileIcon: Component<FileIconProps> = (props) => {
const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded", "mono"])
const name = createMemo(() => chooseIconName(local.node.path, local.node.type, local.expanded || false))
- const id = `file-icon-mono-${filter++}`
+ const id = `file-icon-mono-${createUniqueId()}`
return (
<svg
data-component="file-icon"
@@ -24,15 +22,14 @@ export const FileIcon: Component<FileIconProps> = (props) => {
[local.class ?? ""]: !!local.class,
}}
>
- <Show when={local.mono}>
+ <Show when={local.mono} fallback={<use href={`${sprite}#${name()}`} />}>
<defs>
- <filter id={id} color-interpolation-filters="sRGB">
- <feFlood flood-color="currentColor" result="flood" />
- <feComposite in="flood" in2="SourceAlpha" operator="in" />
- </filter>
+ <mask id={id} mask-type="alpha">
+ <use href={`${sprite}#${name()}`} />
+ </mask>
</defs>
+ <rect width="100%" height="100%" fill="currentColor" mask={`url(#${id})`} />
</Show>
- <use href={`${sprite}#${name()}`} filter={local.mono ? `url(#${id})` : undefined} />
</svg>
)
}