From 4dd606a60b9a94037cca2eb0fa8db7523f0da27e Mon Sep 17 00:00:00 2001 From: Niklas Sirch Date: Sun, 12 Jan 2025 23:59:32 +0100 Subject: [PATCH] feat(pageColor): add option to invert pdf pageColor --- assets/main.mjs | 26 ++++++++++++++++++++++++++ package.json | 23 ++++++++++++++++++++++- src/pdf_viewer_provider.d.ts.map | 2 +- src/pdf_viewer_provider.ts | 6 ++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/assets/main.mjs b/assets/main.mjs index 9c9ac48..7e57655 100644 --- a/assets/main.mjs +++ b/assets/main.mjs @@ -30,6 +30,32 @@ PDFViewerApplicationOptions.set("defaultUrl", ""); PDFViewerApplicationOptions.set("disablePreferences", true); PDFViewerApplicationOptions.set("workerSrc", config.workerSrc); +function invertOrResetPageColor(doInvert) { + const invertFilter = doInvert + ? "invert(64%) contrast(228%) brightness(80%) hue-rotate(180deg)" + : null; + + document.getElementById("viewer").style.filter = invertFilter; + document.getElementById("thumbnailView").style.filter = invertFilter; +} + +switch (config.pageColorTheme) { + case "Follow system": + const darkModePreference = window.matchMedia( + "(prefers-color-scheme: dark)" + ); + invertOrResetPageColor(darkModePreference.matches); + darkModePreference.addEventListener("change", (e) => { + invertOrResetPageColor(e.matches); + }); + break; + case "Unchanged": + break; + case "Invert": + invertOrResetPageColor(true); + break; +} + void (async () => { await window.PDFViewerApplication.initializedPromise; window.PDFViewerApplication.open(config); diff --git a/package.json b/package.json index d64666f..20b3c91 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,28 @@ } ] } - ] + ], + "configuration": { + "type": "object", + "title": "vscode-pdf", + "properties": { + "vscode-pdf.pageColorTheme": { + "type": "string", + "default": "Unchanged", + "enum": [ + "Follow system", + "Unchanged", + "Invert" + ], + "enumDescriptions": [ + "Dark system theme: invert; Light system theme: unchanged", + "Don't change the page color theme", + "Invert the page color theme" + ], + "description": "Change the page color theme" + } + } + } }, "scripts": { "vscode:prepublish": "npm run package", diff --git a/src/pdf_viewer_provider.d.ts.map b/src/pdf_viewer_provider.d.ts.map index f38379f..b1f7ac5 100644 --- a/src/pdf_viewer_provider.d.ts.map +++ b/src/pdf_viewer_provider.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pdf_viewer_provider.d.ts","sourceRoot":"","sources":["pdf_viewer_provider.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,4BAA4B,EACjC,UAAU,EACV,KAAK,gBAAgB,EACrB,GAAG,EAEH,KAAK,YAAY,EAElB,MAAM,QAAQ,CAAC;AAKhB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAiB7C,qBAAa,iBAAkB,YAAW,4BAA4B;IACpE,gBAAuB,QAAQ,cAAc;WAE/B,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAUhD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IAEpD,OAAO,CAAC,aAAa,CAAM;gBAEf,OAAO,EAAE,gBAAgB;IAI/B,kBAAkB,CAAC,GAAG,EAAE,GAAG;IAmBjC,OAAO,CAAC,WAAW;IAKb,mBAAmB,CACvB,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC;IAmBhB,OAAO,CAAC,iBAAiB;CAsC1B"} \ No newline at end of file +{"version":3,"file":"pdf_viewer_provider.d.ts","sourceRoot":"","sources":["pdf_viewer_provider.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,KAAK,4BAA4B,EACjC,UAAU,EACV,KAAK,gBAAgB,EACrB,GAAG,EAEH,KAAK,YAAY,EAGlB,MAAM,QAAQ,CAAC;AAKhB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAkB7C,qBAAa,iBAAkB,YAAW,4BAA4B;IACpE,gBAAuB,QAAQ,cAAc;WAE/B,QAAQ,CAAC,OAAO,EAAE,gBAAgB;IAUhD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IAEpD,OAAO,CAAC,aAAa,CAAM;gBAEf,OAAO,EAAE,gBAAgB;IAI/B,kBAAkB,CAAC,GAAG,EAAE,GAAG;IAmBjC,OAAO,CAAC,WAAW;IAKb,mBAAmB,CACvB,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC;IAmBhB,OAAO,CAAC,iBAAiB;CA2C1B"} \ No newline at end of file diff --git a/src/pdf_viewer_provider.ts b/src/pdf_viewer_provider.ts index 3f1f831..039beec 100644 --- a/src/pdf_viewer_provider.ts +++ b/src/pdf_viewer_provider.ts @@ -23,6 +23,7 @@ import { type Webview, type WebviewPanel, window, + workspace, } from "vscode"; import rawViewerHtml from "../assets/pdf.js/web/viewer.html"; @@ -122,9 +123,14 @@ export class PDFViewerProvider implements CustomReadonlyEditorProvider { const cspSource = webview.cspSource; + const pageColorTheme = workspace + .getConfiguration("vscode-pdf") + .get("pageColorTheme"); + const settings = { url: `${webview.asWebviewUri(document.uri)}`, workerSrc: `${resolvePdfJsURI("build", "pdf.worker.mjs")}`, + pageColorTheme, }; return viewerHtml