diff --git a/web/src/lib/components/diff/ImageDiff.svelte b/web/src/lib/components/diff/ImageDiff.svelte
index 9f75217..86b6208 100644
--- a/web/src/lib/components/diff/ImageDiff.svelte
+++ b/web/src/lib/components/diff/ImageDiff.svelte
@@ -102,14 +102,14 @@
{#snippet modeButton(forMode: Mode, iconClass: string)}
{/snippet}
-
+
{@render modeButton("slide", "octicon--image-16")}
{@render modeButton("side-by-side", "octicon--columns-16")}
{@render modeButton("fade", "octicon--image-16")}
@@ -171,10 +171,12 @@
-
+
-
-
+
+
+
+
{/snippet}
diff --git a/web/src/lib/components/files/DirectoryInput.svelte b/web/src/lib/components/files/DirectoryInput.svelte
new file mode 100644
index 0000000..556e32d
--- /dev/null
+++ b/web/src/lib/components/files/DirectoryInput.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {@render children?.({ directory })}
+
diff --git a/web/src/lib/components/files/DirectorySelect.svelte b/web/src/lib/components/files/DirectorySelect.svelte
new file mode 100644
index 0000000..8d94bb0
--- /dev/null
+++ b/web/src/lib/components/files/DirectorySelect.svelte
@@ -0,0 +1,23 @@
+
+
+
+ {#snippet children({ directory })}
+
+ {#if directory}
+ {directory.fileName}
+ {:else}
+ {placeholder}
+ {/if}
+
+ {/snippet}
+
diff --git a/web/src/lib/components/FileInput.svelte b/web/src/lib/components/files/FileInput.svelte
similarity index 100%
rename from web/src/lib/components/FileInput.svelte
rename to web/src/lib/components/files/FileInput.svelte
diff --git a/web/src/lib/components/SingleFileSelect.svelte b/web/src/lib/components/files/SingleFileSelect.svelte
similarity index 89%
rename from web/src/lib/components/SingleFileSelect.svelte
rename to web/src/lib/components/files/SingleFileSelect.svelte
index 7e893f6..baa4fff 100644
--- a/web/src/lib/components/SingleFileSelect.svelte
+++ b/web/src/lib/components/files/SingleFileSelect.svelte
@@ -1,5 +1,5 @@