Text typed after an undo could not be undone, and the document said it had nothing to save. Undo put every text frame into the state a frame is in while it is first being filled — where edits are deliberately not recorded, because the text is being poured in rather than typed by anyone. From the first undo onwards that state never lifted, so typing changed the document while adding nothing to the undo history: the words could not be taken back, and anything that asked whether there was unsaved work was told there was none. Where saving follows that answer, the work was never saved. Only text was affected; moving or resizing anything still recorded normally.
Undo now takes back what you just typed, rather than one letter at a time. A run of typing is one step: it ends when you pause, move the caret, or do something that is not typing, so a sentence comes back in one go. The history also has a ceiling now — it used to grow for as long as a document stayed open.
Opening a document no longer leaves the previous one's fonts behind. The font list showed everything from every document opened since the page was loaded; it now holds the fonts of the document you have open, plus the default.
Converted documents use the fonts their paragraph styles name. A paragraph whose style says a font, where the text itself says nothing, was drawn in the frame's font instead — so a bulleted list styled in one face appeared in another, at the wrong size, with its bullet to match.
Paragraphs keep their own line spacing. A story could only have one line spacing throughout, so a heading and the list under it were forced to share; each paragraph now keeps the spacing it was given.
Frames that fit no longer report that their text overflows. A frame sized in InDesign to exactly fit its own text could come back a fraction of a point short after conversion, and the overflow marker appeared on text that was not overset.
Text set in ALL CAPS arrives as all caps. The document keeps the letters as they were typed and draws them capitalised, so the text you edit and copy is still the text that was written.
Converted documents keep the shapes and angles they were drawn with:
These three apply to templates converted from now on. They are fixes to what a conversion writes into a document rather than to how a document is drawn, so a template that has already been converted keeps the geometry it was given — square corners, flat artwork — until its InDesign package is converted again. All caps is the same: a document converted before this release does not record which text was set in capitals, so there is nothing for the editor to draw.
Everything else in this release is drawing, and applies to every document the moment it is opened — including the paragraph-style fonts and the per-paragraph line spacing. Those two read what conversions were already writing; it was the reading that was wrong.
Opening the text colour panel no longer fails on a frame that has never been given a colour. The panel did not appear at all, which meant text in a newly created frame — and most text in a converted document, where the colour lives in the styles rather than on the text — could not have its colour changed.
The line spacing control now shows and changes the spacing of the paragraph the caret is in. It read and wrote the frame's value, so with paragraphs keeping their own spacing it showed a number that did not match the text under the caret, and changing it appeared to do nothing.
ALL CAPS can be turned on and off from the toolbar, beside underline.
Line cap and corner are chosen from icons in the stroke flyout, the way stroke alignment already was, rather than from dropdowns that had to be opened to see the options.
Find & Replace no longer dims the page behind it. The document is edited through that dialog while it is open, so darkening what you are reading was the wrong signal — and it made the matches being found harder to see.
The text toolbar puts line spacing and letter spacing with the font controls now, next to the point size, and ALL CAPS at the head of the character formats before underline.
A text frame carries a flag meaning "text is being seeded, do not record an undo step", and copying a frame copied the flag as set. Undo and redo put a page back by copying it, so from the first undo every frame in the document was permanently in that state. The copy now clears it, which is what it always meant: a copy seeds nothing, its text arrives already in place.
Filling a flow is unaffected and still records nothing, which is correct — it reaches the frame by a different route than typing does, and was measured to confirm it: three consecutive reflows add no undo steps.
This one reached production early. It went out with a pin bump on 4 September rather than waiting for this release, so the behaviour changed before this note existed. It is written up here because the note is where the change belongs, not because it is arriving now.
The document's "has unsaved work" signal is still derived from the position in the undo history, which assumes every change to the content records a step. That assumption has now failed twice — here, and in pasting into a linked frame before the previous release. Whether the rule should be enforced, or the signal should be able to notice when it is broken, is recorded as its own question rather than settled here.
Undo coalescing (TYP-653) changed the shape of the undo history, and the "has unsaved work" signal is still derived from a position in it. That is the second change to this machinery in one release — the fix above and this — and the question of whether the signal should be able to notice when its assumption breaks is still open rather than settled.
The font list is per FontManager, and there is one for the life of the page: setup() builds it
once and opening a document mutates the existing document rather than constructing a new one. The
reset keeps the default's live Font objects rather than rebuilding from the built-in data, because
rebuilding ends in the load path that calls the startup screen's callback — every document open
would have re-run startup.
Paragraph-style fonts were ignored on purpose before, and the reason is real: canvas seeds every
document with a paragraph style named default carrying Source Sans Pro 14, and every other style
is based on it. A fully resolved style chain therefore always states a font, and honouring that
would repaint every frame in every document. The resolver now walks a paragraph's own chain and
stops before default, so what survives is a font someone actually named on a style.
Line spacing is resolved per paragraph rather than per line. That is an approximation of what InDesign does — leading is a character attribute there — chosen because it is the granularity converted documents use, and because it keeps a font property out of the line-breaking loop. A paragraph mixing leadings within one line takes the largest, which is what InDesign draws anyway.
The fits-in-the-frame tolerance was sized for floating-point equality (1e-6). It is now sized for
UNIT CONVERSION, which is a different and much larger error: the wire stores millimetres and
InDesign works in points, and the round trip lands about 3e-4 px out. The canvas and the PDF
generator each hold their own copy of this constant — kFitEpsilonPx and FIT_EPSILON_MM — and
both were widened, because a PDF keeping the tighter one drops a line the screen draws. Neither is
a licence to widen further: a frame overset by a tenth of a pixel has something wrong upstream.
All caps is applied where a character run's text enters layout, and nowhere else, so measuring and
drawing cannot disagree about what the text is. The transform preserves length character by
character: every offset in the layout code indexes the run's own string, and German 'ß'
uppercasing to 'SS' would shift every offset after it. A character whose uppercase is a different
length keeps its own case. Small caps is deliberately not implemented — it is a typographic
transform rather than a case one, needing the font's smcp feature or two font sizes inside one
run — but the schema carries the value so a conversion can be faithful.
Conversion fidelity: corner radii now reach the document per corner and in millimetres (they were written to a field nothing draws from, in points, into a millimetre field); a placed item's own rotation is read from its transform rather than discarded; and the frame's rotation is applied to its image once rather than twice.
Which half of a fix a change lands in decides who sees it and when. A converter change rewrites what a document CONTAINS and reaches only conversions that run after it; a canvas change alters how the same content is DRAWN and reaches every document on the next open. Corner radius needed both — the converter to write the radius per corner in the right unit, the canvas to clamp one too big for its frame — so the two halves shipped together and only the second is retrospective. Worth stating in a note when a fix is one and not the other, because "it is fixed" answers differently for a template converted last week.
The swatch panel crash was TYP-646 arriving somewhere it had not been carried: '' means "this
frame has no colour of its own", ?? does not catch it, and getswatch_by_uuid('') answered null
into code that dereferenced it. Fixed as a class rather than at the reported call — the table cell
fill and the line stroke chip built their uuid the same way, and a uuid the library has lost lands
identically.
The all caps button reads its state through the editor's caps_resolver — the one layout itself
uses — rather than off the resolved font the way underline does, because capitalization is
deliberately not a font property. Turning it off writes 'normal' rather than clearing the
override: a run that says nothing inherits its paragraph style, so clearing it on text whose style
applies all caps would turn the capitals straight back on.
Small caps has a toolbar icon drawn and a schema field carrying it, and is deliberately not offered: nothing renders it yet, and a control that writes a setting the page ignores is a promise the product does not keep.
#dialoglayer carries the modal wash as a CSS rule, and it is shared. A dialog that clears it
inline and does not restore it takes the wash away from everything opened afterwards — which the
clip manager was doing, and why the same dialog looked dimmed in one session and not another.
Find & Replace now clears it on show and restores it on hide, and the clip manager restores it
too.