From 936e0bc82610ba169baed59a2eedd6476f724b08 Mon Sep 17 00:00:00 2001 From: Ilya Moskovkin Date: Sun, 1 Nov 2026 13:36:39 +0700 Subject: [PATCH 1/5] Refined graphite interface: neutral surfaces, one accent, aligned layout. Adds refined.css (loaded last) with a Graphite default theme: ash surfaces with a faint aubergine cast, no decorative borders, and one accent reserved for selection, focus, active filter pills and the new-model dot. Legacy --primary-accent fills are routed to neutral chrome; theme presets now only pick that accent. - Sidebar: one-line brand row, tool tabs with line icons, a prominent search field, 40px controls with square helpers, equal insets on both edges. - Library: Detailed cards stretch to fill the row, one inset for all views, list view as a single aligned table, thumbnail menu as a corner button. - Thumbnails default to the card surface (Match interface). A one-time migration moves the old saved defaults (#070147, modern-cyan) once. - Clear the stale is-list-view class when leaving list view. - Ship refined.css and logo-mark.png in electron-builder and Docker. --- CHANGELOG.md | 10 + Dockerfile | 4 +- grid-refresh.js | 4 +- index.html | 47 +- logo-mark.png | Bin 0 -> 6615 bytes package.json | 2 + refined.css | 1754 +++++++++++++++++++++++++ renderer.js | 114 +- scripts/create-docker-distribution.js | 1 + 9 files changed, 1874 insertions(+), 62 deletions(-) create mode 100644 logo-mark.png create mode 100644 refined.css diff --git a/CHANGELOG.md b/CHANGELOG.md index 9158c289..39e8a8ea 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 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..a603c1a2 100644 --- a/grid-refresh.js +++ b/grid-refresh.js @@ -99,8 +99,8 @@ 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. - const contentWidth = Math.max(0, gridWidth - 40); + // Every view uses the full grid box (no horizontal padding in renderer.js). + const contentWidth = Math.max(0, gridWidth); const available = view === 'preview' ? gridWidth : contentWidth; const tile = previewTilePx(gridWidth, previewColumns, previewGap); const detailedColumns = detailedColumnCount(contentWidth, spec.itemWidth || 300); 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