The color sliders now mark the row they edit with `model: "new"`
instead of a dialog-wide flag, and `recolor.apply` reads a row's own
`model` before the command's. Rows the sliders did not edit keep each
color's model, so with RGB art and a CMYK color group, a slider edit of
one row no longer turns the other rows' art CMYK. Another edit of the
row's new color, Reset and rows reduced again remove the mark, and
`recolor.randomize` moves it with its new color.
* ci: run the desktop printing check through the shared gate
print.yml ran its own Windows job, which the CI workflow rules phase out, and each PR saved its
own ~1.3 GB cache. The same commands now run through craft-common-actions' gate.yml on
windows-2022, without craft-fonts, nextest or the wasm target as before. The gate never saves
from a pull request; a manual run on main seeds the cache. storytold/craft-common-actions#118.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ci: call the shared gate at main
storytold/craft-common-actions#119 is merged, so main's gate takes an empty packages list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A dialog opened on a color group or on loose colors no longer offers Tint for a spot color of
the library: OK saves only the new colors, so a tint set there was lost. The row shows the
process modes instead.
The Tint rail and a tinted row's new color chip show a Lab spot color as art linked to it shows
it: the working-CMYK equivalent while the Spot Colors options use CMYK values, with its inks
scaled.
Changing the color count, a Preserve option or Limit to Library rebuilds the rows from the art's colors, which discards a slider edit. The dialog now also forgets that edit, so preview and OK give the art the rebuilt rows' colors in the art's own model instead of the rows' models.
A wheel drag or a harmony rule on the Edit tab now removes a row's tint
when it gives the row another new color, as the color sliders, the hex
field and the Color Picker already do. With Limit to Library, an edit
that snaps back to the row's own color keeps the tint.
recolor.randomize moves each row's tint with its new color when it
shuffles the order, and removes the tint from a color that saturation
and brightness changes.
On Linux and the BSDs, the_titlebar_variable_decides_the_frame_before_the_window_opens now
holds spawning() while it starts each child test process, as the portal save test does around
dbus-daemon, so the child does not keep a copy of a GPU start test's locked start file.
Runs the test binary again with VECTORCRAFT_TITLEBAR set to app, system,
desktop and an unknown value, and checks titlebar_override, custom_titlebar
with no saved preferences and with System Title Bar off and on, and the
window decorations native_options sets before the window opens. On macOS
and Windows the variable is not read.
Reset now also clears the slider edit, so the preview and OK keep each
color's model again instead of sending model "new". Changing the Colors
count, a Preserve flag or Limit to Library, or pressing Reset, with the
preview on reduced the previewed colors, so the rows no longer matched
the art; the preview is now rolled back before the colors are reduced.
The Tint mode follows the swatch recolor.apply links: the first library
swatch of the library color nearest the row's new color, shown as Tint
only when that swatch is a spot color.
- isolation_reaches_hidden_art_only_for_the_isolated_clip_group: with the
outer clip group isolated, clicks and marquees take the art its own mask
hides, while an inner clip group's mask still clips that group's art;
isolating the inner group or its art reaches the inner hidden art.
- isolation_lets_direct_selection_take_the_art_a_clip_group_hides now
continues the press with a drag on the same tool and checks the Move
step and its preview, for Direct Selection and Group Selection.
The Assign tab gets a Color Mode menu (HSB, RGB, CMYK, Lab, and Tint when
the row's new color is a spot color of the Limit to Library library) and
its sliders under the rows. They edit the first selected row's new color
and are disabled with no row selected. Once they have edited a color in a
mode, the preview and OK send recolor.apply with model "new", so the art
takes the color in that mode.
recolor.apply rows take an optional tint (percent, default 100): art linked
to the row's global or spot library swatch takes that share of its tint.
recolor.randomize keeps a row's tint.
The Paragraph panel menu (with the East Asian options) gains Kinsoku Shori
Type, and text.setFormat takes kinsokuType. Where the Kinsoku Set keeps a
character off the start of the next line or the end of this one, Push In
First sets it on the line and closes the line's gaps next to CJK
characters to fit, each by at most a tenth of an em of the character
before it; a line that cannot close up that much, or that holds a tab,
pushes out. With Optical Margin Alignment or Roman Hanging Punctuation
on, the gaps that hanging punctuation keeps open are not counted. Push
Out First pushes in only when pushing out would leave the line more than
an em short. Push Out Only, the default, is the line breaking area type
had before, so existing documents lay out unchanged. The setting does
nothing with Kinsoku Set None, is saved only when it is not Push Out
Only, and paragraph styles carry it. Reset Panel sets it back to Push
Out Only.
Docs: docs/mcp.md, docs/type-parity.md, docs/target-app-parity.md.
The PDF pages of a .ai draw each artboard's background color (Include
Artboard Fill, on by default), but the editing copy of the art left it
out, so the two differed and the file reopened from its PDF part. The
editing copy now takes the same option.
Object > Plug-ins > Color Effects > Find Nearest Swatch... picks a
library (the document's swatches, a built-in library, or a library or
colour book the user saved or loaded) and Fill and Stroke, and lists
each colour of the selection with its three closest swatches and their
CIEDE2000 difference. Apply gives each colour its nearest swatch as one
undo step.
- addon.color.nearestSwatch (a query): the closest swatches of a
library to each colour of the selection's fills and strokes (solid
colours and gradient stops, inside groups and type), or to a colour
given, with deltaE; count 1..50.
- addon.color.applyNearestSwatch: recolours those paints (and gradient
meshes) to their nearest swatch; global and spot swatches link, and a
library's swatches the colours take are added to the document first
(as swatch.library.add adds them), so a spot colour stays spot.
- The library picker Image Trace's Document Library uses moves to the
Swatches panel module and is shared.
- No colour book data ships: only libraries VectorCraft computes or the
user loads are searched.
Each format's copy options are given in full, so no remembered option
applies: PDF and .ai copies write every page (range all), SVG copies
the art of every artboard in one file (useArtboards false), native,
.ai and EPS copies include linked files' data.
Each copy is saved with images embedded and artboards together, so a
document last saved with linked SVG images writes no image files beside
its copy; any other file a save reports is reserved for the copies still
to come.
A Perceptual linear or radial gradient that mixes spot colors with each
other or with CMYK or gray stops was written as an image in process
colors. It is now written as a DeviceN shading of its inks, with the
stops on its Perceptual curve: at each one, the inks of the two stops on
either side are mixed at the weight where the two colors mixed in
display RGB have the OKLab lightness of the color on the curve.
- Gradient::ink_mixes gives the curve's stops as weights between stops,
under the same 4,096-stop limit as ink_tints.
- Perceptual gradients that mix a spot color with RGB or Lab stops,
dithered fills and freeform gradients stay images, and the warning
now names those cases.
Baseline shift now moves a character in the line's frame, outside
Character Rotation, so a positive shift moves a character up from its
line at any rotation, and the character turns about its shifted pen
position. The Touch Type tool splits a drag into its part along the line
(kerning) and its part up from the line (baseline shift) at every
rotation; before, within about 6 degrees of a quarter turn it dropped
the cross-line part.
Characters that already combine a rotation with a baseline shift are
drawn in a new position. Their stored values do not change.
- text: glyph transform order, PositionedGlyph::pivot (the turning
point), tab leaders in the same order
- tools: Touch Type splits drags against the line's up axis and measures
rotate-handle turns about the shifted pen position
- engine: text.touchType description; dy is up from the line
- docs: mcp.md Touch Type paragraph, target-app-parity.md progress line
The Character panel's All Caps, Underline and Strikethrough buttons, and
its menu's All Caps, Underline, Strikethrough, Proportional Metrics,
Tate-chu-yoko and No Break, read the first selected character's style.
With only some characters marked they could show on, and choosing one
turned the attribute off for every character. They now show on only
when every selected character has the attribute, and a click on a mixed
selection turns it on for all, as Small Caps and Standard Vertical Roman
Alignment do. type.underline (Cmd+Shift+U) underlines a mixed selection
the same way. The Character Alignment and Digits submenus check no item
while the selected characters differ.
text.setFormat ignored a value that was not true or false for underline,
strikethrough, allCaps, proportionalMetrics, tateChuYoko,
standardVerticalRoman, noBreak, hyphenate, hyphenateCapitalized and
romanHangingPunctuation. It now refuses it with "`<key>` must be true or
false" and changes nothing, as text.setRangeStyle does.
An envelope in a .ai's editing data opened as its distorted art, with
its mesh and contents dropped. It now opens as a live envelope of its
contents: a warp with its style, bend, distortions and orientation, a
mesh with its points and handles, or a top object with its outline,
with Envelope Options, Fidelity and Edit Contents.
The envelope replaces its drawn art only when VectorCraft draws it like
that art, with a budget so that live envelopes don't make the file open
from its PDF part. When the layers still differ too much from the page,
the drawn art is put back. An envelope that can't be read, or that
draws differently, keeps its drawn art with a note. Envelopes of type
keep their drawn art and hidden type as before.
The editing data's layer options set a template layer from the flag four
places after the colour index. The colour index of nine-operand options,
and the colour index and dimming percentage of eleven and twelve operand
options, are read from their own places (they were read one place later).
A straight (N) * guide path directly on a layer that runs across the
whole canvas, or from edge to edge of one artboard, opens as a ruler
guide on that layer (an artboard guide of that artboard); other guide
paths stay guide paths. Guides scale with the document when its editing
data is in the units of a UserUnit page, and an EPS that keeps only its
first artboard keeps only that artboard's guides.
Fixes#779
A .ai saved with pdfCompatible false warned that other apps show empty
pages, also when the file carries the editing copy of its art. With the
editing copy the warning now says that apps that read its editing data
open it; with editingData false it is unchanged.
The comments on the %%Creator line and on the artboards' Recorded and
NotRecorded parts of the document dictionary now describe what the
writer writes.
LoadOptions::is_partial now counts native off. A PDF saved with Preserve
Editing and opened from its pages instead of the document it carries kept
its save path, so Save wrote over the file and dropped that document.
Save now asks for a name, as for a page range or another box.
The progress-doc bullet now says that folder and file names drop trailing
periods and spaces, and that Batch also numbers a name that an earlier
output, a source file in the destination folder or, for data sets, an
existing file already has.