diff --git a/frontend/src/routes/categories/[id]/+page.svelte b/frontend/src/routes/categories/[id]/+page.svelte
index 93d0a8c..77c9859 100644
--- a/frontend/src/routes/categories/[id]/+page.svelte
+++ b/frontend/src/routes/categories/[id]/+page.svelte
@@ -48,7 +48,8 @@
void loadTags(id, 0);
});
- async function loadTags(id: string, startOffset: number) {
+ async function loadTags(id: string | undefined, startOffset: number) {
+ if (!id) return;
tagsLoading = true;
try {
const params = new URLSearchParams({
diff --git a/frontend/src/routes/tags/[id]/+page.svelte b/frontend/src/routes/tags/[id]/+page.svelte
index 70ec906..ab5a376 100644
--- a/frontend/src/routes/tags/[id]/+page.svelte
+++ b/frontend/src/routes/tags/[id]/+page.svelte
@@ -172,7 +172,7 @@
Implied tags
- (rules = r)} />
+ (rules = r)} />
{/if}
diff --git a/frontend/vite-mock-plugin.ts b/frontend/vite-mock-plugin.ts
index f44a92b..a04f16b 100644
--- a/frontend/vite-mock-plugin.ts
+++ b/frontend/vite-mock-plugin.ts
@@ -114,6 +114,24 @@ function mockThumbSvg(id: string): string {
`;
}
+type MockFile = {
+ id: string;
+ original_name: string;
+ mime_type: string;
+ mime_extension: string;
+ content_datetime: string;
+ notes: string | null;
+ metadata: unknown;
+ exif: Record;
+ phash: number | null;
+ creator_id: number;
+ creator_name: string;
+ is_public: boolean;
+ is_deleted: boolean;
+ created_at: string;
+ position?: number;
+};
+
// Trash — pre-seeded with a few deleted files
const MOCK_TRASH: MockFile[] = Array.from({ length: 6 }, (_, i) => {
const mimes = ['image/jpeg', 'image/png', 'image/webp'];
@@ -139,7 +157,7 @@ const MOCK_TRASH: MockFile[] = Array.from({ length: 6 }, (_, i) => {
};
});
-const MOCK_FILES = Array.from({ length: 75 }, (_, i) => {
+const MOCK_FILES: MockFile[] = Array.from({ length: 75 }, (_, i) => {
const mimes = ['image/jpeg', 'image/png', 'image/webp', 'video/mp4'];
const exts = ['jpg', 'png', 'webp', 'mp4' ];
const mi = i % mimes.length;