Pin craft-ui to c4b8405d, which adds a top edge and the canvas-side top
corner to icon-strip flyouts and saves the moved top per group. Accept
its new MoveFlyoutTop docking action, and restore the saved top when a
group returns to its place. A docking regression checks the cursors, an
upward top-edge and free-corner drag with the bottom and icon-column edge
fixed, and the top after reopening and in a saved layout.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Codex <codex@openai.com>
View > Proof Setup > Working CMYK simulates the working CMYK space of
Color Settings in Proof Colors and Separations Preview, also in a
document assigned another CMYK profile. The active context keeps the
working context beside the assigned profiles, and the proof table cache
key includes the working settings, so a change of the working CMYK space
shows in the next proof.
A stroke at an opacity of 0 draws nothing, so its brush is no longer
listed in the Brushes category, brushNames or brushes. Pattern Objects,
Gradient Objects and Spot Color Objects likewise leave out fills and
strokes at an opacity of 0, and Objects no longer counts objects whose
only such paint is at opacity 0.
Document Info's Brushes category now lists the brushes the artwork's
strokes draw with, each once with its type (Calligraphic, Scatter, Art,
Pattern or Bristle), as the Document Info panel help page describes:
https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/document-info-panel.html
Without Selection Only the category used to list every brush in the
Brushes panel, used or not; it now lists only the brushes art uses.
document.info adds `brushes` ([{name, type}]) and `panelBrushNames`
(the Brushes panel's brushes), and `brushNames` holds the used brushes.
Hidden strokes, strokes with no paint or width, guides, paths with no
segment, type that draws no characters, groups' and layers' own strokes,
compound path members' own strokes and image strokes without a shape
are left out. A brush the panel does not hold is listed as missing,
with a null type, and a name two panel brushes share takes the type of
the brush the renderer draws with.
Color and Grayscale traces smoothed a gray photo before choosing its
colors, but a tinted photo with the same tones skipped smoothing: the
0.065 error rule applied only to pictures whose channels stay within 8
levels of each other. A picture whose opaque pixels lie, 19 in 20, within
6 levels of one tone curve now takes the same rule. The curve runs
through the median color of each 8-level stretch along the colors' main
direction, and a pixel on it must also lie within 6 levels of the plane
the colors spread along most, so art in several unrelated colors is not
counted. The sixteen-versus-eight exception still keeps clean flat art
on the flat-art route.
A Transform effect on a group reshaped its members' paths but left the
raster effects inside it at their own values: a member's Drop Shadow
kept its 10 pt offset under a 200% Transform effect, and with Scale
Strokes & Effects on, it scaled by the mean scale without turning. The
same held for the raster effects of an object's own fills and strokes
under the object's Transform effect.
- A Transform effect that moves the art once now transforms the raster
effects of a group's members (their own and their fills' and
strokes'), of nested groups, of the art of the linked opacity masks
in it and of an object's fills and strokes, after the members' own
Transform effects: sizes scale by the mean scale and a Drop Shadow's
offset turns, reflects and scales. A raster effect that a member's
own Transform effect with copies or random holds back keeps its value
through that effect and still transforms with the group's. Scale
Strokes & Effects does not scale them a second time. A group's or
object's Transform effect that makes copies or moves at random leaves
them as before.
- The canvas, the redraw region, export, Expand Appearance, Object ›
Expand and Outline Stroke read the same values.
- The Transform effect's params text and docs/target-app-parity.md
describe the rule.
A bevel join, and a miter join whose miter limit bevels a corner, end the
stroke at the outer corners of the two segments they join. The visual box
measured such a corner as if the stroke reached half its weight round it:
a 40 x 100 pt triangle with a 20 pt stroke and a miter limit of 2 measured
10 pt above its tip, where the stroke paints about 1.96 pt above it. Use
Preview Bounds, and the alignment and sizing that use it, took that box.
- With bevel and miter joins, closed paths and open paths with round or
projecting caps are now measured along their segments, as butt-capped
open paths already were, with the miter tips the limit keeps and the
caps added. Round joins still reach half the weight round each corner,
the round caps of dashes, which can end at a corner, reach half the
weight all round, and the projecting caps of dashes reach the diagonal
of their square. The visual box of
such a stroke can be smaller than before and is never larger. A path
with no width, such as a rectangle sized to 0 pt wide, turns back at
its ends, where the join bevels, so its box no longer reaches past them.
- object.setBounds with Use Preview Bounds measures an object as drawn
when a beveled or mitered corner, or a butt cap, is on a segment at a
slant. Before, a closed path with miter spikes the limit keeps missed
the size typed when the width and height were out of proportion.
- A click past a bevel or a butt cap, by more than the click tolerance,
no longer selects the stroke. Strokes with a width profile or with
dashes that have round or projecting caps, and the ends of curves that
bend more tightly than half the weight, keep the round reach.
- Paths measured along their segments skip the segments that cannot
reach past the box measured so far, which starts with the path's own
bounds.
Effects apply in the order they are listed, so an effect listed after a
Transform effect applies to the art the Transform effect made, at its
own values, as an object's later effects do after the object's
Transform effect. With Scale Strokes & Effects on, a fill's or stroke's
own Transform effect scaled the effects listed after it in that fill's
or stroke's list by the mean scale: a 300% Transform turned a 5 pt
Offset Path after it into a 15 pt one, and a Drop Shadow after it took
three times its offset. With Transform Patterns or Scale Strokes &
Effects on, an SVG filter after it also had the origin of its user space
moved.
- The effects after such a Transform effect now keep their values, on
the transformed art and on each copy, on every fill and stroke a
live-effect plug-in paints the piece with, and when the copies are
counted against the effect budget.
- With Transform Objects off, the effects before it keep their values
too.
- The Transform params text, docs/target-app-parity.md and docs/gaps.md
describe the rule, and drop the note that listed an object's later
effects keeping their distances as a shortfall.
With logoColors named, Flat Logo measured how flat the image is against
the named colors. A solid pixel counts as flat only within 22 (RGB
distance) of one of those colors or white. Flat art whose named colors
were 20 levels off in every channel was refused as not flat, and the
refusal score of a gradient changed with the names.
The check now uses the image's own colors, found the same way as when
no colors are named. It looks for as many colors as are named, with
white, or as the Colors setting gives, whichever is more. How far the named colors are
from the image's colors no longer changes whether the image is refused.
This changes one existing behavior: an image with large areas of a
color that was not named used to be refused, and it is now traced in
the named colors.
Docs: docs/image-trace-adjustments.md, docs/target-app-parity.md, the
imageTrace.make params text.
A process color can't colorize a grayscale image that has an alpha channel,
and paint.setFill refuses that combination. Remove Background gave such an
image an alpha channel and kept its process colorize color. It now refuses
the run, changing nothing, when an image it is given is gray and colorized
with a process color. It checks this before any image is decoded. Another
image in the document that already has that combination does not affect a
run on other images. Black, white and spot colors still colorize the result.
The rule check_colorized applies to each image is now one function,
paint::gray_colorized_with_process, which both checks call.
Docs: docs/mcp.md (Remove Background), docs/target-app-parity.md.
When a Tabs panel indent marker gave the paragraphs of a threaded story
values of their own, the panel sent one text.setFormat for each
paragraph, and the story flowed through its frames again after every
one of them. text.setFormat now takes paragraphIndents, a list of
{id, start, leftIndent?, firstLineIndent?} entries, one per paragraph.
It checks every entry before it changes anything, rebuilds each type
object's paragraph styles once and makes the whole change one edit, so
the story flows again once. The markers send one such command inside
the same labeled command.batch, and a drag that changes no paragraph
runs nothing.
- With the Selection tool, a marker drag on any frame of a threaded
story now sets every paragraph of the story, in its locked and hidden
frames too.
- The single-value form of text.setFormat fails, naming the key, when a
number such as leftIndent is given as a string, a switch or a list.
- A null value of any text.setFormat attribute leaves it as it is, as an
omitted one does. A call whose attributes are all null fails with
"nothing to change" and records no edit and no undo step.
- A text.setFormat call whose values are the ones the text already has
returns its ids and records no edit, no undo step and no new revision.
Docs: docs/mcp.md, docs/target-app-parity.md.