Commit Graph
2069 Commits
Author SHA1 Message Date
BFlat b4505a76de Merge pull request #6887 from dotCooCoo/feat/new-document-profiles
New Document: each preset category starts documents from its own profile
2026-11-13 06:11:41 +07:00
BFlat d61ad77529 Merge pull request #6909 from dotCooCoo/feat/align-artboards
Align: the Align panel aligns and distributes the selected artboards
2026-11-13 06:11:32 +07:00
BFlat a55606e66b Merge pull request #6949 from dotCooCoo/fix/assign-profile-working-spaces
Color management: Assign Profile leaves the working spaces of Color Settings
2026-11-13 06:11:15 +07:00
BFlat cea91c1374 Merge pull request #6968 from dotCooCoo/fix/followup-6910
MCP: a readable library's id keeps a hidden path that it holds after its start
2026-11-13 06:10:58 +07:00
BFlat f813ea02d5 Merge pull request #6950 from dotCooCoo/perf/setformat-per-paragraph
Type: a Tabs indent drag over many paragraphs no longer takes time in the square of their number
2026-11-13 05:24:02 +07:00
BFlat 9861e7f927 Merge pull request #6920 from dotCooCoo/feat/export-notes-loss-first
Save and Export: notes of what the file loses come before notes on options
2026-11-13 05:23:53 +07:00
BFlat 912a97346b Merge pull request #6973 from dotCooCoo/fix/followup-6827
MCP: document.json names linked JavaScript files outside the read roots by file name
2026-11-13 05:23:43 +07:00
BFlat 822d4101b5 Merge pull request #6890 from dotCooCoo/feat/3d-expand-as-wireframes
3D and Materials: Expand as Wireframes turns a 3D object into its edges as paths
2026-11-13 05:23:34 +07:00
BFlat a86021c7ae Merge pull request #6833 from dotCooCoo/fix/dialog-set-hidden-fields
Automation: ui.dialog.set cannot change the command a dialog runs
2026-11-13 05:23:26 +07:00
BFlat 666ba78862 Merge pull request #6967 from dotCooCoo/feat/docinfo-brush-types
Document Info: Brushes lists the brushes applied to art, with their types
2026-11-13 05:23:17 +07:00
BFlat c2f97d2efa Merge pull request #6961 from dotCooCoo/fix/gradient-repeat-runs
Gradients: a repeated gradient with many stops keeps every run
2026-11-13 05:22:59 +07:00
dotCooCoo 05466e54a8 Color management: Working CMYK proofs a tagged document through the working space
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.
2026-11-12 14:09:08 -08:00
dotCooCoo 3e32e99a15 Merge main into feat/align-artboards 2026-11-12 13:47:00 -08:00
dotCooCoo 7907bae6c3 Merge main into feat/new-document-profiles 2026-11-12 13:42:10 -08:00
BFlat 71d717b1da Merge pull request #6940 from dotCooCoo/feat/learn-tool-locator
Learn: a tool's name in a tutorial step shows where the tool is
2026-11-13 04:26:05 +07:00
BFlat 3434e46240 Merge pull request #6825 from dotCooCoo/feat/custom-arrowheads
Stroke: custom arrowheads from an arrowheads file join the arrowhead menus
2026-11-13 04:25:55 +07:00
dotCooCoo a670c3072b MCP: document.json names linked JavaScript files outside the read roots by file name
With automation read roots in force, document.json returned each entry of
svg_scripts unchanged, so a JavaScript file linked from outside the read
roots kept its full path in the reply. The reply copy now names such a
file by its file name alone. An entry given as a URL is kept, and the
stored document is not changed.
2026-11-12 13:18:17 -08:00
dotCooCoo c513114674 Gradients: Expand reports a capped gradient as unavailable
- object.expand.info reports no gradient or fill to expand for a
  gradient that repeats in more runs across its box than are written,
  matching object.expand, which leaves it a gradient. For a path that a
  painting live effect draws, it measures each piece the effect returns.
- CSS writes a repeating gradient's stop positions, and a repeating
  radial gradient's radius, with enough decimals that their rounding
  adds up to at most a hundredth of a period across the box (at least
  four for positions and three for the radius).
- docs/mcp.md says that sharp steps and swatch-linked stops are the last
  to be left out rather than always kept, and that the CSS conic limit
  counts stops before midpoints and Perceptual curves add more.
2026-11-12 12:55:54 -08:00
dotCooCoo 264a6541e6 Merge main into fix/dialog-set-hidden-fields 2026-11-12 12:55:47 -08:00
dotCooCoo 5edc0fa4f8 Merge main into perf/setformat-per-paragraph 2026-11-12 12:52:42 -08:00
dotCooCoo f02a572c6a Merge main into fix/assign-profile-working-spaces 2026-11-12 12:46:52 -08:00
dotCooCoo b0cde0067e Document Info: strokes and fills at opacity 0 list no brush or paint
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.
2026-11-12 12:45:28 -08:00
dotCooCoo 15ffb4ec01 Merge main into feat/export-notes-loss-first 2026-11-12 12:45:09 -08:00
dotCooCoo cbfe5248bb MCP: a readable library's id keeps a hidden path that it holds after its start
A reply hid a hidden library's absolute path wherever it appeared, also
inside another loaded library's id when the match began after the id's
start. With `/libs/Kit.gpl` hidden, the readable id
`loaded//project/libs/Kit.gpl` came back as `loaded//projectKit.gpl`,
and a request that used it failed.

Each whole readable id in a reply (with or without `loaded/`, or in a
`file:` URL with no host or `localhost`) is now found first, and a
hidden id or path that lies inside it stays. The same path after a
drive or in a URL with another host is still hidden.
2026-11-12 12:29:20 -08:00
BFlat 80f909a162 Merge pull request #6936 from dotCooCoo/fix/css-export-scope-type
CSS: css.export refuses a scope or path that is not a string
2026-11-13 03:29:20 +07:00
BFlat bb3f5c6d1a Merge pull request #6827 from dotCooCoo/fix/read-roots-document-replies
MCP: document.inspect and document.json leave out paths outside a confined client's read roots
2026-11-13 03:29:01 +07:00
BFlat f4767e89ff Merge pull request #6945 from dotCooCoo/feat/svg-variable-data
SVG: Save As SVG can include the document's variables and data sets
2026-11-13 03:28:53 +07:00
BFlat 06ee4cac00 Merge pull request #6952 from dotCooCoo/fix/remove-background-colorized-gray
Remove Background: a gray image colorized with a process color is refused
2026-11-13 03:28:44 +07:00
BFlat bb10f74019 Merge pull request #6875 from dotCooCoo/fix/window-menu-panel-toggle
Window menu: a panel's entry shows the panel Tab hid instead of closing it
2026-11-13 03:28:26 +07:00
BFlat bfd7b3dc00 Merge pull request #6944 from dotCooCoo/feat/bunri-kinshi
Type: Bunri-Kinshi keeps inseparable character pairs on one line
2026-11-13 03:28:08 +07:00
BFlat 484915de53 Merge pull request #6947 from dotCooCoo/fix/shortcut-rows-same-name
Keyboard Shortcuts: rows with the same name get names of their own
2026-11-13 03:27:42 +07:00
BFlat f976979a2f Merge pull request #6955 from dotCooCoo/fix/blend-profiles-follow-key-start
Blend: stroke profiles turn with a key path started at another anchor
2026-11-13 03:27:08 +07:00
dotCooCoo 197d033b4f Merge main into feat/custom-arrowheads 2026-11-12 12:04:01 -08:00
dotCooCoo ba20f468b3 Merge main into feat/align-artboards 2026-11-12 11:58:32 -08:00
dotCooCoo 05cf130fde Document Info: Brushes lists the brushes applied to art, with their types
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.
2026-11-12 11:51:05 -08:00
BFlat bc882d1fc0 Merge pull request #6910 from dotCooCoo/fix/library-ids-and-save-replies
MCP: a hidden library's shown id names it in requests, and replies hide its path wherever it appears
2026-11-13 02:47:27 +07:00
BFlat a2899e538b Merge pull request #6894 from dotCooCoo/fix/read-roots-error-messages
Automation: errors name a path outside the read roots by its file name
2026-11-13 02:47:17 +07:00
BFlat 813b24b0a5 Merge pull request #6835 from dotCooCoo/feat/blend-canvas-easing-handles
Blend: on-canvas widgets set a selected blend's color shift and easing
2026-11-13 02:47:08 +07:00
BFlat 339e33a4df Merge pull request #6905 from dotCooCoo/fix/type-size-range-error
Type: text.create and the type style commands refuse a size outside 0.1 to 1296 pt
2026-11-13 02:46:20 +07:00
BFlat 036c563635 Merge pull request #6820 from dotCooCoo/feat/brushes-ink-wash-library
Brushes: built-in Ink and Wash library with tapered ink, brush pen and wash brushes
2026-11-13 02:46:00 +07:00
dotCooCoo eb80d45ec5 3D and Materials: Expand as Wireframes takes a compound path member as its compound path
A path inside a compound path given in ids was replaced by a group inside the
compound path, which reads its members as paths, so the edges did not draw. The
compound path is now expanded in its place. The panel's Quick Actions show on
the Object tab of Revolve (Classic), not on its Rotation tab, as for the other
effects with an Object tab.
2026-11-12 11:33:34 -08:00
dotCooCoo 0691e1acbe Gradients: keep every run of a repeated gradient with many stops
When a repeated or reflected gradient needs more stops than a limit
allows, each run now leaves out the stops that change its colors
least, so every run is still written, instead of writing fewer runs
and padding the rest with the last color. Each run keeps its ends,
sharp steps, swatch-linked stops, tint and CMYK ink changes and spans
shaped by an off-center midpoint, and the colors are compared as the
gradient's method mixes them. This applies to gradients along or across
a stroke, CSS conic gradients, and PDF, EPS and .ai export.

- Outline Stroke's mesh fits the gradient to at most 1,024 stops, and
  splits a stroke into several meshes when one would hold more than
  2^20 points.
- Object > Expand leaves a gradient as it is when the box needs more
  than 256 runs, instead of expanding only the first runs.
- CSS writes the stop positions of repeating gradients with four
  decimals, so the period stays in place across the box.
- A swatch chip of a gradient that repeats gets at least four grid
  cells a run along each side (at most one a point, and 128), so it
  does not show one color when the count matches the chip's cells.
- docs/mcp.md states the stop limits and the PDF import sample budget.
2026-11-12 11:30:44 -08:00
dotCooCoo 451c308ed4 Remove Background: a gray image colorized with a process color is refused
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.
2026-11-12 10:41:22 -08:00
dotCooCoo f207ac3518 Type: a Tabs indent drag over many paragraphs no longer takes time in the square of their number
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.
2026-11-12 10:39:17 -08:00
dotCooCoo 7b97708c43 Blend: stroke profiles turn with a key path started at another anchor
When a blend starts a key's path elsewhere (an open path clicked at its
last anchor, a closed path turned to another start or reversed to match
the other key's winding), the steps now read that key's width profile,
pen pressure, tilt, bearing and rotation along the turned path, and a
reversed open path's arrowheads swap ends. A width profile's sides swap
when its path is reversed, a closed path's samples move past the new
start keeping the step at the old one, and a split width span is sampled
so its curve keeps its shape. A key whose subpaths turned differently
keeps its stroke as it is.

Width profiles in the steps also keep their discontinuous points instead
of only the width before them, and are sampled between their points so
each key's curve keeps its shape where the other key adds points; keys
whose points sit at the same positions are not sampled, so a preset on
both keys stays that preset. A sample of one key that lies within a
millionth of the other key's step no longer hides that step.
2026-11-12 10:38:00 -08:00
dotCooCoo 07ae51f3a5 Color management: Assign Profile leaves the working spaces of Color Settings
Edit > Assign Profile wrote the profiles it assigned into the working
settings of Edit > Color Settings. Color Settings then showed the
assigned profile as the working space, and the next change in Color
Settings saved that profile for the next start.

The working settings are now kept apart from the settings in effect.
Assign Profile still makes the profiles it assigns the ones colors show
and convert through, and assigning none puts the working space back.
Color Settings shows and saves only the working settings, and a change
there keeps the profiles the document in front is assigned in use.
color.removeProfile refuses only a working space: removing an assigned
profile in use puts the working space in its place, and loading that
profile again puts it back in use.

Public reference: "Changing the color profile for a document" and
"About color working spaces",
https://help.adobe.com/archive/en_US/illustrator/cs3/illustrator_cs3_help.pdf#page=150
2026-11-12 10:33:18 -08:00
dotCooCoo 41f6400993 Keyboard Shortcuts: rows with the same name get names of their own
Several rows of Edit › Keyboard Shortcuts had the same group and label,
so a user could not tell them apart: the four Window › Other Library…
commands, File › New… (file.new and file.newDialog), Type › Fit
Headline (text.fitHeadline and type.fitHeadline), Ui › Reset Panel (the
character and paragraph style options) and File › Continue in
Background (export and open).

Rows that would share an English name now take a name of their own:
- a command that an item of the menu bar runs is listed under that
  item's menu path, for example Window › Swatch Libraries › Other
  Library…;
- a command whose id extends another command's id is listed under that
  command's label, for example Character Style Options › Reset Panel;
- the rows that still share a name show their id after it, except the
  one row an item of the menu bar runs, so File › New… stays the New
  Document dialog's row and file.new is File › New… (file.new). Two
  filter plug-ins with the same menu path and label show their ids too.

shortcuts.list gives the new group of the first two kinds of rows in
`group`. The dialog's search finds a row by the id it shows. A message
about a shortcut that is already in use names every row that has it by
its whole name, with its group, instead of its label alone.
2026-11-12 10:32:03 -08:00
dotCooCoo 9371a9ea51 Merge main into fix/read-roots-document-replies 2026-11-12 10:27:20 -08:00
dotCooCoo 40f4c920e7 Type: Bunri-Kinshi keeps inseparable character pairs on one line
Paragraph panel menu > Bunri-Kinshi (with the East Asian options) and
text.setFormat {bunriKinshi} turn it on per paragraph. A line then
never breaks inside two em dashes, two horizontal ellipses, two two-dot
leaders or the two halves of a vertical kana repeat mark, the pairs W3C
JLREQ lists for class cl-08 (https://www.w3.org/TR/jlreq/#cl-08), nor
inside a chain of em dashes. Both composers, vertical type, Kinsoku
Shori Type, hyphenation and No Break follow it, and a pair wider than
the line stays whole on it. Justification and letter spacing add no
space inside a pair.

The setting works only with a Kinsoku Set: with Kinsoku Set None the
paragraph keeps the value without effect and the menu item is
unavailable. It is off by default, saved with the paragraph only when
on, carried by paragraph styles (Paragraph Style Options > East Asian
Composition Settings), and turned off by Reset Panel. A value that is
not true or false is refused. The .ai editing data has no field for it,
so saving reports a paragraph with it on and a pair in it as left out.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 10:26:11 -08:00
dotCooCoo eed65939fc Learn: a tool's name in a tutorial step shows where the tool is
A tool step in the Learn panel now draws the tool's name as a link. Clicking
it, or pressing Enter or Space on it, runs the new learn.locateTool command,
which marks the tool where the current layout shows it without choosing it
(the help page:
https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/learn-skills-quick-skill-guide.html).

- A tool shown on its toolbar button has the button marked, and a toolbar
  that has scrolled it out of view scrolls it back.
- A tool in a collapsed group opens the group's flyout with its row marked;
  the group keeps the tool it shows.
- A group torn off into a strip comes to the front with the tool marked.
- Toolbars made with New Toolbar are searched after the Tools panel.
- A tool that no shown toolbar holds is marked in the All Tools drawer.
- A Tools panel hidden with Window › Tools shows again. In Presentation
  Mode, or while Tab hides the toolbars, the reply is "unavailable" with a
  reason.
- The mark is a 2 pt outline in the selection color. It lasts 3 seconds,
  until Escape (also when Escape closes the All Tools drawer), or until the
  next link replaces it. These are VectorCraft's own rules.

The command takes a tool id and rejects a missing, non-string or unknown id.
Catalog steps mark the linked name in brackets, and the catalog test checks
that each one names its tool. Rows for the command and the link's hover text
are added to every complete catalog.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
2026-11-12 10:25:44 -08:00