@quillmark/wasm 0.127.0 → 0.129.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,100 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.129.0 - 2026-10-21
4
+
5
+ Upgrade path: [0.128 → 0.129](docs/migrations/0.128-to-0.129.md). Footnotes,
6
+ `$…$` math and definition lists render, where 0.128 imported each as text, so
7
+ markdown that spelled one changes what it renders and nothing reports it. A
8
+ save writes `quillmark/document@0.129.0`, which a 0.128 build refuses. A
9
+ one-line text value printed in a Typst plate carries no space at its edges,
10
+ and `ui.layout: flat` is deprecated.
11
+
12
+ ### Content
13
+
14
+ - feat(content)!: **`text[^1]` with a `[^1]: note` definition renders a
15
+ footnote**, stored as a `footnote` island holding the note as one table
16
+ cell and drawn through Typst's `footnote`. A definition nothing references,
17
+ a second definition of one label, a reference in a table cell, an alt text
18
+ or a note, and a block inside a note warn `parse::dropped_construct`
19
+ (`footnote`, `footnote[<block>]`). Export numbers the references in reading
20
+ order and writes each note after the body. (#2258)
21
+ - feat(content)!: **`$tex$` and `$$tex$$` render equations**, stored as a
22
+ `math` island holding the TeX under `tex`, `display: true` on the second.
23
+ The Typst backend translates the TeX to Typst math, warns
24
+ `typst::unsupported_tex` for a command outside its vocabulary, and embeds
25
+ Noto Sans Math, which answers to `New Computer Modern Math` for a quill
26
+ shipping no font of that family. An equation in a table cell, an alt text
27
+ or a note, or one whose TeX is blank, keeps its source and warns `math`.
28
+ Export escapes a text `$` wherever another could pair with it. (#2258)
29
+ - feat(content)!: **a paragraph with a `: description` line under it is a
30
+ definition list**, stored as a `term` line and a `description` container
31
+ and drawn through Typst's `terms.item`. Export writes `\:` before a
32
+ paragraph line opening `:`. (#2258)
33
+ - feat(content)!: **a save writes `quillmark/document@0.129.0`**, the first
34
+ tag that holds a footnote, an equation or a definition; a row under an older
35
+ tag loads as before, and a 0.128 build refuses one under the new tag. An
36
+ acroform quill declines all three constructs under
37
+ `backend::declined_construct`. (#2258)
38
+
39
+ ### Plates
40
+
41
+ - fix(typst)!: **a one-line text value printed in a Typst plate carries no
42
+ space at either edge**, so `Dear #qm.ink(qm.data, "name"),` renders "Dear
43
+ Mr. Babbage," where it rendered "Dear Mr. Babbage ,". A plate that trimmed
44
+ the spaces can drop the trim; one that leaned on them writes the space
45
+ itself. (#2262)
46
+
47
+ ### Schemas
48
+
49
+ - feat(core)!: **`ui.layout: flat` is deprecated** and warns
50
+ `quill::deprecated_flat` per field, naming its path; it still loads, and
51
+ `schema()` still echoes it. `schema()` no longer writes it on an object
52
+ alone in its legacy `ui.group`. A card-level field outside every group,
53
+ declared after a top-level object or a grouped field, warns
54
+ `quill::field_after_object`. (#2261)
55
+
56
+ ### Parsing
57
+
58
+ - fix(core): **a code fence inside a list item or block quote closes where
59
+ its container ends**, so it no longer shields a column-zero card below it,
60
+ and markers nested past the parser's depth limit read as text. (#2255)
61
+
62
+ ### Docs
63
+
64
+ - docs: **Creating Quills opens with `quillkit init`** and walks the starter
65
+ letter in studio, a quillkit & studio page names the verbs, and a glossary
66
+ defines the author's terms. (#2259)
67
+
68
+ ## v0.128.0 - 2026-10-21
69
+
70
+ Upgrade path: [0.127 → 0.128](docs/migrations/0.127-to-0.128.md). A quill
71
+ whose `requires` floor is above the running release fails to load as
72
+ `quill::requires_unmet`, where it failed as `quill::engine_too_old`, and a
73
+ host matching the old code stops matching. The Rust struct and the Python
74
+ class `Quillmark` are `Engine`, with no alias, so `use quillmark::Quillmark`
75
+ fails to compile and `from quillmark import Quillmark` fails to import. The
76
+ JavaScript `Engine` is unchanged.
77
+
78
+ ### API
79
+
80
+ - refactor(core)!: **a quill whose `requires` floor is above the running
81
+ release fails to load as `quill::requires_unmet`**, where it failed as
82
+ `quill::engine_too_old`. It is still the load's only error, and its message
83
+ still names the release the quill requires; a host matching the old code
84
+ stops matching, and matches both while a 0.126 or 0.127 host can load its
85
+ quills. (#2252, #2254)
86
+ - refactor!: **the Rust struct and the Python class `Quillmark` are
87
+ `Engine`**, the name the JavaScript surface already carries, with no alias.
88
+ Rename at the import and the constructor: `Engine::new()` in Rust,
89
+ `Engine()` in Python. Every method keeps its name and signature. (#2252)
90
+
91
+ ### Docs
92
+
93
+ - docs: **Quillmark is described as a schema-driven document framework**
94
+ across package descriptions, CLI help, crate docs, READMEs, user docs, and
95
+ canon, and copy says `Engine` or the render build where it said engine.
96
+ (#2250, #2252, #2253)
97
+
3
98
  ## v0.127.0 - 2026-10-20
4
99
 
5
100
  Upgrade path: [0.126 → 0.127](docs/migrations/0.126-to-0.127.md). An acroform
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`
@@ -179,7 +182,7 @@ const doc = Document.storageVersionOf(content)
179
182
  : Document.fromMarkdown(content);
180
183
  ```
181
184
 
182
- The `schema` value (`quillmark/document@0.124.0`) is the **model version**,
185
+ The `schema` value (`quillmark/document@0.129.0`) is the **model version**,
183
186
  not the running crate version. It is a hand-set constant, bumped only when
184
187
  the `Document` model itself changes, so every `0.124.x` patch release reads
185
188
  and writes that same value.
@@ -1,8 +1,9 @@
1
1
  # Third-party licenses
2
2
 
3
3
  The crates the workspace links, Quillmark's own included, grouped by license;
4
- then the notices those crates carry and the license of the embedded Roboto
5
- faces. Generated by `scripts/third-party-licenses.sh`; do not edit.
4
+ then the notices those crates carry and the licenses of the embedded Roboto
5
+ and Noto Sans Math faces. Generated by `scripts/third-party-licenses.sh`; do
6
+ not edit.
6
7
 
7
8
  ## BSD Zero Clause License
8
9
 
@@ -2152,14 +2153,14 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH RE
2152
2153
 
2153
2154
  ## Apache License 2.0
2154
2155
 
2155
- - quillmark-acroform 0.127.0 (https://github.com/borb-sh/quillmark)
2156
- - quillmark-typst 0.127.0 (https://github.com/borb-sh/quillmark)
2157
- - quillmark-cli 0.127.0 (https://github.com/borb-sh/quillmark)
2158
- - quillmark-python 0.127.0
2159
- - quillmark-content 0.127.0 (https://github.com/borb-sh/quillmark)
2160
- - quillmark-core 0.127.0 (https://github.com/borb-sh/quillmark)
2161
- - quillmark 0.127.0 (https://github.com/borb-sh/quillmark)
2162
- - quillmark-pdf 0.127.0 (https://github.com/borb-sh/quillmark)
2156
+ - quillmark-acroform 0.129.0 (https://github.com/borb-sh/quillmark)
2157
+ - quillmark-typst 0.129.0 (https://github.com/borb-sh/quillmark)
2158
+ - quillmark-cli 0.129.0 (https://github.com/borb-sh/quillmark)
2159
+ - quillmark-python 0.129.0
2160
+ - quillmark-content 0.129.0 (https://github.com/borb-sh/quillmark)
2161
+ - quillmark-core 0.129.0 (https://github.com/borb-sh/quillmark)
2162
+ - quillmark 0.129.0 (https://github.com/borb-sh/quillmark)
2163
+ - quillmark-pdf 0.129.0 (https://github.com/borb-sh/quillmark)
2163
2164
  - ciborium-io 0.2.2 (https://github.com/enarx/ciborium)
2164
2165
  - ciborium-ll 0.2.2 (https://github.com/enarx/ciborium)
2165
2166
  - ciborium 0.2.2 (https://github.com/enarx/ciborium)
@@ -6246,8 +6247,8 @@ limitations under the License.
6246
6247
 
6247
6248
  ## Apache License 2.0
6248
6249
 
6249
- - quillmark-wasm 0.127.0 (https://github.com/borb-sh/quillmark)
6250
- - quillmark-fixtures 0.127.0
6250
+ - quillmark-wasm 0.129.0 (https://github.com/borb-sh/quillmark)
6251
+ - quillmark-fixtures 0.129.0
6251
6252
  - arraydeque 0.5.1 (https://github.com/andylokandy/arraydeque)
6252
6253
  - codex 0.3.0 (https://github.com/typst/codex)
6253
6254
  - color 0.3.3 (https://github.com/linebender/color)
@@ -10540,6 +10541,104 @@ This license is copied below, and is also available with a FAQ at:
10540
10541
  https://openfontlicense.org
10541
10542
 
10542
10543
 
10544
+ -----------------------------------------------------------
10545
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10546
+ -----------------------------------------------------------
10547
+
10548
+ PREAMBLE
10549
+ The goals of the Open Font License (OFL) are to stimulate worldwide
10550
+ development of collaborative font projects, to support the font creation
10551
+ efforts of academic and linguistic communities, and to provide a free and
10552
+ open framework in which fonts may be shared and improved in partnership
10553
+ with others.
10554
+
10555
+ The OFL allows the licensed fonts to be used, studied, modified and
10556
+ redistributed freely as long as they are not sold by themselves. The
10557
+ fonts, including any derivative works, can be bundled, embedded,
10558
+ redistributed and/or sold with any software provided that any reserved
10559
+ names are not used by derivative works. The fonts and derivatives,
10560
+ however, cannot be released under any other type of license. The
10561
+ requirement for fonts to remain under this license does not apply
10562
+ to any document created using the fonts or their derivatives.
10563
+
10564
+ DEFINITIONS
10565
+ "Font Software" refers to the set of files released by the Copyright
10566
+ Holder(s) under this license and clearly marked as such. This may
10567
+ include source files, build scripts and documentation.
10568
+
10569
+ "Reserved Font Name" refers to any names specified as such after the
10570
+ copyright statement(s).
10571
+
10572
+ "Original Version" refers to the collection of Font Software components as
10573
+ distributed by the Copyright Holder(s).
10574
+
10575
+ "Modified Version" refers to any derivative made by adding to, deleting,
10576
+ or substituting -- in part or in whole -- any of the components of the
10577
+ Original Version, by changing formats or by porting the Font Software to a
10578
+ new environment.
10579
+
10580
+ "Author" refers to any designer, engineer, programmer, technical
10581
+ writer or other person who contributed to the Font Software.
10582
+
10583
+ PERMISSION & CONDITIONS
10584
+ Permission is hereby granted, free of charge, to any person obtaining
10585
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
10586
+ redistribute, and sell modified and unmodified copies of the Font
10587
+ Software, subject to the following conditions:
10588
+
10589
+ 1) Neither the Font Software nor any of its individual components,
10590
+ in Original or Modified Versions, may be sold by itself.
10591
+
10592
+ 2) Original or Modified Versions of the Font Software may be bundled,
10593
+ redistributed and/or sold with any software, provided that each copy
10594
+ contains the above copyright notice and this license. These can be
10595
+ included either as stand-alone text files, human-readable headers or
10596
+ in the appropriate machine-readable metadata fields within text or
10597
+ binary files as long as those fields can be easily viewed by the user.
10598
+
10599
+ 3) No Modified Version of the Font Software may use the Reserved Font
10600
+ Name(s) unless explicit written permission is granted by the corresponding
10601
+ Copyright Holder. This restriction only applies to the primary font name as
10602
+ presented to the users.
10603
+
10604
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
10605
+ Software shall not be used to promote, endorse or advertise any
10606
+ Modified Version, except to acknowledge the contribution(s) of the
10607
+ Copyright Holder(s) and the Author(s) or with their explicit written
10608
+ permission.
10609
+
10610
+ 5) The Font Software, modified or unmodified, in part or in whole,
10611
+ must be distributed entirely under this license, and must not be
10612
+ distributed under any other license. The requirement for fonts to
10613
+ remain under this license does not apply to any document created
10614
+ using the Font Software.
10615
+
10616
+ TERMINATION
10617
+ This license becomes null and void if any of the above conditions are
10618
+ not met.
10619
+
10620
+ DISCLAIMER
10621
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
10622
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
10623
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
10624
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
10625
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
10626
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
10627
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
10628
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
10629
+ OTHER DEALINGS IN THE FONT SOFTWARE.
10630
+ ~~~~
10631
+
10632
+ ## Noto Sans Math (embedded by quillmark-typst)
10633
+
10634
+ ~~~~text
10635
+ Copyright 2022 The Noto Project Authors (https://github.com/notofonts/math)
10636
+
10637
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
10638
+ This license is copied below, and is also available with a FAQ at:
10639
+ https://openfontlicense.org
10640
+
10641
+
10543
10642
  -----------------------------------------------------------
10544
10643
  SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10545
10644
  -----------------------------------------------------------
package/core/wasm.d.ts CHANGED
@@ -80,7 +80,8 @@ export type ContentLineKind =
80
80
  | { kind: "para" }
81
81
  | { kind: "heading"; attrs: { level: number } }
82
82
  | { kind: "code"; attrs?: { lang?: string } }
83
- | { kind: "rule" };
83
+ | { kind: "rule" }
84
+ | { kind: "term" };
84
85
 
85
86
  /** An ancestor block a line nests inside, outermost first. Closed like
86
87
  * `ContentLine.kind`.
@@ -110,6 +111,7 @@ export type ContentContainer =
110
111
  instance?: number;
111
112
  }
112
113
  | { container: "quote"; instance?: number }
114
+ | { container: "description"; instance?: number }
113
115
  | { container: "element"; attrs: ElementAttrs; instance?: number };
114
116
 
115
117
  /** A carrier element's name and attributes, one bag: `$name` is the part of
@@ -171,6 +173,19 @@ export interface ImageProps {
171
173
  alt: string;
172
174
  }
173
175
 
176
+ /** `props` of a `type: "footnote"` island: the note, shaped as one `TableCell`
177
+ * with no `\n` at either edge. The island's slot is the reference, inline in
178
+ * its paragraph. */
179
+ export type FootnoteProps = TableCell;
180
+
181
+ /** `props` of a `type: "math"` island: the equation's TeX, as written between
182
+ * its dollars, on one line with no edge whitespace. `display` is present and
183
+ * `true` on a `$$…$$` equation. */
184
+ export interface MathProps {
185
+ tex: string;
186
+ display?: true;
187
+ }
188
+
174
189
  /** A structured object occupying one island slot in `Content.text`. `type` is a
175
190
  * closed set, so `type === "table"` narrows `props` to `TableProps`. */
176
191
  export type ContentIsland = {
@@ -178,6 +193,8 @@ export type ContentIsland = {
178
193
  } & (
179
194
  | { type: "table"; props: TableProps }
180
195
  | { type: "image"; props: ImageProps }
196
+ | { type: "footnote"; props: FootnoteProps }
197
+ | { type: "math"; props: MathProps }
181
198
  );
182
199
 
183
200
  /**
@@ -568,7 +585,7 @@ export interface QuillSchema {
568
585
  /**
569
586
  * Identity snapshot mirroring the `quill:` section of `Quill.yaml`. The schema
570
587
  * lives on `Quill.schema`; output formats are a resolved-backend capability read
571
- * from `Quillmark.supportedFormats`, not part of this config snapshot.
588
+ * from `Engine.supportedFormats`, not part of this config snapshot.
572
589
  */
573
590
  export interface QuillMetadata {
574
591
  name: string;
@@ -981,7 +998,7 @@ export class Quill {
981
998
  toTree(): Map<string, Uint8Array>;
982
999
  /**
983
1000
  * Validate `doc` against this quill's schema, returning every diagnostic:
984
- * an error blocks a render, a warning does not. Forwards the engine's
1001
+ * an error blocks a render, a warning does not. Returns the schema's
985
1002
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
986
1003
  * backend's `backend::declined_construct`.
987
1004
  */
@@ -995,7 +1012,7 @@ export class Quill {
995
1012
  /**
996
1013
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
997
1014
  * output formats are a resolved-backend capability read from
998
- * `Quillmark.supportedFormats`, not part of this.
1015
+ * `Engine.supportedFormats`, not part of this.
999
1016
  */
1000
1017
  readonly metadata: QuillMetadata;
1001
1018
  /**
@@ -1021,8 +1038,8 @@ export function exportMarkdown(rt: Content): string;
1021
1038
  /**
1022
1039
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
1023
1040
  * 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
1041
+ * location, path and hint each on an indented line of its own. Core owns the
1042
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
1026
1043
  * rather than keeping a copy of the layout that drifts from the CLI's.
1027
1044
  *
1028
1045
  * 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.127.0",
4
- "description": "WebAssembly bindings for Quillmark, a schema-driven document engine",
3
+ "version": "0.129.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
@@ -80,7 +80,8 @@ export type ContentLineKind =
80
80
  | { kind: "para" }
81
81
  | { kind: "heading"; attrs: { level: number } }
82
82
  | { kind: "code"; attrs?: { lang?: string } }
83
- | { kind: "rule" };
83
+ | { kind: "rule" }
84
+ | { kind: "term" };
84
85
 
85
86
  /** An ancestor block a line nests inside, outermost first. Closed like
86
87
  * `ContentLine.kind`.
@@ -110,6 +111,7 @@ export type ContentContainer =
110
111
  instance?: number;
111
112
  }
112
113
  | { container: "quote"; instance?: number }
114
+ | { container: "description"; instance?: number }
113
115
  | { container: "element"; attrs: ElementAttrs; instance?: number };
114
116
 
115
117
  /** A carrier element's name and attributes, one bag: `$name` is the part of
@@ -171,6 +173,19 @@ export interface ImageProps {
171
173
  alt: string;
172
174
  }
173
175
 
176
+ /** `props` of a `type: "footnote"` island: the note, shaped as one `TableCell`
177
+ * with no `\n` at either edge. The island's slot is the reference, inline in
178
+ * its paragraph. */
179
+ export type FootnoteProps = TableCell;
180
+
181
+ /** `props` of a `type: "math"` island: the equation's TeX, as written between
182
+ * its dollars, on one line with no edge whitespace. `display` is present and
183
+ * `true` on a `$$…$$` equation. */
184
+ export interface MathProps {
185
+ tex: string;
186
+ display?: true;
187
+ }
188
+
174
189
  /** A structured object occupying one island slot in `Content.text`. `type` is a
175
190
  * closed set, so `type === "table"` narrows `props` to `TableProps`. */
176
191
  export type ContentIsland = {
@@ -178,6 +193,8 @@ export type ContentIsland = {
178
193
  } & (
179
194
  | { type: "table"; props: TableProps }
180
195
  | { type: "image"; props: ImageProps }
196
+ | { type: "footnote"; props: FootnoteProps }
197
+ | { type: "math"; props: MathProps }
181
198
  );
182
199
 
183
200
  /**
@@ -579,7 +596,7 @@ export interface QuillSchema {
579
596
  /**
580
597
  * Identity snapshot mirroring the `quill:` section of `Quill.yaml`. The schema
581
598
  * lives on `Quill.schema`; output formats are a resolved-backend capability read
582
- * from `Quillmark.supportedFormats`, not part of this config snapshot.
599
+ * from `Engine.supportedFormats`, not part of this config snapshot.
583
600
  */
584
601
  export interface QuillMetadata {
585
602
  name: string;
@@ -1032,6 +1049,35 @@ export class Document {
1032
1049
  readonly warnings: Diagnostic[];
1033
1050
  }
1034
1051
 
1052
+ /**
1053
+ * `Engine`: a backend registry and render dispatcher. Render build only:
1054
+ * the core build constructs and validates quills without it.
1055
+ */
1056
+ export class Engine {
1057
+ free(): void;
1058
+ [Symbol.dispose](): void;
1059
+ constructor();
1060
+ /**
1061
+ * Open a live render session for `doc` against `quill`'s backend, on the
1062
+ * render date `today` (`YYYY-MM-DD`, default the local date).
1063
+ */
1064
+ open(quill: Quill, doc: Document, today?: string | null): LiveSession;
1065
+ /**
1066
+ * Render `doc` against `quill` in one shot: `open` + `LiveSession.render`,
1067
+ * with every `quill.validate` warning in `warnings`, a decline among the
1068
+ * compile's and the rest ahead of them; the load's stay on `doc.warnings`.
1069
+ * An unset `output_format` falls back to the backend's first supported
1070
+ * format. `today` reads as on `open`.
1071
+ */
1072
+ render(quill: Quill, doc: Document, opts?: RenderOptions | null, today?: string | null): RenderResult;
1073
+ /**
1074
+ * The output formats `quill`'s backend can emit; resolves the backend but
1075
+ * compiles nothing. Throws `engine::backend_not_found` when no registered
1076
+ * backend matches the quill's declared one.
1077
+ */
1078
+ supportedFormats(quill: Quill): OutputFormat[];
1079
+ }
1080
+
1035
1081
  /**
1036
1082
  * Live render session: every read serves the current compile. `update(doc)`
1037
1083
  * recompiles a whole document in place, transactionally — on throw the reads
@@ -1240,7 +1286,7 @@ export class Quill {
1240
1286
  toTree(): Map<string, Uint8Array>;
1241
1287
  /**
1242
1288
  * Validate `doc` against this quill's schema, returning every diagnostic:
1243
- * an error blocks a render, a warning does not. Forwards the engine's
1289
+ * an error blocks a render, a warning does not. Returns the schema's
1244
1290
  * `validation::*`, a markdown string's `parse::dropped_construct` and the
1245
1291
  * backend's `backend::declined_construct`.
1246
1292
  */
@@ -1254,7 +1300,7 @@ export class Quill {
1254
1300
  /**
1255
1301
  * Identity snapshot of the `quill:` section of `Quill.yaml`. Pure config:
1256
1302
  * output formats are a resolved-backend capability read from
1257
- * `Quillmark.supportedFormats`, not part of this.
1303
+ * `Engine.supportedFormats`, not part of this.
1258
1304
  */
1259
1305
  readonly metadata: QuillMetadata;
1260
1306
  /**
@@ -1271,35 +1317,6 @@ export class Quill {
1271
1317
  readonly warnings: Diagnostic[];
1272
1318
  }
1273
1319
 
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
1320
  /**
1304
1321
  * Export canonical `Content` to its markdown projection. Throws if `rt` is not
1305
1322
  * canonical content.
@@ -1309,8 +1326,8 @@ export function exportMarkdown(rt: Content): string;
1309
1326
  /**
1310
1327
  * Render a diagnostic as the CLI and Python's `str(diagnostic)` render it:
1311
1328
  * 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
1329
+ * location, path and hint each on an indented line of its own. Core owns the
1330
+ * one printer, `fmt_pretty`, so a consumer surfacing diagnostics reads it here
1314
1331
  * rather than keeping a copy of the layout that drifts from the CLI's.
1315
1332
  *
1316
1333
  * Takes the `Diagnostic` shape every read hands back. Throws on a value that
@@ -1408,9 +1425,9 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
1408
1425
  export interface InitOutput {
1409
1426
  readonly memory: WebAssembly.Memory;
1410
1427
  readonly __wbg_document_free: (a: number, b: number) => void;
1428
+ readonly __wbg_engine_free: (a: number, b: number) => void;
1411
1429
  readonly __wbg_livesession_free: (a: number, b: number) => void;
1412
1430
  readonly __wbg_quill_free: (a: number, b: number) => void;
1413
- readonly __wbg_quillmark_free: (a: number, b: number) => void;
1414
1431
  readonly document__addCard: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
1415
1432
  readonly document__commitField: (a: number, b: number, c: number, d: number, e: number) => void;
1416
1433
  readonly document__commitFields: (a: number, b: number, c: number, d: number, e: number) => void;
@@ -1458,6 +1475,10 @@ export interface InitOutput {
1458
1475
  readonly document_toMarkdown: (a: number, b: number) => void;
1459
1476
  readonly document_toStored: (a: number, b: number) => void;
1460
1477
  readonly document_warnings: (a: number, b: number) => void;
1478
+ readonly engine_new: () => number;
1479
+ readonly engine_open: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
1480
+ readonly engine_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
1481
+ readonly engine_supportedFormats: (a: number, b: number, c: number) => void;
1461
1482
  readonly exportMarkdown: (a: number, b: number) => void;
1462
1483
  readonly formatDiagnostic: (a: number, b: number) => void;
1463
1484
  readonly formatDocPath: (a: number, b: number) => void;
@@ -1496,10 +1517,6 @@ export interface InitOutput {
1496
1517
  readonly quill_toTree: (a: number) => number;
1497
1518
  readonly quill_validate: (a: number, b: number, c: number) => void;
1498
1519
  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
1520
  readonly rebase: (a: number, b: number, c: number, d: number) => void;
1504
1521
  readonly start: () => void;
1505
1522
  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;
@@ -133,6 +133,8 @@ export type {
133
133
  ContentIsland,
134
134
  TableProps,
135
135
  ImageProps,
136
+ FootnoteProps,
137
+ MathProps,
136
138
  TableCell,
137
139
  CardInput,
138
140
  PathStep,
@@ -390,10 +392,12 @@ export interface ChangeSet {
390
392
 
391
393
  /**
392
394
  * 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(...)`.
395
+ * dynamically-imported backend build module, which is this package's own render
396
+ * build: its exports are the package's, hence `unknown`. Overriding `load`
397
+ * changes where the build loads from, never what loads. `formats` is the
398
+ * required static capability manifest, which is what makes
399
+ * `Engine.supportedFormats` free: it answers from it without loading a backend
400
+ * binary or cloning a quill. A malformed descriptor throws at `new Engine(...)`.
397
401
  */
398
402
  export interface BackendDescriptor {
399
403
  load: () => Promise<unknown>;
@@ -445,7 +449,7 @@ export declare class Engine {
445
449
  * `runtime::backend_trapped`, the `WebAssembly.RuntimeError` on `cause`, as
446
450
  * does a trap in {@link LiveSession}'s `update` / `render` / `paint`, and a
447
451
  * `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
452
+ * which JavaScript engines raise for a stack overflow inside wasm. The build's state is then undefined: discard the
449
453
  * realm.
450
454
  */
451
455
  render(quill: Quill, doc: Document, options?: RenderOptions, today?: string): Promise<RenderResult>;
@@ -334,7 +334,7 @@ function requireLocalQuill(quill, method) {
334
334
  // every container has an entry. An entry of `'*'` welds on the whole bag: an
335
335
  // element's attributes are open, its name among them.
336
336
 
337
- const WELD_KEYS = { list_item: ['ordered'], quote: [], element: '*' };
337
+ const WELD_KEYS = { list_item: ['ordered'], quote: [], description: [], element: '*' };
338
338
 
339
339
  /**
340
340
  * @param {import('../core/wasm.js').ContentContainer} a
@@ -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:0d37c944-85c7-4ae4-8218-57722be4d3be",
5
+ "serialNumber": "urn:uuid:b2190f90-f153-4583-a731-a32681d1de2e",
6
6
  "metadata": {
7
- "timestamp": "2026-10-20T19:06:43.590163321Z",
7
+ "timestamp": "2026-10-21T21:27:24.674790859Z",
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.127.0",
17
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.129.0",
18
18
  "name": "quillmark-wasm",
19
- "version": "0.127.0",
20
- "description": "WebAssembly bindings for Quillmark, a schema-driven document engine",
19
+ "version": "0.129.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.127.0?download_url=file://.",
27
+ "purl": "pkg:cargo/quillmark-wasm@0.129.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.127.0 bin-target-0",
37
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.129.0 bin-target-0",
38
38
  "name": "quillmark_wasm",
39
- "version": "0.127.0",
40
- "purl": "pkg:cargo/quillmark-wasm@0.127.0?download_url=file://.#src/lib.rs"
39
+ "version": "0.129.0",
40
+ "purl": "pkg:cargo/quillmark-wasm@0.129.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.127.0",
54
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.129.0",
55
55
  "name": "quillmark-acroform",
56
- "version": "0.127.0",
57
- "description": "Typst-free PDF-form backend for Quillmark: fills existing PDF forms via the quillmark-pdf stamping spine",
56
+ "version": "0.129.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.127.0?download_url=file://../../backends/acroform",
64
+ "purl": "pkg:cargo/quillmark-acroform@0.129.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.127.0",
82
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.129.0",
83
83
  "name": "quillmark-typst",
84
- "version": "0.127.0",
84
+ "version": "0.129.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.127.0?download_url=file://../../backends/typst",
92
+ "purl": "pkg:cargo/quillmark-typst@0.129.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.127.0",
110
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.0",
111
111
  "name": "quillmark-content",
112
- "version": "0.127.0",
112
+ "version": "0.129.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.127.0?download_url=file://../../content",
120
+ "purl": "pkg:cargo/quillmark-content@0.129.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.127.0",
134
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
135
135
  "name": "quillmark-core",
136
- "version": "0.127.0",
137
- "description": "Core types and functionality for the Quillmark schema-driven document engine",
136
+ "version": "0.129.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.127.0?download_url=file://../../core",
144
+ "purl": "pkg:cargo/quillmark-core@0.129.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.127.0",
162
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.129.0",
163
163
  "name": "quillmark",
164
- "version": "0.127.0",
165
- "description": "A schema-driven document engine: turn Markdown into a fully typeset document with a Quill",
164
+ "version": "0.129.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.127.0?download_url=file://../../quillmark",
172
+ "purl": "pkg:cargo/quillmark@0.129.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.127.0",
190
+ "bom-ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.129.0",
191
191
  "name": "quillmark-pdf",
192
- "version": "0.127.0",
192
+ "version": "0.129.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.127.0?download_url=file://../../quillmark-pdf",
200
+ "purl": "pkg:cargo/quillmark-pdf@0.129.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.127.0",
10337
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.129.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.127.0",
10341
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.127.0",
10342
- "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.127.0",
10340
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.0",
10341
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
10342
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.129.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.127.0",
10348
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.129.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.127.0",
10352
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.127.0",
10353
- "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.127.0",
10351
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.0",
10352
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
10353
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.129.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.127.0",
10365
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/bindings/wasm#quillmark-wasm@0.129.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.127.0",
10370
- "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.127.0",
10371
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.127.0",
10369
+ "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.129.0",
10370
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.0",
10371
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.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,20 +10379,21 @@
10379
10379
  ]
10380
10380
  },
10381
10381
  {
10382
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.127.0",
10382
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.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",
10386
10386
  "registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151",
10387
- "registry+https://github.com/rust-lang/crates.io-index#similar@3.2.0"
10387
+ "registry+https://github.com/rust-lang/crates.io-index#similar@3.2.0",
10388
+ "registry+https://github.com/rust-lang/crates.io-index#unicase@2.9.0"
10388
10389
  ]
10389
10390
  },
10390
10391
  {
10391
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.127.0",
10392
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
10392
10393
  "dependsOn": [
10393
10394
  "registry+https://github.com/rust-lang/crates.io-index#glob@0.3.4",
10394
10395
  "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.127.0",
10396
+ "path+file:///home/runner/work/quillmark/quillmark/crates/content#quillmark-content@0.129.0",
10396
10397
  "registry+https://github.com/rust-lang/crates.io-index#serde@1.0.229",
10397
10398
  "registry+https://github.com/rust-lang/crates.io-index#serde-saphyr@1.3.0",
10398
10399
  "registry+https://github.com/rust-lang/crates.io-index#serde_json@1.0.151",
@@ -10403,18 +10404,18 @@
10403
10404
  ]
10404
10405
  },
10405
10406
  {
10406
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.127.0",
10407
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark#0.129.0",
10407
10408
  "dependsOn": [
10408
- "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.127.0",
10409
- "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.127.0",
10410
- "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.127.0"
10409
+ "path+file:///home/runner/work/quillmark/quillmark/crates/backends/acroform#quillmark-acroform@0.129.0",
10410
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
10411
+ "path+file:///home/runner/work/quillmark/quillmark/crates/backends/typst#quillmark-typst@0.129.0"
10411
10412
  ]
10412
10413
  },
10413
10414
  {
10414
- "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.127.0",
10415
+ "ref": "path+file:///home/runner/work/quillmark/quillmark/crates/quillmark-pdf#0.129.0",
10415
10416
  "dependsOn": [
10416
10417
  "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.127.0",
10418
+ "path+file:///home/runner/work/quillmark/quillmark/crates/core#quillmark-core@0.129.0",
10418
10419
  "registry+https://github.com/rust-lang/crates.io-index#thiserror@2.0.21"
10419
10420
  ]
10420
10421
  },