typograph-editor-documentation
    Preparing search index...

    Release Notes - Version 1.0.0-20260904

    • Items placed on an InDesign master page now arrive with the document. A master holds what a document repeats — a logo, a footer rule, a running header, a background panel — and none of it came through: a page that looked complete in InDesign arrived holding only the items drawn directly on it. Each spread now receives what its master puts on it, behind the spread's own items, and a spread whose two pages use different masters receives both.

    • Master items arrive locked and grouped under the name of the master they came from, so they read as the repeating furniture they are rather than as loose items on the page. That matches InDesign, where a master item cannot be edited on the page until it is deliberately released.

    • A stroke weight can be set for new text, beside the stroke colour that was already there. Preferences ▸ Text offered a colour for the outline of the letters and no way to say how thick it should be, so every new text frame started at none however the preference was set. It now offers both, and starts at 0 pt — no outline — as it always did.

    • Find Next now selects the words it found, in a frame ready to type in. It went to the page and drew a box round the frame, leaving the reader to spot the word inside it — and Replace then acted on something nothing on screen was pointing at. The text itself is highlighted now and the frame is open for editing, so Find Next reads the way it does anywhere else and Replace visibly changes what is marked. Where text runs on from one frame into the next, the highlight appears in the frame that actually shows the words rather than in the one that holds the story.
    • Text pasted into a linked frame is kept, and deleting near it no longer damages text elsewhere. Where text runs on from one frame into the next, only the first frame holds it and the others are filled from it. Pasting into one of those later frames put the text somewhere that was about to be rewritten: it appeared, and then vanished the next time anything reflowed the story — typing elsewhere in it, resizing a frame, or simply reopening the document.
    • Until it vanished it also threw the count off, because those frames were holding text the story did not have. Pressing Backspace beside pasted text deleted a character further along the story instead of the one beside the cursor — in a frame that may not even have been on screen. Both come from the same cause and are fixed together: a paste now goes into the story itself, wherever it is typed, exactly as typing already did.
    • Undo no longer leaves the editor dead. Undoing while editing text — one press is one typed character — put the caret in a frame that had just been replaced: the cursor went on blinking, everything typed after it disappeared, and the toolbar stopped following the caret. The only way out was to click somewhere else and back in. Undo and redo now hand the caret to the frame that came back, keeping its place in the text, and leave text editing altogether when the frame itself was undone away.
    • Text no longer turns black when it is styled. Text given a colour kept it until something else about it changed — a different size, a different font — and then it went black, while its outline stayed the colour it was given. Two different notions of "the colour of this text" disagreed, and which one won depended on whether the text had been styled.
    • The same disagreement was making imported text black, the other way round. In a document from InDesign the colours belong to its styles, and any text carrying no colour of its own — most of it, in the brochure this was found in — took the frame's empty setting and came out black rather than the colour it was designed in. Both now follow one order: what the text itself says, then the frame it sits in, then the style behind it.
    • The outline colour set for new text in Preferences never reached the page. It was stored and given to each new frame, but the letters were drawn from a copy of the frame's settings taken a moment earlier, so a new text frame looked exactly as it had before. The fill colour escaped this by being re-read as the text is drawn, which is why only the outline went unnoticed.
    • An outline weight given to selected text was ignored. With the weight for new text set to 1 pt, giving a selection 4 pt left every character at 1 pt while the control went on saying 4 — and it started working the moment a fill colour was picked, from which point everything behaved. Text carrying only an outline weight, or only a dash, an alignment, a corner or a tint, was drawn with the frame's settings instead of its own; picking a colour was what made the rest of it visible.
    • Setting an outline colour for text did nothing. With text selected the colour was given to the whole frame rather than to the selection, and with nothing selected it reached the frame's setting without reaching the letters, so either way the text on screen did not change. Note that an outline colour on its own still draws nothing until a weight is set as well: the two are separate, as they are in InDesign, and the weight sits next to the colour in the same panel.
    • The stroke controls show the stroke of the text you have selected, not the frame's. Select a piece of text whose outline is 4 pt in a frame whose default is none, and the stroke panel said none; set it to 2 pt and it went back to saying none the next time it was opened, because it was reading the frame's setting while its buttons were changing the selected text's. That was true of the colour, the weight, the pattern and the corner, and where the selection holds more than one value the field is now empty rather than showing one of them. The colour chip in particular disagreed with the palette it opens, which had the selection right all along.
    • Line cap is greyed while text is being edited. Text has no cap of its own — the corner it turns at a join it has, the end of a line it does not — so the control was quietly changing the frame's border while sitting in a panel whose every other control changes the text. It is greyed rather than removed, so the controls do not shuffle each time the cursor enters a text frame.
    • Everything on a spread could arrive shifted sideways. In one brochure every element on five of its six spreads sat 5.9 mm to the right of where it was designed — text frames, images and rules alike, all by the same amount, so each spread looked plausible until it was measured against the original. A page's position was read from one half of what InDesign records and the other half was thrown away. A document is affected whenever its pages do not begin at zero in their own coordinates, which is what happens when the page size differs from the box InDesign set up around it — an A4 page laid out in a Letter-sized box, in this case. Nothing else on the spread was wrong, which is why it read as the whole page being off rather than as a fault in any one item.
    • Shapes with no fill printed as solid black in PDF. "None" is stored like any other colour and carries colour values like any other, and every decision about whether to paint asked only whether a colour was named at all. A rectangle set to no fill therefore painted, and in CMYK output the values it happens to carry are the blackest black there is. One page showed both halves of it: a black square where an unfilled rectangle sat inside a group, and two black rules across the page which were the bottom edges of two unfilled rectangles wider than the page. It never showed in RGB output, where the same colour comes out white and lands invisibly on white paper.
    • Text that does not fit its frame was printed anyway. A frame holding more than it can show keeps the lines that did not fit — that is how the text is handed on to the next frame in a flow — and the PDF drew all of them, while the editor draws only as far as the bottom of the frame. On one page that put several columns of text on top of each other and ran the last of them off the bottom of the page. The PDF now stops at the frame's edge, as the page does.
    • Text printed thicker than it is drawn. Where a piece of text carried an outline width but no outline colour, the colour was taken from the frame around it and the two were combined into an outline neither had asked for — and because of how that outline was aligned, the width was doubled again. A logo set in 17pt type printed with well over a third more ink than it should. An outline is now taken as a whole or not at all: without a colour of its own there is no outline to draw. Text that genuinely carries both a colour and a width is unaffected.
    • A colour that cannot be found is no longer painted with whatever came before it. An element referring to a colour the document does not contain used to be filled with the colour of the last element drawn, which changes with the order things are drawn in and is never what was meant. Such an element now paints nothing.
    • The import fixes are seen in documents converted from now on, and the PDF fixes in every document, including those converted before this release. The text stroke controls are the only part of this release that needs a new editor build, and the stroke weight preference needs the editor to be built against this release's page engine — without that it is stored and quietly ignored.
    • A master becomes one group per page, cut at the spine. A page in the stored document holds geometry, margins, guides and grid but no elements — only a spread owns elements — so both groups still belong to the spread; what the cut decides is which of them each item goes in. It has to be the page, because a page moved out of its spread takes its elements with it and the editor decides which those are by greatest overlap, whole and never split: one group spanning both pages would travel entirely with one of them, taking the other page's furniture along or leaving its own behind. An item lying across the spine belongs to the page it covers more of, and to the earlier page when it covers both equally.
    • Each spread receives its own copy of the master's items, re-identified from the spread it lands on: the spread transform rewrites an element's rectangle in place, and an element's identifier is derived from its InDesign one, so a shared copy would be transformed repeatedly and carry the same identifier on every spread. A flow link that leaves the master is dropped rather than followed.
    • Each copied item records which master it came from and which side of that master it sat on, and each group records the page it was placed on. Nothing reads this yet. It is written now because it cannot be recovered later: a document converted without it is anonymous, and the only way to give it that history afterwards is to convert it again from an InDesign package we may no longer hold. What would read it is re-applying a master when a page changes sides, which this release does not do.
    • Master items are injected before the spread transform runs, in the master's own coordinates, so they reach the page through exactly the same arithmetic as the spread's own items — including the page-left-edge correction above.
    • The spine offset is now the page's translate plus the left edge of its bounds, falling back to the translate alone for a document parsed before this release and then to half the spread width. Half the spread width is correct for the document that revealed this and is less code, but it assumes the spine sits mid-spread and fails for unequal page widths, which the generator's own tests already exercise.
    • Automatic page numbers on a master are not resolved. InDesign writes the number as a marker rather than as text, so a master footer arrives reading "Page" with nothing after it. The number itself needs no arithmetic — the page record already carries the folio InDesign displays — but stories are shared by name, so every copy of a master frame would show the same number. Planned, not built.
    • "No paint" in the PDF is now a single decision, and it is a union: the colour is None, or the colour's model says None, or — for an outline — the width is zero. Testing the name alone would miss a none-colour stored under another name; the model is what actually distinguishes the entry from a colour; the width is what the canvas already checks alongside it. The decision gates the drawing operation and not merely the colour, because setting no colour while still asking for a fill paints with whatever was set last.
    • The stored layout carries every composed line on purpose, so the clip against the frame belongs at drawing time, where the canvas puts it. It is measured from the frame's top edge rather than from the text origin, so a vertically aligned frame is judged by where its lines actually land, and it uses the same tolerance as the first-baseline work for the same reason: a frame sized to its own text lands either side of the boundary by a hair. A frame with no usable height draws rather than silently swallowing its text.
    • Table cells are deliberately still not clipped. The canvas does not clip them either; the flag that would say whether a cell clips to the frame, to its own height, or not at all is carried all the way through the layout and the schema and acted on by nobody. Clipping in the PDF alone would recreate the very disagreement between page and print that this release exists to remove, so both renderers should start together.
    • The text outline is deliberately not corrected in the converter. Dropping a width that arrives with no colour at import would destroy real outlines, because a range can carry a width inline and inherit its colour from the style it is based on; the generator reads the properties after that inheritance is resolved, where no colour genuinely means no outline. It also means documents converted before this release print correctly without being converted again. The outline's join keeps the frame-level fallback it was given earlier.
    • The stroke controls are read the way they are written: with the text editor focused, every one of them asks the canvas for the selection's resolved properties, which come back null for anything that differs across the selection. Only the alignment row did that before. The join is the one exception to the blank rule — it draws a corner rather than printing a word and has no empty state, so a mixed selection falls back to the frame's own text join, which is what a run with no join of its own is drawn with anyway.
    • There are two paths that fill those controls and they used to disagree: one when the panel is opened, one on every cursor move. The second was already right for the weight, the pattern and the colours, which is why a wrong value corrected itself as soon as the cursor moved. Both now follow the same rule, and the second covers the three controls it used to skip.
    • A frame's text is drawn from a snapshot of its font, and only three calls rebuild that snapshot — setting the family, the style or the size. A frame builds its own as it is created, before its defaults are applied, and the fill colour is the only thing re-read afterwards. That is the whole reason the stroke colour preference never showed: it reached the frame and never the letters. The snapshot is now rebuilt once the defaults are on.
    • Every restore in the undo history replaces element objects: a page goes back as a copy of the snapshot, so each frame in it is a new object while everything holding the old one — the caret, the toolbar, the parameter panel — keeps pointing at what was replaced. The canvas re-points its own bindings by matching the frame's identifier, which survives the copy, and then says so, so a host holding an element across an undo can do the same. The caret is carried over and clamped against the restored text, since the step being undone may have removed the characters it sat after; a selection is dropped rather than carried, because its anchors belong to a layout that no longer exists.
    • A text colour now resolves in one order everywhere: what the run or its character style states, then the frame's own colour, then the paragraph style, then black. The frame sits in the middle because it is the one a person edits. It only takes part when it HAS a colour, which meant teaching the document the difference between "no colour of its own" and "coloured black" — they used to be written the same way, and an imported document depends on the difference, since the converter gives a frame no colour and lets the styles carry it. A document already saying black keeps meaning black, so nothing already stored looks different.
    • The editor's stroke and colour controls are read the way they are written, and a mixed selection shows blank rather than one of its values. The join is the exception: it draws a corner rather than printing a word and has no empty state, so it falls back to the frame's.
    • Character-level properties reach the text only when the run is recognised as carrying them, and that recognition is a list: a font, a style, a size, a fill or outline colour, a decoration, a raised or lowered position — and now an outline weight, dash, alignment or corner, and a tint set without a colour. Anything not on the list falls back to the frame's own settings, which is why an outline weight on its own was ignored and why picking a colour repaired it: the colour put the run on the list, and the weight it had been carrying all along came with it. The list is what someone remembered rather than something derived, and every gap in it fails the same silent way — the value is stored, the control shows it, and only the text disagrees. Worth replacing with a question the run can answer for itself; recorded as its own ticket rather than extended again.
    • A frame's own outline colour is re-read as the text is drawn, the way its fill colour already was. Nothing else rebuilds the cached font a frame's text is drawn from, so a colour written to the frame — by the swatch panel, or by a host — used to reach the setting and never the letters. Note for anyone debugging this: the cached font still shows the old colour, and that is correct. Ask what a piece of text resolved to, not what the frame cached.
    • Pasting was the last edit that did not go through the story. A frame that continues a flow does not own its text — the first frame holds it and the rest are regenerated from it — so an edit written into one of the later frames is discarded, and until it is, every position counted past it is out by the length of the text that only exists there. Typing and the content keys have been routed to the story since the flow work; paste went straight into whichever frame had focus, and did not even trigger a refill. Both are now the same path. The rule this belongs to, worth applying to anything new that edits text: an edit made in a continuation frame has to be mapped into the frame that holds the story and applied there.
    • Anything that points at a position in a story from outside the text editor has to ask which frame draws it. The frame that holds a flow holds all of it, including the part that runs on into the frames after it, and those trailing lines are never painted where the story lives — so a caret or a highlight placed there marks a spot nobody can see. Find and Replace is the first thing to need this and will not be the last; the canvas answers it now, given a position, with the frame that shows it and the position in that frame's own terms.