diff --git a/client/package.json b/client/package.json index f2811014c..3f54d1e17 100644 --- a/client/package.json +++ b/client/package.json @@ -23,20 +23,22 @@ "format:check": "prettier --check src/" }, "dependencies": { + "@bookorbit/types": "workspace:*", "@fontsource-variable/fraunces": "^5.2.9", "@fontsource-variable/inter": "^5.2.8", - "@bookorbit/types": "workspace:*", "@tailwindcss/vite": "^4.2.4", + "@tanstack/vue-table": "^8.21.3", + "@tanstack/vue-virtual": "^3.13.24", "@types/howler": "^2.2.12", - "@vueuse/core": "^14.2.1", + "@vueuse/core": "^14.3.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "dompurify": "^3.4.1", + "dompurify": "^3.4.2", "driver.js": "^1.4.0", "echarts": "^6.0.0", "howler": "^2.2.4", "lucide-vue-next": "^1.0.0", - "pdfjs-dist": "^5.6.205", + "pdfjs-dist": "^5.7.284", "pinia": "^3.0.4", "reka-ui": "^2.9.6", "socket.io-client": "^4.8.3", @@ -47,7 +49,7 @@ "vue-echarts": "8.1.0-beta.2", "vue-router": "^5.0.6", "vue-sonner": "^2.0.9", - "vue-virtual-scroller": "^3.0.0" + "vue-virtual-scroller": "^3.0.2" }, "devDependencies": { "@tsconfig/node24": "^24.0.4", @@ -58,16 +60,16 @@ "@vitest/coverage-v8": "^4.1.5", "@vitest/eslint-plugin": "^1.6.16", "@vue/eslint-config-typescript": "^14.7.0", - "@vue/test-utils": "^2.4.8", + "@vue/test-utils": "^2.4.10", "@vue/tsconfig": "^0.9.1", "eslint": "^10.2.1", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-oxlint": "~1.61.0", + "eslint-plugin-oxlint": "~1.62.0", "eslint-plugin-vue": "~10.9.0", "jiti": "^2.6.1", - "jsdom": "^29.0.2", + "jsdom": "^29.1.1", "npm-run-all2": "^8.0.4", - "oxlint": "~1.61.0", + "oxlint": "~1.62.0", "prettier": "3.8.3", "tw-animate-css": "^1.4.0", "typescript": "~5.9.3", diff --git a/client/src/components/AppLayout.vue b/client/src/components/AppLayout.vue index f41277c46..dfbed603b 100644 --- a/client/src/components/AppLayout.vue +++ b/client/src/components/AppLayout.vue @@ -13,6 +13,7 @@ const themeStore = useThemeStore() const backgroundClass = computed(() => BACKGROUND_OPTIONS.find((b) => b.id === themeStore.background)?.cssClass ?? '') const BOOK_ROUTE_NAMES = new Set(['book-detail']) +const TABLE_VIEW_ROUTE_NAMES = new Set(['library', 'smartScope', 'collection', 'series-detail']) const viewKey = computed(() => { const name = String(route.name) if (BOOK_ROUTE_NAMES.has(name)) return name @@ -33,7 +34,13 @@ const viewKey = computed(() => {
Scope
+Format
+Columns
+Options
+Preflight
+Scope: {{ scopeSummary }}
+
+
+ Estimated size: + {{ (preflight.estimatedBytes / 1024 / 1024).toFixed(2) }} MB + ({{ preflight.sizeCategory }}) +
+File: {{ preflight.fileName }}
+ +{{ preflightError }}
+Save sort, layout, and view-specific filters for quick reuse.
+| + + | +
+
+
+
+
+
+
+
+ |
+ |
| + | ||
|
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+ |
+
+
| + |
No books to display
+{{ error }}
diff --git a/client/src/features/book/components/detail/tabs/CoverSearchDrawer.vue b/client/src/features/book/components/detail/tabs/CoverSearchDrawer.vue index 1fef4a80c..2679f1eb3 100644 --- a/client/src/features/book/components/detail/tabs/CoverSearchDrawer.vue +++ b/client/src/features/book/components/detail/tabs/CoverSearchDrawer.vue @@ -1,16 +1,18 @@ -
Selection |
+ Title |
+ Authors |
+
|---|---|---|
| checkbox | +A very long book title | +Short | +