Commit Graph
1465 Commits
Author SHA1 Message Date
Brandon Thomas e14b2b2c79 Merge pull request #4070 from marcoarnulfo/fix/direct-select-type-on-path
Direct Selection: an anchor of type on a path's path drags and the type reflows along it
2026-10-25 10:56:10 -04:00
Brandon ThomasandClaude Opus 5.5 f0a4f189f3 Docs: Direct Selection reshapes the path of type on a path outside perspective
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 10:44:35 -04:00
Brandon Thomas 70a05ba09b Merge pull request #4068 from dotCooCoo/fix/eps-no-art-central-file-text
EPS: the help text says no central file is written when no art shows
2026-10-25 10:38:12 -04:00
Brandon Thomas f0e5b5e902 Merge pull request #4069 from dotCooCoo/fix/set-paint-object-count
MCP: set_paint reports how many objects it painted
2026-10-25 10:38:01 -04:00
Brandon Thomas dda90f0f4f Merge pull request #4060 from dotCooCoo/feat/unknown-command-suggestion
Commands: an unknown command id is answered with the nearest command id
2026-10-25 10:37:54 -04:00
Brandon Thomas 774314a351 Merge pull request #4050 from dotCooCoo/fix/screens-filename-is-file-name
Export for Screens: <filename> takes the saved document's file name
2026-10-25 10:37:45 -04:00
Brandon Thomas f775a31a80 Merge pull request #4117 from zsoltmar/fix/3536-pen-cursor-axis
Pen cursors: a fountain-pen nib on the selection arrow's axis
2026-10-25 10:37:36 -04:00
Brandon Thomas d51660d46e Merge pull request #4064 from dotCooCoo/feat/pencil-continue-line-cursor
Pencil: a path-continuation cursor shows over an end a straight line continues
2026-10-25 10:37:33 -04:00
Brandon Thomas 0d50e5f6ce Merge pull request #4059 from dotCooCoo/fix/new-symbol-threaded-text-keeps-its-text
Threaded text: New Symbol on a frame no longer duplicates its text
2026-10-25 10:37:26 -04:00
Brandon Thomas d57bcc3a39 Merge pull request #4047 from dotCooCoo/fix/rasterize-threaded-text-keeps-its-text
Threaded text: Rasterize on a frame no longer duplicates its text
2026-10-25 10:37:15 -04:00
Brandon Thomas 7fc7b41e71 Merge pull request #4061 from dotCooCoo/fix/trace-abutting-seam-note
Docs: the Image Trace page describes the background line between Abutting colors
2026-10-25 10:37:12 -04:00
Zsolt van den Már de18d80399 Pen cursors: a fountain-pen nib on the selection arrow's axis
The old pen glyph was a crude pentagon with a floating dot and a stray
stem. Redraw it as the precision instrument it is: the pen-tool icon's
nib — sharp point on the hotspot, shoulders flaring to their widest
two-thirds back, a narrower flat heel, a slit widening into the round
breather hole — swung round onto the selection arrow's midline
(arrow_axis), so holding Cmd/Ctrl to swap between the Pen and the
selection tools no longer rotates the cursor under the pointer.

Badges keep their meanings (*, +, -, o, /, j, ^, ~) and multi-stroke
ones now draw all halos under all ink via strokes(), so neighbouring
strokes no longer cut each other into blobs.
2026-10-25 00:19:53 -07:00
dotCooCoo 3c3cf90e79 MCP docs: export's EPS row names its one-file default and rect refuses artboards
Without an artboard choice an EPS export writes one file of the visible
art, not one file per artboard. options.rect is also refused with
options.artboards, as page_rect checks every artboard param.
2026-10-24 18:44:21 -07:00
dotCooCoo 7e00887f09 Docs: a whole thread made into a symbol keeps the last frame's text 2026-10-24 13:18:34 -07:00
Marco Arnulfo ec97ee2c80 Direct Selection: an anchor of type on a path's path drags and the type reflows along it (part of #3980) 2026-10-24 22:06:20 +02:00
dotCooCoo c65b494575 MCP: set_paint reports how many objects it painted
With nothing selected and no ids, set_paint changes only the paint for
new art, but its reply was the same as when it painted objects, so a
caller could not tell that no object changed.

paint.setFill, paint.setStroke, paint.none, paint.lastColor,
paint.lastGradient and stroke.set now reply {objects}: how many objects
took the paint, as the commands resolve their targets (a selected group
counts the objects inside it). set_paint adds the largest of those
counts to its reply as `objects`, and when it is 0 a `note` says that
only the paint for new art changed. The tool description and the
set_paint row in docs/mcp.md describe the reply.
2026-10-24 12:27:08 -07:00
dotCooCoo 00f000f831 Pencil: a path-continuation cursor shows over an end a straight line continues
With Shift or Alt held (Alt only while Alt key toggles to Smooth Tool
is off), a Pencil press on an end of a selected open path draws a
straight line that continues the path, but before the press the cursor
was the plain straight-line cursor. Draw straight lines with the Pencil
tool says a path-continuation icon appears on the Pencil over that end:
https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/draw-shapes/draw-straight-lines-with-the-pencil-tool.html
Over such an end the cursor is now PencilContinue, the straight-line
cursor's line leaving a small filled square.

The check is the one the press makes (Edit Selected Paths, the same
end lookup). Away from the ends, with Edit Selected Paths at 0 pixels,
with nothing selected and while the line is drawn, the cursor is as
before.

Docs: docs/target-app-parity.md and docs/ui-parity.md, where the
duplicate Pencil lines and rows left by earlier merges are cut to one.
2026-10-24 12:26:17 -07:00
dotCooCoo 6e6fbbac1d Commands: an unknown command id is answered with the nearest command id
A misspelled parameter key got a did-you-mean suggestion, but a
misspelled command id only got "unknown command `select.al`", through
the CLI, MCP and the control channel alike. Session::execute now names
the nearest command id, using the same matching as parameter keys
(ignoring case), and action.batch does the same for an unknown step. An
id with no near match keeps the plain error.

The matching skips candidates whose length differs by more than the
allowed number of edits, so a very long unknown command id or parameter
key is answered at once instead of being measured against every command
id or accepted key.

The new message has a row in every catalog, and docs/mcp.md's
Parameter keys section shows it.
2026-10-24 11:20:27 -07:00
dotCooCoo 7a4ec1e530 Threaded text: New Symbol on a frame no longer duplicates its text
New Symbol and Redefine Symbol replaced a frame of threaded text by a
symbol instance whose art holds a copy of the frame. The thread's
re-flow then added the frame's text to the story, as it does for a
frame that was deleted, so the other frames held that text a second
time while the instance drew it.

A frame that New Symbol or Redefine Symbol puts in the symbol now
leaves its thread with the text it shows, and the other frames keep
the text they hold, as with Create Outlines, Expand and Flatten
Transparency. When the thread's last frame goes into the symbol, the
text it has no room for goes after the text of the last frame that
stays, and the copy in the symbol's art holds only the text the frame
shows. When every frame of a thread goes into the symbol, the copy of
the last frame keeps all its text. Undo restores the thread.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 11:15:42 -07:00
dotCooCoo 63616b7db7 Docs: the Image Trace page describes the background line between Abutting colors
With Method Abutting, neighboring colors share one exact edge. The canvas
smooths each path's edges on its own, so each path covers only part of the
pixels along that edge, and a thin line of the background can show between
the colors. The adjustments page did not say so. It now describes the line,
names the default and the presets that use Abutting (Default, Auto Color,
3 Colors, 6 Colors and 16 Colors), says which exports show it (SVG and PDF
in most viewers; raster exports with Type Optimized, or with Art Optimized
above 10 million pixels or 16,384 pixels on a side), and points to
Overlapping, which stacks the colors and shows no background along shared
edges.
2026-10-24 11:08:11 -07:00
dotCooCoo 0dcb52c7cd Export for Screens: <filename> takes the saved document's file name
In a file name pattern, <filename> is documented as the document's name
without its extension, but it expanded to the File Info title whenever the
document had one, so a saved my-logo.vectorcraft titled "Logo: final
version" exported as Logo--final-version__Artboard 1.png. The Full
Document file and the .zip took the same title.

Export for Screens and the dialog's Example line now take <filename> from
the document's file, as Save names it (save.rs), and fall back to the
title only for a document that has not been saved.
2026-10-24 09:53:53 -07:00
dotCooCoo b998ae623c MCP: save_file takes the native save options compress, version and preview
Squashed from #3955 onto main.
2026-10-24 23:43:54 +07:00
dotCooCoo 7a9ae4324d Threaded text: Rasterize on a frame no longer duplicates its text
Object › Rasterize replaced a frame of threaded text by an image of
it. The thread's re-flow then added the frame's text to the story, as
it does for a frame that was deleted, so the other frames held that
text a second time while the image drew it.

A frame that Rasterize turns into an image now leaves its thread with
the text it shows, and the other frames keep the text they hold, as
with Create Outlines and Expand. When the thread's last frame is
rasterized, the text it has no room for goes after the text of the
last frame that stays. A thread left with one frame is no longer a
thread, and undo restores the thread.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 09:37:10 -07:00
dotCooCoo 0921b8629e Shape Builder: hover and Alt hover share one region map
Holding Alt over a selection the Shape Builder had already mapped built
the planar map a second time, to add the outline edges that erasing
hits. A merge, and a Live Paint Bucket fill of a plain selection, also
dropped the map, so a gesture that left the document unchanged was
followed by another full build.

The Shape Builder now builds its map with the outline edges the first
time, and both tools keep the map until the document, its revision or
the selection changes.

When the inputs have more than 128 segments, a hover with the Shape
Builder or the Live Paint Bucket now builds the map on another thread
and highlights no region until it arrives, instead of holding up the
frame; the canvas checks for it each frame. A press waits for the map,
and the headless MCP host waits for it after a move. The web build has
no threads and builds the map at once. The Live Paint Selection tool's
hover no longer builds a map of the selection, which it did not use.
2026-10-24 23:15:51 +07:00
dotCooCoo ebd512d2a4 Threaded text: Flatten Transparency on a frame no longer duplicates its text
Object › Flatten Transparency replaced a frame of threaded text by its
outlines with Convert All Text to Outlines, and by flat regions or an
image where the frame was transparent. The thread's re-flow then added
the frame's text to the story, as it does for a frame that was deleted,
so the other frames held that text a second time while the outlines,
regions or image drew it.

A frame that Flatten Transparency outlines or flattens now leaves its
thread with the text it shows, and the other frames keep the text they
hold, as with Create Outlines and Expand. When the thread's last frame
is flattened, the text it has no room for goes after the text of the
last frame that stays. A thread left with one frame is no longer a
thread, and undo restores the thread.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 23:04:33 +07:00
dotCooCoo 066d525425 MCP docs: wait for the app window, and the full --connect error
`open -a` and PowerShell's `&` return before the app opens its control
port, and `vectorcraft-cli mcp` tries the port only once, so the docs
now say to wait for the VectorCraft window before starting the MCP
client. The `--connect` failure is documented as the full line the CLI
prints, `vectorcraft-cli: cannot connect to 127.0.0.1:7979: ` followed
by the system's connection error.
2026-10-24 21:43:44 +07:00
dotCooCoo 0520e9da86 Type: threaded frames do not repeat a continued paragraph's first-line indent or list marker
A paragraph split between two threaded frames took its first-line
indent again at the top of the next frame, and a list paragraph drew
its bullet or number there again. Each frame is laid out on its own,
and its first paragraph kept every paragraph attribute there.

A text object now marks a frame whose first paragraph continues from
the frame before (first_para_continues, not saved). The thread re-flow
sets the mark where each frame's share starts inside a paragraph and
measures each share with it, and a restored document reads the marks
from its saved text. Area type and type on a path set the first line of
such a paragraph as a wrapped line: no first-line indent and no bullet
or number. The paragraph after it takes the next number. Release
Selection, Remove Threading, Convert To Point Type and copies of a
frame clear the mark, so the first paragraph there has its indent and
bullet or number again. When Create Outlines, Expand or Expand
Appearance takes frames out of a thread, a frame that stays keeps the
mark only while it is threaded and the frames before it end inside a
paragraph. A frame whose mark changes lays out its first line again,
and when it is still threaded, its thread re-flows. When the outlined
frame is the last one, the text it has no room for is measured as the
frame lays it out: without the first-line indent when it continues a
paragraph, and with its numbers counted on from the frames before it.
The frame before it now takes exactly the text the last frame has no
room for. Duplicates, copies dragged in the Layers panel, the copies
that Release to Layers (Build), Release Opacity Mask and Edit Opacity
Mask make, and Draw Inside's clipping copy then have their cached
bounds computed again, as paste already does for pasted type.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 21:43:44 +07:00
dotCooCoo c607d2b448 Pencil: the closing cursor shows while a stroke is drawn back near its start
A Pencil or Paintbrush stroke released within Close Paths When Ends Are
Within of its start closes, but the cursor gave no sign of it. While the
pointer is where a release would close the stroke, the cursor is now
PencilClose (PaintbrushClose for the Paintbrush), the crosshair with a
ring, as Draw straight lines with the Pencil tool describes:
https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/draw-shapes/draw-straight-lines-with-the-pencil-tool.html

The check is the one the release makes, on the end the stroke would
take (snapped for the Pencil). A straight line (Shift or Alt held at the
press), a stroke that continues a selected path, a stroke that redraws
one and a smoothing drag show no ring.

Docs: docs/target-app-parity.md, docs/ui-parity.md.
2026-10-24 21:21:37 +07:00
dotCooCoo df49ed25f1 EPS: the help text says no central file is written when no art shows
With Use Artboards and two or more artboards, a document with no visible art gets only the artboard files. The useArtboards and range descriptions, the document.export and document.exportEps params text, the control protocol and the parity line now say so.
2026-10-24 07:09:33 -07:00
dotCooCoo 4821ec92c2 Control: requests are answered at full speed while the window is hidden on macOS
Within about a minute of its window no longer being visible, macOS App
Nap lowers the app's threads to the lowest priority and coalesces its
timers. On a loaded machine, control requests then took seconds to
answer, and the 60 s timeout reply arrived up to 26 s late.

When the control channel is on (--control or VECTORCRAFT_CONTROL_PORT),
the app now holds an NSProcessInfo activity (user initiated, allowing
idle system sleep, latency critical) for as long as it runs, so App Nap
does not apply. The activity does not keep the Mac awake.
docs/control-protocol.md states this in the paragraph on the 60 s
timeout.
2026-10-24 20:58:05 +07:00
dotCooCoo aaf336ba31 MCP: each alias tool names its pair, and ui_screenshot takes max_side
The server lists two names for several calls (command_list and
list_commands, command_run and run_command, doc_inspect and
inspect_document, ui_inspect and inspect_ui, ui_screenshot and
screenshot with window:true), but no description said so, and the two
listing and running pairs take different argument names. Each
description now names its pair and the argument that differs, and undo
and redo name each other.

ui_screenshot took no arguments and returned the window at its full
size, which can be several megapixels on a large display.
ui_screenshot and screenshot {window: true} now take an optional
max_side (1..4096) that scales the returned image down to that many
pixels on its longer side. The reply's text gives the returned size as
width/height and the capture's as capturedWidth/capturedHeight; a file
written to path keeps the full capture. max_side on an artboard render
is an error that points to scale. render_preview reads its max_side
through the same check.

docs/mcp.md describes the pairs and the new argument.
2026-10-24 20:39:55 +07:00
Angelo BernardiniandClaude Fable 5.1 9a4d97c022 G11: Shape Builder's edge-source index is a grid, so diagonal hatches are no longer quadratic
The planar map's `RectIndex` sorted rectangles narrow in x by their left
edge and those narrow in y by their top edge, and scanned the rest for
every lookup. A long diagonal segment is narrow in neither, so a hatch of
diagonals put every line in the scanned list and `Outlines::source_at`
(one lookup per edge) cost a scan of the hatch per edge: quadratic in the
hatch below the 65,536-segment cap, as CodeRabbit found on #3357.

`RectIndex` is now a grid of about one cell per item, each cell listing
the items touching it; a lookup reads the cells around the point. An item
is filed under a footprint of rectangles: its bounds (`new`), or, for a
segment, the bounds of its pieces about a cell long (`with_footprint`,
`segment_footprint`), so a diagonal is filed under the cells along it,
not under every cell its bounds cover. A footprint rectangle covering
more than 64 cells or two rows/columns (a face covering most of the art)
is scanned for every point as before; a thin stripe face is filed under
its column of cells. Cells hold `u32` indices.

Tests: `rect_index_reads_a_diagonal_hatch_only_near_the_point` (2,000
diagonals a tenth of a point apart: a lookup got 1,001 candidates with
the old index, now at most n/4, and still every line through the point;
a hatch of stripe faces is filed, not scanned; a collinear, degenerate
grid). `rect_index_finds_every_rectangle_holding_a_point` keeps the
bounds-only contract.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014gCpjL3yUhaH3jRp7ksufh
2026-10-24 20:39:53 +07:00
dotCooCoo 6cd57cfa1b Undo groups: an open undo group also groups the edits in a document opened or created before its end
A document opened or created between edit.undoGroup.begin and
edit.undoGroup.end opens an undo group of its own with the begun
group's name, so an atomic command_batch that starts with file.new or
document.open is one undo step in the new document. The group opens
after the command that opens the document: when that command also
edits it (a command.batch), those edits stay the command's own undo
step, and a canceled group keeps them, so the journal still replays.
Both commands also run with no document open, and a command.batch that
fails rolls back a begun group. Switching to a document that was
already open does not open a group in it.
2026-10-24 20:10:04 +07:00
dotCooCoo eb4c5e7bf8 MCP docs: start an installed app with the control port
The installed-release section of docs/mcp.md said how to register the
server but not how to start an installed app for a live session; the
only start command in the setup steps was the cargo run from a
checkout.

It now gives the command that starts the installed app with
--control 7979 on macOS, Windows and Linux, and says that the
launchers open no control port, that the flagless server checks for
the app once when it starts, and what --connect prints when no app
is listening.
2026-10-24 19:58:11 +07:00
Patrick LenzenandClaude Opus 5.5 504b549a78 Fix #3621: bound function-based shading reads per import
Review follow-up. A function-based shading is read once per import (kept
per shading pattern and inks), and all of them draw on one budget of
200,000 function evaluations; past it a shading comes in as its average
colour, then flat grey, each with a warning that names the cause. A
gradient read leaves enough of the budget to average another shading.

A colour that changes in step with the sampling grid is checked across
the middle of the domain before an axis is chosen, so it isn't read
along the wrong one. The grey fallback warning for other shadings names
only them.

Tests: the same shading on 2,000 paths is read once; 40 distinct
shadings stay within the budget; a hostile file (5,000 fills, 20
shadings with 500-step functions) opens in 0.8 s, 253 s before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:27:44 +07:00
Patrick LenzenandClaude Opus 5.5 095d2bd2fd Fix #3621: function-based PDF shadings keep their colours
PDF import turned every function-based shading (ShadingType 1) into a
flat mid-grey. Chromium writes a CSS repeating-linear-gradient this way,
so a red and white hatch came in as a grey bar.

A function-based shading whose colour changes along one axis of its
domain only now becomes a linear gradient across the domain: stops
sampled along that axis, each hard colour change (found by halving the
interval between two samples) two stops at one offset. One whose colour
changes in two directions comes in as its average colour, with a
warning. Either paints only over the shading's domain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:27:44 +07:00
Taha-Mahmoodi 95436e7212 Docs: G11, G2 and parity tables drop missing items that shipped (Effect Gallery, Relative rounding, Hard/Soft Mix, #834, #937, #722) 2026-10-24 19:21:32 +07:00
dotCooCoo 76c014b732 Image Trace: Flat Logo traces named colors a few levels off at the image's own size
Squashed from #3999 onto main.
2026-10-24 19:02:09 +07:00
dotCooCoo d0644e5eb9 Image Trace: docs say Flat Logo averages down the decoded raster
An image over 64 megapixels is decoded at a smaller size first, and Flat
Logo averages that raster down in whole-number blocks.
2026-10-24 19:02:09 +07:00
dotCooCoo 68e4392491 Image Trace: Flat Logo says when it traces a large image at a reduced size
Flat Logo traces a copy of the image at most 1024 pixels on a side,
averaged down by a whole factor, so a 1025-pixel image is traced at
513 pixels. The trace's warnings did not say so, because they compared
the image only with the decoded raster. For an image over 1500 pixels
they said instead that it is traced more slowly, which Flat Logo does
not do.

The trace result now carries Flat Logo's working size when it averaged
the image down. imageTrace.make and imageTrace.makeAndExpand then name
both sizes in their warnings, and the status bar shows that note, in
place of the slower-trace and megapixel notes. Other modes keep their
warnings. The message has a row in each catalog that translates the
other Image Trace warnings.
2026-10-24 19:02:09 +07:00
Taha-MahmoodiandClaude Opus 5.5 ff5919f416 Live Paint: Make and Merge refuse type, images and other objects that aren't paths
Live Paint builds its faces and edges from path outlines alone. Make,
Merge and the Live Paint Bucket put every selected object among the
group's hidden sources, so type, an image, a symbol, a blend or a group
holding one of them vanished from the canvas. They now refuse such a
selection before changing anything ("Live Paint takes paths and compound
paths: convert type, images and other objects to paths first"), as type
and raster images can't go into a Live Paint group directly
(https://helpx.adobe.com/illustrator/desktop/paint-and-fill/learn-painting-basics/create-live-paint-groups.html).
One predicate, vectorcraft_tools::builder::live_paint_takes (Live Paint
groups, paths, compound paths and groups of them), decides it for Make,
Merge and the Properties panel's Merge Live Paint, which no longer shows
for a selection Merge refuses. The message has an @msg row in every
catalog.

Tests: tests_build::live_paint_refuses_type_and_images_and_changes_nothing
(Merge, Make and the Bucket with type, an image or a group holding type:
refused, document, selection and undo history unchanged; a group of
paths and a path still merge) and
panels::properties::tests::merge_live_paint_is_a_quick_action_for_a_live_paint_group_and_more
(hidden with type selected). Both fail without the change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 19:02:09 +07:00
Taha-MahmoodiandClaude Opus 5.5 aa35783f47 G1: Properties: Blend Options, Merge Live Paint, Width Profile, an effect's Delete icon and Direct-Selected corners
The Properties panel has the additional contextual controls the public
Properties panel overview lists
(https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/properties-panel-overview.html),
each running the existing command:

- Quick Actions: Blend Options for one selected blend while the Blend
  tool is in use (the Blend Options dialog; OK is one undo step), and
  Merge Live Paint when a Live Paint group is selected with more objects
  (livePaint.merge).
- Appearance: the stroke's Variable Width Profile list (the Control
  bar's) with the Width tool or when the stroke has a variable width
  (stroke.set {profile}); beside fx, with one effect on the one selected
  object (its own, or a fill's or stroke's), its name and a Delete icon
  that removes it (effect.remove); with several, the icon opens the
  Appearance panel, as the overview describes.
- With Direct Selection and corners of one path selected, Corner and
  Corner Radius set those corners' kind and radius
  (object.setLiveShape); a live rectangle's and polygon's own rows
  already do, so they get no second row.

The overview's Variable Font icon was already in Character. Every label
is already in every catalog.

Tests in panels::properties::tests:
blend_options_is_a_quick_action_for_one_blend_with_the_blend_tool,
merge_live_paint_is_a_quick_action_for_a_live_paint_group_and_more,
the_width_profile_shows_for_a_variable_width_or_the_width_tool,
direct_selected_corners_show_their_kind_and_radius,
one_effect_has_a_delete_icon_in_appearance (shown for the right
selection and tool, hidden otherwise, the right command in one undo
step). Documented in docs/target-app-parity.md, docs/ui-parity.md and
docs/gaps.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 19:02:09 +07:00
dotCooCoo b0e88bddf9 MCP docs: export and add_text each have one row
The tool table in docs/mcp.md listed export and add_text twice. The first
export row omitted the ai format, the per-artboard files of SVG, SVGZ and
EPS, options.useArtboards and options.rect, and said that every format but
PDF writes one artboard. The second add_text row omitted vertical.

Each tool now has one row: export keeps the complete row, and add_text
keeps the row with vertical.
2026-10-24 19:02:09 +07:00
dotCooCoo bc041e15ef Type: the Numbered List button numbers paragraphs 1, 2, 3
Squashed from #3960 onto main.
2026-10-24 19:02:08 +07:00
dotCooCoo 0635357eb9 Native format: a document is saved pretty-printed only when its pretty-printed JSON is at most 1 MiB
A native save was pretty-printed when the document had at most 2,000
layers and objects and its compact JSON was at most 1 MiB. Pretty
printing puts every coordinate on its own indented line, so traced art
with few paths and many anchors could pass that check and be written at
about five times the size of its compact JSON.

The 1 MiB limit now applies to the pretty-printed document, indented as
the file holds it and in the form the save writes: version 1 anchors,
and placed documents expanded for older versions or Include Linked
Files. Documents whose pretty-printed JSON is over 1 MiB are saved as
compact JSON, even when their compact JSON is under it. The 2,000-object
rule and compressed saves are unchanged. docs/mcp.md describes the rule.
2026-10-24 19:02:08 +07:00
dotCooCoo 2ff8699989 Image Trace: pressing and holding the eye button shows the source image
The Image Trace panel had no way to compare a trace with its source
image except changing View and changing it back.

The panel now has an eye button to the right of View, enabled with an
Image Trace object selected. While it is held down, the canvas draws the
selected Image Trace objects with their source image, whatever their
View, and draws their View again on release. The document, its View and
the undo history are unchanged. The renderer takes the objects in
RenderOptions::trace_source, which is also part of the canvas frame key
and the raster-effect cache key.
2026-10-24 19:02:08 +07:00
dotCooCoo bef464ea97 PDF export: the hyphen that ends a hyphenated line is written as text
With type written as text, PDF export drew the hyphen that ends a line
broken inside a word as a path. The file's text had no hyphen where the
canvas draws one, so copied or searched text read "considerations"
where the line shows "con-".

The hyphen is now written as text where the line draws it, as the
character the font gives its glyph to: "-", or U+2010 when the font
gives the glyph to U+2010 and not to "-". It is a text run of its own,
and right-to-left lines keep their /ReversedChars marking. The invisible
text of type without paint holds the hyphens too. Kashidas and list
markers are still drawn as paths.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-24 19:02:08 +07:00
dotCooCoo 8c3672fb31 MCP: save_file against the running app waits for the save and reports its result
Squashed from #3969 onto main.
2026-10-24 19:01:51 +07:00
dotCooCoo a9b92d72cc Pencil: the straight-line cursor's description names the Alt exception and the Constrain Angle
The PencilStraight entry in cursors.toml now says the cursor does not
show while Alt is also held with Alt key toggles to Smooth Tool on, and
that the line follows 45° steps from the Constrain Angle. The parity doc
says the Option/Alt straight line waits for #3959.
2026-10-24 18:16:24 +07:00
dotCooCoo 5ae171bc25 Pencil: the pointer shows a straight-line cursor while Shift is held before a press
With Shift held before a press, the Pencil now shows a new cursor,
PencilStraight: its crosshair with a short straight line where the
closing cursor has its ring. The cursor follows the rule the press uses
to start a straight line, so it shows exactly when the press draws one.
With Alt key toggles to Smooth Tool on and Alt held too, the Smooth
cursor shows as before. Once the press is down, and with the
Paintbrush, Shift leaves the tool's own cursor. Use Precise Cursors
turns the new cursor into the plain crosshair.

Draw straight lines with the Pencil tool describes a straight-line icon
on the Pencil while Shift or Alt is held:
https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/draw-shapes/draw-straight-lines-with-the-pencil-tool.html
2026-10-24 18:16:24 +07:00