v0.86.0
Documents now render even when incomplete, the canonical card-yaml fence
becomes a bare ~~~, and the way placeholder/illustrative values are
produced is reworked. This release also fixes two markdown→Typst
conversion bugs and stamps a PDF /Producer field.
Breaking changes
- Bare
~~~is now the canonical card-yaml fence (was~~~card-yaml)
(#662). Existing~~~card-yamldocuments still parse, butto_markdown
re-emits the bare~~~form, so a document's canonical bytes change on
its first re-emit (relevant if you content-hash or byte-compare emitted
markdown, or store blueprint goldens). A side effect: a column-zero
~~~fence in a prose body is now read as a card-yaml block — use a
backtick fence or a non-card-yamlinfo string (e.g.~~~rust) for a
literal code block. Full details and corpus-migration steps:
docs/migrations/0.85-to-0.86.md. fill_blueprint()removed fromquillmark_coreandquillmark,
along with its re-exports (#657, #665). Callers no longer post-process a
blueprint string: fillable/illustrative documents come from
QuillConfig::example(), and the render path fills placeholders itself
(see below).
Behavioral changes
- Incomplete documents render instead of erroring (#665). An absent
Must Fill field is no longer a render error. On the render path each
schema field resolves to its authored value, else itsdefault:, else a
type-empty zero value — applied to the plate projection only, never
persisted to the document. Only malformed input stays fatal: a surviving
<must-fill>sentinel, or a value that won't coerce/validate.
quill.form(doc)still reports completeness independently of the render
gate. defaultvsexampleclarified (#665, #663, #658).defaultis the
value most authors want and is interpolated when a field is omitted (an
authored value always wins);exampledocuments a field's shape only and
never renders into output. Preview and illustrative fills now draw from a
field'sexample:when present, falling back to the leanest type-valid
value ("",0,false,[],{}, first enum variant, empty body).
Markdown → Typst fixes (#661)
- Code is now emitted as
#raw(...)with a string literal instead of a
backtick fence. This fixes fenced or inline code whose content contained
a run of three-or-more backticks, which previously closed the block early
and rendered as markup. - Ordered-list start numbers are preserved — a list written
3./4.now
renders starting at 3 instead of restarting at 1.
New API
QuillConfig::example(), plusexamplegetters on the Python and WASM
bindings (#665).quillmark_core::zero_value— the single source of truth for a field's
type-minimal value, shared by blueprint emission and the render path
(#665).RenderOptions.produceron the core, WASM, and Python render APIs (#656)
— overrides the PDF/Info/Producerstring, which now defaults to
Quillmark <version>on every Typst-rendered PDF.
Other fixes
- PDF rendering folds the
/Producerstamp and the signature-field
AcroForm injection into a single incremental-update pass, preserving
Typst's/Creator(#656). usaf_memo: the signature widget is now overlaid at the 4.5in signature
block (AFH 33-337) instead of the 1in left margin, and no longer consumes
layout flow that could push the block out of position (#660); empty
signature fields no longer carry theAPPEND_ONLYflag (#654).