@quillmark/wasm 0.126.2 → 0.128.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
@@ -1,5 +1,83 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.128.0 - 2026-10-21
4
+
5
+ Upgrade path: [0.127 → 0.128](docs/migrations/0.127-to-0.128.md). A quill
6
+ whose `requires` floor is above the running release fails to load as
7
+ `quill::requires_unmet`, where it failed as `quill::engine_too_old`, and a
8
+ host matching the old code stops matching. The Rust struct and the Python
9
+ class `Quillmark` are `Engine`, with no alias, so `use quillmark::Quillmark`
10
+ fails to compile and `from quillmark import Quillmark` fails to import. The
11
+ JavaScript `Engine` is unchanged.
12
+
13
+ ### API
14
+
15
+ - refactor(core)!: **a quill whose `requires` floor is above the running
16
+ release fails to load as `quill::requires_unmet`**, where it failed as
17
+ `quill::engine_too_old`. It is still the load's only error, and its message
18
+ still names the release the quill requires; a host matching the old code
19
+ stops matching, and matches both while a 0.126 or 0.127 host can load its
20
+ quills. (#2252, #2254)
21
+ - refactor!: **the Rust struct and the Python class `Quillmark` are
22
+ `Engine`**, the name the JavaScript surface already carries, with no alias.
23
+ Rename at the import and the constructor: `Engine::new()` in Rust,
24
+ `Engine()` in Python. Every method keeps its name and signature. (#2252)
25
+
26
+ ### Docs
27
+
28
+ - docs: **Quillmark is described as a schema-driven document framework**
29
+ across package descriptions, CLI help, crate docs, READMEs, user docs, and
30
+ canon, and copy says `Engine` or the render build where it said engine.
31
+ (#2250, #2252, #2253)
32
+
33
+ ## v0.127.0 - 2026-10-20
34
+
35
+ Upgrade path: [0.126 → 0.127](docs/migrations/0.126-to-0.127.md). An acroform
36
+ quill's field spec is `Form.yaml`, and one holding `form.yaml` fails to open,
37
+ so no acroform quill opens on both 0.126 and 0.127. A field box with no area
38
+ or wholly off its page fails to open, a baked appearance wraps and fits its
39
+ value and centres a one-line one, a field whose text its box cuts off or
40
+ whose font draws a character as `?` warns, and a bound field's `option:`
41
+ checks its own box for one enum value.
42
+
43
+ ### PDF forms
44
+
45
+ - feat(acroform)!: **an acroform quill's field spec is `Form.yaml`**,
46
+ capitalized as `Quill.yaml` is, where it was `form.yaml`; the contents need
47
+ no change. A quill holding `form.yaml`, alone or beside `Form.yaml`, fails
48
+ to open as the new `acroform::legacy_form_yaml`, whose hint names the
49
+ rename. There is no overlap window: 0.126 reports a `Form.yaml` quill as
50
+ `acroform::missing_form_spec`, so every acroform quill, and every tool that
51
+ writes one, moves with this release, and a quill declares
52
+ `requires: ">=0.127"`. (#2248)
53
+ - feat(acroform): **a bound field's `option:` names one of its enum's values,
54
+ and its widget is a checkbox of its own**, checked when the field holds
55
+ that value, so a printed form's box-per-answer question ticks one box. Its
56
+ `/TU` defaults to the field's description and the value. An `option:` on a
57
+ field that is not an enum, naming no value of it, or on a variant container
58
+ rather than its `.value`, fails to open as `acroform::invalid_option`. An
59
+ engine before 0.127 draws a dropdown in the box. (#2248)
60
+ - fix(acroform)!: **a `Form.yaml` field `rect` with no width or height, or
61
+ wholly off its page, fails to open as `acroform::invalid_field_rect`**,
62
+ naming the field and its rect, where it opened and rendered the value
63
+ nowhere. A box that only crosses its page's edge still loads. (#2245)
64
+ - fix(pdf): **a baked appearance wraps a multiline value and fits its box.**
65
+ A multiline value breaks at spaces into lines of the box's width, inside a
66
+ word wider than the box, and an auto-sized one steps down from its box's
67
+ size until its lines fit the box's height; an auto-sized one-line value or
68
+ choice shrinks to the box's width, down to 4 pt. Each ran past the box's
69
+ edge, cut off on the canvas and in any consumer drawing the baked stream.
70
+ (#2244)
71
+ - fix(pdf): **a one-line text value and a choice are centred in their box's
72
+ height**, the baseline a viewer centres a line on, where the baked
73
+ appearance set it a point under the box's top. (#2245)
74
+ - feat(acroform): **a field whose text its box still cuts off warns
75
+ `acroform::text_overflow`**, and **one holding a character the form's
76
+ base-14 WinAnsi font draws as `?` warns `acroform::unencodable_text`**,
77
+ with the count of such characters; `/V` keeps the value whole. Both update
78
+ with each session update. `quillmark_pdf::overflows` answers the first from
79
+ the sizing the appearance draws with. (#2245)
80
+
3
81
  ## v0.126.2 - 2026-10-19
4
82
 
5
83
  A `text` or `richtext` field caps its characters with `max:`, warning past
package/README.md CHANGED
@@ -18,8 +18,10 @@ handed out verbatim by `init`, so editor/validation code (`Quill.fromTree`,
18
18
  loaded until you render. The `Engine` hides everything else: the render build,
19
19
  carrying both backends (`typst`, `acroform`), is a private WASM binary with its
20
20
  own linear memory, lazily loaded on the first render. The Engine clones a
21
- `Quill` / `Document` into that memory as data and frees the clones: you never
22
- hold a backend object or cross a memory boundary yourself.
21
+ `Quill` / `Document` into that memory as data. It frees the `Document` clone
22
+ after each call and caches the `Quill` clone in a `WeakMap` keyed on that
23
+ `Quill`, so the clone lives as long as the `Quill` does. You never hold a backend
24
+ object or cross a memory boundary yourself.
23
25
 
24
26
  ## Installation
25
27
 
@@ -32,7 +34,7 @@ npm install @quillmark/wasm
32
34
  ```ts
33
35
  import { init, Engine } from "@quillmark/wasm";
34
36
 
35
- const { Quill, Document } = await init(); // see Initialization
37
+ const { Quill } = await init(); // see Initialization
36
38
 
37
39
  const quill = Quill.fromTree(tree); // no engine needed: build + validate
38
40
  const engine = new Engine(); // loads a backend lazily on first render
@@ -45,8 +47,8 @@ title: My Document
45
47
 
46
48
  # Hello`;
47
49
 
48
- const parsed = Document.fromMarkdown(markdown);
49
- const result = await engine.render(quill, parsed, { format: "pdf" });
50
+ const doc = quill.parse(markdown);
51
+ const result = await engine.render(quill, doc, { format: "pdf" });
50
52
  ```
51
53
 
52
54
  ## Initialization
@@ -102,8 +104,9 @@ A load failure surfaces as `runtime::init_failed`, whose hint names that line.
102
104
 
103
105
  ### `new Engine(options?)`
104
106
  Create the render dispatcher. Routes each quill to its backend by
105
- `quill.backendId`, lazily loads that backend binary, and renders: cloning the
106
- quill/document into the backend's memory and freeing the clones internally.
107
+ `quill.backendId`, lazily loads that backend binary, and renders against
108
+ clones in the backend's memory, freeing the document clone after each call and
109
+ caching the quill clone for as long as that `Quill` lives.
107
110
  `render`, `open`, `load`, and `supportedFormats` are **async** (the first call
108
111
  may load a backend). Pass `{ backends }` to register or override backend descriptors.
109
112
  Each entry is a descriptor (`{ [backendId]: { load, formats } }`) where `load`
@@ -2152,14 +2152,14 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH RE
2152
2152
 
2153
2153
  ## Apache License 2.0
2154
2154
 
2155
- - quillmark-acroform 0.126.2 (https://github.com/borb-sh/quillmark)
2156
- - quillmark-typst 0.126.2 (https://github.com/borb-sh/quillmark)
2157
- - quillmark-cli 0.126.2 (https://github.com/borb-sh/quillmark)
2158
- - quillmark-python 0.126.2
2159
- - quillmark-content 0.126.2 (https://github.com/borb-sh/quillmark)
2160
- - quillmark-core 0.126.2 (https://github.com/borb-sh/quillmark)
2161
- - quillmark 0.126.2 (https://github.com/borb-sh/quillmark)
2162
- - quillmark-pdf 0.126.2 (https://github.com/borb-sh/quillmark)
2155
+ - quillmark-acroform 0.128.0 (https://github.com/borb-sh/quillmark)
2156
+ - quillmark-typst 0.128.0 (https://github.com/borb-sh/quillmark)
2157
+ - quillmark-cli 0.128.0 (https://github.com/borb-sh/quillmark)
2158
+ - quillmark-python 0.128.0
2159
+ - quillmark-content 0.128.0 (https://github.com/borb-sh/quillmark)
2160
+ - quillmark-core 0.128.0 (https://github.com/borb-sh/quillmark)
2161
+ - quillmark 0.128.0 (https://github.com/borb-sh/quillmark)
2162
+ - quillmark-pdf 0.128.0 (https://github.com/borb-sh/quillmark)
2163
2163
  - ciborium-io 0.2.2 (https://github.com/enarx/ciborium)
2164
2164
  - ciborium-ll 0.2.2 (https://github.com/enarx/ciborium)
2165
2165
  - ciborium 0.2.2 (https://github.com/enarx/ciborium)
@@ -6246,8 +6246,8 @@ limitations under the License.
6246
6246
 
6247
6247
  ## Apache License 2.0
6248
6248
 
6249
- - quillmark-wasm 0.126.2 (https://github.com/borb-sh/quillmark)
6250
- - quillmark-fixtures 0.126.2
6249
+ - quillmark-wasm 0.128.0 (https://github.com/borb-sh/quillmark)
6250
+ - quillmark-fixtures 0.128.0
6251
6251
  - arraydeque 0.5.1 (https://github.com/andylokandy/arraydeque)
6252
6252
  - codex 0.3.0 (https://github.com/typst/codex)
6253
6253
  - color 0.3.3 (https://github.com/linebender/color)
package/core/wasm.d.ts CHANGED
@@ -568,7 +568,7 @@ export interface QuillSchema {
568
568
  /**
569
569
  * Identity snapshot mirroring the `quill:` section of `Quill.yaml`. The schema
570
570
  * lives on `Quill.schema`; output formats are a resolved-backend capability read
571
- * from `Quillmark.supportedFormats`, not part of this config snapshot.
571
+ * from `Engine.supportedFormats`, not part of this config snapshot.
572
572
  */
573
573
  export interface QuillMetadata {
574
574
  name: string;
@@ -981,7 +981,7 @@ export class Quill {
981
981
  toTree(): Map<string, Uint8Array>;
982
982
  /**
983
983
  * Validate `doc` against this quill's schema, returning every diagnostic:
984
- * an error blocks a render, a warning does not. Forwards the engine's
984
+ * an error blocks a render, a warning does not. Returns the schema's
985
985
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
986
986
  * backend's `backend::declined_construct`.
987
987
  */
@@ -995,7 +995,7 @@ export class Quill {
995
995
  /**
996
996
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
997
997
  * output formats are a resolved-backend capability read from
998
- * `Quillmark.supportedFormats`, not part of this.
998
+ * `Engine.supportedFormats`, not part of this.
999
999
  */
1000
1000
  readonly metadata: QuillMetadata;
1001
1001
  /**
@@ -1021,8 +1021,8 @@ export function exportMarkdown(rt: Content): string;
1021
1021
  /**
1022
1022
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
1023
1023
  * the severity tag and the message, the code parenthesised after them, then
1024
- * location, path and hint each on an indented line of its own. The engine
1025
- * owns the one printer, so a consumer surfacing diagnostics reads it here
1024
+ * location, path and hint each on an indented line of its own. Core owns the
1025
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
1026
1026
  * rather than keeping a copy of the layout that drifts from the CLI's.
1027
1027
  *
1028
1028
  * Takes the `Diagnostic` shape every read hands back. Throws on a value that
package/core/wasm.js CHANGED
@@ -1211,7 +1211,7 @@ export class Quill {
1211
1211
  * `FieldSource` rung it came from (`"authored" | "default" | "blank"`). The
1212
1212
  * card body is a `body` sibling on its card, never a row in `fields`, and
1213
1213
  * `null` when the kind enables no body. Value and provenance only;
1214
- * diagnostics stay `validate`'s. `today` reads as on `Quillmark.open`.
1214
+ * diagnostics stay `validate`'s. `today` reads as on `Engine.open`.
1215
1215
  * @param {Document} doc
1216
1216
  * @param {string | null} [today]
1217
1217
  * @returns {Resolved}
@@ -1364,7 +1364,7 @@ export class Quill {
1364
1364
  /**
1365
1365
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
1366
1366
  * output formats are a resolved-backend capability read from
1367
- * `Quillmark.supportedFormats`, not part of this.
1367
+ * `Engine.supportedFormats`, not part of this.
1368
1368
  * @returns {QuillMetadata}
1369
1369
  */
1370
1370
  get metadata() {
@@ -1511,7 +1511,7 @@ export class Quill {
1511
1511
  }
1512
1512
  /**
1513
1513
  * Validate `doc` against this quill's schema, returning every diagnostic:
1514
- * an error blocks a render, a warning does not. Forwards the engine's
1514
+ * an error blocks a render, a warning does not. Returns the schema's
1515
1515
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
1516
1516
  * backend's `backend::declined_construct`.
1517
1517
  * @param {Document} doc
@@ -1591,8 +1591,8 @@ export function exportMarkdown(rt) {
1591
1591
  /**
1592
1592
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
1593
1593
  * the severity tag and the message, the code parenthesised after them, then
1594
- * location, path and hint each on an indented line of its own. The engine
1595
- * owns the one printer, so a consumer surfacing diagnostics reads it here
1594
+ * location, path and hint each on an indented line of its own. Core owns the
1595
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
1596
1596
  * rather than keeping a copy of the layout that drifts from the CLI's.
1597
1597
  *
1598
1598
  * Takes the `Diagnostic` shape every read hands back. Throws on a value that
package/core/wasm_bg.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@quillmark/wasm",
3
- "version": "0.126.2",
4
- "description": "WebAssembly bindings for Quillmark, a schema-driven document engine",
3
+ "version": "0.128.0",
4
+ "description": "WebAssembly bindings for Quillmark, a schema-driven document framework",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
7
  "author": "Quillmark Contributors",
@@ -17,6 +17,7 @@
17
17
  "template",
18
18
  "schema",
19
19
  "forms",
20
+ "framework",
20
21
  "wasm"
21
22
  ],
22
23
  "engines": {
package/render/wasm.d.ts CHANGED
@@ -579,7 +579,7 @@ export interface QuillSchema {
579
579
  /**
580
580
  * Identity snapshot mirroring the `quill:` section of `Quill.yaml`. The schema
581
581
  * lives on `Quill.schema`; output formats are a resolved-backend capability read
582
- * from `Quillmark.supportedFormats`, not part of this config snapshot.
582
+ * from `Engine.supportedFormats`, not part of this config snapshot.
583
583
  */
584
584
  export interface QuillMetadata {
585
585
  name: string;
@@ -1032,6 +1032,35 @@ export class Document {
1032
1032
  readonly warnings: Diagnostic[];
1033
1033
  }
1034
1034
 
1035
+ /**
1036
+ * `Engine`: a backend registry and render dispatcher. Render build only:
1037
+ * the core build constructs and validates quills without it.
1038
+ */
1039
+ export class Engine {
1040
+ free(): void;
1041
+ [Symbol.dispose](): void;
1042
+ constructor();
1043
+ /**
1044
+ * Open a live render session for `doc` against `quill`'s backend, on the
1045
+ * render date `today` (`YYYY-MM-DD`, default the local date).
1046
+ */
1047
+ open(quill: Quill, doc: Document, today?: string | null): LiveSession;
1048
+ /**
1049
+ * Render `doc` against `quill` in one shot: `open` + `LiveSession.render`,
1050
+ * with every `quill.validate` warning in `warnings`, a decline among the
1051
+ * compile's and the rest ahead of them; the load's stay on `doc.warnings`.
1052
+ * An unset `output_format` falls back to the backend's first supported
1053
+ * format. `today` reads as on `open`.
1054
+ */
1055
+ render(quill: Quill, doc: Document, opts?: RenderOptions | null, today?: string | null): RenderResult;
1056
+ /**
1057
+ * The output formats `quill`'s backend can emit; resolves the backend but
1058
+ * compiles nothing. Throws `engine::backend_not_found` when no registered
1059
+ * backend matches the quill's declared one.
1060
+ */
1061
+ supportedFormats(quill: Quill): OutputFormat[];
1062
+ }
1063
+
1035
1064
  /**
1036
1065
  * Live render session: every read serves the current compile. `update(doc)`
1037
1066
  * recompiles a whole document in place, transactionally — on throw the reads
@@ -1240,7 +1269,7 @@ export class Quill {
1240
1269
  toTree(): Map<string, Uint8Array>;
1241
1270
  /**
1242
1271
  * Validate `doc` against this quill's schema, returning every diagnostic:
1243
- * an error blocks a render, a warning does not. Forwards the engine's
1272
+ * an error blocks a render, a warning does not. Returns the schema's
1244
1273
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
1245
1274
  * backend's `backend::declined_construct`.
1246
1275
  */
@@ -1254,7 +1283,7 @@ export class Quill {
1254
1283
  /**
1255
1284
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
1256
1285
  * output formats are a resolved-backend capability read from
1257
- * `Quillmark.supportedFormats`, not part of this.
1286
+ * `Engine.supportedFormats`, not part of this.
1258
1287
  */
1259
1288
  readonly metadata: QuillMetadata;
1260
1289
  /**
@@ -1271,35 +1300,6 @@ export class Quill {
1271
1300
  readonly warnings: Diagnostic[];
1272
1301
  }
1273
1302
 
1274
- /**
1275
- * Render engine: a backend registry and render dispatcher. Render build only:
1276
- * the core build constructs and validates quills without it.
1277
- */
1278
- export class Quillmark {
1279
- free(): void;
1280
- [Symbol.dispose](): void;
1281
- constructor();
1282
- /**
1283
- * Open a live render session for `doc` against `quill`'s backend, on the
1284
- * render date `today` (`YYYY-MM-DD`, default the local date).
1285
- */
1286
- open(quill: Quill, doc: Document, today?: string | null): LiveSession;
1287
- /**
1288
- * Render `doc` against `quill` in one shot: `open` + `LiveSession.render`,
1289
- * with every `quill.validate` warning in `warnings`, a decline among the
1290
- * compile's and the rest ahead of them; the load's stay on `doc.warnings`.
1291
- * An unset `output_format` falls back to the backend's first supported
1292
- * format. `today` reads as on `open`.
1293
- */
1294
- render(quill: Quill, doc: Document, opts?: RenderOptions | null, today?: string | null): RenderResult;
1295
- /**
1296
- * The output formats `quill`'s backend can emit; resolves the backend but
1297
- * compiles nothing. Throws `engine::backend_not_found` when no registered
1298
- * backend matches the quill's declared one.
1299
- */
1300
- supportedFormats(quill: Quill): OutputFormat[];
1301
- }
1302
-
1303
1303
  /**
1304
1304
  * Export canonical `Content` to its markdown projection. Throws if `rt` is not
1305
1305
  * canonical content.
@@ -1309,8 +1309,8 @@ export function exportMarkdown(rt: Content): string;
1309
1309
  /**
1310
1310
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
1311
1311
  * the severity tag and the message, the code parenthesised after them, then
1312
- * location, path and hint each on an indented line of its own. The engine
1313
- * owns the one printer, so a consumer surfacing diagnostics reads it here
1312
+ * location, path and hint each on an indented line of its own. Core owns the
1313
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
1314
1314
  * rather than keeping a copy of the layout that drifts from the CLI's.
1315
1315
  *
1316
1316
  * Takes the `Diagnostic` shape every read hands back. Throws on a value that
@@ -1408,9 +1408,9 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
1408
1408
  export interface InitOutput {
1409
1409
  readonly memory: WebAssembly.Memory;
1410
1410
  readonly __wbg_document_free: (a: number, b: number) => void;
1411
+ readonly __wbg_engine_free: (a: number, b: number) => void;
1411
1412
  readonly __wbg_livesession_free: (a: number, b: number) => void;
1412
1413
  readonly __wbg_quill_free: (a: number, b: number) => void;
1413
- readonly __wbg_quillmark_free: (a: number, b: number) => void;
1414
1414
  readonly document__addCard: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
1415
1415
  readonly document__commitField: (a: number, b: number, c: number, d: number, e: number) => void;
1416
1416
  readonly document__commitFields: (a: number, b: number, c: number, d: number, e: number) => void;
@@ -1458,6 +1458,10 @@ export interface InitOutput {
1458
1458
  readonly document_toMarkdown: (a: number, b: number) => void;
1459
1459
  readonly document_toStored: (a: number, b: number) => void;
1460
1460
  readonly document_warnings: (a: number, b: number) => void;
1461
+ readonly engine_new: () => number;
1462
+ readonly engine_open: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
1463
+ readonly engine_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
1464
+ readonly engine_supportedFormats: (a: number, b: number, c: number) => void;
1461
1465
  readonly exportMarkdown: (a: number, b: number) => void;
1462
1466
  readonly formatDiagnostic: (a: number, b: number) => void;
1463
1467
  readonly formatDocPath: (a: number, b: number) => void;
@@ -1496,10 +1500,6 @@ export interface InitOutput {
1496
1500
  readonly quill_toTree: (a: number) => number;
1497
1501
  readonly quill_validate: (a: number, b: number, c: number) => void;
1498
1502
  readonly quill_warnings: (a: number, b: number) => void;
1499
- readonly quillmark_new: () => number;
1500
- readonly quillmark_open: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
1501
- readonly quillmark_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
1502
- readonly quillmark_supportedFormats: (a: number, b: number, c: number) => void;
1503
1503
  readonly rebase: (a: number, b: number, c: number, d: number) => void;
1504
1504
  readonly start: () => void;
1505
1505
  readonly __wbindgen_export: (a: number, b: number) => number;
package/render/wasm.js CHANGED
@@ -1188,6 +1188,111 @@ export class Document {
1188
1188
  }
1189
1189
  if (Symbol.dispose) Document.prototype[Symbol.dispose] = Document.prototype.free;
1190
1190
 
1191
+ /**
1192
+ * `Engine`: a backend registry and render dispatcher. Render build only:
1193
+ * the core build constructs and validates quills without it.
1194
+ */
1195
+ export class Engine {
1196
+ __destroy_into_raw() {
1197
+ const ptr = this.__wbg_ptr;
1198
+ this.__wbg_ptr = 0;
1199
+ EngineFinalization.unregister(this);
1200
+ return ptr;
1201
+ }
1202
+ free() {
1203
+ const ptr = this.__destroy_into_raw();
1204
+ wasm.__wbg_engine_free(ptr, 0);
1205
+ }
1206
+ constructor() {
1207
+ const ret = wasm.engine_new();
1208
+ this.__wbg_ptr = ret;
1209
+ EngineFinalization.register(this, this.__wbg_ptr, this);
1210
+ return this;
1211
+ }
1212
+ /**
1213
+ * Open a live render session for `doc` against `quill`'s backend, on the
1214
+ * render date `today` (`YYYY-MM-DD`, default the local date).
1215
+ * @param {Quill} quill
1216
+ * @param {Document} doc
1217
+ * @param {string | null} [today]
1218
+ * @returns {LiveSession}
1219
+ */
1220
+ open(quill, doc, today) {
1221
+ try {
1222
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1223
+ _assertClass(quill, Quill);
1224
+ _assertClass(doc, Document);
1225
+ var ptr0 = isLikeNone(today) ? 0 : passStringToWasm0(today, wasm.__wbindgen_export, wasm.__wbindgen_export2);
1226
+ var len0 = WASM_VECTOR_LEN;
1227
+ wasm.engine_open(retptr, this.__wbg_ptr, quill.__wbg_ptr, doc.__wbg_ptr, ptr0, len0);
1228
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1229
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1230
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1231
+ if (r2) {
1232
+ throw takeObject(r1);
1233
+ }
1234
+ return LiveSession.__wrap(r0);
1235
+ } finally {
1236
+ wasm.__wbindgen_add_to_stack_pointer(16);
1237
+ }
1238
+ }
1239
+ /**
1240
+ * Render `doc` against `quill` in one shot: `open` + `LiveSession.render`,
1241
+ * with every `quill.validate` warning in `warnings`, a decline among the
1242
+ * compile's and the rest ahead of them; the load's stay on `doc.warnings`.
1243
+ * An unset `output_format` falls back to the backend's first supported
1244
+ * format. `today` reads as on `open`.
1245
+ * @param {Quill} quill
1246
+ * @param {Document} doc
1247
+ * @param {RenderOptions | null} [opts]
1248
+ * @param {string | null} [today]
1249
+ * @returns {RenderResult}
1250
+ */
1251
+ render(quill, doc, opts, today) {
1252
+ try {
1253
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1254
+ _assertClass(quill, Quill);
1255
+ _assertClass(doc, Document);
1256
+ var ptr0 = isLikeNone(today) ? 0 : passStringToWasm0(today, wasm.__wbindgen_export, wasm.__wbindgen_export2);
1257
+ var len0 = WASM_VECTOR_LEN;
1258
+ wasm.engine_render(retptr, this.__wbg_ptr, quill.__wbg_ptr, doc.__wbg_ptr, isLikeNone(opts) ? 0 : addHeapObject(opts), ptr0, len0);
1259
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1260
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1261
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1262
+ if (r2) {
1263
+ throw takeObject(r1);
1264
+ }
1265
+ return takeObject(r0);
1266
+ } finally {
1267
+ wasm.__wbindgen_add_to_stack_pointer(16);
1268
+ }
1269
+ }
1270
+ /**
1271
+ * The output formats `quill`'s backend can emit; resolves the backend but
1272
+ * compiles nothing. Throws `engine::backend_not_found` when no registered
1273
+ * backend matches the quill's declared one.
1274
+ * @param {Quill} quill
1275
+ * @returns {OutputFormat[]}
1276
+ */
1277
+ supportedFormats(quill) {
1278
+ try {
1279
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1280
+ _assertClass(quill, Quill);
1281
+ wasm.engine_supportedFormats(retptr, this.__wbg_ptr, quill.__wbg_ptr);
1282
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1283
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1284
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1285
+ if (r2) {
1286
+ throw takeObject(r1);
1287
+ }
1288
+ return takeObject(r0);
1289
+ } finally {
1290
+ wasm.__wbindgen_add_to_stack_pointer(16);
1291
+ }
1292
+ }
1293
+ }
1294
+ if (Symbol.dispose) Engine.prototype[Symbol.dispose] = Engine.prototype.free;
1295
+
1191
1296
  /**
1192
1297
  * Live render session: every read serves the current compile. `update(doc)`
1193
1298
  * recompiles a whole document in place, transactionally — on throw the reads
@@ -1555,7 +1660,7 @@ export class Quill {
1555
1660
  * `FieldSource` rung it came from (`"authored" | "default" | "blank"`). The
1556
1661
  * card body is a `body` sibling on its card, never a row in `fields`, and
1557
1662
  * `null` when the kind enables no body. Value and provenance only;
1558
- * diagnostics stay `validate`'s. `today` reads as on `Quillmark.open`.
1663
+ * diagnostics stay `validate`'s. `today` reads as on `Engine.open`.
1559
1664
  * @param {Document} doc
1560
1665
  * @param {string | null} [today]
1561
1666
  * @returns {Resolved}
@@ -1708,7 +1813,7 @@ export class Quill {
1708
1813
  /**
1709
1814
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
1710
1815
  * output formats are a resolved-backend capability read from
1711
- * `Quillmark.supportedFormats`, not part of this.
1816
+ * `Engine.supportedFormats`, not part of this.
1712
1817
  * @returns {QuillMetadata}
1713
1818
  */
1714
1819
  get metadata() {
@@ -1855,7 +1960,7 @@ export class Quill {
1855
1960
  }
1856
1961
  /**
1857
1962
  * Validate `doc` against this quill's schema, returning every diagnostic:
1858
- * an error blocks a render, a warning does not. Forwards the engine's
1963
+ * an error blocks a render, a warning does not. Returns the schema's
1859
1964
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
1860
1965
  * backend's `backend::declined_construct`.
1861
1966
  * @param {Document} doc
@@ -1901,111 +2006,6 @@ export class Quill {
1901
2006
  }
1902
2007
  if (Symbol.dispose) Quill.prototype[Symbol.dispose] = Quill.prototype.free;
1903
2008
 
1904
- /**
1905
- * Render engine: a backend registry and render dispatcher. Render build only:
1906
- * the core build constructs and validates quills without it.
1907
- */
1908
- export class Quillmark {
1909
- __destroy_into_raw() {
1910
- const ptr = this.__wbg_ptr;
1911
- this.__wbg_ptr = 0;
1912
- QuillmarkFinalization.unregister(this);
1913
- return ptr;
1914
- }
1915
- free() {
1916
- const ptr = this.__destroy_into_raw();
1917
- wasm.__wbg_quillmark_free(ptr, 0);
1918
- }
1919
- constructor() {
1920
- const ret = wasm.quillmark_new();
1921
- this.__wbg_ptr = ret;
1922
- QuillmarkFinalization.register(this, this.__wbg_ptr, this);
1923
- return this;
1924
- }
1925
- /**
1926
- * Open a live render session for `doc` against `quill`'s backend, on the
1927
- * render date `today` (`YYYY-MM-DD`, default the local date).
1928
- * @param {Quill} quill
1929
- * @param {Document} doc
1930
- * @param {string | null} [today]
1931
- * @returns {LiveSession}
1932
- */
1933
- open(quill, doc, today) {
1934
- try {
1935
- const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1936
- _assertClass(quill, Quill);
1937
- _assertClass(doc, Document);
1938
- var ptr0 = isLikeNone(today) ? 0 : passStringToWasm0(today, wasm.__wbindgen_export, wasm.__wbindgen_export2);
1939
- var len0 = WASM_VECTOR_LEN;
1940
- wasm.quillmark_open(retptr, this.__wbg_ptr, quill.__wbg_ptr, doc.__wbg_ptr, ptr0, len0);
1941
- var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1942
- var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1943
- var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1944
- if (r2) {
1945
- throw takeObject(r1);
1946
- }
1947
- return LiveSession.__wrap(r0);
1948
- } finally {
1949
- wasm.__wbindgen_add_to_stack_pointer(16);
1950
- }
1951
- }
1952
- /**
1953
- * Render `doc` against `quill` in one shot: `open` + `LiveSession.render`,
1954
- * with every `quill.validate` warning in `warnings`, a decline among the
1955
- * compile's and the rest ahead of them; the load's stay on `doc.warnings`.
1956
- * An unset `output_format` falls back to the backend's first supported
1957
- * format. `today` reads as on `open`.
1958
- * @param {Quill} quill
1959
- * @param {Document} doc
1960
- * @param {RenderOptions | null} [opts]
1961
- * @param {string | null} [today]
1962
- * @returns {RenderResult}
1963
- */
1964
- render(quill, doc, opts, today) {
1965
- try {
1966
- const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1967
- _assertClass(quill, Quill);
1968
- _assertClass(doc, Document);
1969
- var ptr0 = isLikeNone(today) ? 0 : passStringToWasm0(today, wasm.__wbindgen_export, wasm.__wbindgen_export2);
1970
- var len0 = WASM_VECTOR_LEN;
1971
- wasm.quillmark_render(retptr, this.__wbg_ptr, quill.__wbg_ptr, doc.__wbg_ptr, isLikeNone(opts) ? 0 : addHeapObject(opts), ptr0, len0);
1972
- var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1973
- var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1974
- var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1975
- if (r2) {
1976
- throw takeObject(r1);
1977
- }
1978
- return takeObject(r0);
1979
- } finally {
1980
- wasm.__wbindgen_add_to_stack_pointer(16);
1981
- }
1982
- }
1983
- /**
1984
- * The output formats `quill`'s backend can emit; resolves the backend but
1985
- * compiles nothing. Throws `engine::backend_not_found` when no registered
1986
- * backend matches the quill's declared one.
1987
- * @param {Quill} quill
1988
- * @returns {OutputFormat[]}
1989
- */
1990
- supportedFormats(quill) {
1991
- try {
1992
- const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
1993
- _assertClass(quill, Quill);
1994
- wasm.quillmark_supportedFormats(retptr, this.__wbg_ptr, quill.__wbg_ptr);
1995
- var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
1996
- var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
1997
- var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
1998
- if (r2) {
1999
- throw takeObject(r1);
2000
- }
2001
- return takeObject(r0);
2002
- } finally {
2003
- wasm.__wbindgen_add_to_stack_pointer(16);
2004
- }
2005
- }
2006
- }
2007
- if (Symbol.dispose) Quillmark.prototype[Symbol.dispose] = Quillmark.prototype.free;
2008
-
2009
2009
  /**
2010
2010
  * Export canonical `Content` to its markdown projection. Throws if `rt` is not
2011
2011
  * canonical content.
@@ -2040,8 +2040,8 @@ export function exportMarkdown(rt) {
2040
2040
  /**
2041
2041
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
2042
2042
  * the severity tag and the message, the code parenthesised after them, then
2043
- * location, path and hint each on an indented line of its own. The engine
2044
- * owns the one printer, so a consumer surfacing diagnostics reads it here
2043
+ * location, path and hint each on an indented line of its own. Core owns the
2044
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
2045
2045
  * rather than keeping a copy of the layout that drifts from the CLI's.
2046
2046
  *
2047
2047
  * Takes the `Diagnostic` shape every read hands back. Throws on a value that
@@ -2696,15 +2696,15 @@ function __wbg_get_imports() {
2696
2696
  const DocumentFinalization = (typeof FinalizationRegistry === 'undefined')
2697
2697
  ? { register: () => {}, unregister: () => {} }
2698
2698
  : new FinalizationRegistry(ptr => wasm.__wbg_document_free(ptr, 1));
2699
+ const EngineFinalization = (typeof FinalizationRegistry === 'undefined')
2700
+ ? { register: () => {}, unregister: () => {} }
2701
+ : new FinalizationRegistry(ptr => wasm.__wbg_engine_free(ptr, 1));
2699
2702
  const LiveSessionFinalization = (typeof FinalizationRegistry === 'undefined')
2700
2703
  ? { register: () => {}, unregister: () => {} }
2701
2704
  : new FinalizationRegistry(ptr => wasm.__wbg_livesession_free(ptr, 1));
2702
2705
  const QuillFinalization = (typeof FinalizationRegistry === 'undefined')
2703
2706
  ? { register: () => {}, unregister: () => {} }
2704
2707
  : new FinalizationRegistry(ptr => wasm.__wbg_quill_free(ptr, 1));
2705
- const QuillmarkFinalization = (typeof FinalizationRegistry === 'undefined')
2706
- ? { register: () => {}, unregister: () => {} }
2707
- : new FinalizationRegistry(ptr => wasm.__wbg_quillmark_free(ptr, 1));
2708
2708
 
2709
2709
  function addHeapObject(obj) {
2710
2710
  if (heap_next === heap.length) heap.push(heap.length + 1);
Binary file
@@ -2,9 +2,9 @@
2
2
  /* eslint-disable */
3
3
  export const memory: WebAssembly.Memory;
4
4
  export const __wbg_document_free: (a: number, b: number) => void;
5
+ export const __wbg_engine_free: (a: number, b: number) => void;
5
6
  export const __wbg_livesession_free: (a: number, b: number) => void;
6
7
  export const __wbg_quill_free: (a: number, b: number) => void;
7
- export const __wbg_quillmark_free: (a: number, b: number) => void;
8
8
  export const document__addCard: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
9
9
  export const document__commitField: (a: number, b: number, c: number, d: number, e: number) => void;
10
10
  export const document__commitFields: (a: number, b: number, c: number, d: number, e: number) => void;
@@ -52,6 +52,10 @@ export const document_toAnnotatedMarkdown: (a: number, b: number) => void;
52
52
  export const document_toMarkdown: (a: number, b: number) => void;
53
53
  export const document_toStored: (a: number, b: number) => void;
54
54
  export const document_warnings: (a: number, b: number) => void;
55
+ export const engine_new: () => number;
56
+ export const engine_open: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
57
+ export const engine_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
58
+ export const engine_supportedFormats: (a: number, b: number, c: number) => void;
55
59
  export const exportMarkdown: (a: number, b: number) => void;
56
60
  export const formatDiagnostic: (a: number, b: number) => void;
57
61
  export const formatDocPath: (a: number, b: number) => void;
@@ -90,10 +94,6 @@ export const quill_seedMain: (a: number, b: number) => void;
90
94
  export const quill_toTree: (a: number) => number;
91
95
  export const quill_validate: (a: number, b: number, c: number) => void;
92
96
  export const quill_warnings: (a: number, b: number) => void;
93
- export const quillmark_new: () => number;
94
- export const quillmark_open: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
95
- export const quillmark_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
96
- export const quillmark_supportedFormats: (a: number, b: number, c: number) => void;
97
97
  export const rebase: (a: number, b: number, c: number, d: number) => void;
98
98
  export const start: () => void;
99
99
  export const __wbindgen_export: (a: number, b: number) => number;
@@ -390,10 +390,12 @@ export interface ChangeSet {
390
390
 
391
391
  /**
392
392
  * A backend registry entry. `load` is the lazy thunk returning the
393
- * dynamically-imported backend build module; `formats` is the required static
394
- * capability manifest, which is what makes `Engine.supportedFormats` free: it
395
- * answers from it without loading a backend binary or cloning a quill. A
396
- * malformed descriptor throws at `new Engine(...)`.
393
+ * dynamically-imported backend build module, which is this package's own render
394
+ * build: its exports are the package's, hence `unknown`. Overriding `load`
395
+ * changes where the build loads from, never what loads. `formats` is the
396
+ * required static capability manifest, which is what makes
397
+ * `Engine.supportedFormats` free: it answers from it without loading a backend
398
+ * binary or cloning a quill. A malformed descriptor throws at `new Engine(...)`.
397
399
  */
398
400
  export interface BackendDescriptor {
399
401
  load: () => Promise<unknown>;
@@ -445,7 +447,7 @@ export declare class Engine {
445
447
  * `runtime::backend_trapped`, the `WebAssembly.RuntimeError` on `cause`, as
446
448
  * does a trap in {@link LiveSession}'s `update` / `render` / `paint`, and a
447
449
  * `RangeError` or Firefox's `InternalError` for stack or memory exhaustion,
448
- * which engines raise for a stack overflow inside wasm. The build's state is then undefined: discard the
450
+ * which JavaScript engines raise for a stack overflow inside wasm. The build's state is then undefined: discard the
449
451
  * realm.
450
452
  */
451
453
  render(quill: Quill, doc: Document, options?: RenderOptions, today?: string): Promise<RenderResult>;
@@ -556,7 +556,7 @@ export class Engine {
556
556
 
557
557
  let engine = this.#engines.get(load);
558
558
  if (!engine) {
559
- engine = new mod.Quillmark();
559
+ engine = new mod.Engine();
560
560
  this.#engines.set(load, engine);
561
561
  }
562
562
  return { mod, engine };
@@ -589,7 +589,7 @@ export class Engine {
589
589
 
590
590
  /**
591
591
  * Materialize the backend-memory clones for `quill` + `doc` in `backendId`'s
592
- * memory and run `fn` against the backend engine. Only `render`/`open` call
592
+ * memory and run `fn` against the backend. Only `render`/`open` call
593
593
  * this, so `doc` is always present.
594
594
  *
595
595
  * OWNERSHIP WINDOW: both caller handles are snapshotted (`doc.toStored()`,
@@ -678,9 +678,8 @@ export class Engine {
678
678
  }
679
679
 
680
680
  /**
681
- * Thin wrapper over a backend's live render session. The quill/document clones
682
- * it was opened from have already been freed: the session retains what `update`
683
- * needs.
681
+ * Thin wrapper over a backend's live render session. The document clone it was
682
+ * opened from has already been freed: the session retains what `update` needs.
684
683
  */
685
684
  export class LiveSession {
686
685
  /**
package/sbom.cdx.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.5",
4
4
  "version": 1,
5
- "serialNumber": "urn:uuid:5e3c9c1c-774a-436d-afef-011825184da4",
5
+ "serialNumber": "urn:uuid:1043ed1d-f769-49b6-ad4a-cf23d2702ebf",
6
6
  "metadata": {
7
- "timestamp": "2026-10-19T01:26:13.385285950Z",
7
+ "timestamp": "2026-10-21T17:35:53.828174476Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "CycloneDX",
@@ -14,17 +14,17 @@
14
14
  ],
15
15
  "component": {
16
16
  "type": "library",
17
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.126.2",
17
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.128.0",
18
18
  "name": "quillmark-wasm",
19
- "version": "0.126.2",
20
- "description": "WebAssembly bindings for Quillmark, a schema-driven document engine",
19
+ "version": "0.128.0",
20
+ "description": "WebAssembly bindings for Quillmark, a schema-driven document framework",
21
21
  "scope": "required",
22
22
  "licenses": [
23
23
  {
24
24
  "expression": "Apache-2.0"
25
25
  }
26
26
  ],
27
- "purl": "pkg:cargo/quillmark-wasm@0.126.2?download_url=file://.",
27
+ "purl": "pkg:cargo/quillmark-wasm@0.128.0?download_url=file://.",
28
28
  "externalReferences": [
29
29
  {
30
30
  "type": "vcs",
@@ -34,10 +34,10 @@
34
34
  "components": [
35
35
  {
36
36
  "type": "library",
37
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.126.2 bin-target-0",
37
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.128.0 bin-target-0",
38
38
  "name": "quillmark_wasm",
39
- "version": "0.126.2",
40
- "purl": "pkg:cargo/quillmark-wasm@0.126.2?download_url=file://.#src/lib.rs"
39
+ "version": "0.128.0",
40
+ "purl": "pkg:cargo/quillmark-wasm@0.128.0?download_url=file://.#src/lib.rs"
41
41
  }
42
42
  ]
43
43
  },
@@ -51,17 +51,17 @@
51
51
  "components": [
52
52
  {
53
53
  "type": "library",
54
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.126.2",
54
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.128.0",
55
55
  "name": "quillmark-acroform",
56
- "version": "0.126.2",
57
- "description": "Typst-free PDF-form backend for Quillmark: fills existing PDF forms via the quillmark-pdf stamping spine",
56
+ "version": "0.128.0",
57
+ "description": "Typst-free acroform backend for Quillmark: fills existing PDF forms via the quillmark-pdf stamping spine",
58
58
  "scope": "required",
59
59
  "licenses": [
60
60
  {
61
61
  "expression": "Apache-2.0"
62
62
  }
63
63
  ],
64
- "purl": "pkg:cargo/quillmark-acroform@0.126.2?download_url=file://../../backends/acroform",
64
+ "purl": "pkg:cargo/quillmark-acroform@0.128.0?download_url=file://../../backends/acroform",
65
65
  "externalReferences": [
66
66
  {
67
67
  "type": "documentation",
@@ -79,9 +79,9 @@
79
79
  },
80
80
  {
81
81
  "type": "library",
82
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.126.2",
82
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.128.0",
83
83
  "name": "quillmark-typst",
84
- "version": "0.126.2",
84
+ "version": "0.128.0",
85
85
  "description": "Typst backend for Quillmark",
86
86
  "scope": "required",
87
87
  "licenses": [
@@ -89,7 +89,7 @@
89
89
  "expression": "Apache-2.0"
90
90
  }
91
91
  ],
92
- "purl": "pkg:cargo/quillmark-typst@0.126.2?download_url=file://../../backends/typst",
92
+ "purl": "pkg:cargo/quillmark-typst@0.128.0?download_url=file://../../backends/typst",
93
93
  "externalReferences": [
94
94
  {
95
95
  "type": "documentation",
@@ -107,9 +107,9 @@
107
107
  },
108
108
  {
109
109
  "type": "library",
110
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
110
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
111
111
  "name": "quillmark-content",
112
- "version": "0.126.2",
112
+ "version": "0.128.0",
113
113
  "description": "Content model (splice-shaped USV text with line attributes, marks, and islands), canonical serialization, edit deltas, and richtext/plaintext codecs for Quillmark",
114
114
  "scope": "required",
115
115
  "licenses": [
@@ -117,7 +117,7 @@
117
117
  "expression": "Apache-2.0"
118
118
  }
119
119
  ],
120
- "purl": "pkg:cargo/quillmark-content@0.126.2?download_url=file://../../content",
120
+ "purl": "pkg:cargo/quillmark-content@0.128.0?download_url=file://../../content",
121
121
  "externalReferences": [
122
122
  {
123
123
  "type": "website",
@@ -131,17 +131,17 @@
131
131
  },
132
132
  {
133
133
  "type": "library",
134
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
134
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
135
135
  "name": "quillmark-core",
136
- "version": "0.126.2",
137
- "description": "Core types and functionality for the Quillmark schema-driven document engine",
136
+ "version": "0.128.0",
137
+ "description": "Core types and functionality for the Quillmark schema-driven document framework",
138
138
  "scope": "required",
139
139
  "licenses": [
140
140
  {
141
141
  "expression": "Apache-2.0"
142
142
  }
143
143
  ],
144
- "purl": "pkg:cargo/quillmark-core@0.126.2?download_url=file://../../core",
144
+ "purl": "pkg:cargo/quillmark-core@0.128.0?download_url=file://../../core",
145
145
  "externalReferences": [
146
146
  {
147
147
  "type": "documentation",
@@ -159,17 +159,17 @@
159
159
  },
160
160
  {
161
161
  "type": "library",
162
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.126.2",
162
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.128.0",
163
163
  "name": "quillmark",
164
- "version": "0.126.2",
165
- "description": "A schema-driven document engine: turn Markdown into a fully typeset document with a Quill",
164
+ "version": "0.128.0",
165
+ "description": "A schema-driven document framework: turn Markdown into a fully typeset document with a quill",
166
166
  "scope": "required",
167
167
  "licenses": [
168
168
  {
169
169
  "expression": "Apache-2.0"
170
170
  }
171
171
  ],
172
- "purl": "pkg:cargo/quillmark@0.126.2?download_url=file://../../quillmark",
172
+ "purl": "pkg:cargo/quillmark@0.128.0?download_url=file://../../quillmark",
173
173
  "externalReferences": [
174
174
  {
175
175
  "type": "documentation",
@@ -187,9 +187,9 @@
187
187
  },
188
188
  {
189
189
  "type": "library",
190
- "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.126.2",
190
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.128.0",
191
191
  "name": "quillmark-pdf",
192
- "version": "0.126.2",
192
+ "version": "0.128.0",
193
193
  "description": "Typst-free AcroForm stamping spine for Quillmark: (base_pdf, &[FieldSpec]) -> stamped PDF + regions",
194
194
  "scope": "required",
195
195
  "licenses": [
@@ -197,7 +197,7 @@
197
197
  "expression": "Apache-2.0"
198
198
  }
199
199
  ],
200
- "purl": "pkg:cargo/quillmark-pdf@0.126.2?download_url=file://../../quillmark-pdf",
200
+ "purl": "pkg:cargo/quillmark-pdf@0.128.0?download_url=file://../../quillmark-pdf",
201
201
  "externalReferences": [
202
202
  {
203
203
  "type": "documentation",
@@ -10334,23 +10334,23 @@
10334
10334
  ],
10335
10335
  "dependencies": [
10336
10336
  {
10337
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.126.2",
10337
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.128.0",
10338
10338
  "dependsOn": [
10339
10339
  "registry+https://github.com/rust-lang/crates.io-index#hayro@0.8.0",
10340
- "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
10341
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10342
- "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.126.2",
10340
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
10341
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10342
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.128.0",
10343
10343
  "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229",
10344
10344
  "registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151"
10345
10345
  ]
10346
10346
  },
10347
10347
  {
10348
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.126.2",
10348
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.128.0",
10349
10349
  "dependsOn": [
10350
10350
  "registry+https://github.com/rust-lang/crates.io-index#comemo@0.5.1",
10351
- "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
10352
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10353
- "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.126.2",
10351
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
10352
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10353
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.128.0",
10354
10354
  "registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151",
10355
10355
  "registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.21",
10356
10356
  "registry+https://github.com/rust-lang/crates.io-index#toml@1.1.6+spec-1.1.0",
@@ -10362,13 +10362,13 @@
10362
10362
  ]
10363
10363
  },
10364
10364
  {
10365
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.126.2",
10365
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.128.0",
10366
10366
  "dependsOn": [
10367
10367
  "registry+https://github.com/rust-lang/crates.io-index#console_error_panic_hook@0.1.7",
10368
10368
  "registry+https://github.com/rust-lang/crates.io-index#js-sys@0.3.106",
10369
- "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.126.2",
10370
- "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
10371
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10369
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.128.0",
10370
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
10371
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10372
10372
  "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229",
10373
10373
  "registry+https://github.com/rust-lang/crates.io-index#serde-wasm-bindgen@0.6.5",
10374
10374
  "registry+https://github.com/rust-lang/crates.io-index#serde_bytes@0.11.19",
@@ -10379,7 +10379,7 @@
10379
10379
  ]
10380
10380
  },
10381
10381
  {
10382
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
10382
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
10383
10383
  "dependsOn": [
10384
10384
  "registry+https://github.com/rust-lang/crates.io-index#pulldown-cmark@0.13.4",
10385
10385
  "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229",
@@ -10388,11 +10388,11 @@
10388
10388
  ]
10389
10389
  },
10390
10390
  {
10391
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10391
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10392
10392
  "dependsOn": [
10393
10393
  "registry+https://github.com/rust-lang/crates.io-index#glob@0.3.4",
10394
10394
  "registry+https://github.com/rust-lang/crates.io-index#indexmap@2.14.2",
10395
- "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.126.2",
10395
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.128.0",
10396
10396
  "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229",
10397
10397
  "registry+https://github.com/rust-lang/crates.io-index#serde-saphyr@1.3.0",
10398
10398
  "registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151",
@@ -10403,18 +10403,18 @@
10403
10403
  ]
10404
10404
  },
10405
10405
  {
10406
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.126.2",
10406
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.128.0",
10407
10407
  "dependsOn": [
10408
- "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.126.2",
10409
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10410
- "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.126.2"
10408
+ "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.128.0",
10409
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10410
+ "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.128.0"
10411
10411
  ]
10412
10412
  },
10413
10413
  {
10414
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.126.2",
10414
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.128.0",
10415
10415
  "dependsOn": [
10416
10416
  "registry+https://github.com/rust-lang/crates.io-index#pdf-writer@0.15.0",
10417
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.126.2",
10417
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.128.0",
10418
10418
  "registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.21"
10419
10419
  ]
10420
10420
  },