diff --git a/frontend/src/lib/components/TileCard.svelte b/frontend/src/lib/components/TileCard.svelte new file mode 100644 index 0000000..08ac5ca --- /dev/null +++ b/frontend/src/lib/components/TileCard.svelte @@ -0,0 +1,213 @@ + + +
{ + if (e.key === 'Enter') { + onpreview(); + } else if (e.key === ' ') { + e.preventDefault(); + onselect(); + } + }} + class="group relative aspect-square cursor-pointer overflow-hidden rounded-lg border transition-all hover:border-sky-400/50 + {selected ? 'border-sky-400/50 ring-1 ring-sky-400/50' : 'border-sky-200/20'}" +> + {#if isImage} + {file.name} + {:else} +
+ {#if isVideo} + + + + + + + + + + + {:else} + + + + + {/if} +
+ {/if} + + {#if isVideo} +
+
+ + + +
+
+ {/if} + +
+ {formatName(file.name)} +
+ +
+ {#if confirming} + + + {:else} + + + {/if} +
+
diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 6f5edb0..91e1edc 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -5,6 +5,7 @@ import type { FileRecord } from '$lib/types'; import { deleteFile, downloadFile, loadFiles, logout, uploadFile } from '$lib/api'; import FileRow from '$lib/components/FileRow.svelte'; + import TileCard from '$lib/components/TileCard.svelte'; import FilePreview from '$lib/components/FilePreview.svelte'; let fileRecords = $state([]); @@ -12,6 +13,12 @@ let previewFile = $state(null); let search = $state(''); let loading = $state(true); + let viewMode = $state<'rows' | 'tiles'>('rows'); + + function setViewMode(mode: 'rows' | 'tiles') { + viewMode = mode; + localStorage.setItem('viewMode', mode); + } async function refresh() { fileRecords = await loadFiles(); @@ -54,7 +61,11 @@ window.location.href = '/auth'; } - onMount(refresh); + onMount(() => { + const saved = localStorage.getItem('viewMode'); + if (saved === 'rows' || saved === 'tiles') viewMode = saved; + refresh(); + });
@@ -92,40 +103,114 @@
-
+
-
- -
- -
- Name - Size - Uploaded at -
- Actions +
+ +
- - {#each filteredFileRecords as fileRecord (fileRecord.id)} -
- (selectedFileId = fileRecord.id)} - onpreview={() => (previewFile = fileRecord)} - ondownload={() => handleDownload(fileRecord.id, fileRecord.name)} - ondelete={() => handleDelete(fileRecord.id)} - /> -
- {:else} - {#if !loading}

No files yet.

{/if} - {/each}
+ + {#if viewMode === 'rows'} +
+
+ Name + Size + Uploaded at +
+ Actions +
+ + {#each filteredFileRecords as fileRecord (fileRecord.id)} +
+ (selectedFileId = fileRecord.id)} + onpreview={() => (previewFile = fileRecord)} + ondownload={() => handleDownload(fileRecord.id, fileRecord.name)} + ondelete={() => handleDelete(fileRecord.id)} + /> +
+ {:else} + {#if !loading} +

No files yet.

+ {/if} + {/each} +
+ {:else} +
+ {#each filteredFileRecords as fileRecord (fileRecord.id)} +
+ (selectedFileId = fileRecord.id)} + onpreview={() => (previewFile = fileRecord)} + ondownload={() => handleDownload(fileRecord.id, fileRecord.name)} + ondelete={() => handleDelete(fileRecord.id)} + /> +
+ {:else} + {#if !loading} +

No files yet.

+ {/if} + {/each} +
+ {/if}
{#if previewFile}