From eef398bdcad2f1b87430de92ca43532d290fe0d7 Mon Sep 17 00:00:00 2001 From: Adib Hanna Date: Fri, 30 Oct 2026 16:50:17 -0500 Subject: [PATCH 1/3] Fix(theme): no white square where a view's two scrollbars meet A view that scrolls both ways drew a solid white 10px square in its bottom-right corner, where the vertical and horizontal scrollbars meet. In a dark theme it was the brightest thing on screen: rgb(255,255,255) against Gruvbox dark's rgb(30,32,33). The 2.80.0 phone walk found it on the Kanban board with lanes, and a check of the desktop build found the same square on wide database grids. The global stylesheet styles ::-webkit-scrollbar, its track and its thumb, but never ::-webkit-scrollbar-corner. Once a page styles the scrollbar, Chromium draws the corner as a custom part too, and a corner with no style of its own paints white. The rule was missing long before 2.80.0; lanes only put one more two-way scroller on a screen people look at all day. The corner is now transparent beside the global track, so it shows whatever sits behind the scroller, the same as the track does. That is the page background in every theme, dark or light, with no new token. It is one rule in app-core, so desktop, the self-hosted web app and the phones all get it; the phone shells already carry an equal rule in their own mobile.css for 1.35.0 / 1.1.51, which this makes redundant but harmless. The thumb and track are left as they were. Checked in the built app with both stores isolated, on a Kanban board with Lanes: Priority (1792 by 8762 inside 654 by 432) and a 24 column, 80 row CSV database (3099 by 2721 inside 654 by 476). In Gruvbox dark every one of the corner's 400 device pixels reads rgb(30,32,33), the page's own colour, on both views. Deleting just this rule in the same session turns all 400 white, and restoring it brings the page colour back. Gruvbox light reads rgb(250,242,204), the page again, where the missing rule left a fainter white square on the cream page. Tests: the stylesheet has a ::-webkit-scrollbar-corner rule with a transparent background (red without the rule). --- packages/app-core/src/lib/scrollbar-style.test.ts | 7 +++++++ packages/app-core/src/styles/index.css | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/packages/app-core/src/lib/scrollbar-style.test.ts b/packages/app-core/src/lib/scrollbar-style.test.ts index 0a2dc43a4..881f635c4 100644 --- a/packages/app-core/src/lib/scrollbar-style.test.ts +++ b/packages/app-core/src/lib/scrollbar-style.test.ts @@ -22,6 +22,13 @@ describe('scrollbar styles', () => { expect(withOpacity.map((rule) => rule.selector)).toEqual([]) }) + it('paints the corner where two scrollbars meet transparent, not Chromium white', () => { + // A view that scrolls both ways (the Kanban board with lanes, a wide + // database grid) once drew a white 10px square there in every dark theme. + const corner = scrollbarRules().find((rule) => rule.selector === '::-webkit-scrollbar-corner') + expect(corner?.body).toMatch(/background:\s*transparent/) + }) + it('tints the sidebar thumb with its text colour at 30%, and 50% under the pointer (#451)', () => { const rules = scrollbarRules() const thumb = rules.find((rule) => rule.selector === '.zn-sidebar-scroll::-webkit-scrollbar-thumb') diff --git a/packages/app-core/src/styles/index.css b/packages/app-core/src/styles/index.css index 3b3b64f58..a5d8f7294 100644 --- a/packages/app-core/src/styles/index.css +++ b/packages/app-core/src/styles/index.css @@ -1459,6 +1459,12 @@ textarea, ::-webkit-scrollbar-track { background: transparent; } +/* Once ::-webkit-scrollbar is styled, Chromium paints the corner where a + view's two scrollbars meet solid white unless it is styled too: a white + square on the lanes board and wide database grids in every dark theme. */ +::-webkit-scrollbar-corner { + background: transparent; +} ::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 999px; From b7070720b3aadd87b072c1e1812f84334ca6f9b3 Mon Sep 17 00:00:00 2001 From: Adib Hanna Date: Fri, 30 Oct 2026 16:52:01 -0500 Subject: [PATCH 2/3] Release: align desktop and shared packages at 2.80.1 --- apps/desktop/package.json | 2 +- apps/quicklook/package.json | 2 +- apps/share-viewer/package.json | 2 +- apps/web/package.json | 2 +- package-lock.json | 20 ++++++++++---------- package.json | 2 +- packages/app-core/package.json | 2 +- packages/bridge-contract/package.json | 2 +- packages/shared-domain/package.json | 2 +- packages/shared-ui/package.json | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 7c13d5545..9b3ff9e88 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/desktop", "productName": "ZenNotes", - "version": "2.80.0", + "version": "2.80.1", "description": "ZenNotes desktop shell", "private": true, "main": "./out/main/index.js", diff --git a/apps/quicklook/package.json b/apps/quicklook/package.json index 3d355b546..d023a7946 100644 --- a/apps/quicklook/package.json +++ b/apps/quicklook/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/quicklook", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "description": "The macOS Quick Look preview for Markdown files: the page it renders and the Swift extension that serves it", "homepage": "https://zennotes.org", diff --git a/apps/share-viewer/package.json b/apps/share-viewer/package.json index 65451307b..eb348331f 100644 --- a/apps/share-viewer/package.json +++ b/apps/share-viewer/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/share-viewer", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "description": "Read-only renderer for publicly shared ZenNotes, embedded by the zennotes.org website", "homepage": "https://zennotes.org", diff --git a/apps/web/package.json b/apps/web/package.json index 698011d0d..1e044a1e5 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/web", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "description": "ZenNotes web client for self-hosted and hosted deployments", "homepage": "https://zennotes.org", diff --git a/package-lock.json b/package-lock.json index 124d59aec..7ee0529a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "zennotes-monorepo", - "version": "2.80.0", + "version": "2.80.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zennotes-monorepo", - "version": "2.80.0", + "version": "2.80.1", "hasInstallScript": true, "workspaces": [ "apps/*", @@ -23,7 +23,7 @@ }, "apps/desktop": { "name": "@zennotes/desktop", - "version": "2.80.0", + "version": "2.80.1", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.18.3", @@ -915,7 +915,7 @@ }, "apps/quicklook": { "name": "@zennotes/quicklook", - "version": "2.80.0", + "version": "2.80.1", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -989,7 +989,7 @@ }, "apps/share-viewer": { "name": "@zennotes/share-viewer", - "version": "2.80.0", + "version": "2.80.1", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -1061,7 +1061,7 @@ }, "apps/web": { "name": "@zennotes/web", - "version": "2.80.0", + "version": "2.80.1", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -16396,7 +16396,7 @@ }, "packages/app-core": { "name": "@zennotes/app-core", - "version": "2.80.0", + "version": "2.80.1", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -16485,14 +16485,14 @@ }, "packages/bridge-contract": { "name": "@zennotes/bridge-contract", - "version": "2.80.0", + "version": "2.80.1", "devDependencies": { "typescript": "^5.7.2" } }, "packages/shared-domain": { "name": "@zennotes/shared-domain", - "version": "2.80.0", + "version": "2.80.1", "dependencies": { "@scure/bip39": "2.4.0", "@zennotes/bridge-contract": "*", @@ -16506,7 +16506,7 @@ }, "packages/shared-ui": { "name": "@zennotes/shared-ui", - "version": "2.80.0" + "version": "2.80.1" } } } diff --git a/package.json b/package.json index 13085d88b..190e407f4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "zennotes-monorepo", "private": true, - "version": "2.80.0", + "version": "2.80.1", "description": "ZenNotes monorepo for desktop, web, and self-hosted server builds", "packageManager": "npm@10.9.2", "engines": { diff --git a/packages/app-core/package.json b/packages/app-core/package.json index 7a9ff060c..83c94f293 100644 --- a/packages/app-core/package.json +++ b/packages/app-core/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/app-core", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "exports": { "./main": "./src/main.tsx", diff --git a/packages/bridge-contract/package.json b/packages/bridge-contract/package.json index 74f50ccb0..fb756ed15 100644 --- a/packages/bridge-contract/package.json +++ b/packages/bridge-contract/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/bridge-contract", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "exports": { "./bridge": "./src/bridge.ts", diff --git a/packages/shared-domain/package.json b/packages/shared-domain/package.json index 749db4b7c..c03a08ea8 100644 --- a/packages/shared-domain/package.json +++ b/packages/shared-domain/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/shared-domain", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "exports": { "./*": "./src/*.ts" diff --git a/packages/shared-ui/package.json b/packages/shared-ui/package.json index 4e1b22d2d..082bf21a6 100644 --- a/packages/shared-ui/package.json +++ b/packages/shared-ui/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/shared-ui", "private": true, - "version": "2.80.0", + "version": "2.80.1", "type": "module", "exports": { ".": "./src/index.ts" From 06ab9d605e21d5c2442074282358f0cbaa77c4ef Mon Sep 17 00:00:00 2001 From: Adib Hanna Date: Fri, 30 Oct 2026 16:52:12 -0500 Subject: [PATCH 3/3] Docs(whats-new): 2.80.1 takes the white square out of the scrollbar corner --- packages/app-core/src/lib/whats-new.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/app-core/src/lib/whats-new.ts b/packages/app-core/src/lib/whats-new.ts index fdbdbf44f..bb55d22e0 100644 --- a/packages/app-core/src/lib/whats-new.ts +++ b/packages/app-core/src/lib/whats-new.ts @@ -39,6 +39,15 @@ export const CLOUD_ANNOUNCEMENT = { } as const export const WHATS_NEW: readonly WhatsNewEntry[] = [ + { + version: '2.80.1', + highlights: [ + { + title: 'No white square in dark themes', + body: 'Where a view scrolls both ways, like the board with lanes or a wide database, the corner between its scrollbars no longer shows a white square.' + } + ] + }, { version: '2.80.0', highlights: [