diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx
index 758f5a83f..1f09642ac 100644
--- a/packages/app/src/components/file-tree.tsx
+++ b/packages/app/src/components/file-tree.tsx
@@ -447,12 +447,13 @@ export default function FileTree(props: {
})
return (
-
+
{(node) => {
const expanded = () => file.tree.state(node.path)?.expanded ?? false
const deep = () => deeps().get(node.path) ?? -1
const kind = () => visibleKind(node, kinds(), marks())
+ const active = () => !!kind() && !node.ignored
return (
@@ -530,7 +531,30 @@ export default function FileTree(props: {
onClick={() => props.onFileClick?.(node)}
>
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/ui/src/components/file-icon.css b/packages/ui/src/components/file-icon.css
index e650f6dc7..078352096 100644
--- a/packages/ui/src/components/file-icon.css
+++ b/packages/ui/src/components/file-icon.css
@@ -3,3 +3,35 @@
width: 16px;
height: 16px;
}
+
+/*
+ File tree: show monochrome weak icons by default.
+ On hover, show the original file-type colors.
+*/
+[data-component="filetree"] .filetree-icon--mono {
+ color: var(--icon-base);
+}
+
+[data-component="filetree"] .filetree-iconpair {
+ position: relative;
+ display: inline-flex;
+ width: 16px;
+ height: 16px;
+}
+
+[data-component="filetree"] .filetree-iconpair [data-component="file-icon"] {
+ position: absolute;
+ inset: 0;
+}
+
+[data-component="filetree"] .filetree-iconpair .filetree-icon--color {
+ opacity: 0;
+}
+
+[data-component="filetree"]:hover .filetree-iconpair .filetree-icon--color {
+ opacity: 1;
+}
+
+[data-component="filetree"]:hover .filetree-iconpair .filetree-icon--mono {
+ opacity: 0;
+}
diff --git a/packages/ui/src/components/file-icon.tsx b/packages/ui/src/components/file-icon.tsx
index cadb7ba83..405cbe163 100644
--- a/packages/ui/src/components/file-icon.tsx
+++ b/packages/ui/src/components/file-icon.tsx
@@ -1,16 +1,20 @@
import type { Component, JSX } from "solid-js"
-import { createMemo, splitProps } from "solid-js"
+import { createMemo, 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 & {
node: { path: string; type: "file" | "directory" }
expanded?: boolean
+ mono?: boolean
}
export const FileIcon: Component = (props) => {
- const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded"])
+ 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++}`
return (
)
}