-
-
-
-
-
-
-
+
+
+
{@html consoleOutput}
@@ -393,3 +532,10 @@
+
+
diff --git a/docs/src/routes/docs/playground/FileTree/FileTree.svelte b/docs/src/routes/docs/playground/FileTree/FileTree.svelte
new file mode 100644
index 000000000..c9cf53650
--- /dev/null
+++ b/docs/src/routes/docs/playground/FileTree/FileTree.svelte
@@ -0,0 +1,98 @@
+
+
+
+ {#snippet renderNodes(nodes: TreeNode[])}
+ {#each nodes as node (node.path)}
+ {
+ selectedFile = path;
+ onSelect?.(path);
+ }}
+ >
+ {@render renderNodes(node.children)}
+
+ {/each}
+ {/snippet}
+
+
+ {@render renderNodes(tree)}
+
+
diff --git a/docs/src/routes/docs/playground/FileTree/TreeView/TreeView.svelte b/docs/src/routes/docs/playground/FileTree/TreeView/TreeView.svelte
new file mode 100644
index 000000000..fd6f1307e
--- /dev/null
+++ b/docs/src/routes/docs/playground/FileTree/TreeView/TreeView.svelte
@@ -0,0 +1,10 @@
+
+
+
+ {@render children?.()}
+
diff --git a/docs/src/routes/docs/playground/FileTree/TreeView/TreeViewNode.svelte b/docs/src/routes/docs/playground/FileTree/TreeView/TreeViewNode.svelte
new file mode 100644
index 000000000..7ff41afb6
--- /dev/null
+++ b/docs/src/routes/docs/playground/FileTree/TreeView/TreeViewNode.svelte
@@ -0,0 +1,106 @@
+
+
+{#if name.includes('.')}
+
+
+{:else}
+
+
+
+ {#if open}
+
+
+
+
+
+ {@render children?.()}
+
+
+
+ {/if}
+
+{/if}
diff --git a/docs/src/routes/docs/playground/FileTree/TreeView/index.ts b/docs/src/routes/docs/playground/FileTree/TreeView/index.ts
new file mode 100644
index 000000000..c723f1388
--- /dev/null
+++ b/docs/src/routes/docs/playground/FileTree/TreeView/index.ts
@@ -0,0 +1,4 @@
+import TreeView from './TreeView.svelte';
+import TreeViewNode from './TreeViewNode.svelte';
+
+export { TreeView, TreeViewNode, TreeView as Root, TreeViewNode as Node };
diff --git a/docs/src/routes/docs/playground/FileTree/TreeView/types.ts b/docs/src/routes/docs/playground/FileTree/TreeView/types.ts
new file mode 100644
index 000000000..65b202bd2
--- /dev/null
+++ b/docs/src/routes/docs/playground/FileTree/TreeView/types.ts
@@ -0,0 +1,16 @@
+import type { WithChildren } from 'bits-ui';
+import type { Snippet } from 'svelte';
+import type { HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements';
+
+export type TreeViewRootProps = HTMLAttributes
;
+
+export type TreeViewNodeProps = WithChildren<
+ Omit & {
+ name: string;
+ path?: string;
+ open?: boolean;
+ selected?: boolean;
+ onSelect?: (path: string) => void;
+ icon?: Snippet<[{ name: string; open: boolean }]>;
+ }
+>;