From 7796b055820b20bb47d679ff60c63d58b02d742b Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Tue, 13 Oct 2026 10:37:51 -0400 Subject: [PATCH] fix(pdf): clear text layer before re-render to stop duplicated spans (v0.5.3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TextLayer appends into the container without clearing it, so any re-render of the same page doc (zoom settle, spread-scale update) stacked a second span set at sub-pixel-shifted positions — selection text reads doubled. Clear the container (stale spans + previous endOfContent helper) before each TextLayer render. --- package.json | 2 +- pdf.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f50940f..90b5625 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "foliate-js", - "version": "0.5.2", + "version": "0.5.3", "description": "Render e-books in the browser", "repository": { "type": "git", diff --git a/pdf.js b/pdf.js index 11a1f6c..be13680 100644 --- a/pdf.js +++ b/pdf.js @@ -36,6 +36,12 @@ const render = async (page, doc, zoom) => { doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)); const container = doc.querySelector(".textLayer"); + // TextLayer appends into the container without clearing it, so any + // re-render of the same page doc (zoom settle, spread-scale update) + // stacked a second span set over the old one (sub-pixel shifted — + // selection text read doubled). Clear stale spans and the previous + // endOfContent helper before rendering fresh. + container.replaceChildren(); const textLayer = new pdfjsLib.TextLayer({ textContentSource: await page.streamTextContent(), container,