{"_id":"@amplo/print-host","name":"@amplo/print-host","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@amplo/print-host","version":"0.1.0","description":"Angular directive-based printing utility (iframe, pagination, font/image stabilization)","keywords":["angular","print","pdf","iframe","pagination"],"license":"MIT","peerDependencies":{"@angular/common":"^19.0.0","@angular/core":"^19.0.0"},"dependencies":{"tslib":"^2.3.0"},"sideEffects":false,"module":"fesm2022/amplo-print-host.mjs","typings":"index.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./index.d.ts","default":"./fesm2022/amplo-print-host.mjs"}},"_id":"@amplo/print-host@0.1.0","gitHead":"30bcb67528f3540847985f18eb3e123ba9c3c7af","_nodeVersion":"20.18.3","_npmVersion":"10.8.2","dist":{"integrity":"sha512-s5WUQpP8xg1lIfwPAKncajPTCSsaGUpHMWxrkGBjR7lGxsB9Lj2YpLehb/a6pXli1TQqD6uUU6DXrKLWN3FJ2Q==","shasum":"0e676409cf54d6c9d175eb929ea52aefa9c4cff0","tarball":"https://registry.npmjs.org/@amplo/print-host/-/print-host-0.1.0.tgz","fileCount":23,"unpackedSize":65590,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2eglwtEmQpZFEDKouAJdngrq1dKl1wBHlTXgvR9QtigIgcsk6ijHNbQscayNfTMg2MVXUi4uwOo2sSuHHoQZ0BVQ="}]},"_npmUser":{"name":"amplo-admin","email":"admin@lariat.co.ZA"},"directories":{},"maintainers":[{"name":"amplo-admin","email":"admin@lariat.co.ZA"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/print-host_0.1.0_1770707911742_0.5772971907452644"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-10T07:18:31.652Z","0.1.0":"2026-02-10T07:18:31.961Z","modified":"2026-02-10T07:18:32.186Z"},"maintainers":[{"name":"amplo-admin","email":"admin@lariat.co.ZA"}],"description":"Angular directive-based printing utility (iframe, pagination, font/image stabilization)","keywords":["angular","print","pdf","iframe","pagination"],"license":"MIT","readme":"# print-host\r\n\r\nA lightweight, framework-friendly Angular utility for **reliable, paginated printing** using an isolated iframe.\r\n\r\n`print-host` solves common browser printing problems:\r\n\r\n- Phantom blank pages\r\n- Inconsistent pagination\r\n- Missing styles, fonts, or images\r\n- Print CSS bleeding into the main app\r\n- Unreliable `window.print()` behavior\r\n\r\nIt works by cloning a DOM subtree into a hidden iframe, injecting styles deterministically, paginating content in pixels (not guesses), and printing cleanly.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- ✅ Iframe-isolated printing (no app CSS pollution)\r\n- ✅ Deterministic pagination for A4\r\n- ✅ Page-break control via CSS selectors\r\n- ✅ Multiple style injection strategies\r\n- ✅ Font & image readiness before printing\r\n- ✅ Standalone Angular directive\r\n- ✅ Safe DOM cloning (no `innerHTML`)\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @amplo/print-host\r\n```\r\n\r\n---\r\n\r\n## Basic Usage\r\n\r\n```html\r\n<div printHost #ph=\"printHost\">\r\n  <div class=\"print-content\">\r\n    <!-- printable content -->\r\n  </div>\r\n</div>\r\n\r\n<button (click)=\"ph.print()\">Print</button>\r\n```\r\n\r\n### Defaults\r\n\r\n- First child of the host is printed\r\n- A4 paper size\r\n- 10mm margins\r\n- Pagination enabled\r\n- Host styles copied into the iframe\r\n\r\n---\r\n\r\n## Directive Inputs\r\n\r\n### Core Options\r\n\r\n| Input                 | Default         | Description                          |\r\n| --------------------- | --------------- | ------------------------------------ |\r\n| `printRoot`           | —               | HTMLElement or `ElementRef` to print |\r\n| `printSelector`       | —               | Selector inside host to print        |\r\n| `pageMarginMm`        | `10`            | A4 page margin in millimeters        |\r\n| `paginate`            | `true`          | Enable cursor-based pagination       |\r\n| `extraCss`            | `''`            | Additional print-only CSS            |\r\n| `breakBeforeSelector` | `.break-before` | Selector forcing page breaks         |\r\n\r\n---\r\n\r\n## Style Injection\r\n\r\nControl how styles are injected into the iframe.\r\n\r\n### Built-in Modes\r\n\r\n```html\r\n<div printHost styleInjectorKey=\"copy\"></div>\r\n<div printHost styleInjectorKey=\"links\"></div>\r\n<div printHost styleInjectorKey=\"none\"></div>\r\n```\r\n\r\n| Mode    | Description                           |\r\n| ------- | ------------------------------------- |\r\n| `copy`  | Copy `<link>` and `<style>` from host |\r\n| `links` | Copy only stylesheet links            |\r\n| `none`  | No styles injected                    |\r\n\r\n---\r\n\r\n## Custom Style Injectors\r\n\r\nRegister custom injectors globally:\r\n\r\n```ts\r\nimport { providePrintHost } from \"print-host\";\r\nimport { InlineCssInjector } from \"print-host/style\";\r\n\r\nbootstrapApplication(AppComponent, {\r\n  providers: [\r\n    providePrintHost({\r\n      styleInjectors: [\r\n        new InlineCssInjector(\"print\", {\r\n          href: \"assets/print.css\",\r\n          cache: true,\r\n        }),\r\n      ],\r\n    }),\r\n  ],\r\n});\r\n```\r\n\r\nSelect the injector by key:\r\n\r\n```html\r\n<div printHost styleInjectorKey=\"print\"></div>\r\n```\r\n\r\n---\r\n\r\n## Page Breaks\r\n\r\n### Force a Page Break Before an Element\r\n\r\n```html\r\n<div class=\"break-before\"></div>\r\n```\r\n\r\n### Custom Break Selector\r\n\r\n```html\r\n<div printHost breakBeforeSelector=\".force-break\"></div>\r\n```\r\n\r\n---\r\n\r\n## Events\r\n\r\n```html\r\n<div printHost (printStarted)=\"onPrintStart()\" (printFinished)=\"onPrintEnd()\"></div>\r\n```\r\n\r\nTypical use cases:\r\n\r\n- Showing / hiding loaders\r\n- Locking UI during print\r\n- Logging print lifecycle events\r\n\r\n---\r\n\r\n## How Pagination Works\r\n\r\n- Measures real element heights using `getBoundingClientRect`\r\n- Converts A4 height using measured px/mm\r\n- Inserts page breaks only when required\r\n- Avoids tiny dangling content at page bottoms\r\n- Removes consecutive and trailing breaks automatically\r\n\r\nThis avoids browser heuristics and provides consistent results across Chrome and Edge.\r\n\r\n---\r\n\r\n## Safety & Stability\r\n\r\n`print-host` intentionally avoids:\r\n\r\n- `innerHTML`\r\n- Arbitrary HTML injection\r\n- Mutating the original DOM\r\n\r\nAll content is **cloned**, sanitized, and printed in isolation inside an iframe.\r\n\r\n---\r\n\r\n## When to Use\r\n\r\n- Reports\r\n- Invoices\r\n- Dashboards\r\n- Admin exports\r\n- Any layout where print fidelity matters\r\n\r\n## When Not to Use\r\n\r\n- Simple one-page text printing\r\n- Cases where browser default printing is sufficient\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","_rev":"1-109c08dbca57310f5679953bd920b38c"}