diff --git a/CHANGELOG.md b/CHANGELOG.md index 9158c289..31253538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes contributed via pull request are documented in this file. ## [Unreleased] +### Refined interface +- New default **Graphite** theme: ash-gray surfaces with a faint aubergine cast, no decorative borders, and one accent used only for selection, focus, active filter pills and the "new" dot. The other themes in Settings now only change that accent. The styles live in `refined.css`, loaded after the existing sheets. +- Thumbnails sit on the card surface instead of dark blue. Settings → Model Background Color has a new **Match interface (Default)** option. On first launch, a saved Dark Blue background or Modern Cyan theme, which older versions saved whenever Settings was saved, moves to the new defaults once. A theme picked after that is kept. +- The search field is the lead control of the sidebar: taller, with a magnifier, a ⌘/ (Ctrl+/) hint, and a submit arrow that lights up once you type. +- Scan Directory and View Entire Library become one compact row of quiet buttons, **Scan folder** and **Show all**, so they no longer compete with search. Both keep their behavior. +- Sidebar: one-line brand row with the model count, tool tabs with line icons instead of colored round buttons, 40px controls with matching square helper buttons, and the same inset on both edges. +- Library: Detailed cards are clear containers (surface, hairline edge, soft depth, rating row on its own hairline) and fill the width like the Preview wall, photo thumbnails get a margin and rounded corners, and all three views share one inset. "Not printed" is no longer badged on every card, because it is the default state; other print states show a colored dot. +- List view is one table: a tinted sticky header, hairline rows edge to edge, centered cells, sizes right-aligned, and group rows in the same type as model rows. +- Dialogs share one flat style with a single light primary button. The Server/Docker touch layout keeps its own design and was checked for regressions. + ## [3.0.1] - 2026-10-18 - Upgrading from 2.x keeps models that were marked Printed. The 3.0.0 migration had filled every row with Unprinted because SQLite applies `DEFAULT` on `ADD COLUMN`, so the backfill never ran. Opening 3.0.1 also repairs databases that already hit that bug (`printed = 1` still in the DB). diff --git a/Dockerfile b/Dockerfile index 32ebdb23..453e30e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -102,7 +102,7 @@ RUN rm -rf node_modules/better-sqlite3/build || true && \ npx electron-builder install-app-deps # Copy application files -COPY main.js db-repair.js bundle-keys.js zip-extract.js preload.js input-dialog-preload.js input-dialog.html renderer.js notes-markdown.js dedup-preferred.js organize-library.js organize-library-ui.js organize-library.css index.html styles.css theme.css notes-markdown.css preview-wall.css thumbnail-progress.css thumbnail-progress.js ./ +COPY main.js db-repair.js bundle-keys.js zip-extract.js preload.js input-dialog-preload.js input-dialog.html renderer.js notes-markdown.js dedup-preferred.js organize-library.js organize-library-ui.js organize-library.css index.html styles.css theme.css refined.css notes-markdown.css preview-wall.css thumbnail-progress.css thumbnail-progress.js ./ COPY printer-manager.js printer-discovery.js slicer-detect.js printer-management.js printer-management.css parts-stock.js parts-stock.css ./ COPY manifest.webmanifest sw.js pwa.js mobile-ui.js mobile-ui.css ./ COPY server-bridge.js scan-worker.js scan-skip.js parse-worker.js scheduled-backup.js missing-thumbnails-query.js primary-thumbnails-query.js delete-model-file.js flatten-3mf-stl.js thumbnail-worker.js ./ @@ -118,7 +118,7 @@ COPY *.png *.jpg *.bmp ./ COPY guide/ ./guide/ # Fail the build if required app modules were omitted from COPY above -RUN for f in db-repair.js bundle-keys.js zip-extract.js thumbnail-compress.js threemf-mesh-extract.js print-events.js folder-tree-lib.js mcp-server.js server-tls.js extension-inbox.js sidebar-layout.js folder-tree.js extract-lys-preview.js extract-f3d-preview.js extract-chitubox-preview.js extract-voxl-preview.js parse-lys-geometry.js step-assembly.js manifest.webmanifest sw.js pwa.js mobile-ui.js mobile-ui.css theme.css notes-markdown.js notes-markdown.css dedup-preferred.js organize-library.js organize-library-ui.js organize-library.css printer-manager.js printer-discovery.js slicer-detect.js printer-management.js printer-management.css parts-stock.js parts-stock.css scheduled-backup.js missing-thumbnails-query.js primary-thumbnails-query.js delete-model-file.js scan-skip.js slicer-launch.js slicer-protocol.js helper/printventory-helper.js helper/install-bundle.js library-context.js folder-tags.js grid-refresh.js stl-sanity.js thumbnail-skip.js ai-rate-limit.js support-logs.js support-webhook.json input-dialog-preload.js input-dialog.html; do \ +RUN for f in db-repair.js bundle-keys.js zip-extract.js thumbnail-compress.js threemf-mesh-extract.js print-events.js folder-tree-lib.js mcp-server.js server-tls.js extension-inbox.js sidebar-layout.js folder-tree.js extract-lys-preview.js extract-f3d-preview.js extract-chitubox-preview.js extract-voxl-preview.js parse-lys-geometry.js step-assembly.js manifest.webmanifest sw.js pwa.js mobile-ui.js mobile-ui.css theme.css refined.css notes-markdown.js notes-markdown.css dedup-preferred.js organize-library.js organize-library-ui.js organize-library.css printer-manager.js printer-discovery.js slicer-detect.js printer-management.js printer-management.css parts-stock.js parts-stock.css scheduled-backup.js missing-thumbnails-query.js primary-thumbnails-query.js delete-model-file.js scan-skip.js slicer-launch.js slicer-protocol.js helper/printventory-helper.js helper/install-bundle.js library-context.js folder-tags.js grid-refresh.js stl-sanity.js thumbnail-skip.js ai-rate-limit.js support-logs.js support-webhook.json input-dialog-preload.js input-dialog.html; do \ test -f "$f" || (echo "Missing required app file: $f" >&2; exit 1); \ done diff --git a/grid-refresh.js b/grid-refresh.js index b984d918..b9098606 100644 --- a/grid-refresh.js +++ b/grid-refresh.js @@ -99,14 +99,14 @@ const view = spec.view || 'detailed'; const previewColumns = Math.max(1, Math.round(Number(spec.previewColumns) || 6)); const previewGap = spec.previewGap == null ? 2 : Number(spec.previewGap); - // Preview tiles use the full grid box. Detailed and list sit inside 20px of padding. + // Detailed and preview sit inside 20px of padding; list rows pad themselves. const contentWidth = Math.max(0, gridWidth - 40); - const available = view === 'preview' ? gridWidth : contentWidth; - const tile = previewTilePx(gridWidth, previewColumns, previewGap); + const available = view === 'list' ? gridWidth : contentWidth; + const tile = previewTilePx(contentWidth, previewColumns, previewGap); const detailedColumns = detailedColumnCount(contentWidth, spec.itemWidth || 300); const columns = view === 'list' ? 1 : (view === 'preview' ? previewColumns : detailedColumns); const rowHeight = view === 'preview' ? tile : (view === 'list' ? 56 : (Number(spec.itemHeight) || 520)); - const verticalGap = view === 'preview' ? previewGap : (view === 'list' ? 6 : 20); + const verticalGap = view === 'preview' ? previewGap : (view === 'list' ? 0 : 20); const next = { width: gridWidth, columns: columns, @@ -124,7 +124,7 @@ detailedColumns: detailedColumns, columns: columns, rowHeight: rowHeight, - list: listViewScrollWidth(spec.columnWidths || [], contentWidth), + list: listViewScrollWidth(spec.columnWidths || [], available), reposition: virtualGridGeometryChanged(spec.previous || null, next), layout: next }; diff --git a/index.html b/index.html index 330b0b20..165cdf92 100644 --- a/index.html +++ b/index.html @@ -21,6 +21,7 @@ + @@ -129,31 +130,26 @@

More