@qrcommunication/gigapdf-lib 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,35 @@ All notable changes to `@qrcommunication/gigapdf-lib` are documented here.
4
4
  The format follows [Keep a Changelog](https://keepachangelog.com/) and the
5
5
  project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [0.13.0] - 2026-06-16
8
+
9
+ ### Added
10
+
11
+ - **`doc.addText(...)` gains `opacity` and `rotationDeg`** — baked text can now
12
+ fade and rotate (text matrix), matching a host editor's `drawText` fidelity for
13
+ edited/added text runs. ABI `gp_add_text` extended.
14
+ - **`doc.extractFont(name)`** — extract an embedded font program by (fuzzy)
15
+ `/BaseFont` name, returning the raw decoded bytes + format (`truetype` embeds
16
+ directly; `cff`/`type1` need a TTF conversion). Lets a host re-embed the
17
+ document's **own** font when re-baking edited text and keep the original
18
+ glyphs (no pdf-lib needed for source-font extraction). ABI `gp_extract_font`.
19
+ - **`doc.addMarkupAnnotation(page, subtype, quads, rgb, opacity, meta)`** —
20
+ Highlight / Underline / StrikeOut / Squiggly spanning **multiple quads**
21
+ (wrapped text), with full reviewer metadata (`contents`, `author`, `id`,
22
+ `date`). ABI `gp_add_markup_annotation`.
23
+ - **`doc.addTextNote(page, rect, rgb, meta, icon, open)`** — sticky-note
24
+ (`/Text`) annotation with popup contents + named icon. ABI `gp_add_text_note`.
25
+
26
+ ## [0.12.0] - 2026-06-16
27
+
28
+ ### Added
29
+
30
+ - **`doc.flattenForm()`** — flatten the whole interactive form: bake every field
31
+ widget across **all pages** into the page content and drop `/AcroForm`, so the
32
+ result is no longer fillable and `fields()` returns empty afterwards. Returns
33
+ the number of widgets baked (0 when there is no form). Complements the
34
+ per-page `flattenAnnotations(page)`. ABI `gp_flatten_form`.
35
+
7
36
  ## [0.11.0] - 2026-06-16
8
37
 
9
38
  ### Added
package/dist/index.cjs CHANGED
@@ -643,10 +643,22 @@ var GigaPdfDoc = class {
643
643
  this.g._free(famPtr, b.length);
644
644
  return obj;
645
645
  }
646
- addText(page, x, y, size, text, fontObj, rgb = 0) {
646
+ addText(page, x, y, size, text, fontObj, rgb = 0, opacity = 1, rotationDeg = 0) {
647
647
  return this.g._withStr(
648
648
  text,
649
- (p, l) => this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))
649
+ (p, l) => this.ex().gp_add_text(
650
+ this.h,
651
+ page,
652
+ x,
653
+ y,
654
+ size,
655
+ p,
656
+ l,
657
+ fontObj,
658
+ RGB(rgb),
659
+ opacity,
660
+ rotationDeg
661
+ )
650
662
  ) === 0;
651
663
  }
652
664
  /**
@@ -663,6 +675,22 @@ var GigaPdfDoc = class {
663
675
  neededFonts() {
664
676
  return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));
665
677
  }
678
+ /**
679
+ * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host
680
+ * editor can re-embed the document's own font when re-baking edited text and
681
+ * keep the original glyphs. Returns the raw decoded bytes and the program
682
+ * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),
683
+ * or `null` when nothing embedded matches.
684
+ */
685
+ extractFont(name) {
686
+ const buf = this.g._withStr(
687
+ name,
688
+ (p, l) => this.g._buffer((o) => this.ex().gp_extract_font(this.h, p, l, o))
689
+ );
690
+ if (buf.length === 0) return null;
691
+ const format = buf[0] === 1 ? "truetype" : buf[0] === 2 ? "cff" : "type1";
692
+ return { format, bytes: buf.subarray(1) };
693
+ }
666
694
  // convert PDF → X
667
695
  toText() {
668
696
  return this.g._str((o) => this.ex().gp_to_text(this.h, o));
@@ -812,6 +840,64 @@ var GigaPdfDoc = class {
812
840
  addStrikeOut(page, x0, y0, x1, y1, rgb = 0) {
813
841
  return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;
814
842
  }
843
+ /**
844
+ * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |
845
+ * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF
846
+ * user space, bottom-left origin — multi-quad covers wrapped text), with full
847
+ * reviewer metadata. `date` is a PDF date string (e.g. `"D:20260616T…Z"`) — the
848
+ * engine has no clock, so the host supplies it.
849
+ */
850
+ addMarkupAnnotation(page, subtype, quads, rgb, opacity, meta = {}) {
851
+ const sub = subtype === "highlight" ? "Highlight" : subtype === "underline" ? "Underline" : subtype === "strikeout" ? "StrikeOut" : "Squiggly";
852
+ const packed = [
853
+ sub,
854
+ meta.contents ?? "",
855
+ meta.author ?? "",
856
+ meta.id ?? "",
857
+ meta.date ?? ""
858
+ ].join("");
859
+ const flat = quads.flat();
860
+ return this.g._withStr(
861
+ packed,
862
+ (mp, ml) => this.g._withF64(
863
+ flat,
864
+ (qp, qc) => this.ex().gp_add_markup_annotation(this.h, page, mp, ml, qp, qc, RGB(rgb), opacity)
865
+ )
866
+ ) === 0;
867
+ }
868
+ /**
869
+ * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)
870
+ * that opens a popup with `meta.contents`. `icon` is the named icon (`"Note"`,
871
+ * `"Comment"`, …); `open` sets the initial popup state.
872
+ */
873
+ addTextNote(page, rect, rgb, meta = {}, icon = "Note", open = false) {
874
+ const packed = [
875
+ meta.contents ?? "",
876
+ meta.author ?? "",
877
+ meta.id ?? "",
878
+ meta.date ?? ""
879
+ ].join("");
880
+ return this.g._withStr(
881
+ packed,
882
+ (mp, ml) => this.g._withStr(
883
+ icon,
884
+ (ip, il) => this.ex().gp_add_text_note(
885
+ this.h,
886
+ page,
887
+ rect[0],
888
+ rect[1],
889
+ rect[2],
890
+ rect[3],
891
+ mp,
892
+ ml,
893
+ ip,
894
+ il,
895
+ open ? 1 : 0,
896
+ RGB(rgb)
897
+ )
898
+ )
899
+ ) === 0;
900
+ }
815
901
  /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */
816
902
  addInk(page, points, rgb = 0, lineWidth = 1) {
817
903
  return this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) === 0;
@@ -825,6 +911,15 @@ var GigaPdfDoc = class {
825
911
  flattenAnnotations(page) {
826
912
  return this.ex().gp_flatten_annotations(this.h, page);
827
913
  }
914
+ /**
915
+ * Flatten the interactive form: bake every field widget across all pages into
916
+ * the page content and drop `/AcroForm`, so the document is no longer
917
+ * fillable and {@link fields} returns empty afterwards. Returns the number of
918
+ * widgets baked (0 when there is no form).
919
+ */
920
+ flattenForm() {
921
+ return this.ex().gp_flatten_form(this.h);
922
+ }
828
923
  // hyperlinks
829
924
  links(page) {
830
925
  return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.15_typescript@6.0.3/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["/**\n * @qrcommunication/gigapdf-lib — TypeScript SDK for the zero-dependency Rust→WASM\n * PDF engine (gigapdf-lib). Wraps the flat `extern \"C\"` `gp_*` ABI behind a typed,\n * ergonomic class. No third-party runtime deps; the `.wasm` is self-contained.\n *\n * Usage:\n * const giga = await GigaPdfEngine.load(wasmBytesOrUrl);\n * const doc = giga.open(pdfBytes);\n * const docx = doc.toDocx();\n * const png = doc.renderPage(1, 2);\n * doc.close();\n */\n\n// FFI boundary: the wasm exports are an untyped table of `gp_*` functions\n// (numbers in, numbers out) plus `memory`. `any` here is the documented FFI\n// exception — every public method below re-imposes precise types.\ntype Exports = {\n memory: WebAssembly.Memory;\n gp_alloc(len: number): number;\n gp_free(ptr: number, len: number): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n};\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** Loaded engine module. Create documents with {@link open} / {@link openEncrypted}. */\nexport class GigaPdfEngine {\n private constructor(private readonly ex: Exports) {}\n\n /** Instantiate from raw wasm bytes, a URL/path, or a Response. */\n static async load(source: ArrayBuffer | Uint8Array | string | Response): Promise<GigaPdfEngine> {\n let bytes: ArrayBuffer | Uint8Array;\n if (typeof source === \"string\") {\n const res = await fetch(source);\n bytes = await res.arrayBuffer();\n } else if (source instanceof Response) {\n bytes = await source.arrayBuffer();\n } else {\n bytes = source;\n }\n const { instance } = await WebAssembly.instantiate(\n bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,\n {}\n );\n return new GigaPdfEngine(instance.exports as Exports);\n }\n\n /**\n * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped\n * inside this package (resolved relative to the built module). In the browser,\n * pass a URL or bytes to {@link load} instead.\n *\n * In Next.js `output: \"standalone\"`, add the asset to `outputFileTracingIncludes`\n * for the consuming route so the `.wasm` is copied into the standalone bundle.\n */\n static async loadDefault(): Promise<GigaPdfEngine> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const wasmPath = fileURLToPath(new URL(\"../gigapdf.wasm\", import.meta.url));\n return GigaPdfEngine.load(await readFile(wasmPath));\n }\n\n // ── linear-memory ABI helpers (internal) ─────────────────────────────────\n private u8() {\n return new Uint8Array(this.ex.memory.buffer);\n }\n private dv() {\n return new DataView(this.ex.memory.buffer);\n }\n /** Copy host bytes into wasm memory; returns the pointer (caller frees). */\n _toWasm(bytes: Uint8Array): number {\n const ptr = this.ex.gp_alloc(bytes.length);\n this.u8().set(bytes, ptr);\n return ptr;\n }\n _free(ptr: number, len: number) {\n this.ex.gp_free(ptr, len);\n }\n /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */\n _buffer(call: (outLenPtr: number) => number): Uint8Array {\n const lenPtr = this.ex.gp_alloc(4);\n const dataPtr = call(lenPtr);\n if (dataPtr === 0) {\n this.ex.gp_free(lenPtr, 4);\n return new Uint8Array(0);\n }\n const len = this.dv().getUint32(lenPtr, true);\n const out = this.u8().slice(dataPtr, dataPtr + len);\n this.ex.gp_free(dataPtr, len);\n this.ex.gp_free(lenPtr, 4);\n return out;\n }\n _str(call: (outLenPtr: number) => number): string {\n return dec.decode(this._buffer(call));\n }\n _json<T = unknown>(call: (outLenPtr: number) => number): T {\n const s = this._str(call);\n return (s ? JSON.parse(s) : []) as T;\n }\n /** Pass a string argument; runs `fn(ptr, len)` then frees. */\n _withStr<T>(s: string, fn: (ptr: number, len: number) => T): T {\n const b = enc.encode(s);\n const ptr = this._toWasm(b);\n try {\n return fn(ptr, b.length);\n } finally {\n this._free(ptr, b.length);\n }\n }\n /** Pass an optional string; an absent/empty value runs `fn(0, 0)` (no alloc). */\n _withOptStr<T>(s: string | undefined, fn: (ptr: number, len: number) => T): T {\n return s ? this._withStr(s, fn) : fn(0, 0);\n }\n /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */\n _withBytes<T>(bytes: Uint8Array, fn: (ptr: number, len: number) => T): T {\n const ptr = this._toWasm(bytes);\n try {\n return fn(ptr, bytes.length);\n } finally {\n this._free(ptr, bytes.length);\n }\n }\n /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */\n _withU32<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 4);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 4);\n }\n }\n /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */\n _withF64<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 8);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 8);\n }\n }\n get raw(): Exports {\n return this.ex;\n }\n\n // ── documents ─────────────────────────────────────────────────────────────\n /** Open a PDF. Throws if it can't be parsed. */\n open(pdf: Uint8Array): GigaPdfDoc {\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));\n if (handle === 0) throw new Error(\"gigapdf: failed to open PDF\");\n return new GigaPdfDoc(this, handle);\n }\n /** Open an encrypted PDF with a password. Returns null if the password is wrong. */\n openEncrypted(pdf: Uint8Array, password: string): GigaPdfDoc | null {\n const b = enc.encode(password);\n const pwPtr = this._toWasm(b);\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));\n this._free(pwPtr, b.length);\n return handle === 0 ? null : new GigaPdfDoc(this, handle);\n }\n\n /**\n * Inspect a PDF's encryption **without decrypting it** (no password needed):\n * whether it has an `/Encrypt` dictionary, plus its `/P` permission bitmask\n * and handler version/revision (`0` when not encrypted).\n */\n encryptionInfo(pdf: Uint8Array): {\n encrypted: boolean;\n permissions: number;\n version: number;\n revision: number;\n } {\n const json = this._withBytes(pdf, (p, l) =>\n this._buffer((o) => this.ex.gp_encryption_info(p, l, o))\n );\n return JSON.parse(dec.decode(json));\n }\n\n /**\n * Width of `text` set in standard Helvetica at `size` points (AFM metrics) —\n * place watermark/header text without embedding a font.\n */\n helveticaWidth(size: number, text: string): number {\n return this._withStr(text, (p, l) => this.ex.gp_helvetica_width(p, l, size));\n }\n\n // ── stateless <format> → PDF conversions ───────────────────────────────────\n txtToPdf(text: string): Uint8Array {\n return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));\n }\n htmlToPdf(html: string): Uint8Array {\n return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));\n }\n rtfToPdf(rtf: string): Uint8Array {\n return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));\n }\n /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */\n officeToPdf(office: Uint8Array): Uint8Array {\n return this._withBytes(office, (p, l) =>\n this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))\n );\n }\n\n // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────\n fontCatalog(): FontInfo[] {\n return this._json((o) => this.ex.gp_font_catalog_json(o));\n }\n /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */\n fontRequestUrl(family: string, weight = 400, italic = false): string {\n return this._withStr(family, (p, l) =>\n this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))\n );\n }\n /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */\n parseCssFontUrl(css: string): string {\n return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));\n }\n\n // ── JavaScript engine (no headless browser) ────────────────────────────────\n /**\n * Evaluate a JavaScript snippet with the built-in engine and return the\n * result value as a string (or `Uncaught …` / `SyntaxError: …`).\n */\n evalJs(src: string): string {\n return this._withStr(src, (p, l) => this._str((o) => this.ex.gp_js_eval(p, l, o)));\n }\n /**\n * Run a document's inline `<script>`s and return the resulting HTML. The\n * `htmlRender`/`htmlNeededFonts` paths already do this automatically; use this\n * only when you want the post-script HTML on its own.\n */\n runInlineScripts(html: string): string {\n return this._withStr(html, (p, l) =>\n this._str((o) => this.ex.gp_run_inline_scripts(p, l, o))\n );\n }\n\n // ── HTML rendering engine (replaces a headless browser for HTML→PDF) ───────\n /**\n * Phase 1 — the Google fonts the document references. Download each `url`\n * (→ TTF) and pass the bytes back to {@link htmlRender} for an identical render.\n */\n htmlNeededFonts(html: string): HtmlFontRequest[] {\n return this._withStr(html, (p, l) =>\n this._json((o) => this.ex.gp_html_needed_fonts(p, l, o))\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 — render HTML + CSS to PDF, with the supplied fonts embedded (real\n * Google fonts, real metrics → identical or nearest match). Block, inline and\n * table layout with pagination. Page size and margin are in points\n * (US-Letter portrait, 0.5in margins by default). JavaScript is not executed.\n */\n htmlRender(\n html: string,\n fonts: HtmlFont[] = [],\n pageWidth = 612,\n pageHeight = 792,\n margin = 36\n ): Uint8Array {\n const blob = packHtmlFonts(fonts);\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._buffer((o) => this.ex.gp_html_render(hp, hl, fp, fl, pageWidth, pageHeight, margin, o))\n )\n );\n }\n\n /**\n * Resolve a named paper size — `\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, `\"legal\"`,\n * `\"tabloid\"`, `\"b5\"`, … — to `{ w, h }` in points (portrait unless the name\n * has a `-landscape` suffix). Returns `null` for an unknown name.\n */\n pageSize(name: string): { w: number; h: number } | null {\n const outPtr = this.ex.gp_alloc(16);\n try {\n const ok = this._withStr(name, (p, l) =>\n this.ex.gp_page_size(p, l, outPtr, outPtr + 8)\n );\n if (!ok) return null;\n const dv = this.dv();\n return { w: dv.getFloat64(outPtr, true), h: dv.getFloat64(outPtr + 8, true) };\n } finally {\n this._free(outPtr, 16);\n }\n }\n\n /**\n * Phase 1 variant that also scans the running `header`/`footer` HTML, so the\n * Google fonts they reference are requested alongside the body's.\n */\n htmlNeededFontsWith(html: string, header?: string, footer?: string): HtmlFontRequest[] {\n return this._withStr(html, (hp, hl) =>\n this._withOptStr(header, (hdp, hdl) =>\n this._withOptStr(footer, (ftp, ftl) =>\n this._json((o) => this.ex.gp_html_needed_fonts_ex(hp, hl, hdp, hdl, ftp, ftl, o))\n )\n )\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 with full page control: named/explicit size, per-side margins, and a\n * running header/footer painted in the page margins. `{{page}}` and `{{pages}}`\n * in the header/footer are replaced with the current / total page number.\n *\n * ```ts\n * const fonts = await fetchFonts(giga.htmlNeededFontsWith(html, header, footer));\n * const pdf = giga.htmlRenderWith(html, fonts, {\n * pageSize: \"A4\",\n * margin: { top: 72, bottom: 72, left: 54, right: 54 },\n * header: `<div style=\"text-align:center\">My Report</div>`,\n * footer: `<div style=\"text-align:center\">Page {{page}} / {{pages}}</div>`,\n * });\n * ```\n */\n htmlRenderWith(\n html: string,\n fonts: HtmlFont[] = [],\n options: HtmlRenderOptions = {}\n ): Uint8Array {\n let pw = options.pageWidth ?? 612;\n let ph = options.pageHeight ?? 792;\n if (options.pageSize) {\n const sz = this.pageSize(options.pageSize);\n if (!sz) throw new Error(`gigapdf: unknown page size \"${options.pageSize}\"`);\n pw = sz.w;\n ph = sz.h;\n }\n const m = options.margin ?? 36;\n const mg =\n typeof m === \"number\"\n ? { top: m, right: m, bottom: m, left: m }\n : { top: m.top ?? 36, right: m.right ?? 36, bottom: m.bottom ?? 36, left: m.left ?? 36 };\n const headerOffset = options.headerOffset ?? 18;\n const footerOffset = options.footerOffset ?? 18;\n const start = options.startPageNumber ?? 1;\n const blob = packHtmlFonts(fonts);\n\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._withOptStr(options.header, (hdp, hdl) =>\n this._withOptStr(options.footer, (ftp, ftl) =>\n this._buffer((o) =>\n this.ex.gp_html_render_opts(\n hp,\n hl,\n fp,\n fl,\n pw,\n ph,\n mg.top,\n mg.right,\n mg.bottom,\n mg.left,\n hdp,\n hdl,\n ftp,\n ftl,\n headerOffset,\n footerOffset,\n start,\n o\n )\n )\n )\n )\n )\n );\n }\n}\n\n/** Pack `HtmlFont[]` into the little-endian blob `gp_html_render` expects. */\nfunction packHtmlFonts(fonts: HtmlFont[]): Uint8Array {\n let size = 4;\n for (const f of fonts) size += 4 + enc.encode(f.family).length + 2 + 1 + 4 + f.ttf.length;\n const buf = new Uint8Array(size);\n const dv = new DataView(buf.buffer);\n let o = 0;\n dv.setUint32(o, fonts.length, true);\n o += 4;\n for (const f of fonts) {\n const fam = enc.encode(f.family);\n dv.setUint32(o, fam.length, true);\n o += 4;\n buf.set(fam, o);\n o += fam.length;\n dv.setUint16(o, f.weight, true);\n o += 2;\n buf[o] = f.italic ? 1 : 0;\n o += 1;\n dv.setUint32(o, f.ttf.length, true);\n o += 4;\n buf.set(f.ttf, o);\n o += f.ttf.length;\n }\n return buf;\n}\n\n/** A Google font the HTML engine needs (resolved from the catalogue). */\nexport interface HtmlFontRequest {\n family: string;\n weight: number;\n italic: boolean;\n /** Google Fonts CSS URL — the host fetches it to obtain the TTF. */\n url: string;\n}\n\n/** A downloaded font handed to {@link GigaPdfEngine.htmlRender}. */\nexport interface HtmlFont {\n family: string;\n weight: number;\n italic: boolean;\n ttf: Uint8Array;\n}\n\n/** Per-side page margins in points; omitted sides default to 36pt. */\nexport interface HtmlMargins {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/** Page setup for {@link GigaPdfEngine.htmlRenderWith}. */\nexport interface HtmlRenderOptions {\n /** Named paper size (`\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, …) — wins over width/height. */\n pageSize?: string;\n /** Explicit page width in points (default 612 = US Letter). Ignored if `pageSize` is set. */\n pageWidth?: number;\n /** Explicit page height in points (default 792). Ignored if `pageSize` is set. */\n pageHeight?: number;\n /** Uniform margin (points) or per-side margins. Default 36pt (0.5in). */\n margin?: number | HtmlMargins;\n /** Running header HTML painted in the top margin (`{{page}}` / `{{pages}}` tokens). */\n header?: string;\n /** Running footer HTML painted in the bottom margin (same tokens). */\n footer?: string;\n /** Distance from the top edge to the header block, in points (default 18). */\n headerOffset?: number;\n /** Distance from the bottom edge to the footer block, in points (default 18). */\n footerOffset?: number;\n /** Number assigned to the first page for `{{page}}` (default 1). */\n startPageNumber?: number;\n}\n\nexport interface FontInfo {\n family: string;\n category: string;\n google: boolean;\n weights: number[];\n}\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\nexport interface Element extends Partial<Box> {\n index: number;\n kind: \"text\" | \"image\" | \"shape\";\n label: string;\n}\nexport interface TextLine extends Box {\n text: string;\n}\nexport interface SearchHit extends Box {\n page: number;\n text: string;\n}\nexport interface OcrWord extends Box {\n text: string;\n}\nexport interface TextRunInfo {\n index: number;\n operator: string;\n text: string;\n}\n/** A markup annotation (rect corners in PDF user space). */\nexport interface AnnotationInfo {\n index: number;\n subtype: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n contents: string;\n}\n/** A hyperlink annotation; `kind` discriminates the target. */\nexport interface LinkInfo {\n index: number;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n kind: \"uri\" | \"page\" | \"unknown\";\n uri?: string;\n page?: number;\n}\nexport type FieldKind =\n | \"text\"\n | \"checkbox\"\n | \"radio\"\n | \"pushbutton\"\n | \"combo\"\n | \"list\"\n | \"signature\"\n | \"unknown\";\n/** An AcroForm field with its flags and (for choices) options. */\nexport interface FieldInfo {\n name: string;\n type: string;\n kind: FieldKind;\n flags: number;\n readOnly: boolean;\n required: boolean;\n multiline: boolean;\n fillable: boolean;\n maxLen?: number;\n /** 1-based page the widget sits on (from its `/P`); absent if it has no widget. */\n page?: number;\n /**\n * Widget rectangle `[x, y, width, height]` in points, **top-left origin**\n * (already Y-flipped from the PDF's bottom-left `/Rect` for direct host use).\n * Absent when the field carries no `/Rect`.\n */\n bounds?: [number, number, number, number];\n value: string;\n options: string[];\n}\n/** One outline (bookmark) entry; `level` is the nesting depth (0 = top). */\nexport interface OutlineEntry {\n level: number;\n title: string;\n page?: number;\n}\n/** An optional-content layer (calque): toggle `visible`/`locked` to persist in the PDF. */\nexport interface LayerInfo {\n id: number;\n name: string;\n visible: boolean;\n locked: boolean;\n order: number;\n}\n/** A page's geometry: size in points and `/Rotate` (0/90/180/270). */\nexport interface PageInfo {\n width: number;\n height: number;\n rotation: number;\n}\n\nconst RGB = (rgb: number) => rgb & 0xffffff;\n\n/** Visual styling for a newly-created form field. */\nexport interface FieldStyle {\n /** Text size in points; `0` (default) auto-sizes to the field box. */\n fontSize?: number;\n /** Text / mark colour `0xRRGGBB` (default black). */\n color?: number;\n /** Border colour `0xRRGGBB`, or `null` for no border (default black). */\n border?: number | null;\n /** Background fill `0xRRGGBB`, or `null` for transparent (default none). */\n background?: number | null;\n /** Border width in points (default `1`). */\n borderWidth?: number;\n}\n\n/** One option of a radio group: its export value and on-page rectangle. */\nexport interface RadioOption {\n /** The export value stored in the field when this button is selected. */\n export: string;\n /** `[x0, y0, x1, y1]` in PDF user space. */\n rect: [number, number, number, number];\n}\n\n/** Expand a {@link FieldStyle} into the 7 packed ABI arguments. */\nfunction styleArgs(s: FieldStyle = {}): [number, number, number, number, number, number, number] {\n const hasBorder = s.border === null ? 0 : 1;\n const borderRgb = s.border == null ? 0x000000 : s.border;\n const hasBg = s.background == null ? 0 : 1;\n const bgRgb = s.background == null ? 0 : s.background;\n return [\n s.fontSize ?? 0,\n RGB(s.color ?? 0x000000),\n RGB(borderRgb),\n hasBorder,\n RGB(bgRgb),\n hasBg,\n s.borderWidth ?? 1,\n ];\n}\n\n/** A live document handle. Call {@link close} when done. */\nexport class GigaPdfDoc {\n constructor(\n private readonly g: GigaPdfEngine,\n private readonly h: number\n ) {}\n private ex() {\n return this.g.raw;\n }\n\n close() {\n this.ex().gp_close(this.h);\n }\n pageCount(): number {\n return this.ex().gp_page_count(this.h);\n }\n save(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save(this.h, o));\n }\n saveCompressed(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));\n }\n\n // text intelligence\n textRuns(page: number): TextRunInfo[] {\n return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));\n }\n elements(page: number): Element[] {\n return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));\n }\n structuredText(page: number): TextLine[] {\n return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));\n }\n search(query: string, caseInsensitive = true): SearchHit[] {\n return this.g._withStr(query, (p, l) =>\n this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))\n );\n }\n /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */\n ocr(page: number, scale = 2): OcrWord[] {\n return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));\n }\n ocrText(page: number, scale = 2): string {\n return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));\n }\n\n // editing\n replaceText(page: number, index: number, text: string): boolean {\n return (\n this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0\n );\n }\n removeElement(page: number, index: number): boolean {\n return this.ex().gp_remove_element(this.h, page, index) === 0;\n }\n moveElement(page: number, index: number, dx: number, dy: number): boolean {\n return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;\n }\n duplicateElement(page: number, index: number): boolean {\n return this.ex().gp_duplicate_element(this.h, page, index) === 0;\n }\n /** Index of the element at page point `(x, y)`, or -1 if none. */\n elementAt(page: number, x: number, y: number): number {\n return this.ex().gp_element_at(this.h, page, x, y);\n }\n /**\n * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or\n * `null` to omit that paint. 0 → success.\n */\n addRectangle(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_rectangle(\n this.h,\n page,\n x,\n y,\n w,\n h,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /** Draw a straight line from `(x1,y1)` to `(x2,y2)`. `stroke` is `0xRRGGBB`. */\n drawLine(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_draw_line(this.h, page, x1, y1, x2, y2, RGB(stroke), lineWidth, opacity) === 0\n );\n }\n\n /**\n * Draw an ellipse (circle when `rx === ry`) centred at `(cx,cy)`. Pass an\n * `0xRRGGBB` colour for `stroke`/`fill`, or `null` to omit that paint.\n */\n addEllipse(\n page: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_ellipse(\n this.h,\n page,\n cx,\n cy,\n rx,\n ry,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /**\n * Draw a polyline/polygon through flat `[x0,y0,x1,y1,…]` points. `close` joins\n * the last vertex back to the first. `0xRRGGBB` colours, or `null` to omit.\n */\n addPolygon(\n page: number,\n points: number[],\n close = true,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withF64(points, (p, c) =>\n this.ex().gp_add_polygon(\n this.h,\n page,\n p,\n c,\n close ? 1 : 0,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Draw an SVG path (`M`/`L`/`C`/`Q`/`Z`…) anchored so the SVG origin maps to\n * `(ox,oy)` with the Y axis flipped — same convention as `pdf-lib`'s\n * `drawSvgPath`. Covers freeform/polygon/triangle shapes.\n */\n addPath(\n page: number,\n svgPath: string,\n ox: number,\n oy: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withStr(svgPath, (p, l) =>\n this.ex().gp_add_path(\n this.h,\n page,\n p,\n l,\n ox,\n oy,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Embed a raster image (PNG or JPEG bytes) at `(x,y)` sized `(w,h)` in PDF\n * user space. PNG alpha is honoured; `opacity` (0..1) sets an overall alpha.\n */\n addImage(\n page: number,\n data: Uint8Array,\n x: number,\n y: number,\n w: number,\n h: number,\n opacity = 1\n ): boolean {\n return (\n this.g._withBytes(data, (p, l) =>\n this.ex().gp_add_image(this.h, page, p, l, x, y, w, h, opacity)\n ) === 0\n );\n }\n /**\n * Draw SVG markup on a page as **native vector paths** (crisp at any zoom, not\n * rasterized), fitting its `viewBox` into the box `(x, y, w, h)` in PDF points\n * (origin bottom-left). Supports shapes, `<path>`, groups, transforms and\n * fill/stroke/opacity. Returns `false` if the SVG can't be parsed.\n */\n addSvg(page: number, svg: string, x: number, y: number, w: number, h: number): boolean {\n return (\n this.g._withStr(svg, (p, l) => this.ex().gp_add_svg(this.h, page, p, l, x, y, w, h)) === 0\n );\n }\n /** True redaction: delete content intersecting the region (no opaque cover by default). */\n redact(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n coverRgb = 0,\n hasCover = false\n ): number {\n return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);\n }\n\n // pages\n rotatePage(page: number, degrees: number): boolean {\n return this.ex().gp_rotate_page(this.h, page, degrees) === 0;\n }\n deletePage(page: number): boolean {\n return this.ex().gp_delete_page(this.h, page) === 0;\n }\n movePage(from: number, to: number): boolean {\n return this.ex().gp_move_page(this.h, from, to) === 0;\n }\n appendPages(otherPdf: Uint8Array): boolean {\n return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;\n }\n /** Extract the given 1-based page numbers into a NEW standalone PDF. */\n extractPages(pages: number[]): Uint8Array {\n return this.g._withU32(pages, (p, c) =>\n this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))\n );\n }\n /** Resize a page's MediaBox to `width`×`height` points. */\n resizePage(page: number, width: number, height: number): boolean {\n return this.ex().gp_resize_page(this.h, page, width, height) === 0;\n }\n /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */\n addPage(width: number, height: number, after = 0): number {\n return this.ex().gp_add_page(this.h, width, height, after);\n }\n /** Duplicate a page, inserting the copy right after it; returns the new page's id. */\n copyPage(page: number): number {\n return this.ex().gp_copy_page(this.h, page);\n }\n /** A page's size (points) and `/Rotate` (0/90/180/270). */\n pageInfo(page: number): PageInfo {\n return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));\n }\n\n // render\n renderPage(page: number, scale = 1): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));\n }\n\n // fonts — embed a downloaded TTF, then add real selectable text\n embedFont(family: string, ttf: Uint8Array): number {\n const b = enc.encode(family);\n const famPtr = this.g._toWasm(b);\n const obj = this.g._withBytes(ttf, (p, l) =>\n this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)\n );\n this.g._free(famPtr, b.length);\n return obj;\n }\n addText(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n fontObj: number,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))\n ) === 0\n );\n }\n /**\n * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at\n * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,\n * `opacity` 0–1. Pair with {@link GigaPdfEngine.helveticaWidth} for centring.\n */\n addWatermark(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n rgb = 0x808080,\n opacity = 0.25,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_watermark(this.h, page, x, y, size, p, l, RGB(rgb), opacity, rotationDeg)\n ) === 0\n );\n }\n neededFonts(): string[] {\n return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));\n }\n\n // convert PDF → X\n toText(): string {\n return this.g._str((o) => this.ex().gp_to_text(this.h, o));\n }\n toHtml(): string {\n return this.g._str((o) => this.ex().gp_to_html(this.h, o));\n }\n toDocx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));\n }\n toPptx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));\n }\n /** Convert to an editable OpenDocument Presentation (`.odp`). */\n toOdp(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odp(this.h, o));\n }\n toOdt(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));\n }\n toXlsx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));\n }\n toOds(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));\n }\n toRtf(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));\n }\n toPdfA(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));\n }\n\n // security\n /**\n * Serialize the document encrypted with the PDF Standard Security Handler.\n * Defaults to **AES-256 (R6)**. `fileId` is the document `/ID` (any stable\n * hex/string). For AES-256 a **secret 32-byte key** is required — it is taken\n * from `opts.keySeed` or generated with Web Crypto; RC4/AES-128 derive their\n * key from the password and ignore it.\n */\n saveEncrypted(\n password: string,\n fileId: string,\n opts: {\n ownerPassword?: string;\n algorithm?: \"rc4\" | \"aes128\" | \"aes256\";\n permissions?: number;\n keySeed?: Uint8Array;\n } = {}\n ): Uint8Array {\n const algo = opts.algorithm ?? \"aes256\";\n const algoCode = algo === \"rc4\" ? 0 : algo === \"aes128\" ? 1 : 2;\n const permissions = opts.permissions ?? -44;\n let key = opts.keySeed ?? new Uint8Array(0);\n if (algoCode === 2 && key.length < 32) {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.getRandomValues) {\n throw new Error(\n \"AES-256 encryption needs Web Crypto (globalThis.crypto.getRandomValues) or an explicit opts.keySeed\"\n );\n }\n // `getRandomValues` requires an ArrayBuffer-backed view (not ArrayBufferLike).\n const fresh = new Uint8Array(32);\n c.getRandomValues(fresh);\n key = fresh;\n }\n return this.g._withStr(password, (pwP, pwL) =>\n this.g._withOptStr(opts.ownerPassword, (oP, oL) =>\n this.g._withStr(fileId, (idP, idL) =>\n this.g._withBytes(key, (kP, kL) =>\n this.g._buffer((o) =>\n this.ex().gp_save_encrypted(\n this.h,\n pwP,\n pwL,\n oP,\n oL,\n idP,\n idL,\n kP,\n kL,\n algoCode,\n permissions,\n o\n )\n )\n )\n )\n )\n );\n }\n /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */\n sign(fields: string, random: Uint8Array, keyBits = 2048): Uint8Array {\n const rPtr = this.g._toWasm(random);\n const out = this.g._withStr(fields, (fP, fL) =>\n this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))\n );\n this.g._free(rPtr, random.length);\n return out;\n }\n\n // metadata\n getMetadata(key: string): string {\n return this.g._withStr(key, (p, l) =>\n this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))\n );\n }\n /** Set an Info-dictionary entry (e.g. \"Title\", \"Author\"). */\n setMetadata(key: string, value: string): boolean {\n return (\n this.g._withStr(key, (kP, kL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))\n ) === 0\n );\n }\n\n // annotations (Acrobat-style markup)\n annotations(page: number): AnnotationInfo[] {\n return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));\n }\n removeAnnotation(page: number, index: number): boolean {\n return this.ex().gp_remove_annotation(this.h, page, index) === 0;\n }\n addSquare(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n stroke: number | null = 0,\n fill: number | null = null,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_square(\n this.h,\n page,\n x0,\n y0,\n x1,\n y1,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n addHighlight(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0xffff00): boolean {\n return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addLineAnnotation(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rgb = 0,\n lineWidth = 1\n ): boolean {\n return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;\n }\n addFreeText(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n text: string,\n fontSize = 12,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))\n ) === 0\n );\n }\n addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */\n addInk(page: number, points: number[], rgb = 0, lineWidth = 1): boolean {\n return (\n this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) ===\n 0\n );\n }\n addStamp(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n label: string,\n rgb = 0xc00000\n ): boolean {\n return (\n this.g._withStr(label, (p, l) =>\n this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))\n ) === 0\n );\n }\n flattenAnnotations(page: number): number {\n return this.ex().gp_flatten_annotations(this.h, page);\n }\n\n // hyperlinks\n links(page: number): LinkInfo[] {\n return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));\n }\n addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean {\n return (\n this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) ===\n 0\n );\n }\n addGotoLink(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n targetPage: number\n ): boolean {\n return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;\n }\n\n // optional-content layers (calques): list + show/hide + lock/unlock + remove\n layers(): LayerInfo[] {\n return this.g._json((o) => this.ex().gp_layers_json(this.h, o));\n }\n /** Create a new (visible, unlocked) layer; returns its id (0 on error). */\n addLayer(name: string): number {\n return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));\n }\n setLayerVisibility(id: number, visible: boolean): boolean {\n return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;\n }\n setLayerLocked(id: number, locked: boolean): boolean {\n return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;\n }\n removeLayer(id: number): boolean {\n return this.ex().gp_remove_layer(this.h, id) === 0;\n }\n\n // outline (bookmarks)\n outline(): OutlineEntry[] {\n return this.g._json((o) => this.ex().gp_outline_json(this.h, o));\n }\n /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */\n setOutline(entries: OutlineEntry[]): boolean {\n const text = entries.map((e) => `${e.level}\\t${e.page ?? 0}\\t${e.title}`).join(\"\\n\");\n return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;\n }\n\n // interactive forms (AcroForm)\n fields(): FieldInfo[] {\n return this.g._json((o) => this.ex().gp_fields_json(this.h, o));\n }\n setTextField(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n setCheckbox(name: string, checked: boolean): boolean {\n return (\n this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0\n );\n }\n setRadio(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n /** Set a choice field's selection (multi-select list boxes accept several values). */\n setChoice(name: string, values: string[]): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(values.join(\"\\n\"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n\n // ── form field creation ──────────────────────────────────────────────────\n\n /**\n * Create a text field on `page` covering `rect` = `[x0, y0, x1, y1]` (PDF\n * user space). Options: `maxLen` character cap, `multiline`, `password`,\n * and visual `style`.\n */\n addTextField(\n page: number,\n name: string,\n rect: [number, number, number, number],\n value = \"\",\n opts: { maxLen?: number; multiline?: boolean; password?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) =>\n this.ex().gp_add_text_field(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], vP, vL,\n opts.maxLen ?? -1, opts.multiline ? 1 : 0, opts.password ? 1 : 0, ...st\n )\n )\n ) === 0\n );\n }\n\n /** Create a checkbox. `export` is the on-state name (default `On`). */\n addCheckbox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n checked = false,\n opts: { export?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(opts.export ?? \"On\", (eP, eL) =>\n this.ex().gp_add_checkbox(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], checked ? 1 : 0, eP, eL, ...st\n )\n )\n ) === 0\n );\n }\n\n /**\n * Create a radio-button group: one logical field whose `options` are the\n * individual buttons. `selected` is the initially-chosen export value.\n */\n addRadioGroup(\n page: number,\n name: string,\n options: RadioOption[],\n opts: { selected?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n const exports = options.map((o) => o.export).join(\"\\n\");\n const rects = options.flatMap((o) => o.rect).join(\",\");\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(exports, (eP, eL) =>\n this.g._withStr(rects, (rP, rL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_radio_group(this.h, page, nP, nL, eP, eL, rP, rL, sP, sL, ...st)\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a drop-down combo box. `editable` permits values outside `options`. */\n addComboBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; editable?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_combo_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.editable ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a scrolling list box. `multi` allows selecting several options. */\n addListBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; multi?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_list_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.multi ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"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","names":["exports"]}
1
+ {"version":3,"sources":["../src/index.ts","../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.15_typescript@6.0.3/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["/**\n * @qrcommunication/gigapdf-lib — TypeScript SDK for the zero-dependency Rust→WASM\n * PDF engine (gigapdf-lib). Wraps the flat `extern \"C\"` `gp_*` ABI behind a typed,\n * ergonomic class. No third-party runtime deps; the `.wasm` is self-contained.\n *\n * Usage:\n * const giga = await GigaPdfEngine.load(wasmBytesOrUrl);\n * const doc = giga.open(pdfBytes);\n * const docx = doc.toDocx();\n * const png = doc.renderPage(1, 2);\n * doc.close();\n */\n\n// FFI boundary: the wasm exports are an untyped table of `gp_*` functions\n// (numbers in, numbers out) plus `memory`. `any` here is the documented FFI\n// exception — every public method below re-imposes precise types.\ntype Exports = {\n memory: WebAssembly.Memory;\n gp_alloc(len: number): number;\n gp_free(ptr: number, len: number): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n};\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** Loaded engine module. Create documents with {@link open} / {@link openEncrypted}. */\nexport class GigaPdfEngine {\n private constructor(private readonly ex: Exports) {}\n\n /** Instantiate from raw wasm bytes, a URL/path, or a Response. */\n static async load(source: ArrayBuffer | Uint8Array | string | Response): Promise<GigaPdfEngine> {\n let bytes: ArrayBuffer | Uint8Array;\n if (typeof source === \"string\") {\n const res = await fetch(source);\n bytes = await res.arrayBuffer();\n } else if (source instanceof Response) {\n bytes = await source.arrayBuffer();\n } else {\n bytes = source;\n }\n const { instance } = await WebAssembly.instantiate(\n bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,\n {}\n );\n return new GigaPdfEngine(instance.exports as Exports);\n }\n\n /**\n * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped\n * inside this package (resolved relative to the built module). In the browser,\n * pass a URL or bytes to {@link load} instead.\n *\n * In Next.js `output: \"standalone\"`, add the asset to `outputFileTracingIncludes`\n * for the consuming route so the `.wasm` is copied into the standalone bundle.\n */\n static async loadDefault(): Promise<GigaPdfEngine> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const wasmPath = fileURLToPath(new URL(\"../gigapdf.wasm\", import.meta.url));\n return GigaPdfEngine.load(await readFile(wasmPath));\n }\n\n // ── linear-memory ABI helpers (internal) ─────────────────────────────────\n private u8() {\n return new Uint8Array(this.ex.memory.buffer);\n }\n private dv() {\n return new DataView(this.ex.memory.buffer);\n }\n /** Copy host bytes into wasm memory; returns the pointer (caller frees). */\n _toWasm(bytes: Uint8Array): number {\n const ptr = this.ex.gp_alloc(bytes.length);\n this.u8().set(bytes, ptr);\n return ptr;\n }\n _free(ptr: number, len: number) {\n this.ex.gp_free(ptr, len);\n }\n /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */\n _buffer(call: (outLenPtr: number) => number): Uint8Array {\n const lenPtr = this.ex.gp_alloc(4);\n const dataPtr = call(lenPtr);\n if (dataPtr === 0) {\n this.ex.gp_free(lenPtr, 4);\n return new Uint8Array(0);\n }\n const len = this.dv().getUint32(lenPtr, true);\n const out = this.u8().slice(dataPtr, dataPtr + len);\n this.ex.gp_free(dataPtr, len);\n this.ex.gp_free(lenPtr, 4);\n return out;\n }\n _str(call: (outLenPtr: number) => number): string {\n return dec.decode(this._buffer(call));\n }\n _json<T = unknown>(call: (outLenPtr: number) => number): T {\n const s = this._str(call);\n return (s ? JSON.parse(s) : []) as T;\n }\n /** Pass a string argument; runs `fn(ptr, len)` then frees. */\n _withStr<T>(s: string, fn: (ptr: number, len: number) => T): T {\n const b = enc.encode(s);\n const ptr = this._toWasm(b);\n try {\n return fn(ptr, b.length);\n } finally {\n this._free(ptr, b.length);\n }\n }\n /** Pass an optional string; an absent/empty value runs `fn(0, 0)` (no alloc). */\n _withOptStr<T>(s: string | undefined, fn: (ptr: number, len: number) => T): T {\n return s ? this._withStr(s, fn) : fn(0, 0);\n }\n /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */\n _withBytes<T>(bytes: Uint8Array, fn: (ptr: number, len: number) => T): T {\n const ptr = this._toWasm(bytes);\n try {\n return fn(ptr, bytes.length);\n } finally {\n this._free(ptr, bytes.length);\n }\n }\n /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */\n _withU32<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 4);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 4);\n }\n }\n /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */\n _withF64<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 8);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 8);\n }\n }\n get raw(): Exports {\n return this.ex;\n }\n\n // ── documents ─────────────────────────────────────────────────────────────\n /** Open a PDF. Throws if it can't be parsed. */\n open(pdf: Uint8Array): GigaPdfDoc {\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));\n if (handle === 0) throw new Error(\"gigapdf: failed to open PDF\");\n return new GigaPdfDoc(this, handle);\n }\n /** Open an encrypted PDF with a password. Returns null if the password is wrong. */\n openEncrypted(pdf: Uint8Array, password: string): GigaPdfDoc | null {\n const b = enc.encode(password);\n const pwPtr = this._toWasm(b);\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));\n this._free(pwPtr, b.length);\n return handle === 0 ? null : new GigaPdfDoc(this, handle);\n }\n\n /**\n * Inspect a PDF's encryption **without decrypting it** (no password needed):\n * whether it has an `/Encrypt` dictionary, plus its `/P` permission bitmask\n * and handler version/revision (`0` when not encrypted).\n */\n encryptionInfo(pdf: Uint8Array): {\n encrypted: boolean;\n permissions: number;\n version: number;\n revision: number;\n } {\n const json = this._withBytes(pdf, (p, l) =>\n this._buffer((o) => this.ex.gp_encryption_info(p, l, o))\n );\n return JSON.parse(dec.decode(json));\n }\n\n /**\n * Width of `text` set in standard Helvetica at `size` points (AFM metrics) —\n * place watermark/header text without embedding a font.\n */\n helveticaWidth(size: number, text: string): number {\n return this._withStr(text, (p, l) => this.ex.gp_helvetica_width(p, l, size));\n }\n\n // ── stateless <format> → PDF conversions ───────────────────────────────────\n txtToPdf(text: string): Uint8Array {\n return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));\n }\n htmlToPdf(html: string): Uint8Array {\n return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));\n }\n rtfToPdf(rtf: string): Uint8Array {\n return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));\n }\n /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */\n officeToPdf(office: Uint8Array): Uint8Array {\n return this._withBytes(office, (p, l) =>\n this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))\n );\n }\n\n // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────\n fontCatalog(): FontInfo[] {\n return this._json((o) => this.ex.gp_font_catalog_json(o));\n }\n /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */\n fontRequestUrl(family: string, weight = 400, italic = false): string {\n return this._withStr(family, (p, l) =>\n this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))\n );\n }\n /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */\n parseCssFontUrl(css: string): string {\n return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));\n }\n\n // ── JavaScript engine (no headless browser) ────────────────────────────────\n /**\n * Evaluate a JavaScript snippet with the built-in engine and return the\n * result value as a string (or `Uncaught …` / `SyntaxError: …`).\n */\n evalJs(src: string): string {\n return this._withStr(src, (p, l) => this._str((o) => this.ex.gp_js_eval(p, l, o)));\n }\n /**\n * Run a document's inline `<script>`s and return the resulting HTML. The\n * `htmlRender`/`htmlNeededFonts` paths already do this automatically; use this\n * only when you want the post-script HTML on its own.\n */\n runInlineScripts(html: string): string {\n return this._withStr(html, (p, l) =>\n this._str((o) => this.ex.gp_run_inline_scripts(p, l, o))\n );\n }\n\n // ── HTML rendering engine (replaces a headless browser for HTML→PDF) ───────\n /**\n * Phase 1 — the Google fonts the document references. Download each `url`\n * (→ TTF) and pass the bytes back to {@link htmlRender} for an identical render.\n */\n htmlNeededFonts(html: string): HtmlFontRequest[] {\n return this._withStr(html, (p, l) =>\n this._json((o) => this.ex.gp_html_needed_fonts(p, l, o))\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 — render HTML + CSS to PDF, with the supplied fonts embedded (real\n * Google fonts, real metrics → identical or nearest match). Block, inline and\n * table layout with pagination. Page size and margin are in points\n * (US-Letter portrait, 0.5in margins by default). JavaScript is not executed.\n */\n htmlRender(\n html: string,\n fonts: HtmlFont[] = [],\n pageWidth = 612,\n pageHeight = 792,\n margin = 36\n ): Uint8Array {\n const blob = packHtmlFonts(fonts);\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._buffer((o) => this.ex.gp_html_render(hp, hl, fp, fl, pageWidth, pageHeight, margin, o))\n )\n );\n }\n\n /**\n * Resolve a named paper size — `\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, `\"legal\"`,\n * `\"tabloid\"`, `\"b5\"`, … — to `{ w, h }` in points (portrait unless the name\n * has a `-landscape` suffix). Returns `null` for an unknown name.\n */\n pageSize(name: string): { w: number; h: number } | null {\n const outPtr = this.ex.gp_alloc(16);\n try {\n const ok = this._withStr(name, (p, l) =>\n this.ex.gp_page_size(p, l, outPtr, outPtr + 8)\n );\n if (!ok) return null;\n const dv = this.dv();\n return { w: dv.getFloat64(outPtr, true), h: dv.getFloat64(outPtr + 8, true) };\n } finally {\n this._free(outPtr, 16);\n }\n }\n\n /**\n * Phase 1 variant that also scans the running `header`/`footer` HTML, so the\n * Google fonts they reference are requested alongside the body's.\n */\n htmlNeededFontsWith(html: string, header?: string, footer?: string): HtmlFontRequest[] {\n return this._withStr(html, (hp, hl) =>\n this._withOptStr(header, (hdp, hdl) =>\n this._withOptStr(footer, (ftp, ftl) =>\n this._json((o) => this.ex.gp_html_needed_fonts_ex(hp, hl, hdp, hdl, ftp, ftl, o))\n )\n )\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 with full page control: named/explicit size, per-side margins, and a\n * running header/footer painted in the page margins. `{{page}}` and `{{pages}}`\n * in the header/footer are replaced with the current / total page number.\n *\n * ```ts\n * const fonts = await fetchFonts(giga.htmlNeededFontsWith(html, header, footer));\n * const pdf = giga.htmlRenderWith(html, fonts, {\n * pageSize: \"A4\",\n * margin: { top: 72, bottom: 72, left: 54, right: 54 },\n * header: `<div style=\"text-align:center\">My Report</div>`,\n * footer: `<div style=\"text-align:center\">Page {{page}} / {{pages}}</div>`,\n * });\n * ```\n */\n htmlRenderWith(\n html: string,\n fonts: HtmlFont[] = [],\n options: HtmlRenderOptions = {}\n ): Uint8Array {\n let pw = options.pageWidth ?? 612;\n let ph = options.pageHeight ?? 792;\n if (options.pageSize) {\n const sz = this.pageSize(options.pageSize);\n if (!sz) throw new Error(`gigapdf: unknown page size \"${options.pageSize}\"`);\n pw = sz.w;\n ph = sz.h;\n }\n const m = options.margin ?? 36;\n const mg =\n typeof m === \"number\"\n ? { top: m, right: m, bottom: m, left: m }\n : { top: m.top ?? 36, right: m.right ?? 36, bottom: m.bottom ?? 36, left: m.left ?? 36 };\n const headerOffset = options.headerOffset ?? 18;\n const footerOffset = options.footerOffset ?? 18;\n const start = options.startPageNumber ?? 1;\n const blob = packHtmlFonts(fonts);\n\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._withOptStr(options.header, (hdp, hdl) =>\n this._withOptStr(options.footer, (ftp, ftl) =>\n this._buffer((o) =>\n this.ex.gp_html_render_opts(\n hp,\n hl,\n fp,\n fl,\n pw,\n ph,\n mg.top,\n mg.right,\n mg.bottom,\n mg.left,\n hdp,\n hdl,\n ftp,\n ftl,\n headerOffset,\n footerOffset,\n start,\n o\n )\n )\n )\n )\n )\n );\n }\n}\n\n/** Pack `HtmlFont[]` into the little-endian blob `gp_html_render` expects. */\nfunction packHtmlFonts(fonts: HtmlFont[]): Uint8Array {\n let size = 4;\n for (const f of fonts) size += 4 + enc.encode(f.family).length + 2 + 1 + 4 + f.ttf.length;\n const buf = new Uint8Array(size);\n const dv = new DataView(buf.buffer);\n let o = 0;\n dv.setUint32(o, fonts.length, true);\n o += 4;\n for (const f of fonts) {\n const fam = enc.encode(f.family);\n dv.setUint32(o, fam.length, true);\n o += 4;\n buf.set(fam, o);\n o += fam.length;\n dv.setUint16(o, f.weight, true);\n o += 2;\n buf[o] = f.italic ? 1 : 0;\n o += 1;\n dv.setUint32(o, f.ttf.length, true);\n o += 4;\n buf.set(f.ttf, o);\n o += f.ttf.length;\n }\n return buf;\n}\n\n/** A Google font the HTML engine needs (resolved from the catalogue). */\nexport interface HtmlFontRequest {\n family: string;\n weight: number;\n italic: boolean;\n /** Google Fonts CSS URL — the host fetches it to obtain the TTF. */\n url: string;\n}\n\n/** A downloaded font handed to {@link GigaPdfEngine.htmlRender}. */\nexport interface HtmlFont {\n family: string;\n weight: number;\n italic: boolean;\n ttf: Uint8Array;\n}\n\n/** Per-side page margins in points; omitted sides default to 36pt. */\nexport interface HtmlMargins {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/** Page setup for {@link GigaPdfEngine.htmlRenderWith}. */\nexport interface HtmlRenderOptions {\n /** Named paper size (`\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, …) — wins over width/height. */\n pageSize?: string;\n /** Explicit page width in points (default 612 = US Letter). Ignored if `pageSize` is set. */\n pageWidth?: number;\n /** Explicit page height in points (default 792). Ignored if `pageSize` is set. */\n pageHeight?: number;\n /** Uniform margin (points) or per-side margins. Default 36pt (0.5in). */\n margin?: number | HtmlMargins;\n /** Running header HTML painted in the top margin (`{{page}}` / `{{pages}}` tokens). */\n header?: string;\n /** Running footer HTML painted in the bottom margin (same tokens). */\n footer?: string;\n /** Distance from the top edge to the header block, in points (default 18). */\n headerOffset?: number;\n /** Distance from the bottom edge to the footer block, in points (default 18). */\n footerOffset?: number;\n /** Number assigned to the first page for `{{page}}` (default 1). */\n startPageNumber?: number;\n}\n\nexport interface FontInfo {\n family: string;\n category: string;\n google: boolean;\n weights: number[];\n}\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\nexport interface Element extends Partial<Box> {\n index: number;\n kind: \"text\" | \"image\" | \"shape\";\n label: string;\n}\nexport interface TextLine extends Box {\n text: string;\n}\nexport interface SearchHit extends Box {\n page: number;\n text: string;\n}\nexport interface OcrWord extends Box {\n text: string;\n}\nexport interface TextRunInfo {\n index: number;\n operator: string;\n text: string;\n}\n/** A markup annotation (rect corners in PDF user space). */\nexport interface AnnotationInfo {\n index: number;\n subtype: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n contents: string;\n}\n/** A hyperlink annotation; `kind` discriminates the target. */\nexport interface LinkInfo {\n index: number;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n kind: \"uri\" | \"page\" | \"unknown\";\n uri?: string;\n page?: number;\n}\nexport type FieldKind =\n | \"text\"\n | \"checkbox\"\n | \"radio\"\n | \"pushbutton\"\n | \"combo\"\n | \"list\"\n | \"signature\"\n | \"unknown\";\n/** An AcroForm field with its flags and (for choices) options. */\nexport interface FieldInfo {\n name: string;\n type: string;\n kind: FieldKind;\n flags: number;\n readOnly: boolean;\n required: boolean;\n multiline: boolean;\n fillable: boolean;\n maxLen?: number;\n /** 1-based page the widget sits on (from its `/P`); absent if it has no widget. */\n page?: number;\n /**\n * Widget rectangle `[x, y, width, height]` in points, **top-left origin**\n * (already Y-flipped from the PDF's bottom-left `/Rect` for direct host use).\n * Absent when the field carries no `/Rect`.\n */\n bounds?: [number, number, number, number];\n value: string;\n options: string[];\n}\n/** One outline (bookmark) entry; `level` is the nesting depth (0 = top). */\nexport interface OutlineEntry {\n level: number;\n title: string;\n page?: number;\n}\n/** An optional-content layer (calque): toggle `visible`/`locked` to persist in the PDF. */\nexport interface LayerInfo {\n id: number;\n name: string;\n visible: boolean;\n locked: boolean;\n order: number;\n}\n/** A page's geometry: size in points and `/Rotate` (0/90/180/270). */\nexport interface PageInfo {\n width: number;\n height: number;\n rotation: number;\n}\n\nconst RGB = (rgb: number) => rgb & 0xffffff;\n\n/** Visual styling for a newly-created form field. */\nexport interface FieldStyle {\n /** Text size in points; `0` (default) auto-sizes to the field box. */\n fontSize?: number;\n /** Text / mark colour `0xRRGGBB` (default black). */\n color?: number;\n /** Border colour `0xRRGGBB`, or `null` for no border (default black). */\n border?: number | null;\n /** Background fill `0xRRGGBB`, or `null` for transparent (default none). */\n background?: number | null;\n /** Border width in points (default `1`). */\n borderWidth?: number;\n}\n\n/** One option of a radio group: its export value and on-page rectangle. */\nexport interface RadioOption {\n /** The export value stored in the field when this button is selected. */\n export: string;\n /** `[x0, y0, x1, y1]` in PDF user space. */\n rect: [number, number, number, number];\n}\n\n/** Expand a {@link FieldStyle} into the 7 packed ABI arguments. */\nfunction styleArgs(s: FieldStyle = {}): [number, number, number, number, number, number, number] {\n const hasBorder = s.border === null ? 0 : 1;\n const borderRgb = s.border == null ? 0x000000 : s.border;\n const hasBg = s.background == null ? 0 : 1;\n const bgRgb = s.background == null ? 0 : s.background;\n return [\n s.fontSize ?? 0,\n RGB(s.color ?? 0x000000),\n RGB(borderRgb),\n hasBorder,\n RGB(bgRgb),\n hasBg,\n s.borderWidth ?? 1,\n ];\n}\n\n/** A live document handle. Call {@link close} when done. */\nexport class GigaPdfDoc {\n constructor(\n private readonly g: GigaPdfEngine,\n private readonly h: number\n ) {}\n private ex() {\n return this.g.raw;\n }\n\n close() {\n this.ex().gp_close(this.h);\n }\n pageCount(): number {\n return this.ex().gp_page_count(this.h);\n }\n save(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save(this.h, o));\n }\n saveCompressed(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));\n }\n\n // text intelligence\n textRuns(page: number): TextRunInfo[] {\n return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));\n }\n elements(page: number): Element[] {\n return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));\n }\n structuredText(page: number): TextLine[] {\n return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));\n }\n search(query: string, caseInsensitive = true): SearchHit[] {\n return this.g._withStr(query, (p, l) =>\n this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))\n );\n }\n /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */\n ocr(page: number, scale = 2): OcrWord[] {\n return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));\n }\n ocrText(page: number, scale = 2): string {\n return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));\n }\n\n // editing\n replaceText(page: number, index: number, text: string): boolean {\n return (\n this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0\n );\n }\n removeElement(page: number, index: number): boolean {\n return this.ex().gp_remove_element(this.h, page, index) === 0;\n }\n moveElement(page: number, index: number, dx: number, dy: number): boolean {\n return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;\n }\n duplicateElement(page: number, index: number): boolean {\n return this.ex().gp_duplicate_element(this.h, page, index) === 0;\n }\n /** Index of the element at page point `(x, y)`, or -1 if none. */\n elementAt(page: number, x: number, y: number): number {\n return this.ex().gp_element_at(this.h, page, x, y);\n }\n /**\n * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or\n * `null` to omit that paint. 0 → success.\n */\n addRectangle(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_rectangle(\n this.h,\n page,\n x,\n y,\n w,\n h,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /** Draw a straight line from `(x1,y1)` to `(x2,y2)`. `stroke` is `0xRRGGBB`. */\n drawLine(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_draw_line(this.h, page, x1, y1, x2, y2, RGB(stroke), lineWidth, opacity) === 0\n );\n }\n\n /**\n * Draw an ellipse (circle when `rx === ry`) centred at `(cx,cy)`. Pass an\n * `0xRRGGBB` colour for `stroke`/`fill`, or `null` to omit that paint.\n */\n addEllipse(\n page: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_ellipse(\n this.h,\n page,\n cx,\n cy,\n rx,\n ry,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /**\n * Draw a polyline/polygon through flat `[x0,y0,x1,y1,…]` points. `close` joins\n * the last vertex back to the first. `0xRRGGBB` colours, or `null` to omit.\n */\n addPolygon(\n page: number,\n points: number[],\n close = true,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withF64(points, (p, c) =>\n this.ex().gp_add_polygon(\n this.h,\n page,\n p,\n c,\n close ? 1 : 0,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Draw an SVG path (`M`/`L`/`C`/`Q`/`Z`…) anchored so the SVG origin maps to\n * `(ox,oy)` with the Y axis flipped — same convention as `pdf-lib`'s\n * `drawSvgPath`. Covers freeform/polygon/triangle shapes.\n */\n addPath(\n page: number,\n svgPath: string,\n ox: number,\n oy: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withStr(svgPath, (p, l) =>\n this.ex().gp_add_path(\n this.h,\n page,\n p,\n l,\n ox,\n oy,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Embed a raster image (PNG or JPEG bytes) at `(x,y)` sized `(w,h)` in PDF\n * user space. PNG alpha is honoured; `opacity` (0..1) sets an overall alpha.\n */\n addImage(\n page: number,\n data: Uint8Array,\n x: number,\n y: number,\n w: number,\n h: number,\n opacity = 1\n ): boolean {\n return (\n this.g._withBytes(data, (p, l) =>\n this.ex().gp_add_image(this.h, page, p, l, x, y, w, h, opacity)\n ) === 0\n );\n }\n /**\n * Draw SVG markup on a page as **native vector paths** (crisp at any zoom, not\n * rasterized), fitting its `viewBox` into the box `(x, y, w, h)` in PDF points\n * (origin bottom-left). Supports shapes, `<path>`, groups, transforms and\n * fill/stroke/opacity. Returns `false` if the SVG can't be parsed.\n */\n addSvg(page: number, svg: string, x: number, y: number, w: number, h: number): boolean {\n return (\n this.g._withStr(svg, (p, l) => this.ex().gp_add_svg(this.h, page, p, l, x, y, w, h)) === 0\n );\n }\n /** True redaction: delete content intersecting the region (no opaque cover by default). */\n redact(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n coverRgb = 0,\n hasCover = false\n ): number {\n return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);\n }\n\n // pages\n rotatePage(page: number, degrees: number): boolean {\n return this.ex().gp_rotate_page(this.h, page, degrees) === 0;\n }\n deletePage(page: number): boolean {\n return this.ex().gp_delete_page(this.h, page) === 0;\n }\n movePage(from: number, to: number): boolean {\n return this.ex().gp_move_page(this.h, from, to) === 0;\n }\n appendPages(otherPdf: Uint8Array): boolean {\n return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;\n }\n /** Extract the given 1-based page numbers into a NEW standalone PDF. */\n extractPages(pages: number[]): Uint8Array {\n return this.g._withU32(pages, (p, c) =>\n this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))\n );\n }\n /** Resize a page's MediaBox to `width`×`height` points. */\n resizePage(page: number, width: number, height: number): boolean {\n return this.ex().gp_resize_page(this.h, page, width, height) === 0;\n }\n /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */\n addPage(width: number, height: number, after = 0): number {\n return this.ex().gp_add_page(this.h, width, height, after);\n }\n /** Duplicate a page, inserting the copy right after it; returns the new page's id. */\n copyPage(page: number): number {\n return this.ex().gp_copy_page(this.h, page);\n }\n /** A page's size (points) and `/Rotate` (0/90/180/270). */\n pageInfo(page: number): PageInfo {\n return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));\n }\n\n // render\n renderPage(page: number, scale = 1): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));\n }\n\n // fonts — embed a downloaded TTF, then add real selectable text\n embedFont(family: string, ttf: Uint8Array): number {\n const b = enc.encode(family);\n const famPtr = this.g._toWasm(b);\n const obj = this.g._withBytes(ttf, (p, l) =>\n this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)\n );\n this.g._free(famPtr, b.length);\n return obj;\n }\n addText(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n fontObj: number,\n rgb = 0,\n opacity = 1,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_text(\n this.h,\n page,\n x,\n y,\n size,\n p,\n l,\n fontObj,\n RGB(rgb),\n opacity,\n rotationDeg\n )\n ) === 0\n );\n }\n /**\n * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at\n * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,\n * `opacity` 0–1. Pair with {@link GigaPdfEngine.helveticaWidth} for centring.\n */\n addWatermark(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n rgb = 0x808080,\n opacity = 0.25,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_watermark(this.h, page, x, y, size, p, l, RGB(rgb), opacity, rotationDeg)\n ) === 0\n );\n }\n neededFonts(): string[] {\n return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));\n }\n /**\n * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host\n * editor can re-embed the document's own font when re-baking edited text and\n * keep the original glyphs. Returns the raw decoded bytes and the program\n * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),\n * or `null` when nothing embedded matches.\n */\n extractFont(\n name: string\n ): { format: \"truetype\" | \"cff\" | \"type1\"; bytes: Uint8Array } | null {\n const buf = this.g._withStr(name, (p, l) =>\n this.g._buffer((o) => this.ex().gp_extract_font(this.h, p, l, o))\n );\n if (buf.length === 0) return null;\n const format = buf[0] === 1 ? \"truetype\" : buf[0] === 2 ? \"cff\" : \"type1\";\n return { format, bytes: buf.subarray(1) };\n }\n\n // convert PDF → X\n toText(): string {\n return this.g._str((o) => this.ex().gp_to_text(this.h, o));\n }\n toHtml(): string {\n return this.g._str((o) => this.ex().gp_to_html(this.h, o));\n }\n toDocx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));\n }\n toPptx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));\n }\n /** Convert to an editable OpenDocument Presentation (`.odp`). */\n toOdp(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odp(this.h, o));\n }\n toOdt(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));\n }\n toXlsx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));\n }\n toOds(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));\n }\n toRtf(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));\n }\n toPdfA(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));\n }\n\n // security\n /**\n * Serialize the document encrypted with the PDF Standard Security Handler.\n * Defaults to **AES-256 (R6)**. `fileId` is the document `/ID` (any stable\n * hex/string). For AES-256 a **secret 32-byte key** is required — it is taken\n * from `opts.keySeed` or generated with Web Crypto; RC4/AES-128 derive their\n * key from the password and ignore it.\n */\n saveEncrypted(\n password: string,\n fileId: string,\n opts: {\n ownerPassword?: string;\n algorithm?: \"rc4\" | \"aes128\" | \"aes256\";\n permissions?: number;\n keySeed?: Uint8Array;\n } = {}\n ): Uint8Array {\n const algo = opts.algorithm ?? \"aes256\";\n const algoCode = algo === \"rc4\" ? 0 : algo === \"aes128\" ? 1 : 2;\n const permissions = opts.permissions ?? -44;\n let key = opts.keySeed ?? new Uint8Array(0);\n if (algoCode === 2 && key.length < 32) {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.getRandomValues) {\n throw new Error(\n \"AES-256 encryption needs Web Crypto (globalThis.crypto.getRandomValues) or an explicit opts.keySeed\"\n );\n }\n // `getRandomValues` requires an ArrayBuffer-backed view (not ArrayBufferLike).\n const fresh = new Uint8Array(32);\n c.getRandomValues(fresh);\n key = fresh;\n }\n return this.g._withStr(password, (pwP, pwL) =>\n this.g._withOptStr(opts.ownerPassword, (oP, oL) =>\n this.g._withStr(fileId, (idP, idL) =>\n this.g._withBytes(key, (kP, kL) =>\n this.g._buffer((o) =>\n this.ex().gp_save_encrypted(\n this.h,\n pwP,\n pwL,\n oP,\n oL,\n idP,\n idL,\n kP,\n kL,\n algoCode,\n permissions,\n o\n )\n )\n )\n )\n )\n );\n }\n /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */\n sign(fields: string, random: Uint8Array, keyBits = 2048): Uint8Array {\n const rPtr = this.g._toWasm(random);\n const out = this.g._withStr(fields, (fP, fL) =>\n this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))\n );\n this.g._free(rPtr, random.length);\n return out;\n }\n\n // metadata\n getMetadata(key: string): string {\n return this.g._withStr(key, (p, l) =>\n this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))\n );\n }\n /** Set an Info-dictionary entry (e.g. \"Title\", \"Author\"). */\n setMetadata(key: string, value: string): boolean {\n return (\n this.g._withStr(key, (kP, kL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))\n ) === 0\n );\n }\n\n // annotations (Acrobat-style markup)\n annotations(page: number): AnnotationInfo[] {\n return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));\n }\n removeAnnotation(page: number, index: number): boolean {\n return this.ex().gp_remove_annotation(this.h, page, index) === 0;\n }\n addSquare(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n stroke: number | null = 0,\n fill: number | null = null,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_square(\n this.h,\n page,\n x0,\n y0,\n x1,\n y1,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n addHighlight(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0xffff00): boolean {\n return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addLineAnnotation(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rgb = 0,\n lineWidth = 1\n ): boolean {\n return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;\n }\n addFreeText(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n text: string,\n fontSize = 12,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))\n ) === 0\n );\n }\n addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n /**\n * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |\n * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF\n * user space, bottom-left origin — multi-quad covers wrapped text), with full\n * reviewer metadata. `date` is a PDF date string (e.g. `\"D:20260616T…Z\"`) — the\n * engine has no clock, so the host supplies it.\n */\n addMarkupAnnotation(\n page: number,\n subtype: \"highlight\" | \"underline\" | \"strikeout\" | \"squiggly\",\n quads: Array<[number, number, number, number]>,\n rgb: number,\n opacity: number,\n meta: { contents?: string; author?: string; id?: string; date?: string } = {}\n ): boolean {\n const sub =\n subtype === \"highlight\"\n ? \"Highlight\"\n : subtype === \"underline\"\n ? \"Underline\"\n : subtype === \"strikeout\"\n ? \"StrikeOut\"\n : \"Squiggly\";\n const packed = [\n sub,\n meta.contents ?? \"\",\n meta.author ?? \"\",\n meta.id ?? \"\",\n meta.date ?? \"\",\n ].join(\"\u001f\");\n const flat = quads.flat();\n return (\n this.g._withStr(packed, (mp, ml) =>\n this.g._withF64(flat, (qp, qc) =>\n this.ex().gp_add_markup_annotation(this.h, page, mp, ml, qp, qc, RGB(rgb), opacity)\n )\n ) === 0\n );\n }\n /**\n * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)\n * that opens a popup with `meta.contents`. `icon` is the named icon (`\"Note\"`,\n * `\"Comment\"`, …); `open` sets the initial popup state.\n */\n addTextNote(\n page: number,\n rect: [number, number, number, number],\n rgb: number,\n meta: { contents?: string; author?: string; id?: string; date?: string } = {},\n icon = \"Note\",\n open = false\n ): boolean {\n const packed = [\n meta.contents ?? \"\",\n meta.author ?? \"\",\n meta.id ?? \"\",\n meta.date ?? \"\",\n ].join(\"\u001f\");\n return (\n this.g._withStr(packed, (mp, ml) =>\n this.g._withStr(icon, (ip, il) =>\n this.ex().gp_add_text_note(\n this.h,\n page,\n rect[0],\n rect[1],\n rect[2],\n rect[3],\n mp,\n ml,\n ip,\n il,\n open ? 1 : 0,\n RGB(rgb)\n )\n )\n ) === 0\n );\n }\n /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */\n addInk(page: number, points: number[], rgb = 0, lineWidth = 1): boolean {\n return (\n this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) ===\n 0\n );\n }\n addStamp(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n label: string,\n rgb = 0xc00000\n ): boolean {\n return (\n this.g._withStr(label, (p, l) =>\n this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))\n ) === 0\n );\n }\n flattenAnnotations(page: number): number {\n return this.ex().gp_flatten_annotations(this.h, page);\n }\n /**\n * Flatten the interactive form: bake every field widget across all pages into\n * the page content and drop `/AcroForm`, so the document is no longer\n * fillable and {@link fields} returns empty afterwards. Returns the number of\n * widgets baked (0 when there is no form).\n */\n flattenForm(): number {\n return this.ex().gp_flatten_form(this.h);\n }\n\n // hyperlinks\n links(page: number): LinkInfo[] {\n return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));\n }\n addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean {\n return (\n this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) ===\n 0\n );\n }\n addGotoLink(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n targetPage: number\n ): boolean {\n return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;\n }\n\n // optional-content layers (calques): list + show/hide + lock/unlock + remove\n layers(): LayerInfo[] {\n return this.g._json((o) => this.ex().gp_layers_json(this.h, o));\n }\n /** Create a new (visible, unlocked) layer; returns its id (0 on error). */\n addLayer(name: string): number {\n return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));\n }\n setLayerVisibility(id: number, visible: boolean): boolean {\n return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;\n }\n setLayerLocked(id: number, locked: boolean): boolean {\n return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;\n }\n removeLayer(id: number): boolean {\n return this.ex().gp_remove_layer(this.h, id) === 0;\n }\n\n // outline (bookmarks)\n outline(): OutlineEntry[] {\n return this.g._json((o) => this.ex().gp_outline_json(this.h, o));\n }\n /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */\n setOutline(entries: OutlineEntry[]): boolean {\n const text = entries.map((e) => `${e.level}\\t${e.page ?? 0}\\t${e.title}`).join(\"\\n\");\n return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;\n }\n\n // interactive forms (AcroForm)\n fields(): FieldInfo[] {\n return this.g._json((o) => this.ex().gp_fields_json(this.h, o));\n }\n setTextField(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n setCheckbox(name: string, checked: boolean): boolean {\n return (\n this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0\n );\n }\n setRadio(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n /** Set a choice field's selection (multi-select list boxes accept several values). */\n setChoice(name: string, values: string[]): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(values.join(\"\\n\"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n\n // ── form field creation ──────────────────────────────────────────────────\n\n /**\n * Create a text field on `page` covering `rect` = `[x0, y0, x1, y1]` (PDF\n * user space). Options: `maxLen` character cap, `multiline`, `password`,\n * and visual `style`.\n */\n addTextField(\n page: number,\n name: string,\n rect: [number, number, number, number],\n value = \"\",\n opts: { maxLen?: number; multiline?: boolean; password?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) =>\n this.ex().gp_add_text_field(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], vP, vL,\n opts.maxLen ?? -1, opts.multiline ? 1 : 0, opts.password ? 1 : 0, ...st\n )\n )\n ) === 0\n );\n }\n\n /** Create a checkbox. `export` is the on-state name (default `On`). */\n addCheckbox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n checked = false,\n opts: { export?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(opts.export ?? \"On\", (eP, eL) =>\n this.ex().gp_add_checkbox(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], checked ? 1 : 0, eP, eL, ...st\n )\n )\n ) === 0\n );\n }\n\n /**\n * Create a radio-button group: one logical field whose `options` are the\n * individual buttons. `selected` is the initially-chosen export value.\n */\n addRadioGroup(\n page: number,\n name: string,\n options: RadioOption[],\n opts: { selected?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n const exports = options.map((o) => o.export).join(\"\\n\");\n const rects = options.flatMap((o) => o.rect).join(\",\");\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(exports, (eP, eL) =>\n this.g._withStr(rects, (rP, rL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_radio_group(this.h, page, nP, nL, eP, eL, rP, rL, sP, sL, ...st)\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a drop-down combo box. `editable` permits values outside `options`. */\n addComboBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; editable?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_combo_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.editable ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a scrolling list box. `multi` allows selecting several options. */\n addListBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; multi?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_list_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.multi ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ADY9D,IAAM,MAAM,IAAI,YAAY;AAC5B,IAAM,MAAM,IAAI,YAAY;AAGrB,IAAM,gBAAN,MAAM,eAAc;AAAA,EACjB,YAA6B,IAAa;AAAb;AAAA,EAAc;AAAA,EAAd;AAAA;AAAA,EAGrC,aAAa,KAAK,QAA8E;AAC9F,QAAI;AACJ,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,cAAQ,MAAM,IAAI,YAAY;AAAA,IAChC,WAAW,kBAAkB,UAAU;AACrC,cAAQ,MAAM,OAAO,YAAY;AAAA,IACnC,OAAO;AACL,cAAQ;AAAA,IACV;AACA,UAAM,EAAE,SAAS,IAAI,MAAM,YAAY;AAAA,MACrC,iBAAiB,aAAa,MAAM,MAAM,EAAE,SAAS;AAAA,MACrD,CAAC;AAAA,IACH;AACA,WAAO,IAAI,eAAc,SAAS,OAAkB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,cAAsC;AACjD,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,KAAU;AACjD,UAAM,WAAW,cAAc,IAAI,IAAI,mBAAmB,aAAe,CAAC;AAC1E,WAAO,eAAc,KAAK,MAAM,SAAS,QAAQ,CAAC;AAAA,EACpD;AAAA;AAAA,EAGQ,KAAK;AACX,WAAO,IAAI,WAAW,KAAK,GAAG,OAAO,MAAM;AAAA,EAC7C;AAAA,EACQ,KAAK;AACX,WAAO,IAAI,SAAS,KAAK,GAAG,OAAO,MAAM;AAAA,EAC3C;AAAA;AAAA,EAEA,QAAQ,OAA2B;AACjC,UAAM,MAAM,KAAK,GAAG,SAAS,MAAM,MAAM;AACzC,SAAK,GAAG,EAAE,IAAI,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAa,KAAa;AAC9B,SAAK,GAAG,QAAQ,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA,EAEA,QAAQ,MAAiD;AACvD,UAAM,SAAS,KAAK,GAAG,SAAS,CAAC;AACjC,UAAM,UAAU,KAAK,MAAM;AAC3B,QAAI,YAAY,GAAG;AACjB,WAAK,GAAG,QAAQ,QAAQ,CAAC;AACzB,aAAO,IAAI,WAAW,CAAC;AAAA,IACzB;AACA,UAAM,MAAM,KAAK,GAAG,EAAE,UAAU,QAAQ,IAAI;AAC5C,UAAM,MAAM,KAAK,GAAG,EAAE,MAAM,SAAS,UAAU,GAAG;AAClD,SAAK,GAAG,QAAQ,SAAS,GAAG;AAC5B,SAAK,GAAG,QAAQ,QAAQ,CAAC;AACzB,WAAO;AAAA,EACT;AAAA,EACA,KAAK,MAA6C;AAChD,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,EACtC;AAAA,EACA,MAAmB,MAAwC;AACzD,UAAM,IAAI,KAAK,KAAK,IAAI;AACxB,WAAQ,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;AAAA,EAC/B;AAAA;AAAA,EAEA,SAAY,GAAW,IAAwC;AAC7D,UAAM,IAAI,IAAI,OAAO,CAAC;AACtB,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI;AACF,aAAO,GAAG,KAAK,EAAE,MAAM;AAAA,IACzB,UAAE;AACA,WAAK,MAAM,KAAK,EAAE,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAEA,YAAe,GAAuB,IAAwC;AAC5E,WAAO,IAAI,KAAK,SAAS,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA,EAEA,WAAc,OAAmB,IAAwC;AACvE,UAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,QAAI;AACF,aAAO,GAAG,KAAK,MAAM,MAAM;AAAA,IAC7B,UAAE;AACA,WAAK,MAAM,KAAK,MAAM,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAEA,SAAY,QAAkB,IAA0C;AACtE,UAAM,MAAM,KAAK,GAAG,SAAS,OAAO,SAAS,CAAC;AAC9C,UAAM,KAAK,KAAK,GAAG;AACnB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAG,IAAG,UAAU,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI;AAC9E,QAAI;AACF,aAAO,GAAG,KAAK,OAAO,MAAM;AAAA,IAC9B,UAAE;AACA,WAAK,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAEA,SAAY,QAAkB,IAA0C;AACtE,UAAM,MAAM,KAAK,GAAG,SAAS,OAAO,SAAS,CAAC;AAC9C,UAAM,KAAK,KAAK,GAAG;AACnB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAG,IAAG,WAAW,MAAM,IAAI,GAAG,GAAG,IAAI;AACzE,QAAI;AACF,aAAO,GAAG,KAAK,OAAO,MAAM;AAAA,IAC9B,UAAE;AACA,WAAK,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EACA,IAAI,MAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA,EAIA,KAAK,KAA6B;AAChC,UAAM,SAAS,KAAK,WAAW,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AACnE,QAAI,WAAW,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAC/D,WAAO,IAAI,WAAW,MAAM,MAAM;AAAA,EACpC;AAAA;AAAA,EAEA,cAAc,KAAiB,UAAqC;AAClE,UAAM,IAAI,IAAI,OAAO,QAAQ;AAC7B,UAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,UAAM,SAAS,KAAK,WAAW,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,kBAAkB,GAAG,GAAG,OAAO,EAAE,MAAM,CAAC;AAC9F,SAAK,MAAM,OAAO,EAAE,MAAM;AAC1B,WAAO,WAAW,IAAI,OAAO,IAAI,WAAW,MAAM,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAKb;AACA,UAAM,OAAO,KAAK;AAAA,MAAW;AAAA,MAAK,CAAC,GAAG,MACpC,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AACA,WAAO,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,MAAc,MAAsB;AACjD,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,IAAI,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,SAAS,MAA0B;AACjC,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC1F;AAAA,EACA,UAAU,MAA0B;AAClC,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC3F;AAAA,EACA,SAAS,KAAyB;AAChC,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACzF;AAAA;AAAA,EAEA,YAAY,QAAgC;AAC1C,WAAO,KAAK;AAAA,MAAW;AAAA,MAAQ,CAAC,GAAG,MACjC,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,iBAAiB,GAAG,GAAG,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA,EAGA,cAA0B;AACxB,WAAO,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC;AAAA,EAC1D;AAAA;AAAA,EAEA,eAAe,QAAgB,SAAS,KAAK,SAAS,OAAe;AACnE,WAAO,KAAK;AAAA,MAAS;AAAA,MAAQ,CAAC,GAAG,MAC/B,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,oBAAoB,GAAG,GAAG,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA,EAEA,gBAAgB,KAAqB;AACnC,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,sBAAsB,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAqB;AAC1B,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,MAAsB;AACrC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MAC7B,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,sBAAsB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,MAAiC;AAC/C,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MAC7B,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WACE,MACA,QAAoB,CAAC,GACrB,YAAY,KACZ,aAAa,KACb,SAAS,IACG;AACZ,UAAM,OAAO,cAAc,KAAK;AAChC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAW;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,eAAe,IAAI,IAAI,IAAI,IAAI,WAAW,YAAY,QAAQ,CAAC,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAA+C;AACtD,UAAM,SAAS,KAAK,GAAG,SAAS,EAAE;AAClC,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,QAAS;AAAA,QAAM,CAAC,GAAG,MACjC,KAAK,GAAG,aAAa,GAAG,GAAG,QAAQ,SAAS,CAAC;AAAA,MAC/C;AACA,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,KAAK,KAAK,GAAG;AACnB,aAAO,EAAE,GAAG,GAAG,WAAW,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,SAAS,GAAG,IAAI,EAAE;AAAA,IAC9E,UAAE;AACA,WAAK,MAAM,QAAQ,EAAE;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,MAAc,QAAiB,QAAoC;AACrF,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAY;AAAA,QAAQ,CAAC,KAAK,QAC7B,KAAK;AAAA,UAAY;AAAA,UAAQ,CAAC,KAAK,QAC7B,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,wBAAwB,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,eACE,MACA,QAAoB,CAAC,GACrB,UAA6B,CAAC,GAClB;AACZ,QAAI,KAAK,QAAQ,aAAa;AAC9B,QAAI,KAAK,QAAQ,cAAc;AAC/B,QAAI,QAAQ,UAAU;AACpB,YAAM,KAAK,KAAK,SAAS,QAAQ,QAAQ;AACzC,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,+BAA+B,QAAQ,QAAQ,GAAG;AAC3E,WAAK,GAAG;AACR,WAAK,GAAG;AAAA,IACV;AACA,UAAM,IAAI,QAAQ,UAAU;AAC5B,UAAM,KACJ,OAAO,MAAM,WACT,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,IACvC,EAAE,KAAK,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,UAAU,IAAI,MAAM,EAAE,QAAQ,GAAG;AAC3F,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,QAAQ,QAAQ,mBAAmB;AACzC,UAAM,OAAO,cAAc,KAAK;AAEhC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAW;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK;AAAA,UAAY,QAAQ;AAAA,UAAQ,CAAC,KAAK,QACrC,KAAK;AAAA,YAAY,QAAQ;AAAA,YAAQ,CAAC,KAAK,QACrC,KAAK;AAAA,cAAQ,CAAC,MACZ,KAAK,GAAG;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAA+B;AACpD,MAAI,OAAO;AACX,aAAW,KAAK,MAAO,SAAQ,IAAI,IAAI,OAAO,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,IAAI;AACnF,QAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,QAAM,KAAK,IAAI,SAAS,IAAI,MAAM;AAClC,MAAI,IAAI;AACR,KAAG,UAAU,GAAG,MAAM,QAAQ,IAAI;AAClC,OAAK;AACL,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,IAAI,OAAO,EAAE,MAAM;AAC/B,OAAG,UAAU,GAAG,IAAI,QAAQ,IAAI;AAChC,SAAK;AACL,QAAI,IAAI,KAAK,CAAC;AACd,SAAK,IAAI;AACT,OAAG,UAAU,GAAG,EAAE,QAAQ,IAAI;AAC9B,SAAK;AACL,QAAI,CAAC,IAAI,EAAE,SAAS,IAAI;AACxB,SAAK;AACL,OAAG,UAAU,GAAG,EAAE,IAAI,QAAQ,IAAI;AAClC,SAAK;AACL,QAAI,IAAI,EAAE,KAAK,CAAC;AAChB,SAAK,EAAE,IAAI;AAAA,EACb;AACA,SAAO;AACT;AA0JA,IAAM,MAAM,CAAC,QAAgB,MAAM;AAyBnC,SAAS,UAAU,IAAgB,CAAC,GAA6D;AAC/F,QAAM,YAAY,EAAE,WAAW,OAAO,IAAI;AAC1C,QAAM,YAAY,EAAE,UAAU,OAAO,IAAW,EAAE;AAClD,QAAM,QAAQ,EAAE,cAAc,OAAO,IAAI;AACzC,QAAM,QAAQ,EAAE,cAAc,OAAO,IAAI,EAAE;AAC3C,SAAO;AAAA,IACL,EAAE,YAAY;AAAA,IACd,IAAI,EAAE,SAAS,CAAQ;AAAA,IACvB,IAAI,SAAS;AAAA,IACb;AAAA,IACA,IAAI,KAAK;AAAA,IACT;AAAA,IACA,EAAE,eAAe;AAAA,EACnB;AACF;AAGO,IAAM,aAAN,MAAiB;AAAA,EACtB,YACmB,GACA,GACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAEX,KAAK;AACX,WAAO,KAAK,EAAE;AAAA,EAChB;AAAA,EAEA,QAAQ;AACN,SAAK,GAAG,EAAE,SAAS,KAAK,CAAC;AAAA,EAC3B;AAAA,EACA,YAAoB;AAClB,WAAO,KAAK,GAAG,EAAE,cAAc,KAAK,CAAC;AAAA,EACvC;AAAA,EACA,OAAmB;AACjB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,iBAA6B;AAC3B,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,mBAAmB,KAAK,GAAG,CAAC,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,SAAS,MAA6B;AACpC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,SAAS,MAAyB;AAChC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACxE;AAAA,EACA,eAAe,MAA0B;AACvC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,wBAAwB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EAC/E;AAAA,EACA,OAAO,OAAe,kBAAkB,MAAmB;AACzD,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MAChC,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,GAAG,GAAG,kBAAkB,IAAI,GAAG,CAAC,CAAC;AAAA,IACxF;AAAA,EACF;AAAA;AAAA,EAEA,IAAI,MAAc,QAAQ,GAAc;AACtC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EAC1E;AAAA,EACA,QAAQ,MAAc,QAAQ,GAAW;AACvC,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,YAAY,MAAc,OAAe,MAAuB;AAC9D,WACE,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM;AAAA,EAE9F;AAAA,EACA,cAAc,MAAc,OAAwB;AAClD,WAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EAC9D;AAAA,EACA,YAAY,MAAc,OAAe,IAAY,IAAqB;AACxE,WAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,OAAO,IAAI,EAAE,MAAM;AAAA,EACpE;AAAA,EACA,iBAAiB,MAAc,OAAwB;AACrD,WAAO,KAAK,GAAG,EAAE,qBAAqB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EACjE;AAAA;AAAA,EAEA,UAAU,MAAc,GAAW,GAAmB;AACpD,WAAO,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,MAAM,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MACA,GACA,GACA,GACA,GACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,SACE,MACA,IACA,IACA,IACA,IACA,SAAS,GACT,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAE9F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WACE,MACA,IACA,IACA,IACA,IACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WACE,MACA,QACA,QAAQ,MACR,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,GAAG,MAC1B,KAAK,GAAG,EAAE;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,IAAI;AAAA,QACZ,IAAI,UAAU,CAAC;AAAA,QACf,WAAW,OAAO,IAAI;AAAA,QACtB,IAAI,QAAQ,CAAC;AAAA,QACb,SAAS,OAAO,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACE,MACA,SACA,IACA,IACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAS,CAAC,GAAG,MAC3B,KAAK,GAAG,EAAE;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,UAAU,CAAC;AAAA,QACf,WAAW,OAAO,IAAI;AAAA,QACtB,IAAI,QAAQ,CAAC;AAAA,QACb,SAAS,OAAO,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SACE,MACA,MACA,GACA,GACA,GACA,GACA,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAW;AAAA,MAAM,CAAC,GAAG,MAC1B,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;AAAA,IAChE,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAc,KAAa,GAAW,GAAW,GAAW,GAAoB;AACrF,WACE,KAAK,EAAE,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EAE7F;AAAA;AAAA,EAEA,OACE,MACA,GACA,GACA,GACA,GACA,WAAW,GACX,WAAW,OACH;AACR,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,QAAQ,GAAG,WAAW,IAAI,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGA,WAAW,MAAc,SAA0B;AACjD,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,MAAM;AAAA,EAC7D;AAAA,EACA,WAAW,MAAuB;AAChC,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,IAAI,MAAM;AAAA,EACpD;AAAA,EACA,SAAS,MAAc,IAAqB;AAC1C,WAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,EAAE,MAAM;AAAA,EACtD;AAAA,EACA,YAAY,UAA+B;AACzC,WAAO,KAAK,EAAE,WAAW,UAAU,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EAC5F;AAAA;AAAA,EAEA,aAAa,OAA6B;AACxC,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IACnE;AAAA,EACF;AAAA;AAAA,EAEA,WAAW,MAAc,OAAe,QAAyB;AAC/D,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,EACnE;AAAA;AAAA,EAEA,QAAQ,OAAe,QAAgB,QAAQ,GAAW;AACxD,WAAO,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,OAAO,QAAQ,KAAK;AAAA,EAC3D;AAAA;AAAA,EAEA,SAAS,MAAsB;AAC7B,WAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,IAAI;AAAA,EAC5C;AAAA;AAAA,EAEA,SAAS,MAAwB;AAC/B,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,WAAW,MAAc,QAAQ,GAAe;AAC9C,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,UAAU,QAAgB,KAAyB;AACjD,UAAM,IAAI,IAAI,OAAO,MAAM;AAC3B,UAAM,SAAS,KAAK,EAAE,QAAQ,CAAC;AAC/B,UAAM,MAAM,KAAK,EAAE;AAAA,MAAW;AAAA,MAAK,CAAC,GAAG,MACrC,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,QAAQ,EAAE,QAAQ,GAAG,CAAC;AAAA,IACxD;AACA,SAAK,EAAE,MAAM,QAAQ,EAAE,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,QACE,MACA,GACA,GACA,MACA,MACA,SACA,MAAM,GACN,UAAU,GACV,cAAc,GACL;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,GAAG;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,MACA,GACA,GACA,MACA,MACA,MAAM,SACN,UAAU,MACV,cAAc,GACL;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,SAAS,WAAW;AAAA,IAC3F,MAAM;AAAA,EAEV;AAAA,EACA,cAAwB;AACtB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YACE,MACoE;AACpE,UAAM,MAAM,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACpC,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IAClE;AACA,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,UAAM,SAAS,IAAI,CAAC,MAAM,IAAI,aAAa,IAAI,CAAC,MAAM,IAAI,QAAQ;AAClE,WAAO,EAAE,QAAQ,OAAO,IAAI,SAAS,CAAC,EAAE;AAAA,EAC1C;AAAA;AAAA,EAGA,SAAiB;AACf,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,SAAiB;AACf,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA,EAEA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cACE,UACA,QACA,OAKI,CAAC,GACO;AACZ,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,WAAW,SAAS,QAAQ,IAAI,SAAS,WAAW,IAAI;AAC9D,UAAM,cAAc,KAAK,eAAe;AACxC,QAAI,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC;AAC1C,QAAI,aAAa,KAAK,IAAI,SAAS,IAAI;AACrC,YAAM,IAAK,WAAmC;AAC9C,UAAI,CAAC,GAAG,iBAAiB;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,QAAE,gBAAgB,KAAK;AACvB,YAAM;AAAA,IACR;AACA,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAU,CAAC,KAAK,QACrC,KAAK,EAAE;AAAA,QAAY,KAAK;AAAA,QAAe,CAAC,IAAI,OAC1C,KAAK,EAAE;AAAA,UAAS;AAAA,UAAQ,CAAC,KAAK,QAC5B,KAAK,EAAE;AAAA,YAAW;AAAA,YAAK,CAAC,IAAI,OAC1B,KAAK,EAAE;AAAA,cAAQ,CAAC,MACd,KAAK,GAAG,EAAE;AAAA,gBACR,KAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA,KAAK,QAAgB,QAAoB,UAAU,MAAkB;AACnE,UAAM,OAAO,KAAK,EAAE,QAAQ,MAAM;AAClC,UAAM,MAAM,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,IAAI,OACvC,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG,IAAI,IAAI,MAAM,OAAO,QAAQ,SAAS,CAAC,CAAC;AAAA,IAC1F;AACA,SAAK,EAAE,MAAM,MAAM,OAAO,MAAM;AAChC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,KAAqB;AAC/B,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAK,CAAC,GAAG,MAC9B,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA,EAEA,YAAY,KAAa,OAAwB;AAC/C,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAK,CAAC,IAAI,OACxB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACtF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YAAY,MAAgC;AAC1C,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,oBAAoB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EAC3E;AAAA,EACA,iBAAiB,MAAc,OAAwB;AACrD,WAAO,KAAK,GAAG,EAAE,qBAAqB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EACjE;AAAA,EACA,UACE,MACA,IACA,IACA,IACA,IACA,SAAwB,GACxB,OAAsB,MACtB,YAAY,GACH;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,IACF,MAAM;AAAA,EAEV;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,UAAmB;AAClG,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EAChF;AAAA,EACA,kBACE,MACA,IACA,IACA,IACA,IACA,MAAM,GACN,YAAY,GACH;AACT,WAAO,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,SAAS,MAAM;AAAA,EACtF;AAAA,EACA,YACE,MACA,IACA,IACA,IACA,IACA,MACA,WAAW,IACX,MAAM,GACG;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,UAAU,IAAI,GAAG,CAAC;AAAA,IACnF,MAAM;AAAA,EAEV;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,GAAY;AAC3F,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EAChF;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,GAAY;AAC3F,WAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBACE,MACA,SACA,OACA,KACA,SACA,OAA2E,CAAC,GACnE;AACT,UAAM,MACJ,YAAY,cACR,cACA,YAAY,cACV,cACA,YAAY,cACV,cACA;AACV,UAAM,SAAS;AAAA,MACb;AAAA,MACA,KAAK,YAAY;AAAA,MACjB,KAAK,UAAU;AAAA,MACf,KAAK,MAAM;AAAA,MACX,KAAK,QAAQ;AAAA,IACf,EAAE,KAAK,GAAG;AACV,UAAM,OAAO,MAAM,KAAK;AACxB,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,IAAI,OAC3B,KAAK,EAAE;AAAA,QAAS;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK,GAAG,EAAE,yBAAyB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,OAAO;AAAA,MACpF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YACE,MACA,MACA,KACA,OAA2E,CAAC,GAC5E,OAAO,QACP,OAAO,OACE;AACT,UAAM,SAAS;AAAA,MACb,KAAK,YAAY;AAAA,MACjB,KAAK,UAAU;AAAA,MACf,KAAK,MAAM;AAAA,MACX,KAAK,QAAQ;AAAA,IACf,EAAE,KAAK,GAAG;AACV,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,IAAI,OAC3B,KAAK,EAAE;AAAA,QAAS;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK,GAAG,EAAE;AAAA,UACR,KAAK;AAAA,UACL;AAAA,UACA,KAAK,CAAC;AAAA,UACN,KAAK,CAAC;AAAA,UACN,KAAK,CAAC;AAAA,UACN,KAAK,CAAC;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,IAAI;AAAA,UACX,IAAI,GAAG;AAAA,QACT;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAEA,OAAO,MAAc,QAAkB,MAAM,GAAG,YAAY,GAAY;AACtE,WACE,KAAK,EAAE,SAAS,QAAQ,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,SAAS,CAAC,MAC/F;AAAA,EAEJ;AAAA,EACA,SACE,MACA,IACA,IACA,IACA,IACA,OACA,MAAM,UACG;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MACzB,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,IACrE,MAAM;AAAA,EAEV;AAAA,EACA,mBAAmB,MAAsB;AACvC,WAAO,KAAK,GAAG,EAAE,uBAAuB,KAAK,GAAG,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAsB;AACpB,WAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,MAA0B;AAC9B,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACrE;AAAA,EACA,WAAW,MAAc,IAAY,IAAY,IAAY,IAAY,KAAsB;AAC7F,WACE,KAAK,EAAE,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,MAC5F;AAAA,EAEJ;AAAA,EACA,YACE,MACA,IACA,IACA,IACA,IACA,YACS;AACT,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,UAAU,MAAM;AAAA,EAClF;AAAA;AAAA,EAGA,SAAsB;AACpB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,CAAC,CAAC;AAAA,EAChE;AAAA;AAAA,EAEA,SAAS,MAAsB;AAC7B,WAAO,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,GAAG,CAAC,CAAC;AAAA,EAC7E;AAAA,EACA,mBAAmB,IAAY,SAA2B;AACxD,WAAO,KAAK,GAAG,EAAE,wBAAwB,KAAK,GAAG,IAAI,UAAU,IAAI,CAAC,MAAM;AAAA,EAC5E;AAAA,EACA,eAAe,IAAY,QAA0B;AACnD,WAAO,KAAK,GAAG,EAAE,oBAAoB,KAAK,GAAG,IAAI,SAAS,IAAI,CAAC,MAAM;AAAA,EACvE;AAAA,EACA,YAAY,IAAqB;AAC/B,WAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,EAAE,MAAM;AAAA,EACnD;AAAA;AAAA,EAGA,UAA0B;AACxB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA,EAEA,WAAW,SAAkC;AAC3C,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,IAAK,EAAE,QAAQ,CAAC,IAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACnF,WAAO,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EACrF;AAAA;AAAA,EAGA,SAAsB;AACpB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,CAAC,CAAC;AAAA,EAChE;AAAA,EACA,aAAa,MAAc,OAAwB;AACjD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACxF,MAAM;AAAA,EAEV;AAAA,EACA,YAAY,MAAc,SAA2B;AACnD,WACE,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,GAAG,UAAU,IAAI,CAAC,CAAC,MAAM;AAAA,EAElG;AAAA,EACA,SAAS,MAAc,OAAwB;AAC7C,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACnF,MAAM;AAAA,EAEV;AAAA;AAAA,EAEA,UAAU,MAAc,QAA2B;AACjD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,KAAK,IAAI,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IAChG,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aACE,MACA,MACA,MACA,QAAQ,IACR,OAAyF,CAAC,GACjF;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS;AAAA,QAAO,CAAC,IAAI,OAC1B,KAAK,GAAG,EAAE;AAAA,UACR,KAAK;AAAA,UAAG;AAAA,UAAM;AAAA,UAAI;AAAA,UAAI,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG;AAAA,UAAI;AAAA,UAC9D,KAAK,UAAU;AAAA,UAAI,KAAK,YAAY,IAAI;AAAA,UAAG,KAAK,WAAW,IAAI;AAAA,UAAG,GAAG;AAAA,QACvE;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YACE,MACA,MACA,MACA,UAAU,OACV,OAAgD,CAAC,GACxC;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,KAAK,UAAU;AAAA,QAAM,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,UACR,KAAK;AAAA,UAAG;AAAA,UAAM;AAAA,UAAI;AAAA,UAAI,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,UAAU,IAAI;AAAA,UAAG;AAAA,UAAI;AAAA,UAAI,GAAG;AAAA,QACxF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,MACA,MACA,SACA,OAAkD,CAAC,GAC1C;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,UAAMA,WAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI;AACtD,UAAM,QAAQ,QAAQ,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG;AACrD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAASA;AAAA,QAAS,CAAC,IAAI,OAC5B,KAAK,EAAE;AAAA,UAAS;AAAA,UAAO,CAAC,IAAI,OAC1B,KAAK,EAAE;AAAA,YAAS,KAAK,YAAY;AAAA,YAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE,mBAAmB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YACE,MACA,MACA,MACA,SACA,OAAsE,CAAC,GAC9D;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,QAAQ,KAAK,IAAI;AAAA,QAAG,CAAC,IAAI,OACvC,KAAK,EAAE;AAAA,UAAS,KAAK,YAAY;AAAA,UAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,YACR,KAAK;AAAA,YAAG;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG;AAAA,YAAI;AAAA,YAAI;AAAA,YAAI;AAAA,YACtE,KAAK,WAAW,IAAI;AAAA,YAAG,GAAG;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,WACE,MACA,MACA,MACA,SACA,OAAmE,CAAC,GAC3D;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,QAAQ,KAAK,IAAI;AAAA,QAAG,CAAC,IAAI,OACvC,KAAK,EAAE;AAAA,UAAS,KAAK,YAAY;AAAA,UAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,YACR,KAAK;AAAA,YAAG;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG;AAAA,YAAI;AAAA,YAAI;AAAA,YAAI;AAAA,YACtE,KAAK,QAAQ,IAAI;AAAA,YAAG,GAAG;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AACF;","names":["exports"]}
package/dist/index.d.cts CHANGED
@@ -370,7 +370,7 @@ declare class GigaPdfDoc {
370
370
  pageInfo(page: number): PageInfo;
371
371
  renderPage(page: number, scale?: number): Uint8Array;
372
372
  embedFont(family: string, ttf: Uint8Array): number;
373
- addText(page: number, x: number, y: number, size: number, text: string, fontObj: number, rgb?: number): boolean;
373
+ addText(page: number, x: number, y: number, size: number, text: string, fontObj: number, rgb?: number, opacity?: number, rotationDeg?: number): boolean;
374
374
  /**
375
375
  * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at
376
376
  * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,
@@ -378,6 +378,17 @@ declare class GigaPdfDoc {
378
378
  */
379
379
  addWatermark(page: number, x: number, y: number, size: number, text: string, rgb?: number, opacity?: number, rotationDeg?: number): boolean;
380
380
  neededFonts(): string[];
381
+ /**
382
+ * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host
383
+ * editor can re-embed the document's own font when re-baking edited text and
384
+ * keep the original glyphs. Returns the raw decoded bytes and the program
385
+ * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),
386
+ * or `null` when nothing embedded matches.
387
+ */
388
+ extractFont(name: string): {
389
+ format: "truetype" | "cff" | "type1";
390
+ bytes: Uint8Array;
391
+ } | null;
381
392
  toText(): string;
382
393
  toHtml(): string;
383
394
  toDocx(): Uint8Array;
@@ -415,10 +426,41 @@ declare class GigaPdfDoc {
415
426
  addFreeText(page: number, x0: number, y0: number, x1: number, y1: number, text: string, fontSize?: number, rgb?: number): boolean;
416
427
  addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb?: number): boolean;
417
428
  addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb?: number): boolean;
429
+ /**
430
+ * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |
431
+ * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF
432
+ * user space, bottom-left origin — multi-quad covers wrapped text), with full
433
+ * reviewer metadata. `date` is a PDF date string (e.g. `"D:20260616T…Z"`) — the
434
+ * engine has no clock, so the host supplies it.
435
+ */
436
+ addMarkupAnnotation(page: number, subtype: "highlight" | "underline" | "strikeout" | "squiggly", quads: Array<[number, number, number, number]>, rgb: number, opacity: number, meta?: {
437
+ contents?: string;
438
+ author?: string;
439
+ id?: string;
440
+ date?: string;
441
+ }): boolean;
442
+ /**
443
+ * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)
444
+ * that opens a popup with `meta.contents`. `icon` is the named icon (`"Note"`,
445
+ * `"Comment"`, …); `open` sets the initial popup state.
446
+ */
447
+ addTextNote(page: number, rect: [number, number, number, number], rgb: number, meta?: {
448
+ contents?: string;
449
+ author?: string;
450
+ id?: string;
451
+ date?: string;
452
+ }, icon?: string, open?: boolean): boolean;
418
453
  /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */
419
454
  addInk(page: number, points: number[], rgb?: number, lineWidth?: number): boolean;
420
455
  addStamp(page: number, x0: number, y0: number, x1: number, y1: number, label: string, rgb?: number): boolean;
421
456
  flattenAnnotations(page: number): number;
457
+ /**
458
+ * Flatten the interactive form: bake every field widget across all pages into
459
+ * the page content and drop `/AcroForm`, so the document is no longer
460
+ * fillable and {@link fields} returns empty afterwards. Returns the number of
461
+ * widgets baked (0 when there is no form).
462
+ */
463
+ flattenForm(): number;
422
464
  links(page: number): LinkInfo[];
423
465
  addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean;
424
466
  addGotoLink(page: number, x0: number, y0: number, x1: number, y1: number, targetPage: number): boolean;
package/dist/index.d.ts CHANGED
@@ -370,7 +370,7 @@ declare class GigaPdfDoc {
370
370
  pageInfo(page: number): PageInfo;
371
371
  renderPage(page: number, scale?: number): Uint8Array;
372
372
  embedFont(family: string, ttf: Uint8Array): number;
373
- addText(page: number, x: number, y: number, size: number, text: string, fontObj: number, rgb?: number): boolean;
373
+ addText(page: number, x: number, y: number, size: number, text: string, fontObj: number, rgb?: number, opacity?: number, rotationDeg?: number): boolean;
374
374
  /**
375
375
  * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at
376
376
  * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,
@@ -378,6 +378,17 @@ declare class GigaPdfDoc {
378
378
  */
379
379
  addWatermark(page: number, x: number, y: number, size: number, text: string, rgb?: number, opacity?: number, rotationDeg?: number): boolean;
380
380
  neededFonts(): string[];
381
+ /**
382
+ * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host
383
+ * editor can re-embed the document's own font when re-baking edited text and
384
+ * keep the original glyphs. Returns the raw decoded bytes and the program
385
+ * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),
386
+ * or `null` when nothing embedded matches.
387
+ */
388
+ extractFont(name: string): {
389
+ format: "truetype" | "cff" | "type1";
390
+ bytes: Uint8Array;
391
+ } | null;
381
392
  toText(): string;
382
393
  toHtml(): string;
383
394
  toDocx(): Uint8Array;
@@ -415,10 +426,41 @@ declare class GigaPdfDoc {
415
426
  addFreeText(page: number, x0: number, y0: number, x1: number, y1: number, text: string, fontSize?: number, rgb?: number): boolean;
416
427
  addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb?: number): boolean;
417
428
  addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb?: number): boolean;
429
+ /**
430
+ * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |
431
+ * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF
432
+ * user space, bottom-left origin — multi-quad covers wrapped text), with full
433
+ * reviewer metadata. `date` is a PDF date string (e.g. `"D:20260616T…Z"`) — the
434
+ * engine has no clock, so the host supplies it.
435
+ */
436
+ addMarkupAnnotation(page: number, subtype: "highlight" | "underline" | "strikeout" | "squiggly", quads: Array<[number, number, number, number]>, rgb: number, opacity: number, meta?: {
437
+ contents?: string;
438
+ author?: string;
439
+ id?: string;
440
+ date?: string;
441
+ }): boolean;
442
+ /**
443
+ * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)
444
+ * that opens a popup with `meta.contents`. `icon` is the named icon (`"Note"`,
445
+ * `"Comment"`, …); `open` sets the initial popup state.
446
+ */
447
+ addTextNote(page: number, rect: [number, number, number, number], rgb: number, meta?: {
448
+ contents?: string;
449
+ author?: string;
450
+ id?: string;
451
+ date?: string;
452
+ }, icon?: string, open?: boolean): boolean;
418
453
  /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */
419
454
  addInk(page: number, points: number[], rgb?: number, lineWidth?: number): boolean;
420
455
  addStamp(page: number, x0: number, y0: number, x1: number, y1: number, label: string, rgb?: number): boolean;
421
456
  flattenAnnotations(page: number): number;
457
+ /**
458
+ * Flatten the interactive form: bake every field widget across all pages into
459
+ * the page content and drop `/AcroForm`, so the document is no longer
460
+ * fillable and {@link fields} returns empty afterwards. Returns the number of
461
+ * widgets baked (0 when there is no form).
462
+ */
463
+ flattenForm(): number;
422
464
  links(page: number): LinkInfo[];
423
465
  addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean;
424
466
  addGotoLink(page: number, x0: number, y0: number, x1: number, y1: number, targetPage: number): boolean;
package/dist/index.js CHANGED
@@ -602,10 +602,22 @@ var GigaPdfDoc = class {
602
602
  this.g._free(famPtr, b.length);
603
603
  return obj;
604
604
  }
605
- addText(page, x, y, size, text, fontObj, rgb = 0) {
605
+ addText(page, x, y, size, text, fontObj, rgb = 0, opacity = 1, rotationDeg = 0) {
606
606
  return this.g._withStr(
607
607
  text,
608
- (p, l) => this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))
608
+ (p, l) => this.ex().gp_add_text(
609
+ this.h,
610
+ page,
611
+ x,
612
+ y,
613
+ size,
614
+ p,
615
+ l,
616
+ fontObj,
617
+ RGB(rgb),
618
+ opacity,
619
+ rotationDeg
620
+ )
609
621
  ) === 0;
610
622
  }
611
623
  /**
@@ -622,6 +634,22 @@ var GigaPdfDoc = class {
622
634
  neededFonts() {
623
635
  return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));
624
636
  }
637
+ /**
638
+ * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host
639
+ * editor can re-embed the document's own font when re-baking edited text and
640
+ * keep the original glyphs. Returns the raw decoded bytes and the program
641
+ * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),
642
+ * or `null` when nothing embedded matches.
643
+ */
644
+ extractFont(name) {
645
+ const buf = this.g._withStr(
646
+ name,
647
+ (p, l) => this.g._buffer((o) => this.ex().gp_extract_font(this.h, p, l, o))
648
+ );
649
+ if (buf.length === 0) return null;
650
+ const format = buf[0] === 1 ? "truetype" : buf[0] === 2 ? "cff" : "type1";
651
+ return { format, bytes: buf.subarray(1) };
652
+ }
625
653
  // convert PDF → X
626
654
  toText() {
627
655
  return this.g._str((o) => this.ex().gp_to_text(this.h, o));
@@ -771,6 +799,64 @@ var GigaPdfDoc = class {
771
799
  addStrikeOut(page, x0, y0, x1, y1, rgb = 0) {
772
800
  return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;
773
801
  }
802
+ /**
803
+ * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |
804
+ * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF
805
+ * user space, bottom-left origin — multi-quad covers wrapped text), with full
806
+ * reviewer metadata. `date` is a PDF date string (e.g. `"D:20260616T…Z"`) — the
807
+ * engine has no clock, so the host supplies it.
808
+ */
809
+ addMarkupAnnotation(page, subtype, quads, rgb, opacity, meta = {}) {
810
+ const sub = subtype === "highlight" ? "Highlight" : subtype === "underline" ? "Underline" : subtype === "strikeout" ? "StrikeOut" : "Squiggly";
811
+ const packed = [
812
+ sub,
813
+ meta.contents ?? "",
814
+ meta.author ?? "",
815
+ meta.id ?? "",
816
+ meta.date ?? ""
817
+ ].join("");
818
+ const flat = quads.flat();
819
+ return this.g._withStr(
820
+ packed,
821
+ (mp, ml) => this.g._withF64(
822
+ flat,
823
+ (qp, qc) => this.ex().gp_add_markup_annotation(this.h, page, mp, ml, qp, qc, RGB(rgb), opacity)
824
+ )
825
+ ) === 0;
826
+ }
827
+ /**
828
+ * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)
829
+ * that opens a popup with `meta.contents`. `icon` is the named icon (`"Note"`,
830
+ * `"Comment"`, …); `open` sets the initial popup state.
831
+ */
832
+ addTextNote(page, rect, rgb, meta = {}, icon = "Note", open = false) {
833
+ const packed = [
834
+ meta.contents ?? "",
835
+ meta.author ?? "",
836
+ meta.id ?? "",
837
+ meta.date ?? ""
838
+ ].join("");
839
+ return this.g._withStr(
840
+ packed,
841
+ (mp, ml) => this.g._withStr(
842
+ icon,
843
+ (ip, il) => this.ex().gp_add_text_note(
844
+ this.h,
845
+ page,
846
+ rect[0],
847
+ rect[1],
848
+ rect[2],
849
+ rect[3],
850
+ mp,
851
+ ml,
852
+ ip,
853
+ il,
854
+ open ? 1 : 0,
855
+ RGB(rgb)
856
+ )
857
+ )
858
+ ) === 0;
859
+ }
774
860
  /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */
775
861
  addInk(page, points, rgb = 0, lineWidth = 1) {
776
862
  return this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) === 0;
@@ -784,6 +870,15 @@ var GigaPdfDoc = class {
784
870
  flattenAnnotations(page) {
785
871
  return this.ex().gp_flatten_annotations(this.h, page);
786
872
  }
873
+ /**
874
+ * Flatten the interactive form: bake every field widget across all pages into
875
+ * the page content and drop `/AcroForm`, so the document is no longer
876
+ * fillable and {@link fields} returns empty afterwards. Returns the number of
877
+ * widgets baked (0 when there is no form).
878
+ */
879
+ flattenForm() {
880
+ return this.ex().gp_flatten_form(this.h);
881
+ }
787
882
  // hyperlinks
788
883
  links(page) {
789
884
  return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @qrcommunication/gigapdf-lib — TypeScript SDK for the zero-dependency Rust→WASM\n * PDF engine (gigapdf-lib). Wraps the flat `extern \"C\"` `gp_*` ABI behind a typed,\n * ergonomic class. No third-party runtime deps; the `.wasm` is self-contained.\n *\n * Usage:\n * const giga = await GigaPdfEngine.load(wasmBytesOrUrl);\n * const doc = giga.open(pdfBytes);\n * const docx = doc.toDocx();\n * const png = doc.renderPage(1, 2);\n * doc.close();\n */\n\n// FFI boundary: the wasm exports are an untyped table of `gp_*` functions\n// (numbers in, numbers out) plus `memory`. `any` here is the documented FFI\n// exception — every public method below re-imposes precise types.\ntype Exports = {\n memory: WebAssembly.Memory;\n gp_alloc(len: number): number;\n gp_free(ptr: number, len: number): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n};\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** Loaded engine module. Create documents with {@link open} / {@link openEncrypted}. */\nexport class GigaPdfEngine {\n private constructor(private readonly ex: Exports) {}\n\n /** Instantiate from raw wasm bytes, a URL/path, or a Response. */\n static async load(source: ArrayBuffer | Uint8Array | string | Response): Promise<GigaPdfEngine> {\n let bytes: ArrayBuffer | Uint8Array;\n if (typeof source === \"string\") {\n const res = await fetch(source);\n bytes = await res.arrayBuffer();\n } else if (source instanceof Response) {\n bytes = await source.arrayBuffer();\n } else {\n bytes = source;\n }\n const { instance } = await WebAssembly.instantiate(\n bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,\n {}\n );\n return new GigaPdfEngine(instance.exports as Exports);\n }\n\n /**\n * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped\n * inside this package (resolved relative to the built module). In the browser,\n * pass a URL or bytes to {@link load} instead.\n *\n * In Next.js `output: \"standalone\"`, add the asset to `outputFileTracingIncludes`\n * for the consuming route so the `.wasm` is copied into the standalone bundle.\n */\n static async loadDefault(): Promise<GigaPdfEngine> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const wasmPath = fileURLToPath(new URL(\"../gigapdf.wasm\", import.meta.url));\n return GigaPdfEngine.load(await readFile(wasmPath));\n }\n\n // ── linear-memory ABI helpers (internal) ─────────────────────────────────\n private u8() {\n return new Uint8Array(this.ex.memory.buffer);\n }\n private dv() {\n return new DataView(this.ex.memory.buffer);\n }\n /** Copy host bytes into wasm memory; returns the pointer (caller frees). */\n _toWasm(bytes: Uint8Array): number {\n const ptr = this.ex.gp_alloc(bytes.length);\n this.u8().set(bytes, ptr);\n return ptr;\n }\n _free(ptr: number, len: number) {\n this.ex.gp_free(ptr, len);\n }\n /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */\n _buffer(call: (outLenPtr: number) => number): Uint8Array {\n const lenPtr = this.ex.gp_alloc(4);\n const dataPtr = call(lenPtr);\n if (dataPtr === 0) {\n this.ex.gp_free(lenPtr, 4);\n return new Uint8Array(0);\n }\n const len = this.dv().getUint32(lenPtr, true);\n const out = this.u8().slice(dataPtr, dataPtr + len);\n this.ex.gp_free(dataPtr, len);\n this.ex.gp_free(lenPtr, 4);\n return out;\n }\n _str(call: (outLenPtr: number) => number): string {\n return dec.decode(this._buffer(call));\n }\n _json<T = unknown>(call: (outLenPtr: number) => number): T {\n const s = this._str(call);\n return (s ? JSON.parse(s) : []) as T;\n }\n /** Pass a string argument; runs `fn(ptr, len)` then frees. */\n _withStr<T>(s: string, fn: (ptr: number, len: number) => T): T {\n const b = enc.encode(s);\n const ptr = this._toWasm(b);\n try {\n return fn(ptr, b.length);\n } finally {\n this._free(ptr, b.length);\n }\n }\n /** Pass an optional string; an absent/empty value runs `fn(0, 0)` (no alloc). */\n _withOptStr<T>(s: string | undefined, fn: (ptr: number, len: number) => T): T {\n return s ? this._withStr(s, fn) : fn(0, 0);\n }\n /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */\n _withBytes<T>(bytes: Uint8Array, fn: (ptr: number, len: number) => T): T {\n const ptr = this._toWasm(bytes);\n try {\n return fn(ptr, bytes.length);\n } finally {\n this._free(ptr, bytes.length);\n }\n }\n /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */\n _withU32<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 4);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 4);\n }\n }\n /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */\n _withF64<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 8);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 8);\n }\n }\n get raw(): Exports {\n return this.ex;\n }\n\n // ── documents ─────────────────────────────────────────────────────────────\n /** Open a PDF. Throws if it can't be parsed. */\n open(pdf: Uint8Array): GigaPdfDoc {\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));\n if (handle === 0) throw new Error(\"gigapdf: failed to open PDF\");\n return new GigaPdfDoc(this, handle);\n }\n /** Open an encrypted PDF with a password. Returns null if the password is wrong. */\n openEncrypted(pdf: Uint8Array, password: string): GigaPdfDoc | null {\n const b = enc.encode(password);\n const pwPtr = this._toWasm(b);\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));\n this._free(pwPtr, b.length);\n return handle === 0 ? null : new GigaPdfDoc(this, handle);\n }\n\n /**\n * Inspect a PDF's encryption **without decrypting it** (no password needed):\n * whether it has an `/Encrypt` dictionary, plus its `/P` permission bitmask\n * and handler version/revision (`0` when not encrypted).\n */\n encryptionInfo(pdf: Uint8Array): {\n encrypted: boolean;\n permissions: number;\n version: number;\n revision: number;\n } {\n const json = this._withBytes(pdf, (p, l) =>\n this._buffer((o) => this.ex.gp_encryption_info(p, l, o))\n );\n return JSON.parse(dec.decode(json));\n }\n\n /**\n * Width of `text` set in standard Helvetica at `size` points (AFM metrics) —\n * place watermark/header text without embedding a font.\n */\n helveticaWidth(size: number, text: string): number {\n return this._withStr(text, (p, l) => this.ex.gp_helvetica_width(p, l, size));\n }\n\n // ── stateless <format> → PDF conversions ───────────────────────────────────\n txtToPdf(text: string): Uint8Array {\n return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));\n }\n htmlToPdf(html: string): Uint8Array {\n return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));\n }\n rtfToPdf(rtf: string): Uint8Array {\n return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));\n }\n /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */\n officeToPdf(office: Uint8Array): Uint8Array {\n return this._withBytes(office, (p, l) =>\n this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))\n );\n }\n\n // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────\n fontCatalog(): FontInfo[] {\n return this._json((o) => this.ex.gp_font_catalog_json(o));\n }\n /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */\n fontRequestUrl(family: string, weight = 400, italic = false): string {\n return this._withStr(family, (p, l) =>\n this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))\n );\n }\n /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */\n parseCssFontUrl(css: string): string {\n return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));\n }\n\n // ── JavaScript engine (no headless browser) ────────────────────────────────\n /**\n * Evaluate a JavaScript snippet with the built-in engine and return the\n * result value as a string (or `Uncaught …` / `SyntaxError: …`).\n */\n evalJs(src: string): string {\n return this._withStr(src, (p, l) => this._str((o) => this.ex.gp_js_eval(p, l, o)));\n }\n /**\n * Run a document's inline `<script>`s and return the resulting HTML. The\n * `htmlRender`/`htmlNeededFonts` paths already do this automatically; use this\n * only when you want the post-script HTML on its own.\n */\n runInlineScripts(html: string): string {\n return this._withStr(html, (p, l) =>\n this._str((o) => this.ex.gp_run_inline_scripts(p, l, o))\n );\n }\n\n // ── HTML rendering engine (replaces a headless browser for HTML→PDF) ───────\n /**\n * Phase 1 — the Google fonts the document references. Download each `url`\n * (→ TTF) and pass the bytes back to {@link htmlRender} for an identical render.\n */\n htmlNeededFonts(html: string): HtmlFontRequest[] {\n return this._withStr(html, (p, l) =>\n this._json((o) => this.ex.gp_html_needed_fonts(p, l, o))\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 — render HTML + CSS to PDF, with the supplied fonts embedded (real\n * Google fonts, real metrics → identical or nearest match). Block, inline and\n * table layout with pagination. Page size and margin are in points\n * (US-Letter portrait, 0.5in margins by default). JavaScript is not executed.\n */\n htmlRender(\n html: string,\n fonts: HtmlFont[] = [],\n pageWidth = 612,\n pageHeight = 792,\n margin = 36\n ): Uint8Array {\n const blob = packHtmlFonts(fonts);\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._buffer((o) => this.ex.gp_html_render(hp, hl, fp, fl, pageWidth, pageHeight, margin, o))\n )\n );\n }\n\n /**\n * Resolve a named paper size — `\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, `\"legal\"`,\n * `\"tabloid\"`, `\"b5\"`, … — to `{ w, h }` in points (portrait unless the name\n * has a `-landscape` suffix). Returns `null` for an unknown name.\n */\n pageSize(name: string): { w: number; h: number } | null {\n const outPtr = this.ex.gp_alloc(16);\n try {\n const ok = this._withStr(name, (p, l) =>\n this.ex.gp_page_size(p, l, outPtr, outPtr + 8)\n );\n if (!ok) return null;\n const dv = this.dv();\n return { w: dv.getFloat64(outPtr, true), h: dv.getFloat64(outPtr + 8, true) };\n } finally {\n this._free(outPtr, 16);\n }\n }\n\n /**\n * Phase 1 variant that also scans the running `header`/`footer` HTML, so the\n * Google fonts they reference are requested alongside the body's.\n */\n htmlNeededFontsWith(html: string, header?: string, footer?: string): HtmlFontRequest[] {\n return this._withStr(html, (hp, hl) =>\n this._withOptStr(header, (hdp, hdl) =>\n this._withOptStr(footer, (ftp, ftl) =>\n this._json((o) => this.ex.gp_html_needed_fonts_ex(hp, hl, hdp, hdl, ftp, ftl, o))\n )\n )\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 with full page control: named/explicit size, per-side margins, and a\n * running header/footer painted in the page margins. `{{page}}` and `{{pages}}`\n * in the header/footer are replaced with the current / total page number.\n *\n * ```ts\n * const fonts = await fetchFonts(giga.htmlNeededFontsWith(html, header, footer));\n * const pdf = giga.htmlRenderWith(html, fonts, {\n * pageSize: \"A4\",\n * margin: { top: 72, bottom: 72, left: 54, right: 54 },\n * header: `<div style=\"text-align:center\">My Report</div>`,\n * footer: `<div style=\"text-align:center\">Page {{page}} / {{pages}}</div>`,\n * });\n * ```\n */\n htmlRenderWith(\n html: string,\n fonts: HtmlFont[] = [],\n options: HtmlRenderOptions = {}\n ): Uint8Array {\n let pw = options.pageWidth ?? 612;\n let ph = options.pageHeight ?? 792;\n if (options.pageSize) {\n const sz = this.pageSize(options.pageSize);\n if (!sz) throw new Error(`gigapdf: unknown page size \"${options.pageSize}\"`);\n pw = sz.w;\n ph = sz.h;\n }\n const m = options.margin ?? 36;\n const mg =\n typeof m === \"number\"\n ? { top: m, right: m, bottom: m, left: m }\n : { top: m.top ?? 36, right: m.right ?? 36, bottom: m.bottom ?? 36, left: m.left ?? 36 };\n const headerOffset = options.headerOffset ?? 18;\n const footerOffset = options.footerOffset ?? 18;\n const start = options.startPageNumber ?? 1;\n const blob = packHtmlFonts(fonts);\n\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._withOptStr(options.header, (hdp, hdl) =>\n this._withOptStr(options.footer, (ftp, ftl) =>\n this._buffer((o) =>\n this.ex.gp_html_render_opts(\n hp,\n hl,\n fp,\n fl,\n pw,\n ph,\n mg.top,\n mg.right,\n mg.bottom,\n mg.left,\n hdp,\n hdl,\n ftp,\n ftl,\n headerOffset,\n footerOffset,\n start,\n o\n )\n )\n )\n )\n )\n );\n }\n}\n\n/** Pack `HtmlFont[]` into the little-endian blob `gp_html_render` expects. */\nfunction packHtmlFonts(fonts: HtmlFont[]): Uint8Array {\n let size = 4;\n for (const f of fonts) size += 4 + enc.encode(f.family).length + 2 + 1 + 4 + f.ttf.length;\n const buf = new Uint8Array(size);\n const dv = new DataView(buf.buffer);\n let o = 0;\n dv.setUint32(o, fonts.length, true);\n o += 4;\n for (const f of fonts) {\n const fam = enc.encode(f.family);\n dv.setUint32(o, fam.length, true);\n o += 4;\n buf.set(fam, o);\n o += fam.length;\n dv.setUint16(o, f.weight, true);\n o += 2;\n buf[o] = f.italic ? 1 : 0;\n o += 1;\n dv.setUint32(o, f.ttf.length, true);\n o += 4;\n buf.set(f.ttf, o);\n o += f.ttf.length;\n }\n return buf;\n}\n\n/** A Google font the HTML engine needs (resolved from the catalogue). */\nexport interface HtmlFontRequest {\n family: string;\n weight: number;\n italic: boolean;\n /** Google Fonts CSS URL — the host fetches it to obtain the TTF. */\n url: string;\n}\n\n/** A downloaded font handed to {@link GigaPdfEngine.htmlRender}. */\nexport interface HtmlFont {\n family: string;\n weight: number;\n italic: boolean;\n ttf: Uint8Array;\n}\n\n/** Per-side page margins in points; omitted sides default to 36pt. */\nexport interface HtmlMargins {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/** Page setup for {@link GigaPdfEngine.htmlRenderWith}. */\nexport interface HtmlRenderOptions {\n /** Named paper size (`\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, …) — wins over width/height. */\n pageSize?: string;\n /** Explicit page width in points (default 612 = US Letter). Ignored if `pageSize` is set. */\n pageWidth?: number;\n /** Explicit page height in points (default 792). Ignored if `pageSize` is set. */\n pageHeight?: number;\n /** Uniform margin (points) or per-side margins. Default 36pt (0.5in). */\n margin?: number | HtmlMargins;\n /** Running header HTML painted in the top margin (`{{page}}` / `{{pages}}` tokens). */\n header?: string;\n /** Running footer HTML painted in the bottom margin (same tokens). */\n footer?: string;\n /** Distance from the top edge to the header block, in points (default 18). */\n headerOffset?: number;\n /** Distance from the bottom edge to the footer block, in points (default 18). */\n footerOffset?: number;\n /** Number assigned to the first page for `{{page}}` (default 1). */\n startPageNumber?: number;\n}\n\nexport interface FontInfo {\n family: string;\n category: string;\n google: boolean;\n weights: number[];\n}\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\nexport interface Element extends Partial<Box> {\n index: number;\n kind: \"text\" | \"image\" | \"shape\";\n label: string;\n}\nexport interface TextLine extends Box {\n text: string;\n}\nexport interface SearchHit extends Box {\n page: number;\n text: string;\n}\nexport interface OcrWord extends Box {\n text: string;\n}\nexport interface TextRunInfo {\n index: number;\n operator: string;\n text: string;\n}\n/** A markup annotation (rect corners in PDF user space). */\nexport interface AnnotationInfo {\n index: number;\n subtype: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n contents: string;\n}\n/** A hyperlink annotation; `kind` discriminates the target. */\nexport interface LinkInfo {\n index: number;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n kind: \"uri\" | \"page\" | \"unknown\";\n uri?: string;\n page?: number;\n}\nexport type FieldKind =\n | \"text\"\n | \"checkbox\"\n | \"radio\"\n | \"pushbutton\"\n | \"combo\"\n | \"list\"\n | \"signature\"\n | \"unknown\";\n/** An AcroForm field with its flags and (for choices) options. */\nexport interface FieldInfo {\n name: string;\n type: string;\n kind: FieldKind;\n flags: number;\n readOnly: boolean;\n required: boolean;\n multiline: boolean;\n fillable: boolean;\n maxLen?: number;\n /** 1-based page the widget sits on (from its `/P`); absent if it has no widget. */\n page?: number;\n /**\n * Widget rectangle `[x, y, width, height]` in points, **top-left origin**\n * (already Y-flipped from the PDF's bottom-left `/Rect` for direct host use).\n * Absent when the field carries no `/Rect`.\n */\n bounds?: [number, number, number, number];\n value: string;\n options: string[];\n}\n/** One outline (bookmark) entry; `level` is the nesting depth (0 = top). */\nexport interface OutlineEntry {\n level: number;\n title: string;\n page?: number;\n}\n/** An optional-content layer (calque): toggle `visible`/`locked` to persist in the PDF. */\nexport interface LayerInfo {\n id: number;\n name: string;\n visible: boolean;\n locked: boolean;\n order: number;\n}\n/** A page's geometry: size in points and `/Rotate` (0/90/180/270). */\nexport interface PageInfo {\n width: number;\n height: number;\n rotation: number;\n}\n\nconst RGB = (rgb: number) => rgb & 0xffffff;\n\n/** Visual styling for a newly-created form field. */\nexport interface FieldStyle {\n /** Text size in points; `0` (default) auto-sizes to the field box. */\n fontSize?: number;\n /** Text / mark colour `0xRRGGBB` (default black). */\n color?: number;\n /** Border colour `0xRRGGBB`, or `null` for no border (default black). */\n border?: number | null;\n /** Background fill `0xRRGGBB`, or `null` for transparent (default none). */\n background?: number | null;\n /** Border width in points (default `1`). */\n borderWidth?: number;\n}\n\n/** One option of a radio group: its export value and on-page rectangle. */\nexport interface RadioOption {\n /** The export value stored in the field when this button is selected. */\n export: string;\n /** `[x0, y0, x1, y1]` in PDF user space. */\n rect: [number, number, number, number];\n}\n\n/** Expand a {@link FieldStyle} into the 7 packed ABI arguments. */\nfunction styleArgs(s: FieldStyle = {}): [number, number, number, number, number, number, number] {\n const hasBorder = s.border === null ? 0 : 1;\n const borderRgb = s.border == null ? 0x000000 : s.border;\n const hasBg = s.background == null ? 0 : 1;\n const bgRgb = s.background == null ? 0 : s.background;\n return [\n s.fontSize ?? 0,\n RGB(s.color ?? 0x000000),\n RGB(borderRgb),\n hasBorder,\n RGB(bgRgb),\n hasBg,\n s.borderWidth ?? 1,\n ];\n}\n\n/** A live document handle. Call {@link close} when done. */\nexport class GigaPdfDoc {\n constructor(\n private readonly g: GigaPdfEngine,\n private readonly h: number\n ) {}\n private ex() {\n return this.g.raw;\n }\n\n close() {\n this.ex().gp_close(this.h);\n }\n pageCount(): number {\n return this.ex().gp_page_count(this.h);\n }\n save(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save(this.h, o));\n }\n saveCompressed(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));\n }\n\n // text intelligence\n textRuns(page: number): TextRunInfo[] {\n return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));\n }\n elements(page: number): Element[] {\n return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));\n }\n structuredText(page: number): TextLine[] {\n return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));\n }\n search(query: string, caseInsensitive = true): SearchHit[] {\n return this.g._withStr(query, (p, l) =>\n this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))\n );\n }\n /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */\n ocr(page: number, scale = 2): OcrWord[] {\n return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));\n }\n ocrText(page: number, scale = 2): string {\n return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));\n }\n\n // editing\n replaceText(page: number, index: number, text: string): boolean {\n return (\n this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0\n );\n }\n removeElement(page: number, index: number): boolean {\n return this.ex().gp_remove_element(this.h, page, index) === 0;\n }\n moveElement(page: number, index: number, dx: number, dy: number): boolean {\n return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;\n }\n duplicateElement(page: number, index: number): boolean {\n return this.ex().gp_duplicate_element(this.h, page, index) === 0;\n }\n /** Index of the element at page point `(x, y)`, or -1 if none. */\n elementAt(page: number, x: number, y: number): number {\n return this.ex().gp_element_at(this.h, page, x, y);\n }\n /**\n * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or\n * `null` to omit that paint. 0 → success.\n */\n addRectangle(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_rectangle(\n this.h,\n page,\n x,\n y,\n w,\n h,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /** Draw a straight line from `(x1,y1)` to `(x2,y2)`. `stroke` is `0xRRGGBB`. */\n drawLine(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_draw_line(this.h, page, x1, y1, x2, y2, RGB(stroke), lineWidth, opacity) === 0\n );\n }\n\n /**\n * Draw an ellipse (circle when `rx === ry`) centred at `(cx,cy)`. Pass an\n * `0xRRGGBB` colour for `stroke`/`fill`, or `null` to omit that paint.\n */\n addEllipse(\n page: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_ellipse(\n this.h,\n page,\n cx,\n cy,\n rx,\n ry,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /**\n * Draw a polyline/polygon through flat `[x0,y0,x1,y1,…]` points. `close` joins\n * the last vertex back to the first. `0xRRGGBB` colours, or `null` to omit.\n */\n addPolygon(\n page: number,\n points: number[],\n close = true,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withF64(points, (p, c) =>\n this.ex().gp_add_polygon(\n this.h,\n page,\n p,\n c,\n close ? 1 : 0,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Draw an SVG path (`M`/`L`/`C`/`Q`/`Z`…) anchored so the SVG origin maps to\n * `(ox,oy)` with the Y axis flipped — same convention as `pdf-lib`'s\n * `drawSvgPath`. Covers freeform/polygon/triangle shapes.\n */\n addPath(\n page: number,\n svgPath: string,\n ox: number,\n oy: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withStr(svgPath, (p, l) =>\n this.ex().gp_add_path(\n this.h,\n page,\n p,\n l,\n ox,\n oy,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Embed a raster image (PNG or JPEG bytes) at `(x,y)` sized `(w,h)` in PDF\n * user space. PNG alpha is honoured; `opacity` (0..1) sets an overall alpha.\n */\n addImage(\n page: number,\n data: Uint8Array,\n x: number,\n y: number,\n w: number,\n h: number,\n opacity = 1\n ): boolean {\n return (\n this.g._withBytes(data, (p, l) =>\n this.ex().gp_add_image(this.h, page, p, l, x, y, w, h, opacity)\n ) === 0\n );\n }\n /**\n * Draw SVG markup on a page as **native vector paths** (crisp at any zoom, not\n * rasterized), fitting its `viewBox` into the box `(x, y, w, h)` in PDF points\n * (origin bottom-left). Supports shapes, `<path>`, groups, transforms and\n * fill/stroke/opacity. Returns `false` if the SVG can't be parsed.\n */\n addSvg(page: number, svg: string, x: number, y: number, w: number, h: number): boolean {\n return (\n this.g._withStr(svg, (p, l) => this.ex().gp_add_svg(this.h, page, p, l, x, y, w, h)) === 0\n );\n }\n /** True redaction: delete content intersecting the region (no opaque cover by default). */\n redact(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n coverRgb = 0,\n hasCover = false\n ): number {\n return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);\n }\n\n // pages\n rotatePage(page: number, degrees: number): boolean {\n return this.ex().gp_rotate_page(this.h, page, degrees) === 0;\n }\n deletePage(page: number): boolean {\n return this.ex().gp_delete_page(this.h, page) === 0;\n }\n movePage(from: number, to: number): boolean {\n return this.ex().gp_move_page(this.h, from, to) === 0;\n }\n appendPages(otherPdf: Uint8Array): boolean {\n return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;\n }\n /** Extract the given 1-based page numbers into a NEW standalone PDF. */\n extractPages(pages: number[]): Uint8Array {\n return this.g._withU32(pages, (p, c) =>\n this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))\n );\n }\n /** Resize a page's MediaBox to `width`×`height` points. */\n resizePage(page: number, width: number, height: number): boolean {\n return this.ex().gp_resize_page(this.h, page, width, height) === 0;\n }\n /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */\n addPage(width: number, height: number, after = 0): number {\n return this.ex().gp_add_page(this.h, width, height, after);\n }\n /** Duplicate a page, inserting the copy right after it; returns the new page's id. */\n copyPage(page: number): number {\n return this.ex().gp_copy_page(this.h, page);\n }\n /** A page's size (points) and `/Rotate` (0/90/180/270). */\n pageInfo(page: number): PageInfo {\n return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));\n }\n\n // render\n renderPage(page: number, scale = 1): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));\n }\n\n // fonts — embed a downloaded TTF, then add real selectable text\n embedFont(family: string, ttf: Uint8Array): number {\n const b = enc.encode(family);\n const famPtr = this.g._toWasm(b);\n const obj = this.g._withBytes(ttf, (p, l) =>\n this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)\n );\n this.g._free(famPtr, b.length);\n return obj;\n }\n addText(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n fontObj: number,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))\n ) === 0\n );\n }\n /**\n * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at\n * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,\n * `opacity` 0–1. Pair with {@link GigaPdfEngine.helveticaWidth} for centring.\n */\n addWatermark(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n rgb = 0x808080,\n opacity = 0.25,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_watermark(this.h, page, x, y, size, p, l, RGB(rgb), opacity, rotationDeg)\n ) === 0\n );\n }\n neededFonts(): string[] {\n return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));\n }\n\n // convert PDF → X\n toText(): string {\n return this.g._str((o) => this.ex().gp_to_text(this.h, o));\n }\n toHtml(): string {\n return this.g._str((o) => this.ex().gp_to_html(this.h, o));\n }\n toDocx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));\n }\n toPptx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));\n }\n /** Convert to an editable OpenDocument Presentation (`.odp`). */\n toOdp(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odp(this.h, o));\n }\n toOdt(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));\n }\n toXlsx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));\n }\n toOds(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));\n }\n toRtf(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));\n }\n toPdfA(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));\n }\n\n // security\n /**\n * Serialize the document encrypted with the PDF Standard Security Handler.\n * Defaults to **AES-256 (R6)**. `fileId` is the document `/ID` (any stable\n * hex/string). For AES-256 a **secret 32-byte key** is required — it is taken\n * from `opts.keySeed` or generated with Web Crypto; RC4/AES-128 derive their\n * key from the password and ignore it.\n */\n saveEncrypted(\n password: string,\n fileId: string,\n opts: {\n ownerPassword?: string;\n algorithm?: \"rc4\" | \"aes128\" | \"aes256\";\n permissions?: number;\n keySeed?: Uint8Array;\n } = {}\n ): Uint8Array {\n const algo = opts.algorithm ?? \"aes256\";\n const algoCode = algo === \"rc4\" ? 0 : algo === \"aes128\" ? 1 : 2;\n const permissions = opts.permissions ?? -44;\n let key = opts.keySeed ?? new Uint8Array(0);\n if (algoCode === 2 && key.length < 32) {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.getRandomValues) {\n throw new Error(\n \"AES-256 encryption needs Web Crypto (globalThis.crypto.getRandomValues) or an explicit opts.keySeed\"\n );\n }\n // `getRandomValues` requires an ArrayBuffer-backed view (not ArrayBufferLike).\n const fresh = new Uint8Array(32);\n c.getRandomValues(fresh);\n key = fresh;\n }\n return this.g._withStr(password, (pwP, pwL) =>\n this.g._withOptStr(opts.ownerPassword, (oP, oL) =>\n this.g._withStr(fileId, (idP, idL) =>\n this.g._withBytes(key, (kP, kL) =>\n this.g._buffer((o) =>\n this.ex().gp_save_encrypted(\n this.h,\n pwP,\n pwL,\n oP,\n oL,\n idP,\n idL,\n kP,\n kL,\n algoCode,\n permissions,\n o\n )\n )\n )\n )\n )\n );\n }\n /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */\n sign(fields: string, random: Uint8Array, keyBits = 2048): Uint8Array {\n const rPtr = this.g._toWasm(random);\n const out = this.g._withStr(fields, (fP, fL) =>\n this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))\n );\n this.g._free(rPtr, random.length);\n return out;\n }\n\n // metadata\n getMetadata(key: string): string {\n return this.g._withStr(key, (p, l) =>\n this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))\n );\n }\n /** Set an Info-dictionary entry (e.g. \"Title\", \"Author\"). */\n setMetadata(key: string, value: string): boolean {\n return (\n this.g._withStr(key, (kP, kL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))\n ) === 0\n );\n }\n\n // annotations (Acrobat-style markup)\n annotations(page: number): AnnotationInfo[] {\n return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));\n }\n removeAnnotation(page: number, index: number): boolean {\n return this.ex().gp_remove_annotation(this.h, page, index) === 0;\n }\n addSquare(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n stroke: number | null = 0,\n fill: number | null = null,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_square(\n this.h,\n page,\n x0,\n y0,\n x1,\n y1,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n addHighlight(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0xffff00): boolean {\n return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addLineAnnotation(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rgb = 0,\n lineWidth = 1\n ): boolean {\n return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;\n }\n addFreeText(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n text: string,\n fontSize = 12,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))\n ) === 0\n );\n }\n addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */\n addInk(page: number, points: number[], rgb = 0, lineWidth = 1): boolean {\n return (\n this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) ===\n 0\n );\n }\n addStamp(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n label: string,\n rgb = 0xc00000\n ): boolean {\n return (\n this.g._withStr(label, (p, l) =>\n this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))\n ) === 0\n );\n }\n flattenAnnotations(page: number): number {\n return this.ex().gp_flatten_annotations(this.h, page);\n }\n\n // hyperlinks\n links(page: number): LinkInfo[] {\n return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));\n }\n addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean {\n return (\n this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) ===\n 0\n );\n }\n addGotoLink(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n targetPage: number\n ): boolean {\n return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;\n }\n\n // optional-content layers (calques): list + show/hide + lock/unlock + remove\n layers(): LayerInfo[] {\n return this.g._json((o) => this.ex().gp_layers_json(this.h, o));\n }\n /** Create a new (visible, unlocked) layer; returns its id (0 on error). */\n addLayer(name: string): number {\n return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));\n }\n setLayerVisibility(id: number, visible: boolean): boolean {\n return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;\n }\n setLayerLocked(id: number, locked: boolean): boolean {\n return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;\n }\n removeLayer(id: number): boolean {\n return this.ex().gp_remove_layer(this.h, id) === 0;\n }\n\n // outline (bookmarks)\n outline(): OutlineEntry[] {\n return this.g._json((o) => this.ex().gp_outline_json(this.h, o));\n }\n /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */\n setOutline(entries: OutlineEntry[]): boolean {\n const text = entries.map((e) => `${e.level}\\t${e.page ?? 0}\\t${e.title}`).join(\"\\n\");\n return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;\n }\n\n // interactive forms (AcroForm)\n fields(): FieldInfo[] {\n return this.g._json((o) => this.ex().gp_fields_json(this.h, o));\n }\n setTextField(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n setCheckbox(name: string, checked: boolean): boolean {\n return (\n this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0\n );\n }\n setRadio(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n /** Set a choice field's selection (multi-select list boxes accept several values). */\n setChoice(name: string, values: string[]): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(values.join(\"\\n\"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n\n // ── form field creation ──────────────────────────────────────────────────\n\n /**\n * Create a text field on `page` covering `rect` = `[x0, y0, x1, y1]` (PDF\n * user space). Options: `maxLen` character cap, `multiline`, `password`,\n * and visual `style`.\n */\n addTextField(\n page: number,\n name: string,\n rect: [number, number, number, number],\n value = \"\",\n opts: { maxLen?: number; multiline?: boolean; password?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) =>\n this.ex().gp_add_text_field(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], vP, vL,\n opts.maxLen ?? -1, opts.multiline ? 1 : 0, opts.password ? 1 : 0, ...st\n )\n )\n ) === 0\n );\n }\n\n /** Create a checkbox. `export` is the on-state name (default `On`). */\n addCheckbox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n checked = false,\n opts: { export?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(opts.export ?? \"On\", (eP, eL) =>\n this.ex().gp_add_checkbox(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], checked ? 1 : 0, eP, eL, ...st\n )\n )\n ) === 0\n );\n }\n\n /**\n * Create a radio-button group: one logical field whose `options` are the\n * individual buttons. `selected` is the initially-chosen export value.\n */\n addRadioGroup(\n page: number,\n name: string,\n options: RadioOption[],\n opts: { selected?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n const exports = options.map((o) => o.export).join(\"\\n\");\n const rects = options.flatMap((o) => o.rect).join(\",\");\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(exports, (eP, eL) =>\n this.g._withStr(rects, (rP, rL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_radio_group(this.h, page, nP, nL, eP, eL, rP, rL, sP, sL, ...st)\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a drop-down combo box. `editable` permits values outside `options`. */\n addComboBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; editable?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_combo_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.editable ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a scrolling list box. `multi` allows selecting several options. */\n addListBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; multi?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_list_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.multi ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n}\n"],"mappings":";AAwBA,IAAM,MAAM,IAAI,YAAY;AAC5B,IAAM,MAAM,IAAI,YAAY;AAGrB,IAAM,gBAAN,MAAM,eAAc;AAAA,EACjB,YAA6B,IAAa;AAAb;AAAA,EAAc;AAAA,EAAd;AAAA;AAAA,EAGrC,aAAa,KAAK,QAA8E;AAC9F,QAAI;AACJ,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,cAAQ,MAAM,IAAI,YAAY;AAAA,IAChC,WAAW,kBAAkB,UAAU;AACrC,cAAQ,MAAM,OAAO,YAAY;AAAA,IACnC,OAAO;AACL,cAAQ;AAAA,IACV;AACA,UAAM,EAAE,SAAS,IAAI,MAAM,YAAY;AAAA,MACrC,iBAAiB,aAAa,MAAM,MAAM,EAAE,SAAS;AAAA,MACrD,CAAC;AAAA,IACH;AACA,WAAO,IAAI,eAAc,SAAS,OAAkB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,cAAsC;AACjD,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,KAAU;AACjD,UAAM,WAAW,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAAC;AAC1E,WAAO,eAAc,KAAK,MAAM,SAAS,QAAQ,CAAC;AAAA,EACpD;AAAA;AAAA,EAGQ,KAAK;AACX,WAAO,IAAI,WAAW,KAAK,GAAG,OAAO,MAAM;AAAA,EAC7C;AAAA,EACQ,KAAK;AACX,WAAO,IAAI,SAAS,KAAK,GAAG,OAAO,MAAM;AAAA,EAC3C;AAAA;AAAA,EAEA,QAAQ,OAA2B;AACjC,UAAM,MAAM,KAAK,GAAG,SAAS,MAAM,MAAM;AACzC,SAAK,GAAG,EAAE,IAAI,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAa,KAAa;AAC9B,SAAK,GAAG,QAAQ,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA,EAEA,QAAQ,MAAiD;AACvD,UAAM,SAAS,KAAK,GAAG,SAAS,CAAC;AACjC,UAAM,UAAU,KAAK,MAAM;AAC3B,QAAI,YAAY,GAAG;AACjB,WAAK,GAAG,QAAQ,QAAQ,CAAC;AACzB,aAAO,IAAI,WAAW,CAAC;AAAA,IACzB;AACA,UAAM,MAAM,KAAK,GAAG,EAAE,UAAU,QAAQ,IAAI;AAC5C,UAAM,MAAM,KAAK,GAAG,EAAE,MAAM,SAAS,UAAU,GAAG;AAClD,SAAK,GAAG,QAAQ,SAAS,GAAG;AAC5B,SAAK,GAAG,QAAQ,QAAQ,CAAC;AACzB,WAAO;AAAA,EACT;AAAA,EACA,KAAK,MAA6C;AAChD,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,EACtC;AAAA,EACA,MAAmB,MAAwC;AACzD,UAAM,IAAI,KAAK,KAAK,IAAI;AACxB,WAAQ,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;AAAA,EAC/B;AAAA;AAAA,EAEA,SAAY,GAAW,IAAwC;AAC7D,UAAM,IAAI,IAAI,OAAO,CAAC;AACtB,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI;AACF,aAAO,GAAG,KAAK,EAAE,MAAM;AAAA,IACzB,UAAE;AACA,WAAK,MAAM,KAAK,EAAE,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAEA,YAAe,GAAuB,IAAwC;AAC5E,WAAO,IAAI,KAAK,SAAS,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA,EAEA,WAAc,OAAmB,IAAwC;AACvE,UAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,QAAI;AACF,aAAO,GAAG,KAAK,MAAM,MAAM;AAAA,IAC7B,UAAE;AACA,WAAK,MAAM,KAAK,MAAM,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAEA,SAAY,QAAkB,IAA0C;AACtE,UAAM,MAAM,KAAK,GAAG,SAAS,OAAO,SAAS,CAAC;AAC9C,UAAM,KAAK,KAAK,GAAG;AACnB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAG,IAAG,UAAU,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI;AAC9E,QAAI;AACF,aAAO,GAAG,KAAK,OAAO,MAAM;AAAA,IAC9B,UAAE;AACA,WAAK,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAEA,SAAY,QAAkB,IAA0C;AACtE,UAAM,MAAM,KAAK,GAAG,SAAS,OAAO,SAAS,CAAC;AAC9C,UAAM,KAAK,KAAK,GAAG;AACnB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAG,IAAG,WAAW,MAAM,IAAI,GAAG,GAAG,IAAI;AACzE,QAAI;AACF,aAAO,GAAG,KAAK,OAAO,MAAM;AAAA,IAC9B,UAAE;AACA,WAAK,MAAM,KAAK,OAAO,SAAS,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EACA,IAAI,MAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA,EAIA,KAAK,KAA6B;AAChC,UAAM,SAAS,KAAK,WAAW,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AACnE,QAAI,WAAW,EAAG,OAAM,IAAI,MAAM,6BAA6B;AAC/D,WAAO,IAAI,WAAW,MAAM,MAAM;AAAA,EACpC;AAAA;AAAA,EAEA,cAAc,KAAiB,UAAqC;AAClE,UAAM,IAAI,IAAI,OAAO,QAAQ;AAC7B,UAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,UAAM,SAAS,KAAK,WAAW,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,kBAAkB,GAAG,GAAG,OAAO,EAAE,MAAM,CAAC;AAC9F,SAAK,MAAM,OAAO,EAAE,MAAM;AAC1B,WAAO,WAAW,IAAI,OAAO,IAAI,WAAW,MAAM,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAKb;AACA,UAAM,OAAO,KAAK;AAAA,MAAW;AAAA,MAAK,CAAC,GAAG,MACpC,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AACA,WAAO,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,MAAc,MAAsB;AACjD,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,mBAAmB,GAAG,GAAG,IAAI,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,SAAS,MAA0B;AACjC,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC1F;AAAA,EACA,UAAU,MAA0B;AAClC,WAAO,KAAK,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC3F;AAAA,EACA,SAAS,KAAyB;AAChC,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACzF;AAAA;AAAA,EAEA,YAAY,QAAgC;AAC1C,WAAO,KAAK;AAAA,MAAW;AAAA,MAAQ,CAAC,GAAG,MACjC,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,iBAAiB,GAAG,GAAG,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AAAA;AAAA,EAGA,cAA0B;AACxB,WAAO,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC;AAAA,EAC1D;AAAA;AAAA,EAEA,eAAe,QAAgB,SAAS,KAAK,SAAS,OAAe;AACnE,WAAO,KAAK;AAAA,MAAS;AAAA,MAAQ,CAAC,GAAG,MAC/B,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,oBAAoB,GAAG,GAAG,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA,EAEA,gBAAgB,KAAqB;AACnC,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,sBAAsB,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAqB;AAC1B,WAAO,KAAK,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,MAAsB;AACrC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MAC7B,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,sBAAsB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,MAAiC;AAC/C,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MAC7B,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,GAAG,GAAG,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WACE,MACA,QAAoB,CAAC,GACrB,YAAY,KACZ,aAAa,KACb,SAAS,IACG;AACZ,UAAM,OAAO,cAAc,KAAK;AAChC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAW;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK,QAAQ,CAAC,MAAM,KAAK,GAAG,eAAe,IAAI,IAAI,IAAI,IAAI,WAAW,YAAY,QAAQ,CAAC,CAAC;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,MAA+C;AACtD,UAAM,SAAS,KAAK,GAAG,SAAS,EAAE;AAClC,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,QAAS;AAAA,QAAM,CAAC,GAAG,MACjC,KAAK,GAAG,aAAa,GAAG,GAAG,QAAQ,SAAS,CAAC;AAAA,MAC/C;AACA,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,KAAK,KAAK,GAAG;AACnB,aAAO,EAAE,GAAG,GAAG,WAAW,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,SAAS,GAAG,IAAI,EAAE;AAAA,IAC9E,UAAE;AACA,WAAK,MAAM,QAAQ,EAAE;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,MAAc,QAAiB,QAAoC;AACrF,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAY;AAAA,QAAQ,CAAC,KAAK,QAC7B,KAAK;AAAA,UAAY;AAAA,UAAQ,CAAC,KAAK,QAC7B,KAAK,MAAM,CAAC,MAAM,KAAK,GAAG,wBAAwB,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,eACE,MACA,QAAoB,CAAC,GACrB,UAA6B,CAAC,GAClB;AACZ,QAAI,KAAK,QAAQ,aAAa;AAC9B,QAAI,KAAK,QAAQ,cAAc;AAC/B,QAAI,QAAQ,UAAU;AACpB,YAAM,KAAK,KAAK,SAAS,QAAQ,QAAQ;AACzC,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,+BAA+B,QAAQ,QAAQ,GAAG;AAC3E,WAAK,GAAG;AACR,WAAK,GAAG;AAAA,IACV;AACA,UAAM,IAAI,QAAQ,UAAU;AAC5B,UAAM,KACJ,OAAO,MAAM,WACT,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,IACvC,EAAE,KAAK,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,UAAU,IAAI,MAAM,EAAE,QAAQ,GAAG;AAC3F,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,QAAQ,QAAQ,mBAAmB;AACzC,UAAM,OAAO,cAAc,KAAK;AAEhC,WAAO,KAAK;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OAC9B,KAAK;AAAA,QAAW;AAAA,QAAM,CAAC,IAAI,OACzB,KAAK;AAAA,UAAY,QAAQ;AAAA,UAAQ,CAAC,KAAK,QACrC,KAAK;AAAA,YAAY,QAAQ;AAAA,YAAQ,CAAC,KAAK,QACrC,KAAK;AAAA,cAAQ,CAAC,MACZ,KAAK,GAAG;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAA+B;AACpD,MAAI,OAAO;AACX,aAAW,KAAK,MAAO,SAAQ,IAAI,IAAI,OAAO,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,IAAI;AACnF,QAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,QAAM,KAAK,IAAI,SAAS,IAAI,MAAM;AAClC,MAAI,IAAI;AACR,KAAG,UAAU,GAAG,MAAM,QAAQ,IAAI;AAClC,OAAK;AACL,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,IAAI,OAAO,EAAE,MAAM;AAC/B,OAAG,UAAU,GAAG,IAAI,QAAQ,IAAI;AAChC,SAAK;AACL,QAAI,IAAI,KAAK,CAAC;AACd,SAAK,IAAI;AACT,OAAG,UAAU,GAAG,EAAE,QAAQ,IAAI;AAC9B,SAAK;AACL,QAAI,CAAC,IAAI,EAAE,SAAS,IAAI;AACxB,SAAK;AACL,OAAG,UAAU,GAAG,EAAE,IAAI,QAAQ,IAAI;AAClC,SAAK;AACL,QAAI,IAAI,EAAE,KAAK,CAAC;AAChB,SAAK,EAAE,IAAI;AAAA,EACb;AACA,SAAO;AACT;AA0JA,IAAM,MAAM,CAAC,QAAgB,MAAM;AAyBnC,SAAS,UAAU,IAAgB,CAAC,GAA6D;AAC/F,QAAM,YAAY,EAAE,WAAW,OAAO,IAAI;AAC1C,QAAM,YAAY,EAAE,UAAU,OAAO,IAAW,EAAE;AAClD,QAAM,QAAQ,EAAE,cAAc,OAAO,IAAI;AACzC,QAAM,QAAQ,EAAE,cAAc,OAAO,IAAI,EAAE;AAC3C,SAAO;AAAA,IACL,EAAE,YAAY;AAAA,IACd,IAAI,EAAE,SAAS,CAAQ;AAAA,IACvB,IAAI,SAAS;AAAA,IACb;AAAA,IACA,IAAI,KAAK;AAAA,IACT;AAAA,IACA,EAAE,eAAe;AAAA,EACnB;AACF;AAGO,IAAM,aAAN,MAAiB;AAAA,EACtB,YACmB,GACA,GACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAEX,KAAK;AACX,WAAO,KAAK,EAAE;AAAA,EAChB;AAAA,EAEA,QAAQ;AACN,SAAK,GAAG,EAAE,SAAS,KAAK,CAAC;AAAA,EAC3B;AAAA,EACA,YAAoB;AAClB,WAAO,KAAK,GAAG,EAAE,cAAc,KAAK,CAAC;AAAA,EACvC;AAAA,EACA,OAAmB;AACjB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,iBAA6B;AAC3B,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,mBAAmB,KAAK,GAAG,CAAC,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,SAAS,MAA6B;AACpC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,SAAS,MAAyB;AAChC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACxE;AAAA,EACA,eAAe,MAA0B;AACvC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,wBAAwB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EAC/E;AAAA,EACA,OAAO,OAAe,kBAAkB,MAAmB;AACzD,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MAChC,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,GAAG,GAAG,kBAAkB,IAAI,GAAG,CAAC,CAAC;AAAA,IACxF;AAAA,EACF;AAAA;AAAA,EAEA,IAAI,MAAc,QAAQ,GAAc;AACtC,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EAC1E;AAAA,EACA,QAAQ,MAAc,QAAQ,GAAW;AACvC,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,YAAY,MAAc,OAAe,MAAuB;AAC9D,WACE,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM;AAAA,EAE9F;AAAA,EACA,cAAc,MAAc,OAAwB;AAClD,WAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EAC9D;AAAA,EACA,YAAY,MAAc,OAAe,IAAY,IAAqB;AACxE,WAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,OAAO,IAAI,EAAE,MAAM;AAAA,EACpE;AAAA,EACA,iBAAiB,MAAc,OAAwB;AACrD,WAAO,KAAK,GAAG,EAAE,qBAAqB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EACjE;AAAA;AAAA,EAEA,UAAU,MAAc,GAAW,GAAmB;AACpD,WAAO,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,MAAM,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MACA,GACA,GACA,GACA,GACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,SACE,MACA,IACA,IACA,IACA,IACA,SAAS,GACT,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAE9F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WACE,MACA,IACA,IACA,IACA,IACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WACE,MACA,QACA,QAAQ,MACR,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,GAAG,MAC1B,KAAK,GAAG,EAAE;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,IAAI;AAAA,QACZ,IAAI,UAAU,CAAC;AAAA,QACf,WAAW,OAAO,IAAI;AAAA,QACtB,IAAI,QAAQ,CAAC;AAAA,QACb,SAAS,OAAO,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACE,MACA,SACA,IACA,IACA,SAAwB,MACxB,OAAsB,GACtB,YAAY,GACZ,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAS,CAAC,GAAG,MAC3B,KAAK,GAAG,EAAE;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,UAAU,CAAC;AAAA,QACf,WAAW,OAAO,IAAI;AAAA,QACtB,IAAI,QAAQ,CAAC;AAAA,QACb,SAAS,OAAO,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SACE,MACA,MACA,GACA,GACA,GACA,GACA,UAAU,GACD;AACT,WACE,KAAK,EAAE;AAAA,MAAW;AAAA,MAAM,CAAC,GAAG,MAC1B,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;AAAA,IAChE,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAc,KAAa,GAAW,GAAW,GAAW,GAAoB;AACrF,WACE,KAAK,EAAE,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EAE7F;AAAA;AAAA,EAEA,OACE,MACA,GACA,GACA,GACA,GACA,WAAW,GACX,WAAW,OACH;AACR,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,QAAQ,GAAG,WAAW,IAAI,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGA,WAAW,MAAc,SAA0B;AACjD,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,MAAM;AAAA,EAC7D;AAAA,EACA,WAAW,MAAuB;AAChC,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,IAAI,MAAM;AAAA,EACpD;AAAA,EACA,SAAS,MAAc,IAAqB;AAC1C,WAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,EAAE,MAAM;AAAA,EACtD;AAAA,EACA,YAAY,UAA+B;AACzC,WAAO,KAAK,EAAE,WAAW,UAAU,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EAC5F;AAAA;AAAA,EAEA,aAAa,OAA6B;AACxC,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IACnE;AAAA,EACF;AAAA;AAAA,EAEA,WAAW,MAAc,OAAe,QAAyB;AAC/D,WAAO,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,MAAM,MAAM;AAAA,EACnE;AAAA;AAAA,EAEA,QAAQ,OAAe,QAAgB,QAAQ,GAAW;AACxD,WAAO,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,OAAO,QAAQ,KAAK;AAAA,EAC3D;AAAA;AAAA,EAEA,SAAS,MAAsB;AAC7B,WAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,IAAI;AAAA,EAC5C;AAAA;AAAA,EAEA,SAAS,MAAwB;AAC/B,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,WAAW,MAAc,QAAQ,GAAe;AAC9C,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,UAAU,QAAgB,KAAyB;AACjD,UAAM,IAAI,IAAI,OAAO,MAAM;AAC3B,UAAM,SAAS,KAAK,EAAE,QAAQ,CAAC;AAC/B,UAAM,MAAM,KAAK,EAAE;AAAA,MAAW;AAAA,MAAK,CAAC,GAAG,MACrC,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,QAAQ,EAAE,QAAQ,GAAG,CAAC;AAAA,IACxD;AACA,SAAK,EAAE,MAAM,QAAQ,EAAE,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,QACE,MACA,GACA,GACA,MACA,MACA,SACA,MAAM,GACG;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,SAAS,IAAI,GAAG,CAAC;AAAA,IACzE,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,MACA,GACA,GACA,MACA,MACA,MAAM,SACN,UAAU,MACV,cAAc,GACL;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,SAAS,WAAW;AAAA,IAC3F,MAAM;AAAA,EAEV;AAAA,EACA,cAAwB;AACtB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA,EAGA,SAAiB;AACf,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,SAAiB;AACf,WAAO,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA,EAEA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,QAAoB;AAClB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,SAAqB;AACnB,WAAO,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cACE,UACA,QACA,OAKI,CAAC,GACO;AACZ,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,WAAW,SAAS,QAAQ,IAAI,SAAS,WAAW,IAAI;AAC9D,UAAM,cAAc,KAAK,eAAe;AACxC,QAAI,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC;AAC1C,QAAI,aAAa,KAAK,IAAI,SAAS,IAAI;AACrC,YAAM,IAAK,WAAmC;AAC9C,UAAI,CAAC,GAAG,iBAAiB;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,QAAE,gBAAgB,KAAK;AACvB,YAAM;AAAA,IACR;AACA,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAU,CAAC,KAAK,QACrC,KAAK,EAAE;AAAA,QAAY,KAAK;AAAA,QAAe,CAAC,IAAI,OAC1C,KAAK,EAAE;AAAA,UAAS;AAAA,UAAQ,CAAC,KAAK,QAC5B,KAAK,EAAE;AAAA,YAAW;AAAA,YAAK,CAAC,IAAI,OAC1B,KAAK,EAAE;AAAA,cAAQ,CAAC,MACd,KAAK,GAAG,EAAE;AAAA,gBACR,KAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA,KAAK,QAAgB,QAAoB,UAAU,MAAkB;AACnE,UAAM,OAAO,KAAK,EAAE,QAAQ,MAAM;AAClC,UAAM,MAAM,KAAK,EAAE;AAAA,MAAS;AAAA,MAAQ,CAAC,IAAI,OACvC,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAG,IAAI,IAAI,MAAM,OAAO,QAAQ,SAAS,CAAC,CAAC;AAAA,IAC1F;AACA,SAAK,EAAE,MAAM,MAAM,OAAO,MAAM;AAChC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,YAAY,KAAqB;AAC/B,WAAO,KAAK,EAAE;AAAA,MAAS;AAAA,MAAK,CAAC,GAAG,MAC9B,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA,EAEA,YAAY,KAAa,OAAwB;AAC/C,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAK,CAAC,IAAI,OACxB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACtF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YAAY,MAAgC;AAC1C,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,oBAAoB,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EAC3E;AAAA,EACA,iBAAiB,MAAc,OAAwB;AACrD,WAAO,KAAK,GAAG,EAAE,qBAAqB,KAAK,GAAG,MAAM,KAAK,MAAM;AAAA,EACjE;AAAA,EACA,UACE,MACA,IACA,IACA,IACA,IACA,SAAwB,GACxB,OAAsB,MACtB,YAAY,GACH;AACT,WACE,KAAK,GAAG,EAAE;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,UAAU,CAAC;AAAA,MACf,WAAW,OAAO,IAAI;AAAA,MACtB,IAAI,QAAQ,CAAC;AAAA,MACb,SAAS,OAAO,IAAI;AAAA,MACpB;AAAA,IACF,MAAM;AAAA,EAEV;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,UAAmB;AAClG,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EAChF;AAAA,EACA,kBACE,MACA,IACA,IACA,IACA,IACA,MAAM,GACN,YAAY,GACH;AACT,WAAO,KAAK,GAAG,EAAE,YAAY,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,SAAS,MAAM;AAAA,EACtF;AAAA,EACA,YACE,MACA,IACA,IACA,IACA,IACA,MACA,WAAW,IACX,MAAM,GACG;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,GAAG,MACxB,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,UAAU,IAAI,GAAG,CAAC;AAAA,IACnF,MAAM;AAAA,EAEV;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,GAAY;AAC3F,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EAChF;AAAA,EACA,aAAa,MAAc,IAAY,IAAY,IAAY,IAAY,MAAM,GAAY;AAC3F,WAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM;AAAA,EACjF;AAAA;AAAA,EAEA,OAAO,MAAc,QAAkB,MAAM,GAAG,YAAY,GAAY;AACtE,WACE,KAAK,EAAE,SAAS,QAAQ,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,SAAS,CAAC,MAC/F;AAAA,EAEJ;AAAA,EACA,SACE,MACA,IACA,IACA,IACA,IACA,OACA,MAAM,UACG;AACT,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAO,CAAC,GAAG,MACzB,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,IACrE,MAAM;AAAA,EAEV;AAAA,EACA,mBAAmB,MAAsB;AACvC,WAAO,KAAK,GAAG,EAAE,uBAAuB,KAAK,GAAG,IAAI;AAAA,EACtD;AAAA;AAAA,EAGA,MAAM,MAA0B;AAC9B,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,EACrE;AAAA,EACA,WAAW,MAAc,IAAY,IAAY,IAAY,IAAY,KAAsB;AAC7F,WACE,KAAK,EAAE,SAAS,KAAK,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,MAC5F;AAAA,EAEJ;AAAA,EACA,YACE,MACA,IACA,IACA,IACA,IACA,YACS;AACT,WAAO,KAAK,GAAG,EAAE,iBAAiB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,UAAU,MAAM;AAAA,EAClF;AAAA;AAAA,EAGA,SAAsB;AACpB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,CAAC,CAAC;AAAA,EAChE;AAAA;AAAA,EAEA,SAAS,MAAsB;AAC7B,WAAO,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,GAAG,CAAC,CAAC;AAAA,EAC7E;AAAA,EACA,mBAAmB,IAAY,SAA2B;AACxD,WAAO,KAAK,GAAG,EAAE,wBAAwB,KAAK,GAAG,IAAI,UAAU,IAAI,CAAC,MAAM;AAAA,EAC5E;AAAA,EACA,eAAe,IAAY,QAA0B;AACnD,WAAO,KAAK,GAAG,EAAE,oBAAoB,KAAK,GAAG,IAAI,SAAS,IAAI,CAAC,MAAM;AAAA,EACvE;AAAA,EACA,YAAY,IAAqB;AAC/B,WAAO,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,EAAE,MAAM;AAAA,EACnD;AAAA;AAAA,EAGA,UAA0B;AACxB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA,EAEA,WAAW,SAAkC;AAC3C,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,IAAK,EAAE,QAAQ,CAAC,IAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACnF,WAAO,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM;AAAA,EACrF;AAAA;AAAA,EAGA,SAAsB;AACpB,WAAO,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,eAAe,KAAK,GAAG,CAAC,CAAC;AAAA,EAChE;AAAA,EACA,aAAa,MAAc,OAAwB;AACjD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,kBAAkB,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACxF,MAAM;AAAA,EAEV;AAAA,EACA,YAAY,MAAc,SAA2B;AACnD,WACE,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,gBAAgB,KAAK,GAAG,GAAG,GAAG,UAAU,IAAI,CAAC,CAAC,MAAM;AAAA,EAElG;AAAA,EACA,SAAS,MAAc,OAAwB;AAC7C,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,aAAa,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IACnF,MAAM;AAAA,EAEV;AAAA;AAAA,EAEA,UAAU,MAAc,QAA2B;AACjD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE,SAAS,OAAO,KAAK,IAAI,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,cAAc,KAAK,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,IAChG,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aACE,MACA,MACA,MACA,QAAQ,IACR,OAAyF,CAAC,GACjF;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS;AAAA,QAAO,CAAC,IAAI,OAC1B,KAAK,GAAG,EAAE;AAAA,UACR,KAAK;AAAA,UAAG;AAAA,UAAM;AAAA,UAAI;AAAA,UAAI,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG;AAAA,UAAI;AAAA,UAC9D,KAAK,UAAU;AAAA,UAAI,KAAK,YAAY,IAAI;AAAA,UAAG,KAAK,WAAW,IAAI;AAAA,UAAG,GAAG;AAAA,QACvE;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YACE,MACA,MACA,MACA,UAAU,OACV,OAAgD,CAAC,GACxC;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,KAAK,UAAU;AAAA,QAAM,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,UACR,KAAK;AAAA,UAAG;AAAA,UAAM;AAAA,UAAI;AAAA,UAAI,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,KAAK,CAAC;AAAA,UAAG,UAAU,IAAI;AAAA,UAAG;AAAA,UAAI;AAAA,UAAI,GAAG;AAAA,QACxF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,MACA,MACA,SACA,OAAkD,CAAC,GAC1C;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,UAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI;AACtD,UAAM,QAAQ,QAAQ,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG;AACrD,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS;AAAA,QAAS,CAAC,IAAI,OAC5B,KAAK,EAAE;AAAA,UAAS;AAAA,UAAO,CAAC,IAAI,OAC1B,KAAK,EAAE;AAAA,YAAS,KAAK,YAAY;AAAA,YAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE,mBAAmB,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,YACE,MACA,MACA,MACA,SACA,OAAsE,CAAC,GAC9D;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,QAAQ,KAAK,IAAI;AAAA,QAAG,CAAC,IAAI,OACvC,KAAK,EAAE;AAAA,UAAS,KAAK,YAAY;AAAA,UAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,YACR,KAAK;AAAA,YAAG;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG;AAAA,YAAI;AAAA,YAAI;AAAA,YAAI;AAAA,YACtE,KAAK,WAAW,IAAI;AAAA,YAAG,GAAG;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AAAA;AAAA,EAGA,WACE,MACA,MACA,MACA,SACA,OAAmE,CAAC,GAC3D;AACT,UAAM,KAAK,UAAU,KAAK,KAAK;AAC/B,WACE,KAAK,EAAE;AAAA,MAAS;AAAA,MAAM,CAAC,IAAI,OACzB,KAAK,EAAE;AAAA,QAAS,QAAQ,KAAK,IAAI;AAAA,QAAG,CAAC,IAAI,OACvC,KAAK,EAAE;AAAA,UAAS,KAAK,YAAY;AAAA,UAAI,CAAC,IAAI,OACxC,KAAK,GAAG,EAAE;AAAA,YACR,KAAK;AAAA,YAAG;AAAA,YAAM;AAAA,YAAI;AAAA,YAAI,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG,KAAK,CAAC;AAAA,YAAG;AAAA,YAAI;AAAA,YAAI;AAAA,YAAI;AAAA,YACtE,KAAK,QAAQ,IAAI;AAAA,YAAG,GAAG;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,MAAM;AAAA,EAEV;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @qrcommunication/gigapdf-lib — TypeScript SDK for the zero-dependency Rust→WASM\n * PDF engine (gigapdf-lib). Wraps the flat `extern \"C\"` `gp_*` ABI behind a typed,\n * ergonomic class. No third-party runtime deps; the `.wasm` is self-contained.\n *\n * Usage:\n * const giga = await GigaPdfEngine.load(wasmBytesOrUrl);\n * const doc = giga.open(pdfBytes);\n * const docx = doc.toDocx();\n * const png = doc.renderPage(1, 2);\n * doc.close();\n */\n\n// FFI boundary: the wasm exports are an untyped table of `gp_*` functions\n// (numbers in, numbers out) plus `memory`. `any` here is the documented FFI\n// exception — every public method below re-imposes precise types.\ntype Exports = {\n memory: WebAssembly.Memory;\n gp_alloc(len: number): number;\n gp_free(ptr: number, len: number): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n};\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** Loaded engine module. Create documents with {@link open} / {@link openEncrypted}. */\nexport class GigaPdfEngine {\n private constructor(private readonly ex: Exports) {}\n\n /** Instantiate from raw wasm bytes, a URL/path, or a Response. */\n static async load(source: ArrayBuffer | Uint8Array | string | Response): Promise<GigaPdfEngine> {\n let bytes: ArrayBuffer | Uint8Array;\n if (typeof source === \"string\") {\n const res = await fetch(source);\n bytes = await res.arrayBuffer();\n } else if (source instanceof Response) {\n bytes = await source.arrayBuffer();\n } else {\n bytes = source;\n }\n const { instance } = await WebAssembly.instantiate(\n bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,\n {}\n );\n return new GigaPdfEngine(instance.exports as Exports);\n }\n\n /**\n * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped\n * inside this package (resolved relative to the built module). In the browser,\n * pass a URL or bytes to {@link load} instead.\n *\n * In Next.js `output: \"standalone\"`, add the asset to `outputFileTracingIncludes`\n * for the consuming route so the `.wasm` is copied into the standalone bundle.\n */\n static async loadDefault(): Promise<GigaPdfEngine> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const wasmPath = fileURLToPath(new URL(\"../gigapdf.wasm\", import.meta.url));\n return GigaPdfEngine.load(await readFile(wasmPath));\n }\n\n // ── linear-memory ABI helpers (internal) ─────────────────────────────────\n private u8() {\n return new Uint8Array(this.ex.memory.buffer);\n }\n private dv() {\n return new DataView(this.ex.memory.buffer);\n }\n /** Copy host bytes into wasm memory; returns the pointer (caller frees). */\n _toWasm(bytes: Uint8Array): number {\n const ptr = this.ex.gp_alloc(bytes.length);\n this.u8().set(bytes, ptr);\n return ptr;\n }\n _free(ptr: number, len: number) {\n this.ex.gp_free(ptr, len);\n }\n /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */\n _buffer(call: (outLenPtr: number) => number): Uint8Array {\n const lenPtr = this.ex.gp_alloc(4);\n const dataPtr = call(lenPtr);\n if (dataPtr === 0) {\n this.ex.gp_free(lenPtr, 4);\n return new Uint8Array(0);\n }\n const len = this.dv().getUint32(lenPtr, true);\n const out = this.u8().slice(dataPtr, dataPtr + len);\n this.ex.gp_free(dataPtr, len);\n this.ex.gp_free(lenPtr, 4);\n return out;\n }\n _str(call: (outLenPtr: number) => number): string {\n return dec.decode(this._buffer(call));\n }\n _json<T = unknown>(call: (outLenPtr: number) => number): T {\n const s = this._str(call);\n return (s ? JSON.parse(s) : []) as T;\n }\n /** Pass a string argument; runs `fn(ptr, len)` then frees. */\n _withStr<T>(s: string, fn: (ptr: number, len: number) => T): T {\n const b = enc.encode(s);\n const ptr = this._toWasm(b);\n try {\n return fn(ptr, b.length);\n } finally {\n this._free(ptr, b.length);\n }\n }\n /** Pass an optional string; an absent/empty value runs `fn(0, 0)` (no alloc). */\n _withOptStr<T>(s: string | undefined, fn: (ptr: number, len: number) => T): T {\n return s ? this._withStr(s, fn) : fn(0, 0);\n }\n /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */\n _withBytes<T>(bytes: Uint8Array, fn: (ptr: number, len: number) => T): T {\n const ptr = this._toWasm(bytes);\n try {\n return fn(ptr, bytes.length);\n } finally {\n this._free(ptr, bytes.length);\n }\n }\n /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */\n _withU32<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 4);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 4);\n }\n }\n /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */\n _withF64<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 8);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 8);\n }\n }\n get raw(): Exports {\n return this.ex;\n }\n\n // ── documents ─────────────────────────────────────────────────────────────\n /** Open a PDF. Throws if it can't be parsed. */\n open(pdf: Uint8Array): GigaPdfDoc {\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));\n if (handle === 0) throw new Error(\"gigapdf: failed to open PDF\");\n return new GigaPdfDoc(this, handle);\n }\n /** Open an encrypted PDF with a password. Returns null if the password is wrong. */\n openEncrypted(pdf: Uint8Array, password: string): GigaPdfDoc | null {\n const b = enc.encode(password);\n const pwPtr = this._toWasm(b);\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));\n this._free(pwPtr, b.length);\n return handle === 0 ? null : new GigaPdfDoc(this, handle);\n }\n\n /**\n * Inspect a PDF's encryption **without decrypting it** (no password needed):\n * whether it has an `/Encrypt` dictionary, plus its `/P` permission bitmask\n * and handler version/revision (`0` when not encrypted).\n */\n encryptionInfo(pdf: Uint8Array): {\n encrypted: boolean;\n permissions: number;\n version: number;\n revision: number;\n } {\n const json = this._withBytes(pdf, (p, l) =>\n this._buffer((o) => this.ex.gp_encryption_info(p, l, o))\n );\n return JSON.parse(dec.decode(json));\n }\n\n /**\n * Width of `text` set in standard Helvetica at `size` points (AFM metrics) —\n * place watermark/header text without embedding a font.\n */\n helveticaWidth(size: number, text: string): number {\n return this._withStr(text, (p, l) => this.ex.gp_helvetica_width(p, l, size));\n }\n\n // ── stateless <format> → PDF conversions ───────────────────────────────────\n txtToPdf(text: string): Uint8Array {\n return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));\n }\n htmlToPdf(html: string): Uint8Array {\n return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));\n }\n rtfToPdf(rtf: string): Uint8Array {\n return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));\n }\n /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */\n officeToPdf(office: Uint8Array): Uint8Array {\n return this._withBytes(office, (p, l) =>\n this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))\n );\n }\n\n // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────\n fontCatalog(): FontInfo[] {\n return this._json((o) => this.ex.gp_font_catalog_json(o));\n }\n /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */\n fontRequestUrl(family: string, weight = 400, italic = false): string {\n return this._withStr(family, (p, l) =>\n this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))\n );\n }\n /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */\n parseCssFontUrl(css: string): string {\n return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));\n }\n\n // ── JavaScript engine (no headless browser) ────────────────────────────────\n /**\n * Evaluate a JavaScript snippet with the built-in engine and return the\n * result value as a string (or `Uncaught …` / `SyntaxError: …`).\n */\n evalJs(src: string): string {\n return this._withStr(src, (p, l) => this._str((o) => this.ex.gp_js_eval(p, l, o)));\n }\n /**\n * Run a document's inline `<script>`s and return the resulting HTML. The\n * `htmlRender`/`htmlNeededFonts` paths already do this automatically; use this\n * only when you want the post-script HTML on its own.\n */\n runInlineScripts(html: string): string {\n return this._withStr(html, (p, l) =>\n this._str((o) => this.ex.gp_run_inline_scripts(p, l, o))\n );\n }\n\n // ── HTML rendering engine (replaces a headless browser for HTML→PDF) ───────\n /**\n * Phase 1 — the Google fonts the document references. Download each `url`\n * (→ TTF) and pass the bytes back to {@link htmlRender} for an identical render.\n */\n htmlNeededFonts(html: string): HtmlFontRequest[] {\n return this._withStr(html, (p, l) =>\n this._json((o) => this.ex.gp_html_needed_fonts(p, l, o))\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 — render HTML + CSS to PDF, with the supplied fonts embedded (real\n * Google fonts, real metrics → identical or nearest match). Block, inline and\n * table layout with pagination. Page size and margin are in points\n * (US-Letter portrait, 0.5in margins by default). JavaScript is not executed.\n */\n htmlRender(\n html: string,\n fonts: HtmlFont[] = [],\n pageWidth = 612,\n pageHeight = 792,\n margin = 36\n ): Uint8Array {\n const blob = packHtmlFonts(fonts);\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._buffer((o) => this.ex.gp_html_render(hp, hl, fp, fl, pageWidth, pageHeight, margin, o))\n )\n );\n }\n\n /**\n * Resolve a named paper size — `\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, `\"legal\"`,\n * `\"tabloid\"`, `\"b5\"`, … — to `{ w, h }` in points (portrait unless the name\n * has a `-landscape` suffix). Returns `null` for an unknown name.\n */\n pageSize(name: string): { w: number; h: number } | null {\n const outPtr = this.ex.gp_alloc(16);\n try {\n const ok = this._withStr(name, (p, l) =>\n this.ex.gp_page_size(p, l, outPtr, outPtr + 8)\n );\n if (!ok) return null;\n const dv = this.dv();\n return { w: dv.getFloat64(outPtr, true), h: dv.getFloat64(outPtr + 8, true) };\n } finally {\n this._free(outPtr, 16);\n }\n }\n\n /**\n * Phase 1 variant that also scans the running `header`/`footer` HTML, so the\n * Google fonts they reference are requested alongside the body's.\n */\n htmlNeededFontsWith(html: string, header?: string, footer?: string): HtmlFontRequest[] {\n return this._withStr(html, (hp, hl) =>\n this._withOptStr(header, (hdp, hdl) =>\n this._withOptStr(footer, (ftp, ftl) =>\n this._json((o) => this.ex.gp_html_needed_fonts_ex(hp, hl, hdp, hdl, ftp, ftl, o))\n )\n )\n ) as HtmlFontRequest[];\n }\n\n /**\n * Phase 2 with full page control: named/explicit size, per-side margins, and a\n * running header/footer painted in the page margins. `{{page}}` and `{{pages}}`\n * in the header/footer are replaced with the current / total page number.\n *\n * ```ts\n * const fonts = await fetchFonts(giga.htmlNeededFontsWith(html, header, footer));\n * const pdf = giga.htmlRenderWith(html, fonts, {\n * pageSize: \"A4\",\n * margin: { top: 72, bottom: 72, left: 54, right: 54 },\n * header: `<div style=\"text-align:center\">My Report</div>`,\n * footer: `<div style=\"text-align:center\">Page {{page}} / {{pages}}</div>`,\n * });\n * ```\n */\n htmlRenderWith(\n html: string,\n fonts: HtmlFont[] = [],\n options: HtmlRenderOptions = {}\n ): Uint8Array {\n let pw = options.pageWidth ?? 612;\n let ph = options.pageHeight ?? 792;\n if (options.pageSize) {\n const sz = this.pageSize(options.pageSize);\n if (!sz) throw new Error(`gigapdf: unknown page size \"${options.pageSize}\"`);\n pw = sz.w;\n ph = sz.h;\n }\n const m = options.margin ?? 36;\n const mg =\n typeof m === \"number\"\n ? { top: m, right: m, bottom: m, left: m }\n : { top: m.top ?? 36, right: m.right ?? 36, bottom: m.bottom ?? 36, left: m.left ?? 36 };\n const headerOffset = options.headerOffset ?? 18;\n const footerOffset = options.footerOffset ?? 18;\n const start = options.startPageNumber ?? 1;\n const blob = packHtmlFonts(fonts);\n\n return this._withStr(html, (hp, hl) =>\n this._withBytes(blob, (fp, fl) =>\n this._withOptStr(options.header, (hdp, hdl) =>\n this._withOptStr(options.footer, (ftp, ftl) =>\n this._buffer((o) =>\n this.ex.gp_html_render_opts(\n hp,\n hl,\n fp,\n fl,\n pw,\n ph,\n mg.top,\n mg.right,\n mg.bottom,\n mg.left,\n hdp,\n hdl,\n ftp,\n ftl,\n headerOffset,\n footerOffset,\n start,\n o\n )\n )\n )\n )\n )\n );\n }\n}\n\n/** Pack `HtmlFont[]` into the little-endian blob `gp_html_render` expects. */\nfunction packHtmlFonts(fonts: HtmlFont[]): Uint8Array {\n let size = 4;\n for (const f of fonts) size += 4 + enc.encode(f.family).length + 2 + 1 + 4 + f.ttf.length;\n const buf = new Uint8Array(size);\n const dv = new DataView(buf.buffer);\n let o = 0;\n dv.setUint32(o, fonts.length, true);\n o += 4;\n for (const f of fonts) {\n const fam = enc.encode(f.family);\n dv.setUint32(o, fam.length, true);\n o += 4;\n buf.set(fam, o);\n o += fam.length;\n dv.setUint16(o, f.weight, true);\n o += 2;\n buf[o] = f.italic ? 1 : 0;\n o += 1;\n dv.setUint32(o, f.ttf.length, true);\n o += 4;\n buf.set(f.ttf, o);\n o += f.ttf.length;\n }\n return buf;\n}\n\n/** A Google font the HTML engine needs (resolved from the catalogue). */\nexport interface HtmlFontRequest {\n family: string;\n weight: number;\n italic: boolean;\n /** Google Fonts CSS URL — the host fetches it to obtain the TTF. */\n url: string;\n}\n\n/** A downloaded font handed to {@link GigaPdfEngine.htmlRender}. */\nexport interface HtmlFont {\n family: string;\n weight: number;\n italic: boolean;\n ttf: Uint8Array;\n}\n\n/** Per-side page margins in points; omitted sides default to 36pt. */\nexport interface HtmlMargins {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n}\n\n/** Page setup for {@link GigaPdfEngine.htmlRenderWith}. */\nexport interface HtmlRenderOptions {\n /** Named paper size (`\"A4\"`, `\"a3-landscape\"`, `\"letter\"`, …) — wins over width/height. */\n pageSize?: string;\n /** Explicit page width in points (default 612 = US Letter). Ignored if `pageSize` is set. */\n pageWidth?: number;\n /** Explicit page height in points (default 792). Ignored if `pageSize` is set. */\n pageHeight?: number;\n /** Uniform margin (points) or per-side margins. Default 36pt (0.5in). */\n margin?: number | HtmlMargins;\n /** Running header HTML painted in the top margin (`{{page}}` / `{{pages}}` tokens). */\n header?: string;\n /** Running footer HTML painted in the bottom margin (same tokens). */\n footer?: string;\n /** Distance from the top edge to the header block, in points (default 18). */\n headerOffset?: number;\n /** Distance from the bottom edge to the footer block, in points (default 18). */\n footerOffset?: number;\n /** Number assigned to the first page for `{{page}}` (default 1). */\n startPageNumber?: number;\n}\n\nexport interface FontInfo {\n family: string;\n category: string;\n google: boolean;\n weights: number[];\n}\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\nexport interface Element extends Partial<Box> {\n index: number;\n kind: \"text\" | \"image\" | \"shape\";\n label: string;\n}\nexport interface TextLine extends Box {\n text: string;\n}\nexport interface SearchHit extends Box {\n page: number;\n text: string;\n}\nexport interface OcrWord extends Box {\n text: string;\n}\nexport interface TextRunInfo {\n index: number;\n operator: string;\n text: string;\n}\n/** A markup annotation (rect corners in PDF user space). */\nexport interface AnnotationInfo {\n index: number;\n subtype: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n contents: string;\n}\n/** A hyperlink annotation; `kind` discriminates the target. */\nexport interface LinkInfo {\n index: number;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n kind: \"uri\" | \"page\" | \"unknown\";\n uri?: string;\n page?: number;\n}\nexport type FieldKind =\n | \"text\"\n | \"checkbox\"\n | \"radio\"\n | \"pushbutton\"\n | \"combo\"\n | \"list\"\n | \"signature\"\n | \"unknown\";\n/** An AcroForm field with its flags and (for choices) options. */\nexport interface FieldInfo {\n name: string;\n type: string;\n kind: FieldKind;\n flags: number;\n readOnly: boolean;\n required: boolean;\n multiline: boolean;\n fillable: boolean;\n maxLen?: number;\n /** 1-based page the widget sits on (from its `/P`); absent if it has no widget. */\n page?: number;\n /**\n * Widget rectangle `[x, y, width, height]` in points, **top-left origin**\n * (already Y-flipped from the PDF's bottom-left `/Rect` for direct host use).\n * Absent when the field carries no `/Rect`.\n */\n bounds?: [number, number, number, number];\n value: string;\n options: string[];\n}\n/** One outline (bookmark) entry; `level` is the nesting depth (0 = top). */\nexport interface OutlineEntry {\n level: number;\n title: string;\n page?: number;\n}\n/** An optional-content layer (calque): toggle `visible`/`locked` to persist in the PDF. */\nexport interface LayerInfo {\n id: number;\n name: string;\n visible: boolean;\n locked: boolean;\n order: number;\n}\n/** A page's geometry: size in points and `/Rotate` (0/90/180/270). */\nexport interface PageInfo {\n width: number;\n height: number;\n rotation: number;\n}\n\nconst RGB = (rgb: number) => rgb & 0xffffff;\n\n/** Visual styling for a newly-created form field. */\nexport interface FieldStyle {\n /** Text size in points; `0` (default) auto-sizes to the field box. */\n fontSize?: number;\n /** Text / mark colour `0xRRGGBB` (default black). */\n color?: number;\n /** Border colour `0xRRGGBB`, or `null` for no border (default black). */\n border?: number | null;\n /** Background fill `0xRRGGBB`, or `null` for transparent (default none). */\n background?: number | null;\n /** Border width in points (default `1`). */\n borderWidth?: number;\n}\n\n/** One option of a radio group: its export value and on-page rectangle. */\nexport interface RadioOption {\n /** The export value stored in the field when this button is selected. */\n export: string;\n /** `[x0, y0, x1, y1]` in PDF user space. */\n rect: [number, number, number, number];\n}\n\n/** Expand a {@link FieldStyle} into the 7 packed ABI arguments. */\nfunction styleArgs(s: FieldStyle = {}): [number, number, number, number, number, number, number] {\n const hasBorder = s.border === null ? 0 : 1;\n const borderRgb = s.border == null ? 0x000000 : s.border;\n const hasBg = s.background == null ? 0 : 1;\n const bgRgb = s.background == null ? 0 : s.background;\n return [\n s.fontSize ?? 0,\n RGB(s.color ?? 0x000000),\n RGB(borderRgb),\n hasBorder,\n RGB(bgRgb),\n hasBg,\n s.borderWidth ?? 1,\n ];\n}\n\n/** A live document handle. Call {@link close} when done. */\nexport class GigaPdfDoc {\n constructor(\n private readonly g: GigaPdfEngine,\n private readonly h: number\n ) {}\n private ex() {\n return this.g.raw;\n }\n\n close() {\n this.ex().gp_close(this.h);\n }\n pageCount(): number {\n return this.ex().gp_page_count(this.h);\n }\n save(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save(this.h, o));\n }\n saveCompressed(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));\n }\n\n // text intelligence\n textRuns(page: number): TextRunInfo[] {\n return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));\n }\n elements(page: number): Element[] {\n return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));\n }\n structuredText(page: number): TextLine[] {\n return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));\n }\n search(query: string, caseInsensitive = true): SearchHit[] {\n return this.g._withStr(query, (p, l) =>\n this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))\n );\n }\n /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */\n ocr(page: number, scale = 2): OcrWord[] {\n return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));\n }\n ocrText(page: number, scale = 2): string {\n return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));\n }\n\n // editing\n replaceText(page: number, index: number, text: string): boolean {\n return (\n this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0\n );\n }\n removeElement(page: number, index: number): boolean {\n return this.ex().gp_remove_element(this.h, page, index) === 0;\n }\n moveElement(page: number, index: number, dx: number, dy: number): boolean {\n return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;\n }\n duplicateElement(page: number, index: number): boolean {\n return this.ex().gp_duplicate_element(this.h, page, index) === 0;\n }\n /** Index of the element at page point `(x, y)`, or -1 if none. */\n elementAt(page: number, x: number, y: number): number {\n return this.ex().gp_element_at(this.h, page, x, y);\n }\n /**\n * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or\n * `null` to omit that paint. 0 → success.\n */\n addRectangle(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_rectangle(\n this.h,\n page,\n x,\n y,\n w,\n h,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /** Draw a straight line from `(x1,y1)` to `(x2,y2)`. `stroke` is `0xRRGGBB`. */\n drawLine(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_draw_line(this.h, page, x1, y1, x2, y2, RGB(stroke), lineWidth, opacity) === 0\n );\n }\n\n /**\n * Draw an ellipse (circle when `rx === ry`) centred at `(cx,cy)`. Pass an\n * `0xRRGGBB` colour for `stroke`/`fill`, or `null` to omit that paint.\n */\n addEllipse(\n page: number,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.ex().gp_add_ellipse(\n this.h,\n page,\n cx,\n cy,\n rx,\n ry,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n ) === 0\n );\n }\n\n /**\n * Draw a polyline/polygon through flat `[x0,y0,x1,y1,…]` points. `close` joins\n * the last vertex back to the first. `0xRRGGBB` colours, or `null` to omit.\n */\n addPolygon(\n page: number,\n points: number[],\n close = true,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withF64(points, (p, c) =>\n this.ex().gp_add_polygon(\n this.h,\n page,\n p,\n c,\n close ? 1 : 0,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Draw an SVG path (`M`/`L`/`C`/`Q`/`Z`…) anchored so the SVG origin maps to\n * `(ox,oy)` with the Y axis flipped — same convention as `pdf-lib`'s\n * `drawSvgPath`. Covers freeform/polygon/triangle shapes.\n */\n addPath(\n page: number,\n svgPath: string,\n ox: number,\n oy: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1,\n opacity = 1\n ): boolean {\n return (\n this.g._withStr(svgPath, (p, l) =>\n this.ex().gp_add_path(\n this.h,\n page,\n p,\n l,\n ox,\n oy,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth,\n opacity\n )\n ) === 0\n );\n }\n\n /**\n * Embed a raster image (PNG or JPEG bytes) at `(x,y)` sized `(w,h)` in PDF\n * user space. PNG alpha is honoured; `opacity` (0..1) sets an overall alpha.\n */\n addImage(\n page: number,\n data: Uint8Array,\n x: number,\n y: number,\n w: number,\n h: number,\n opacity = 1\n ): boolean {\n return (\n this.g._withBytes(data, (p, l) =>\n this.ex().gp_add_image(this.h, page, p, l, x, y, w, h, opacity)\n ) === 0\n );\n }\n /**\n * Draw SVG markup on a page as **native vector paths** (crisp at any zoom, not\n * rasterized), fitting its `viewBox` into the box `(x, y, w, h)` in PDF points\n * (origin bottom-left). Supports shapes, `<path>`, groups, transforms and\n * fill/stroke/opacity. Returns `false` if the SVG can't be parsed.\n */\n addSvg(page: number, svg: string, x: number, y: number, w: number, h: number): boolean {\n return (\n this.g._withStr(svg, (p, l) => this.ex().gp_add_svg(this.h, page, p, l, x, y, w, h)) === 0\n );\n }\n /** True redaction: delete content intersecting the region (no opaque cover by default). */\n redact(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n coverRgb = 0,\n hasCover = false\n ): number {\n return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);\n }\n\n // pages\n rotatePage(page: number, degrees: number): boolean {\n return this.ex().gp_rotate_page(this.h, page, degrees) === 0;\n }\n deletePage(page: number): boolean {\n return this.ex().gp_delete_page(this.h, page) === 0;\n }\n movePage(from: number, to: number): boolean {\n return this.ex().gp_move_page(this.h, from, to) === 0;\n }\n appendPages(otherPdf: Uint8Array): boolean {\n return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;\n }\n /** Extract the given 1-based page numbers into a NEW standalone PDF. */\n extractPages(pages: number[]): Uint8Array {\n return this.g._withU32(pages, (p, c) =>\n this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))\n );\n }\n /** Resize a page's MediaBox to `width`×`height` points. */\n resizePage(page: number, width: number, height: number): boolean {\n return this.ex().gp_resize_page(this.h, page, width, height) === 0;\n }\n /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */\n addPage(width: number, height: number, after = 0): number {\n return this.ex().gp_add_page(this.h, width, height, after);\n }\n /** Duplicate a page, inserting the copy right after it; returns the new page's id. */\n copyPage(page: number): number {\n return this.ex().gp_copy_page(this.h, page);\n }\n /** A page's size (points) and `/Rotate` (0/90/180/270). */\n pageInfo(page: number): PageInfo {\n return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));\n }\n\n // render\n renderPage(page: number, scale = 1): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));\n }\n\n // fonts — embed a downloaded TTF, then add real selectable text\n embedFont(family: string, ttf: Uint8Array): number {\n const b = enc.encode(family);\n const famPtr = this.g._toWasm(b);\n const obj = this.g._withBytes(ttf, (p, l) =>\n this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)\n );\n this.g._free(famPtr, b.length);\n return obj;\n }\n addText(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n fontObj: number,\n rgb = 0,\n opacity = 1,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_text(\n this.h,\n page,\n x,\n y,\n size,\n p,\n l,\n fontObj,\n RGB(rgb),\n opacity,\n rotationDeg\n )\n ) === 0\n );\n }\n /**\n * Stamp a standard-**Helvetica** watermark (no font embed needed): `text` at\n * `(x, y)`, rotated `rotationDeg`° counter-clockwise, `rgb` packed `0xRRGGBB`,\n * `opacity` 0–1. Pair with {@link GigaPdfEngine.helveticaWidth} for centring.\n */\n addWatermark(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n rgb = 0x808080,\n opacity = 0.25,\n rotationDeg = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_watermark(this.h, page, x, y, size, p, l, RGB(rgb), opacity, rotationDeg)\n ) === 0\n );\n }\n neededFonts(): string[] {\n return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));\n }\n /**\n * Extract an embedded font program by (fuzzy) `/BaseFont` name — so a host\n * editor can re-embed the document's own font when re-baking edited text and\n * keep the original glyphs. Returns the raw decoded bytes and the program\n * format (`truetype` embeds directly; `cff`/`type1` need a TTF conversion),\n * or `null` when nothing embedded matches.\n */\n extractFont(\n name: string\n ): { format: \"truetype\" | \"cff\" | \"type1\"; bytes: Uint8Array } | null {\n const buf = this.g._withStr(name, (p, l) =>\n this.g._buffer((o) => this.ex().gp_extract_font(this.h, p, l, o))\n );\n if (buf.length === 0) return null;\n const format = buf[0] === 1 ? \"truetype\" : buf[0] === 2 ? \"cff\" : \"type1\";\n return { format, bytes: buf.subarray(1) };\n }\n\n // convert PDF → X\n toText(): string {\n return this.g._str((o) => this.ex().gp_to_text(this.h, o));\n }\n toHtml(): string {\n return this.g._str((o) => this.ex().gp_to_html(this.h, o));\n }\n toDocx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));\n }\n toPptx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));\n }\n /** Convert to an editable OpenDocument Presentation (`.odp`). */\n toOdp(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odp(this.h, o));\n }\n toOdt(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));\n }\n toXlsx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));\n }\n toOds(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));\n }\n toRtf(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));\n }\n toPdfA(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));\n }\n\n // security\n /**\n * Serialize the document encrypted with the PDF Standard Security Handler.\n * Defaults to **AES-256 (R6)**. `fileId` is the document `/ID` (any stable\n * hex/string). For AES-256 a **secret 32-byte key** is required — it is taken\n * from `opts.keySeed` or generated with Web Crypto; RC4/AES-128 derive their\n * key from the password and ignore it.\n */\n saveEncrypted(\n password: string,\n fileId: string,\n opts: {\n ownerPassword?: string;\n algorithm?: \"rc4\" | \"aes128\" | \"aes256\";\n permissions?: number;\n keySeed?: Uint8Array;\n } = {}\n ): Uint8Array {\n const algo = opts.algorithm ?? \"aes256\";\n const algoCode = algo === \"rc4\" ? 0 : algo === \"aes128\" ? 1 : 2;\n const permissions = opts.permissions ?? -44;\n let key = opts.keySeed ?? new Uint8Array(0);\n if (algoCode === 2 && key.length < 32) {\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.getRandomValues) {\n throw new Error(\n \"AES-256 encryption needs Web Crypto (globalThis.crypto.getRandomValues) or an explicit opts.keySeed\"\n );\n }\n // `getRandomValues` requires an ArrayBuffer-backed view (not ArrayBufferLike).\n const fresh = new Uint8Array(32);\n c.getRandomValues(fresh);\n key = fresh;\n }\n return this.g._withStr(password, (pwP, pwL) =>\n this.g._withOptStr(opts.ownerPassword, (oP, oL) =>\n this.g._withStr(fileId, (idP, idL) =>\n this.g._withBytes(key, (kP, kL) =>\n this.g._buffer((o) =>\n this.ex().gp_save_encrypted(\n this.h,\n pwP,\n pwL,\n oP,\n oL,\n idP,\n idL,\n kP,\n kL,\n algoCode,\n permissions,\n o\n )\n )\n )\n )\n )\n );\n }\n /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */\n sign(fields: string, random: Uint8Array, keyBits = 2048): Uint8Array {\n const rPtr = this.g._toWasm(random);\n const out = this.g._withStr(fields, (fP, fL) =>\n this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))\n );\n this.g._free(rPtr, random.length);\n return out;\n }\n\n // metadata\n getMetadata(key: string): string {\n return this.g._withStr(key, (p, l) =>\n this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))\n );\n }\n /** Set an Info-dictionary entry (e.g. \"Title\", \"Author\"). */\n setMetadata(key: string, value: string): boolean {\n return (\n this.g._withStr(key, (kP, kL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))\n ) === 0\n );\n }\n\n // annotations (Acrobat-style markup)\n annotations(page: number): AnnotationInfo[] {\n return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));\n }\n removeAnnotation(page: number, index: number): boolean {\n return this.ex().gp_remove_annotation(this.h, page, index) === 0;\n }\n addSquare(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n stroke: number | null = 0,\n fill: number | null = null,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_square(\n this.h,\n page,\n x0,\n y0,\n x1,\n y1,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n addHighlight(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0xffff00): boolean {\n return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addLineAnnotation(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rgb = 0,\n lineWidth = 1\n ): boolean {\n return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;\n }\n addFreeText(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n text: string,\n fontSize = 12,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))\n ) === 0\n );\n }\n addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n /**\n * Add a text-markup annotation (`highlight` | `underline` | `strikeout` |\n * `squiggly`) spanning one or more `quads` (each `[x0, y0, x1, y1]` in PDF\n * user space, bottom-left origin — multi-quad covers wrapped text), with full\n * reviewer metadata. `date` is a PDF date string (e.g. `\"D:20260616T…Z\"`) — the\n * engine has no clock, so the host supplies it.\n */\n addMarkupAnnotation(\n page: number,\n subtype: \"highlight\" | \"underline\" | \"strikeout\" | \"squiggly\",\n quads: Array<[number, number, number, number]>,\n rgb: number,\n opacity: number,\n meta: { contents?: string; author?: string; id?: string; date?: string } = {}\n ): boolean {\n const sub =\n subtype === \"highlight\"\n ? \"Highlight\"\n : subtype === \"underline\"\n ? \"Underline\"\n : subtype === \"strikeout\"\n ? \"StrikeOut\"\n : \"Squiggly\";\n const packed = [\n sub,\n meta.contents ?? \"\",\n meta.author ?? \"\",\n meta.id ?? \"\",\n meta.date ?? \"\",\n ].join(\"\u001f\");\n const flat = quads.flat();\n return (\n this.g._withStr(packed, (mp, ml) =>\n this.g._withF64(flat, (qp, qc) =>\n this.ex().gp_add_markup_annotation(this.h, page, mp, ml, qp, qc, RGB(rgb), opacity)\n )\n ) === 0\n );\n }\n /**\n * Add a sticky-note (`/Text`) annotation: a badge at `rect` (`[x0,y0,x1,y1]`)\n * that opens a popup with `meta.contents`. `icon` is the named icon (`\"Note\"`,\n * `\"Comment\"`, …); `open` sets the initial popup state.\n */\n addTextNote(\n page: number,\n rect: [number, number, number, number],\n rgb: number,\n meta: { contents?: string; author?: string; id?: string; date?: string } = {},\n icon = \"Note\",\n open = false\n ): boolean {\n const packed = [\n meta.contents ?? \"\",\n meta.author ?? \"\",\n meta.id ?? \"\",\n meta.date ?? \"\",\n ].join(\"\u001f\");\n return (\n this.g._withStr(packed, (mp, ml) =>\n this.g._withStr(icon, (ip, il) =>\n this.ex().gp_add_text_note(\n this.h,\n page,\n rect[0],\n rect[1],\n rect[2],\n rect[3],\n mp,\n ml,\n ip,\n il,\n open ? 1 : 0,\n RGB(rgb)\n )\n )\n ) === 0\n );\n }\n /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */\n addInk(page: number, points: number[], rgb = 0, lineWidth = 1): boolean {\n return (\n this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) ===\n 0\n );\n }\n addStamp(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n label: string,\n rgb = 0xc00000\n ): boolean {\n return (\n this.g._withStr(label, (p, l) =>\n this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))\n ) === 0\n );\n }\n flattenAnnotations(page: number): number {\n return this.ex().gp_flatten_annotations(this.h, page);\n }\n /**\n * Flatten the interactive form: bake every field widget across all pages into\n * the page content and drop `/AcroForm`, so the document is no longer\n * fillable and {@link fields} returns empty afterwards. Returns the number of\n * widgets baked (0 when there is no form).\n */\n flattenForm(): number {\n return this.ex().gp_flatten_form(this.h);\n }\n\n // hyperlinks\n links(page: number): LinkInfo[] {\n return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));\n }\n addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean {\n return (\n this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) ===\n 0\n );\n }\n addGotoLink(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n targetPage: number\n ): boolean {\n return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;\n }\n\n // optional-content layers (calques): list + show/hide + lock/unlock + remove\n layers(): LayerInfo[] {\n return this.g._json((o) => this.ex().gp_layers_json(this.h, o));\n }\n /** Create a new (visible, unlocked) layer; returns its id (0 on error). */\n addLayer(name: string): number {\n return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));\n }\n setLayerVisibility(id: number, visible: boolean): boolean {\n return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;\n }\n setLayerLocked(id: number, locked: boolean): boolean {\n return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;\n }\n removeLayer(id: number): boolean {\n return this.ex().gp_remove_layer(this.h, id) === 0;\n }\n\n // outline (bookmarks)\n outline(): OutlineEntry[] {\n return this.g._json((o) => this.ex().gp_outline_json(this.h, o));\n }\n /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */\n setOutline(entries: OutlineEntry[]): boolean {\n const text = entries.map((e) => `${e.level}\\t${e.page ?? 0}\\t${e.title}`).join(\"\\n\");\n return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;\n }\n\n // interactive forms (AcroForm)\n fields(): FieldInfo[] {\n return this.g._json((o) => this.ex().gp_fields_json(this.h, o));\n }\n setTextField(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n setCheckbox(name: string, checked: boolean): boolean {\n return (\n this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0\n );\n }\n setRadio(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n /** Set a choice field's selection (multi-select list boxes accept several values). */\n setChoice(name: string, values: string[]): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(values.join(\"\\n\"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n\n // ── form field creation ──────────────────────────────────────────────────\n\n /**\n * Create a text field on `page` covering `rect` = `[x0, y0, x1, y1]` (PDF\n * user space). Options: `maxLen` character cap, `multiline`, `password`,\n * and visual `style`.\n */\n addTextField(\n page: number,\n name: string,\n rect: [number, number, number, number],\n value = \"\",\n opts: { maxLen?: number; multiline?: boolean; password?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) =>\n this.ex().gp_add_text_field(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], vP, vL,\n opts.maxLen ?? -1, opts.multiline ? 1 : 0, opts.password ? 1 : 0, ...st\n )\n )\n ) === 0\n );\n }\n\n /** Create a checkbox. `export` is the on-state name (default `On`). */\n addCheckbox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n checked = false,\n opts: { export?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(opts.export ?? \"On\", (eP, eL) =>\n this.ex().gp_add_checkbox(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], checked ? 1 : 0, eP, eL, ...st\n )\n )\n ) === 0\n );\n }\n\n /**\n * Create a radio-button group: one logical field whose `options` are the\n * individual buttons. `selected` is the initially-chosen export value.\n */\n addRadioGroup(\n page: number,\n name: string,\n options: RadioOption[],\n opts: { selected?: string; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n const exports = options.map((o) => o.export).join(\"\\n\");\n const rects = options.flatMap((o) => o.rect).join(\",\");\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(exports, (eP, eL) =>\n this.g._withStr(rects, (rP, rL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_radio_group(this.h, page, nP, nL, eP, eL, rP, rL, sP, sL, ...st)\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a drop-down combo box. `editable` permits values outside `options`. */\n addComboBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; editable?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_combo_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.editable ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n\n /** Create a scrolling list box. `multi` allows selecting several options. */\n addListBox(\n page: number,\n name: string,\n rect: [number, number, number, number],\n options: string[],\n opts: { selected?: string; multi?: boolean; style?: FieldStyle } = {}\n ): boolean {\n const st = styleArgs(opts.style);\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(options.join(\"\\n\"), (oP, oL) =>\n this.g._withStr(opts.selected ?? \"\", (sP, sL) =>\n this.ex().gp_add_list_box(\n this.h, page, nP, nL, rect[0], rect[1], rect[2], rect[3], oP, oL, sP, sL,\n opts.multi ? 1 : 0, ...st\n )\n )\n )\n ) === 0\n );\n }\n}\n"],"mappings":"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","names":[]}
package/gigapdf.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qrcommunication/gigapdf-lib",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "description": "TypeScript SDK for gigapdf-lib — a zero-dependency Rust→WASM PDF engine: read/edit/render, OCR, full-text search, AcroForm fields (read · fill · create), annotations, signing, encryption, PDF↔Office/HTML/RTF conversions, and a native HTML+CSS+JavaScript→PDF renderer (no headless browser; a suspendable JS VM gives lazy generators and spec-ordered async). Self-contained .wasm, no third-party runtime deps.",
5
5
  "license": "PolyForm-Noncommercial-1.0.0",
6
6
  "author": "Rony Licha / QR Communication",