diff --git a/ts_web/elements/viewer.ts b/ts_web/elements/viewer.ts index 2d136d8..49f98a2 100644 --- a/ts_web/elements/viewer.ts +++ b/ts_web/elements/viewer.ts @@ -594,18 +594,17 @@ export class DeDocumentViewer extends DeesElement { } private async handlePrint(): Promise { - // Create a print-specific container + // Create a print-specific container - hidden on screen, visible only in print const printContainer = document.createElement("div"); printContainer.className = "dedocument-print-container"; printContainer.style.cssText = ` - position: fixed; + position: absolute; + left: -9999px; top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 999999; - background: white; - overflow: visible; + width: 210mm; + height: auto; + visibility: hidden; + pointer-events: none; `; // Create a document element in print mode @@ -618,7 +617,7 @@ export class DeDocumentViewer extends DeesElement { printContainer.appendChild(printDoc); document.body.appendChild(printContainer); - // Add print styles + // Add print styles - hide everything except print container during print const printStyles = document.createElement("style"); printStyles.id = "dedocument-print-styles"; printStyles.textContent = ` @@ -628,8 +627,11 @@ export class DeDocumentViewer extends DeesElement { } .dedocument-print-container { position: static !important; + left: auto !important; width: auto !important; height: auto !important; + visibility: visible !important; + pointer-events: auto !important; } dedocument-dedocument { display: block !important; @@ -655,24 +657,26 @@ export class DeDocumentViewer extends DeesElement { // Wait for the document to render await new Promise((resolve) => setTimeout(resolve, 500)); - // Trigger print - window.print(); - - // Clean up after print dialog closes + // Cleanup function const cleanup = () => { - printContainer.remove(); - printStyles.remove(); + if (document.body.contains(printContainer)) { + printContainer.remove(); + } + if (document.head.contains(printStyles)) { + printStyles.remove(); + } window.removeEventListener("afterprint", cleanup); }; + // Listen for print dialog close window.addEventListener("afterprint", cleanup); - // Fallback cleanup after a delay (in case afterprint doesn't fire) - setTimeout(() => { - if (document.body.contains(printContainer)) { - cleanup(); - } - }, 60000); + // Trigger print + window.print(); + + // Fallback: also clean up immediately after print() returns + // (some browsers return from print() after dialog closes) + setTimeout(cleanup, 100); } private calculateFitWidth(): void {