Просмотр исходного кода

fix(app): dim non-deep filetree guide lines

David Hill 3 недель назад
Родитель
Сommit
010ed55590
1 измененных файлов с 23 добавлено и 1 удалено
  1. 23 1
      packages/app/src/components/file-tree.tsx

+ 23 - 1
packages/app/src/components/file-tree.tsx

@@ -33,6 +33,19 @@ export default function FileTree(props: {
   const draggable = () => props.draggable ?? true
   const tooltip = () => props.tooltip ?? true
 
+  const maxOpen = (dir: string, lvl: number): number => {
+    const expanded = file.tree.state(dir)?.expanded ?? false
+    if (!expanded) return -1
+
+    const nodes = file.tree.children(dir)
+    const child = nodes.reduce((max, node) => {
+      if (node.type !== "directory") return max
+      return Math.max(max, maxOpen(node.path, lvl + 1))
+    }, -1)
+
+    return Math.max(lvl, child)
+  }
+
   const filter = createMemo(() => {
     const allowed = props.allowed
     if (!allowed) return
@@ -152,6 +165,7 @@ export default function FileTree(props: {
       <For each={nodes()}>
         {(node) => {
           const expanded = () => file.tree.state(node.path)?.expanded ?? false
+          const deep = createMemo(() => (node.type === "directory" ? maxOpen(node.path, level) : -1))
           const Wrapper = (p: ParentProps) => {
             if (!tooltip()) return p.children
             return (
@@ -181,7 +195,15 @@ export default function FileTree(props: {
                       </Node>
                     </Wrapper>
                   </Collapsible.Trigger>
-                  <Collapsible.Content class="mt-0.5">
+                  <Collapsible.Content class="relative pt-0.5">
+                    <div
+                      classList={{
+                        "absolute top-0 bottom-0 w-px pointer-events-none bg-border-weak-base": true,
+                        "opacity-100": expanded() && deep() === level,
+                        "opacity-50": !(expanded() && deep() === level),
+                      }}
+                      style={`left: ${Math.max(0, 8 + level * 12 - 4) + 8}px`}
+                    />
                     <FileTree
                       path={node.path}
                       level={level + 1}