Commit Graph
7221 Commits
Author SHA1 Message Date
Brandon Thomas 33010204cb Merge pull request #5137 from dotCooCoo/fix/vars-p16
Variables: Lock Variables' description names the refused import
2026-11-01 15:27:53 -05:00
Brandon Thomas 2aa24c1f3a Merge pull request #5136 from dotCooCoo/fix/vars-p5
Variables: a graph variable's data set applies its CSV as graph.setData does
2026-11-01 15:27:48 -05:00
Brandon Thomas 7e5eebc3ed Merge pull request #5135 from dotCooCoo/fix/vars-p15
Variables: Rename reports a missing variable or data set before a taken name
2026-11-01 15:27:45 -05:00
Brandon Thomas 0271e034ce Merge pull request #5123 from dotCooCoo/fix/ai-os22-g6
.ai import: version 7 palettes keep their swatches without names
2026-11-01 15:27:41 -05:00
Brandon Thomas cbae540edf Merge pull request #5120 from dotCooCoo/fix/paste-beside-compound-member
Paste: in front or back of a compound path's member, other art goes beside the compound path
2026-11-01 15:27:36 -05:00
dotCooCoo 39e69e8446 Tests: move the lock params text test next to the lock test 2026-11-01 11:48:41 -08:00
Brandon ThomasandClaude Opus 5.5 5628de96f8 Release 0.20.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.20.0
2026-11-01 13:59:17 -05:00
dotCooCoo b104efc53c Graph data: a dropped empty row adds no blank series
Dropping rows with neither a label nor a value read the data padded to
the widest row, so a dropped row wider than the rest (`,,`) left every
kept row one blank cell wider. The graph then had an extra blank series,
and a right-axis assignment to that index was kept. Each kept row now
keeps its own width. This applies to graph.setData and to a graph
variable's data set.
2026-11-01 10:19:45 -08:00
dotCooCoo 637229931f Paste: Paste in Back keeps a clip group's clipping path at the bottom
With the clipping path of a clip group or a clipping layer selected, or a
member of a compound path that is the clipping path, Paste in Back put the
clipboard's objects below it. The bottom pasted object then became the
clipping path. With nothing selected in a clipping layer, Paste in Back did
the same at the bottom of the layer.

Paste in Back now puts the objects right above the clipping path, as Send to
Back keeps art above it.
2026-11-01 10:18:06 -08:00
Dylan M. Taylor 77274ac5ff docs: sync Craft App Suite list with ArtCraft Launcher 2026-11-01 12:29:58 -05:00
dotCooCoo e49e102032 Variables: Lock Variables' description names the refused import
variable.lock's params text and the doc comment on Variables::locked said every
dataset command still runs while the variables are locked. dataset.import is
refused when its header would define a variable; both texts now say so, as
docs/mcp.md and dataset.import's params already do.
2026-11-01 08:43:56 -08:00
dotCooCoo 07282d95e0 Variables: a graph variable's data set applies its CSV as graph.setData does
Choosing a data set gave a graph variable's CSV to the graph without the
two steps graph.setData takes after new data: rows with neither a label
nor a value were kept and drawn as empty slots, and a right-axis series
the new data no longer had stayed assigned, so a series added by a later
row started on the right axis. The data set now goes through the same
steps.
2026-11-01 08:43:16 -08:00
dotCooCoo f98b086c5f Variables: Rename reports a missing variable or data set before a taken name
variable.rename and dataset.rename checked whether newName was taken before
checking that name exists, so renaming a missing name onto a taken one said
the new name already exists. Both now report the missing name first.
2026-11-01 08:23:40 -08:00
dotCooCoo f1fd255120 .ai import: version 7 palettes keep their swatches without names
Version 7 files write each palette swatch as its paint and `Pc`, with no
name. The reader only kept a swatch with a name before `Pc`, so such a
palette gave no swatches and the document got the default set.

A swatch without a name is now named by its spot color, gradient or
pattern, or by its values in the format the swatch import already uses
for unnamed colors ("Gray K=25", "C=25 M=0 Y=0 K=0"). `Pn` and a `Pc`
with no paint before it add nothing. Named swatches keep their names.

An operator the reader does not know, or a `Pg`, now ends the paint
before it, so a later `(name) Pc` no longer takes that paint. The
swatch limit is kept with a running count instead of summing every
group at each `Pc`.
2026-11-01 06:55:53 -08:00
dotCooCoo 827e137b5c Paste: in front or back of a compound path's member, other art goes beside the compound path
With a member of a compound path selected, Paste in Front and Paste in Back
put the clipboard's objects next to that member, inside the compound path,
whatever they were. A pasted group, compound path or type object then sat
inside a compound path, which holds only paths. The model-based test
`random_command_sequences` stops on this with "compound #N has a non-path
child".

When the clipboard holds anything other than paths, the objects now go
right above or below the compound path. Paths still go next to the member,
inside the compound path.
2026-11-01 06:42:33 -08:00
05d5f99fd7 ci: run the desktop printing check through the shared gate (#5062)
* 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>
2026-11-01 10:55:12 +01:00
BFlat 1c4a7831eb Merge pull request #5067 from storytold/feat/nearest-swatch-4923
Fix #4923: Find Nearest Swatch in the document or a swatch library
2026-11-01 11:28:39 +07:00
BFlat d94392db1f Merge pull request #5055 from mockydevs/fix/export-all-one-file-4920
Export All Open Documents: one file per copy (#4920 follow-up)
2026-11-01 11:28:23 +07:00
BFlat f77dcc8ec4 Merge pull request #5056 from dotCooCoo/fix/pdf-perceptual-gradient-mixed-inks
PDF export: a Perceptual gradient that mixes spot and process inks keeps its inks
2026-11-01 11:28:01 +07:00
BFlat e36488ee95 Merge pull request #5028 from dotCooCoo/fix/export-for-screens-numbers-taken-names-r
Export for Screens: a second file with a taken name is numbered instead of skipped
2026-11-01 11:27:49 +07:00
BFlat 7c40cc4220 Merge pull request #5064 from dotCooCoo/feat/symbol-edit-mode
Symbols: Edit Symbol opens the symbol in its own editing mode, and every instance follows each edit
2026-11-01 11:27:34 +07:00
BFlat da022c9e60 Merge pull request #5061 from dotCooCoo/feat/touch-type-rotated-characters
Type: Touch Type moves a character rotated near 90 degrees across its line
2026-11-01 11:27:18 +07:00
BFlat 2f6252f086 Merge pull request #5063 from dotCooCoo/fix/character-panel-mixed-toggles
Type: Character panel toggles show off for a mixed selection, and text.setFormat checks on/off values
2026-11-01 11:26:59 +07:00
BFlat e365620311 Merge pull request #5026 from dotCooCoo/feat/character-font-height-reference-r
Character: Font Size can measure the cap height, x-height or ICF box
2026-11-01 11:26:46 +07:00
BFlat 3153f6eb00 Merge pull request #5065 from dotCooCoo/fix/ai-os15
.ai import: envelopes open as live envelopes
2026-11-01 11:26:29 +07:00
BFlat 6047570089 Merge pull request #5059 from dotCooCoo/fix/ai-os16-onpath
.ai import: Objects on Path groups open live with their path, Pivot and Rotate
2026-11-01 11:26:14 +07:00
BFlat 071f5cbb43 Merge pull request #5057 from dotCooCoo/fix/ai-os13
.ai import: template layers and ruler guides open as they were set
2026-11-01 11:25:59 +07:00
bflatastic a76d9215da Fix #4923: Find Nearest Swatch matches colours to a library's swatches
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.
2026-11-01 11:09:11 +07:00
Don Omondi 6d6757c929 Export All Open Documents: every page and artboard, linked data included
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.
2026-11-01 11:09:10 +07:00
Don Omondi c101576df3 Fix #4920: one file per copy
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.
2026-11-01 11:09:10 +07:00
dotCooCoo 38bb213917 PDF export: a Perceptual gradient that mixes spot and process inks keeps its inks
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.
2026-11-01 11:09:09 +07:00
dotCooCoo 7e5e099f8e Export for Screens: a second file with a taken name is numbered instead of skipped
Squashed from #5028 onto main.
2026-11-01 11:09:08 +07:00
dotCooCoo ff036557fb Symbols: Edit Symbol opens the symbol in its own editing mode, and every instance follows each edit
Squashed from #5064 onto main.
2026-11-01 11:09:03 +07:00
dotCooCoo 5716a996ab Type: Touch Type moves a character rotated near 90 degrees across its line
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
2026-11-01 11:08:57 +07:00
dotCooCoo 94ef9b87c2 Type: Character panel toggles show off for a mixed selection, and text.setFormat checks on/off values
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.
2026-11-01 11:08:56 +07:00
dotCooCoo 427bce12b0 Character: Font Size can measure the cap height, x-height or ICF box
Squashed from #5026 onto main.
2026-11-01 11:08:55 +07:00
dotCooCoo af133b1ee4 .ai import: envelopes open as live envelopes
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.
2026-11-01 11:08:49 +07:00
dotCooCoo c027947362 .ai import: Objects on Path groups open live with their path, Pivot and Rotate
Squashed from #5059 onto main.
2026-11-01 11:08:47 +07:00
dotCooCoo 70651f585e .ai import: template layers and ruler guides open as they were set
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
2026-11-01 11:08:18 +07:00
Dylan M. Taylor 469c7a421e ci: grant packages write permission to release workflow 2026-10-31 23:43:01 -04:00
BFlat 3b5fa80be3 Merge pull request #5060 from storytold/fix/artboard-panel-reorder-4687
Fix #4687: the Artboards panel reorders artboards by dragging a row
2026-11-01 10:32:11 +07:00
bflatastic 9b9f0918f0 Fix #4687: the Artboards panel reorders artboards by dragging a row 2026-11-01 10:17:29 +07:00
BFlat 42b07e35e3 Merge pull request #5022 from mockydevs/feat/export-all-open-4920
Fix #4920: Document Tools exports every open document
2026-11-01 09:38:50 +07:00
BFlat 03d54404c2 Merge pull request #5050 from dotCooCoo/fix/ai-unread-object-keeps-layers-r
.ai import: one object the reader can't read comes in as the page's art, and the layers stay
2026-11-01 09:38:34 +07:00
BFlat b359a7a63d Merge pull request #4949 from dotCooCoo/fix/eyedropper-blend-envelope
Eyedropper: Shift-click samples a blend's steps and an envelope's distorted art
2026-11-01 09:38:18 +07:00
BFlat 50113ea99a Merge pull request #5044 from dotCooCoo/feat/knife-straight-cut-smart-guides
Knife: a straight cut's ends snap to the anchors and paths Smart Guides snap to
2026-11-01 09:38:04 +07:00
BFlat a17ba4e304 Merge pull request #5045 from dotCooCoo/fix/doc-cfb-fuzz
Tests: .doc import fuzzing also damages the compound-file container
2026-11-01 09:37:49 +07:00
bflatastic 2d95cd667b Document Tools: catalog rows for Export All Open Documents, and its failure message as one translatable message 2026-11-01 09:24:25 +07:00
Don Omondi 1e8ac2434c Fix #4920: Document Tools exports every open document
addon.document.exportAllOpen {folder, format?} writes a copy of every
open document to one folder as Save a Copy does, each named after its
document with taken names numbered so no file is replaced. Documents
keep their paths and modified state, the active one stays active, and a
document that can't be written is reported while the others are still
written. Object > Plug-ins > Document Tools gets Export All Open
Documents as PDF and as SVG, which ask for the folder.
2026-11-01 09:24:25 +07:00
dotCooCoo 18b9c6113e .ai import: one object the reader can't read comes in as the page's art, and the layers stay
Squashed from #5050 onto main.
2026-11-01 09:24:23 +07:00