A dimension selected with the art it measures became a plain group of
paths and text when Object › Expand, Object › Expand Appearance or
Object › Path › Outline Stroke ran, so it no longer redrew when moved
or restyled.
These commands now leave such a dimension's lines and label as they
are, also inside selected groups without fills, strokes or effects of
their own, and change only the other art. The dimension keeps its
export assets and variable bindings. When the new art no longer fits
the dimension's link, for example because the outlined stroke has
other anchors, the dimension stays where it was, no longer linked, as
it does when its art is deleted. Undo links it again.
When the dimension is all the command would change, the command
changes nothing and reports the error it gives for a selection with
nothing to change. Object › Expand… is no longer dimmed for the label
of such a dimension. A dimension selected without the art it measures,
a part of one, and one inside a selected group with an appearance of
its own still become plain groups, and Type › Create Outlines still
outlines the label.
Docs: docs/dimensions.md, docs/mcp.md, docs/target-app-parity.md.
With no glyph choice left on the character, text.setGlyphAlternate
returned the font's default glyph for it: 0 for a character the font
lacks, which a fallback font draws, and the lowercase glyph for a
letter under All Caps. It now reports the glyph the character is drawn
with, as text.glyphAlternates does.
A <text> in a <clipPath> was dropped with a warning, so a clip path made
only of text had no content and the art it clipped was hidden. The
clipPath content model in CSS Masking Module Level 1 lists text and use
(https://www.w3.org/TR/css-masking-1/#ClipPathElement).
The importer now clips by the text's glyph outlines, together with any
shapes in the same clip path, and keeps clipPathUnits, the transforms,
clip-rule, visibility, the conditional processing attributes and a clip
path on the text. A <use> in a clip path that shows a text clips the
same way, placed by the <use>; a clip path on the <use> applies in the
<use>'s user space, and a reference goes to the first element with the
id. When the clip path holds only one visible text, with no clip path
of its own and no even-odd clip rule, the clipping path of the clip
group is the text object with no fill or stroke, the same structure
Make Clipping Mask produces for type. A text or a <use> with an id in a
clip path can still be shown by a <use> outside it. Each text's
outlines are laid out once, however many elements use the clip path.
A transform set by a style rule or a style attribute on a text now
places it, as it does a shape. Before, only the transform attribute was
read, inside and outside clip paths.
path.reshape refused focal with radius only when focal named an anchor.
Since an empty focal list chooses the focal-point rule, a call with
"focal": [] and a radius was accepted and used the radius falloff,
although the params text and docs/mcp.md say the two cannot be used
together. Any focal other than null now goes with radius as an error.
After an aligned Remove Item or Duplicate Item, the active row was
re-pointed by the indices of the first object in paint order. When the
first selected object paints above the others, its own rows that changed
are different ones, so the active row could be dropped or land on the
wrong row, and a later paint edit changed that row instead.
The active row now follows the rows removed or copied in the first
selected object's own stack.
Follows #5591.
In horizontal type, tracking and manual kerning are now thousandths of
the em as the Horizontal Scale draws it: at 50%, a tracking of 100 adds
0.05 em after each character. They were added at the full em while the
glyph advances took the scale, so narrow tracked type drifted from the
page of users' .ai files letter by letter. That page writes such type's
character spacing as the tracking itself in a text space as wide as the
scale, which PDF scales by it (ISO 32000-1 9.4.4). Vertical type keeps
the full em: its advances down the column don't all take the scale.
vectorcraft_text::spacing_scale gives the factor. Shaping, inline
graphics and the Optical pairs use it, and so do the conversions from
points back to thousandths of an em: the automatic kerning the Character
panel reads and Touch Type's limits (glyph_em), Combine Point Text, and
PDF import, whose tracking is now the file's Tc. Scale Text Attributes
now keeps tracked type where a horizontal stretch drew it.
SVG export writes letter-spacing in thousandths of the font size it
writes (the vertical scale), so uniformly scaled type keeps its spacing
in a viewer.
Type with both a Horizontal Scale other than 100% and tracking or manual
kerning lays out differently than before, in every document.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PDF/X-1a, PDF/X-3 and PDF 1.3 files leave the layers they don't print
out of the flattening. A flattened group no longer takes the place of
art in a layer that doesn't print, so the art of a clipping layer over
such a layer prints, and art of a layer that doesn't print stays out
of the file.
- A flattened group goes into a lower layer only when that layer prints,
shows and is a template as the clipping layer does, the clipping layer
and the groups it leaves have no opacity, blend mode or isolation, and
the clipping path has no fill. Otherwise the group holds only the art
inside the clipping layer, drawn over the clipping path's fill and the
art below, and the art below is flattened on its own. Before, the fill
covered the group, the group lost the layer's opacity, or the clipping
path cut the art below.
- Transparent art that a clipping path hides entirely, such as one of
area type holding only a space, is removed. Before, the export failed
because the art kept its transparency.
Object › Flatten Transparency follows the same rules. Documents without
clipping layers or layers that don't print export the same bytes as
before.
Expand Appearance on a symbol instance with a fill tint and a color
adjustment applied the adjustment to the untinted art, so the expanded
colors differed from the canvas. The expand path now passes the tinted
instance art to adjust_in_document.
A selected segment that path.insertAnchor splits stays selected as its
two halves. The new anchor is the end both halves share, so it moves
with them, and Delete cuts both halves. docs/mcp.md and the comment on
renumber_after_insert called it a direct-selected anchor; they now
describe it as an end of the halves that moves with them.
Break Link to Symbol on an instance just placed on a locked artboard
selected nothing: the art that replaced the instance has a new id, so the
locked-artboard check did not see it as new art. The art of an instance
that was new art is now checked without the locked artboards, and the
session keeps it selected as new art. The art of an older instance on a
locked artboard, named by id, is still left out of the selection.
Before the Reshape tool had focal points it sent path.reshape without
focal or radius, and the command stretched an open path from the grabbed
point to its ends whatever the selection, and moved the anchors of a
closed path within half the diagonal of its bounding box with a
falloff. Such a step, in a saved action or a script, now moved a closed
path whole. A step without focal (or with focal null) and without
radius now plays by that earlier rule. The Reshape tool always sends
focal, an empty list included, so its drags keep the focal-point rule.
On a vertical path, an upright glyph is now placed in its column as
vertical point type places it, then the column is centered on the path.
- Its cell starts at its place on the path; it started 0.12 em earlier
with fonts whose cell top is less than a full cell above the baseline.
- A baseline shift moves it across the column instead of along the path.
- A horizontal scale widens it evenly about the column's center.
- A combining mark stays on its upright letter.
- The caret and the selection highlight span the column, half its em on
each side of the path, instead of the font's ascent and descent.
With Skew, 3D Ribbon and Stair Step on a path that runs to the left,
letters are a quarter turn counterclockwise from upright glyphs: Skew and
3D Ribbon mirror both kinds there, and Stair Step keeps letters level. The
test, the progress doc and the params text of Tate-chu-yoko Settings now
state these conditions and the block's directions on a path.
Before writing a PDF preset, ICC profile, plug-in, Color Settings,
disabled list or grants file, the store compared the new bytes with the
file already there by reading the whole file into memory, so a large file
left in the folder was read in full. The comparison now reads at most one
byte more than the new content.
path.insertAnchor (the Add Anchor Point tool, the Pen's Auto Add, the
Smart Pen's Alt-click on a segment and Alt-click with the Scissors)
added the anchor without changing the selection, so the direct-selected
anchors and selected segments after it on the subpath kept their old
numbers and the selection shifted onto the next points along. It now
renumbers them with renumber_after_insert, the helper path.reshape
uses. A selected segment that the new anchor splits stays selected as
its two halves, and the new anchor is direct-selected with them. Undo
restores the path and the selection in one step.
Docs: params text, docs/mcp.md, docs/target-app-parity.md.
alert(message[, title, errorIcon]), confirm(message[, noAsDflt, title])
and prompt(message, preset[, title]) are globals in a script run. In the
app the run waits at the call for the person's answer, spends no
instructions while it waits, and every dialog has Stop, which ends the
run and puts every document back. A run over MCP or the command line
takes its answers in order from script.run's answers, a list of
{kind, value} records; a missing, mismatched or unused answer ends the
run. The report lists each dialog with its answer in dialogs, with
dialogCount and dialogsTruncated.
The interpreter gains a host call that waits at the call for its
result, from the script's own code only; a dialog called in a callback
of a built-in, a getter or a conversion throws in the app.
Docs: docs/mcp.md, docs/target-app-parity.md.
Before a script runs, `script.run` reads its preprocessor lines (`#` or
`//@` at the start of a line, outside strings and comments):
- `#include` and `//@include` put another file's text in place of the
line, looked for beside the including file, then in each
`#includepath` folder, then in each `JSINCLUDE` folder. A later
`#includepath` replaces the list.
- `#script` names the run unless `name` is given; `#target` takes any
value; `#strict off` is taken. `#strict on`, `#targetengine` and
`#engine` are refused as unsupported, and any other `#name` as
unknown.
`$.evalFile(path, timeout?)` runs a file in the same global environment
and returns its last value, `$.fileName` is the file being run and
`$.includePath` the include folders.
A script run from a file reads these files only in its folder and the
folders below it. Paths with a `..` name, links or junctions that lead
out, device names, streams and network paths are refused; a script
given as text reads none. A run reads at most 64 files 16 levels deep,
32 MiB of source in all and 1,024 paths looked up. An error in an
included or evaluated file is reported at that file's line and column,
and the report's new `file` field names it.
Docs: docs/mcp.md (script.run, Script Console), docs/target-app-parity.md.
A linear dimension clicked from an anchor to a point that is not an
anchor (a point on a segment, or a point a Smart Guide gave) followed
the art at the anchor end only, so scaling the art turned it into a
long slanted dimension.
- A point on a segment is stored by its curve parameter on that
segment, and stays on it when the segment's anchors or handles are
edited.
- Any other point is stored against anchors (and, for a path whose
anchors lie on one line, handles) of the path under it, or of the
path at the other end, and moves, scales, turns and reflects with
that path. Beside a path whose anchors and handles all lie on one
line, such as a straight line, it keeps its distance along and
across the path: a reflection moves it as a half turn does, and a
scale that is not uniform moves it as a uniform scale does.
- When linked art is reflected, a linear dimension's line goes to the
reflected side, except for art whose anchors and handles lie on one
line.
- Deleting the art, changing its anchor count or whether it is closed,
turning an angle's arm into a curve, or making a measured circle or
arc no longer circular leaves the dimension where it was, no longer
linked, instead of removing it. Undo links it again.
Docs: docs/dimensions.md, docs/target-app-parity.md.
Break Link to Symbol on a selected group selected the art of every
instance it expanded that was itself shown and unlocked, including art in
a hidden or locked group inside the selection. The art now goes into the
selection only when it and every group and layer holding it are shown and
unlocked, the check Select All uses (select::is_selectable).