Every event name now follows one convention, and the Page panel's Type is tidied up.
The text-typing event has a snake_case name: typograph_text_input. It was the one event name
in camelCase, typograph_textInput. Both names fire for now, with the same { text, uuid }, so a
page listening for the old one keeps working — but please move to typograph_text_input: the old
name will be removed in a later release. Every event name is now snake_case, starting typograph_.
Shadows can be see-through. The Shadow panel has a new Opacity field beside length, blur and angle. A shadow was always fully opaque; at 75 %, InDesign's default, it looks much more natural. Existing shadows stay as they were (100 %).
Shadows are drawn at their real size on high-resolution screens. On a Retina or other high-resolution display every shadow was drawn at half its distance and half its softness. It now matches what is set — and what InDesign shows.
Round a rectangle's corners by dragging. A selected rectangle shows a small circle just inside each corner, as in Illustrator and Figma. Drag one towards the middle to round the corners — all four together. Hold Option or Cmd while dragging to round only that corner. The Corners panel follows; one undo step per drag.
Know which page is shown — the event typograph_page_shown. A host page now hears when a
different spread comes into view, however that happens: the page bar, navigation, opening a
document, or deleting or moving pages. The event says which spread and which pages, once per
change. See typograph_page_shown in Page Action Events.
Convert to Path keeps a pie slice or ring. Converting an opened circle — a slice, a ring or a ring segment — gave back the whole circle. It now gives the shape you see, ready to edit point by point; a ring becomes a compound path with its hole.
A document with an uploaded or linked font prints again. A font added from a link or uploaded was saved with an empty date, and one whose file names no version with an empty version, and the PDF service turned the whole document away. If such a font's files could not be loaded when the document was opened, saving it again also lost the font's identity, with the same result. Both are now saved in a form the PDF service accepts. A document saved before this release is repaired by opening it and saving it again. (Second deploy of this release.)
Release notes 20261005 corrected. The note said the Page panel's old Type menu did nothing when used. It did: choosing "spread" on a single page doubled it into a spread, and choosing "single" on a spread left one page twice as wide. The entry now says so. Nothing changes in the editor.
These come from the conversion and PDF services, not from the editor, and reach users when those services deploy:
fix/page-type-dead-plumbing (PR #119, already deployed on its merge): removes set_PageType() (menucommands.ts),
its two popupmenu_page_type branches in menucontroler.ts and its menuactions registration —
unreachable since the Type popup became a read-only field in 20261005, and nothing else produced
those ids. Converting a page between single and spread is deliberately not offered as a command: a
spread's pages change through the Page menu (add, remove, split, duplicate).ec13a39 — TYP-627 (PR #158), TYP-800 (shadow opacity and the hidpi shadow size), the corner knobs, Convert to Path of an opened circle, typograph_page_shown (TYP-808) and the font data a document is saved with (fix/font-data-wire, PR #167).typograph_events.ts): typograph_text_input is the event; typograph_textInput
stays exported as a DEPRECATED alias and send_text_input() dispatches both, the
send_page_images_loaded() remedy. TYP-797 removes the alias. tests/text_input_event.test.ts pins
both names, the payload and that inserts are not throttled. The retired standalone viewer-ui repo
still has the old literal in its compiled scripts/viewer_ui.js; it is not maintained and not
touched.shadow_opacity (0–1, absent = 1 and kept
off the wire). get_shadow_color() returns the colour with an #rrggbbaa alpha, so every draw site
picks it up. Canvas TYP-800-shadow-opacity (merged), editor-ui TYP-800-shadow-opacity (panel field, in this
note branch). ⚠️ Merge order: document-schema TYP-799-shadow-opacity (shadowOpacity) → lock bumps in
converter-, publisher- and document-service → canvas → editor-ui; an editor that writes
shadow_opacity before the services know it fails PDF validation. The PDF does not draw shadows
yet (TYP-802).TYP-800-shadow-opacity also fixes the hidpi size: ctx.shadowOffsetX/Y and shadowBlur
are device pixels the transform does not scale, so on a dpr-2 view every shadow drew at half size;
set_screen_rect() multiplies by view.dpr.TYP-801-drop-shadow, unmerged): DropShadowResolver merges the
item's object-level DropShadowSetting over its object style (BasedOn chain) over Preferences.xml
<TransparencyDefaultContainerObject> — the items in a real document usually state only
Mode="Drop". Needs document-schema TYP-799 first, then a converter-service lock bump.TYP-802-pdf-shadow, unmerged): the element is drawn ALONE by its
own drawing code into a throwaway PDF on a transparent page, rasterised by Ghostscript (pngalpha,
200 dpi); the alpha channel is the silhouette. Blurred (σ = blur/2, the canvas convention) and
placed as a soft mask over a solid image in the shadow colour, in the document's colour space.
About 0.7 s per shadow. Needs Ghostscript and Imagick in the publisher image — both are there.fix/rounded-rect-rotated-stroke (unmerged): drawPageElementRoundedRect popped
the element's rotation after the fill; the stroke printed unrotated and the closing
StopTransform() popped an unsaved state.feat/corner-knobs (merged) — PageElementRoundedRect.corner_knobs() / corner_knob_at() /
drag_corner_knob(view, corner, p, only_this) / set_corner_radius(); to_unrotated() moved from the
circle to PageElement. Browser suite run_corner_knobs_tests(). editor-ui feat/corner-knobs:
cornerknob.ts, hooked in the idle mouse-down beside the arc knobs, before the scale handles.
The editor branch is folded into this one.fix/circle-arc-to-path (merged): PageElementCircel.arc_paths() — the opened outline as
poly paths, used by changeelementtype('poly').fix/font-data-wire: font data went to the wire with modification_date: '' (every font from
add_fonts_from_urls() or an upload) and version: '' (a font file without a version string).
document-schema parses the date as a DateTime and has version NotBlank, so the template failed
validation at the publisher (fontData[1].data.modificationDate — … not an string, an empty string, or null). font_data_for_wire() (fontmanager.ts) leaves an empty date out and writes 'unknown' for
an empty version, on the registry (FontManager.fontdata_for_wire()) and on the font copy every text
element carries (PageElement.toJSON()); the registry itself is unchanged. Also:
add_fonts_from_fontdata() dropped the document's font uuid. That path only runs when the manifest
fonts failed to load, so the next save wrote uuid '' (NotBlank). Reported from a MyVivenda document;
with this and the host's own corrections it validates with 0 violations. ⚠️ Symfony reports type
errors first and checks constraints only after, so one fix can reveal the next failure.TYP-808-page-shown (merged): typograph_page_shown with
{container_index, record_indexes, page_names}, fired from redraw() (the one place every route
that changes the shown spread passes), compared by index and spread uuid; open_document() resets
it. Browser suite run_page_shown_tests(). Documented in
docs/PageEvents.md.