The view items of these panels' menus kept their choice in egui panel
state, so no command could set the view. The views now live in the UI
state for the session, and ui.panelView {panel, view?} sets or reads
them; the menu items and the Swatches panel's list and thumbnail buttons
run it. An unknown panel or view is an error and changes nothing.
Docs: docs/mcp.md, docs/target-app-parity.md.
Merge carried each old edge's paint only to the new edge nearest the old
edge's middle, so when an added path cut a repainted edge, the other
piece went back to its source's stroke. Every new edge whose middle lies
on an old edge now takes that edge's paint, with its rows fitted to its
part of the edge, as Gap Options does.
Reverse Path Direction reversed each member path of a compound path and
turned the members' own stroke records, but left the compound path's
strokes as they were. A compound path's strokes run along its members'
subpaths in order, so its width profile and pen pressure, tilt, bearing
and rotation then ran the old way and the stroke drew differently.
reverse_stroke_records now also takes a compound path, reading its
members' subpaths in order, and path.reverse turns each compound path's
strokes with the combined reversal of its members before they reverse.
As for a path, the strokes turn only when every subpath turns alike.
The Links panel menu gets Copy Info, which runs the new UI command
links.copyInfo {ids?}: the file names of the selected rows (or of ids),
one per line in the order the panel shows them, go to the clipboard.
The item is off with no row selected. An id that is not an image or a
placed document, or a malformed ids, is an error and leaves the
clipboard as it was.
The rename field in Export for Screens tracked the artboard by its index. If the
artboards changed order while a name was typed (a command from the control channel
or MCP), Enter renamed the artboard that had moved into that index. The field now
tracks the artboard by its id and by the document it was opened in. When that
artboard is deleted, or another document becomes active, while its name is typed,
the field closes, no artboard is renamed, and Escape closes the dialog again.
The Japanese row in docs/localization-parity.md said every message is
translated, and the Japanese catalog line in docs/target-app-parity.md
said 38 messages were missing, one of them waiting on #7214, which has
merged. On main the untranslated report lists 98 messages without a
Japanese row, 77 of which every complete-message language lacks. Both
lines now give the counted rows and the report's count, and name the
open pull requests that translate part of them.
A block's line took the tallest ascent and deepest descent of its
characters, or the height of the stack's em boxes, whichever was larger.
The top block line's characters reach above the stack by their ascent
past the em box, and the bottom line's below it by their descent, so with
a wide Line Gap the line was too short for them. The line's ascent and
descent now also take in each character's reach from its own block line's
baseline.
- Outline Stroke on a graph's strokes, including Object > Expand with
Stroke on, adjusts the bounds the graph keeps, the same way
Create Outlines on its labels does. Before, the stroke outlines
changed the bounds of the art without type, and the next redraw
stretched the plot by the width the outlines added.
- A graph that keeps `placedArt` and has no art other than type left
is no longer measured on the bounds of all its art. A label edit on
such a graph moved and stretched the plot at the next redraw; the
plot now stays where it is.
- A redraw no longer measures a move or scale on art that has no width
or no height now, such as a graph left with one axis line. Before,
the plot collapsed to no width.
- A clipping group in a graph that holds type is measured on its clip
when the clip does not depend on type, so moving art outside the clip
does not change the bounds. Blends, envelopes and repeats are
measured whole, as they are drawn.
- The doc crate's helper is named `graph_art_without_type` and sits
with the file's other free functions.
- docs/mcp.md lists Outline Stroke and states that moving an outlined
label, a swatch, an axis or a tick mark on its own can move or scale
the plot, and that a graph left with only labels, or with art that
has no width or height, does not follow a move.
- Tests: a scale of the graph made before outlining a label, a move of
a graph opened from `.ai` after its label is restyled and moved,
Outline Stroke after a move, a graph left with only its labels or
with one line, and clipping groups holding type.
Effect > Blur > Radial Blur... has a Blur Center box. A press or a drag
in the box sets the point the spin or zoom starts from, the arrow keys
move it 1% (10% with Shift), and Horizontal and Vertical fields take the
same position in percent. Screen readers get the box with both values.
- blur.radial takes centerX and centerY, from 0 to 1 across and down the
object's bounds (0.5 each by default), so the center moves and scales
with the object. An effect saved without them draws as before.
- effect.apply and effect.setParams refuse a value outside 0 to 1, or
one that is not a number; a saved one draws at the nearest edge.
- The raster's margin is measured from the center, and the center stays
in the object's own bounds when a Rasterize splits the stack.
- Params text, docs/mcp.md, the evidence line in
docs/target-app-parity.md and a Blur Center row in every catalog.
A plot of the art's bounds now leaves placed images, objects at 0%
opacity and unpainted paths out of the art of a dynamic symbol, as it
does for other symbols. An object that an instance's fill, stroke or
opacity makes the plot draw is measured for that instance only, and an
instance whose symbol holds nothing else is left out, so a document
with only such instances is refused.
With Show East Asian Options on, the Glyphs panel menu lists Traditional
Forms, Expert Forms, JIS 04, JIS 90, JIS 78 and JIS 83 Forms, Monospaced
Full-Width, Half-Width, Third-Width and Quarter-Width Forms, and Revert
To Default Forms. Each form draws the selected characters with the
font's OpenType feature for it (trad, expt, jp04, jp90, jp78, jp83,
fwid, hwid, twid or qwid). A form is checked when every selected
character has it and disabled when none of the faces that draw the
selected text, fallback faces included, has the feature.
The form is a new character attribute, glyphForm, one form at a time
(text.setFormat, text.setRangeStyle). It is saved only when set,
character styles carry it, and runs that differ only in their form
shape as one piece of text. SVG writes it in font-feature-settings;
PDF draws the glyphs from the layout.
Load Variable Library defines each variable with the kind of its trait
(textcontent, visibility, fileref, graphdata; any other or none is the
unknown kind) and reads visibility values from true or false, image
values from a file's absolute path or file: URL, and graph values from
a data element of series names and rows. A document variable declared
with the same name and kind keeps its bindings. Save Variable Library
writes every kind in the same forms and is enabled with any variable.
Image values that aren't absolute paths and graph data past what a
graph holds are refused, so every saved file loads back.
An option given to document.exportSelection skips the options dialog, but
without `path` the save panel still picks the file. docs/mcp.md said any
option writes without a dialog, and docs/control-protocol.md said params
export without the dialog. Both now say that only `path` writes without a
dialog, and a test pins the behavior.
When Merge added a path that cut a painted edge, the piece holding the
old edge's middle took the old edge's stroke rows unchanged, so its
dashes started again and it kept both arrowheads. It now takes them
fitted to its part of the old edge, as Gap Options does.