Commit Graph
5672 Commits
Author SHA1 Message Date
BFlat b1feb063a5 Merge pull request #4055 from dotCooCoo/feat/mcp-render-trace-views
MCP: screenshot and render_preview can draw the Image Trace view
2026-10-26 09:19:11 +07:00
BFlat f3e07d7ecc Merge pull request #4049 from dotCooCoo/fix/dialog-set-unknown-field
Dialogs: ui.dialog.set returns an error for a field the open dialog does not read
2026-10-26 09:18:55 +07:00
BFlat 3a2a1c8249 Merge pull request #4103 from dotCooCoo/fix/undo-group-cancel-keeps-batch-steps-elsewhere
Undo: canceling an undo group keeps a batch's steps in other documents
2026-10-26 09:18:39 +07:00
BFlat f0bdf3fa2c Merge pull request #4105 from dotCooCoo/fix/trace-preview-drafts
Image Trace: changes that wait with Preview off stay with their object
2026-10-26 09:18:24 +07:00
BFlat 86519a61cd Merge pull request #4075 from dotCooCoo/fix/trace-cut-edge-palette
Image Trace: the blended edge of a cut-out image adds no color to the palette
2026-10-26 09:18:07 +07:00
BFlat 3431ca3dc4 Merge pull request #4048 from dotCooCoo/fix/trace-library-neutral-tones
Image Trace: Document Library keeps neutral tones off saturated library colors
2026-10-26 09:17:48 +07:00
BFlat 34b5c56560 Merge pull request #4054 from dotCooCoo/fix/overlapping-trace-own-areas
Image Trace: Overlapping layers reach only under areas that hold their own color
2026-10-26 09:17:32 +07:00
BFlat 6d855b4af4 Merge pull request #4076 from dotCooCoo/fix/trace-eye-button-hold
Image Trace: the eye button's hold ends on release, and the panel uses any selected trace or image
2026-10-26 09:17:13 +07:00
BFlat dbf7194090 Merge pull request #4079 from dotCooCoo/fix/shape-builder-merge-thin-overlap
Shape Builder: a merge across an overlap thinner than the precision gives one path
2026-10-26 09:16:54 +07:00
BFlat 5b10d96a11 Merge pull request #4065 from dotCooCoo/fix/shape-builder-erase-narrow-crossings
Shape Builder: erasing picks a region narrower than twice the tolerance
2026-10-26 09:16:38 +07:00
BFlat bb8e1897f6 Merge pull request #4158 from devius/ka-short-labels
i18n(ka): shorter Georgian for 15 labels that were cut off
2026-10-26 09:16:23 +07:00
BFlat 8f6200b44f Merge pull request #4062 from dotCooCoo/fix/shape-builder-merge-reuses-hover-map
Shape Builder: a click merges over the map the tool built for the hover
2026-10-26 09:16:08 +07:00
BFlat bca67558ea Merge pull request #4211 from storytold/land/4080
G11: Shape Builder's edge-source grid holds a bounded number of references (#4080)
2026-10-26 09:15:33 +07:00
BFlat 86ee259d81 Merge pull request #4078 from dotCooCoo/fix/live-paint-plain-group-named-live-paint
Live Paint: a plain group named "Live Paint..." is not a Live Paint group
2026-10-26 09:14:11 +07:00
BFlat 00584e491e Merge pull request #4149 from acosimati/doc-inspect-opacity-pct
MCP: doc_inspect reports opacityPct in the percent scale the drawing tools take
2026-10-26 09:13:40 +07:00
BFlat 3af669b5bf Merge pull request #4147 from nrq6993-a11y/stream/vc-feat-3627-convert-pdf-editing
Fix #3627: convert to PDF omits editing data by default
2026-10-26 09:13:15 +07:00
BFlat 9176a85065 Merge pull request #4148 from nrq6993-a11y/stream/vc-feat-g1-star-radii-measure-label
G1: Star tool shows inner and outer radii in measurement labels
2026-10-26 09:13:01 +07:00
Dylan M. Taylor 97ccb83337 lint: shell helper and lossless float conversion (S1192, S7679, S4325) (#4205)
- packaging/linux/package.sh: one verify_sha256 helper replaces the four
  repeated printf|sha256sum -c pipelines.
- packaging/macos/package.sh: stapler_retry copies its positional
  arguments into locals before use.
- swatch_options: f64::from(v) instead of v as f64 (same value; the
  argument is an f32, so the conversion stays).
2026-10-25 22:12:52 -04:00
BFlat 8334528da0 Merge pull request #4164 from nrq6993-a11y/stream/vc-feat-g1-shear-tool-shift-axis
G1: Shear tool Shift locks width or height
2026-10-26 09:12:50 +07:00
BFlat 8ebefbacb2 Merge pull request #4168 from nrq6993-a11y/stream/vc-feat-g1-slice-resize-transform-tools
G1: Slice Selection resize honors Transform Tools
2026-10-26 09:12:33 +07:00
BFlat b6b31dbd81 Merge pull request #4160 from nrq6993-a11y/stream/vc-feat-g1-artboard-resize-transform-tools
G1: Artboard resize honors Transform Tools readouts
2026-10-26 09:12:14 +07:00
BFlat 49e4b23d4f Merge pull request #4161 from nrq6993-a11y/stream/vc-feat-g1-reshape-readout-prefs
G1: Reshape readouts follow Measurement Labels pref
2026-10-26 09:11:56 +07:00
dotCooCoo 2d10d17143 Tests: supersampled outlines are checked for width as well as darkness
The test checked only that each outline had a dark pixel, which a line
two or more pixels wide also has. It now counts the dark pixels across
the path, a stem of the type and the guide, and expects one, with and
without supersampling.
2026-10-26 09:09:45 +07:00
dotCooCoo 8c67ade824 Dialogs: Move runs with a Distance and Angle set before its next frame
Move opened without Distance and Angle, so its first frame replaced the
values a control client set with ones computed from Horizontal and
Vertical, and OK read Horizontal and Vertical without the Distance and
Angle set since the last frame. Move now opens holding the Distance and
Angle of its offset, and OK applies a Distance and Angle set since the
last frame.
2026-10-26 09:09:45 +07:00
dotCooCoo 056274f5d6 Undo: canceling an undo group keeps a batch's steps in other documents
A command.batch that edited a document with an undo group and then a
document without one was dropped from the journal as a whole when the
group was canceled, so a replay lost the second document's edit, which
the session kept. Each batch step is now noted in the undo groups it
belongs to, by the same rule as a top-level command, and a cancel takes
only those steps out of the batch's journal entry. A step that changed
the active document becomes that change. Undo groups that stay open
follow the entry and step numbers that a cancel changes.
2026-10-26 09:09:45 +07:00
dotCooCoo fd4c187ab5 Image Trace: settings that wait stay with their object when a plain image is selected
With Preview off, selecting a plain image after an Image Trace object
kept the panel on that object without saving its waiting settings. A
trace of the image then made the image's trace the panel's object, and
selecting the first object again showed its stored settings and lost the
change. The panel now keeps the waiting settings for the object it
leaves whatever is selected next.
2026-10-26 09:09:45 +07:00
dotCooCoo 58767abe0f Image Trace: the blended edge of a cut-out image adds no color to the palette
Squashed from #4075 onto main.
2026-10-26 09:09:45 +07:00
dotCooCoo bc674bec64 Image Trace: the empty-palette test uses a library blue the row maps to
The test of a color whose every path straightens to no area traced a
pale blue row with a library of a light color, black and [40, 120, 240].
With Document Library weighing hue and chroma three times as much as
lightness, the row takes the light color instead of that blue, so the
test no longer traced any blue. The library blue is now [60, 130, 235],
which the row still maps to; the assertions are unchanged.
2026-10-26 09:09:45 +07:00
dotCooCoo 0629d4e9a5 Image Trace: Overlapping layers reach only under areas that hold their own color
With Method Overlapping, each color layer covered every pixel of the colors
above it in the stack. A small dot or square on a background was then traced
once in its own color and again, at the same bounds, in every color between
the background and it, and with Shapes on each copy became its own live shape.
Those layers also ended on edges they never touched and showed through the
anti-aliased rim there.

Each layer now leaves out every 4-connected part of its stacked area that holds
no pixel of its own color. This changes the result of many Overlapping traces,
the photo presets included: fewer paths (High Fidelity Photo 121 to 69.6 on its
own quality inputs, Low Fidelity Photo 37.1 to 26.1) and no rim, around a
shape, of a color that sits apart from it. One existing test that counted the
extra copies now expects one layer per area, and another that compared layer
pixel counts now checks that the bottom layer covers the whole image.
2026-10-26 09:09:45 +07:00
dotCooCoo 2bbbdafc63 Image Trace: the eye button's hold ends on release, and the panel uses any selected trace or image
Squashed from #4076 onto main.
2026-10-26 09:09:45 +07:00
dotCooCoo 6c9ac54b22 Shape Builder: a merge across an overlap thinner than the precision gives one path
Two shapes that overlap by less than the region precision (0.01 pt) leave
their overlap out of the Shape Builder's regions as a sliver. Merging the
regions on both sides of it united only the picked faces, so the result
was a compound path with a hairline gap where the overlap had been.

A merge now takes in each dropped sliver next to a merged face when only
the merged faces' shapes fill it, both from the arrangement and from the
planar map used when open paths are selected. A thin cutout that no shape
fills stays a hole. What is left of a shape after the merge takes in a
sliver only where the shape covers it and the merged shape does not take
it in, so the two do not overlap. Pathfinder operations and Live Paint do
not use the merger and are unchanged; Live Paint's planar map does not
test which shapes cover a sliver.
2026-10-26 09:09:45 +07:00
dotCooCoo eadf7674f1 MCP: screenshot and render_preview can draw the Image Trace view
After imageTrace.setView, screenshot and render_preview still drew the
tracing result, because ui.render renders with the export options and only
the canvas turns on trace views. Only the app window showed the view.

ui.render now takes traceViews. With traceViews: true, Image Trace objects
draw in the view set with imageTrace.setView, as on the canvas, both
headless and in the running app. screenshot and render_preview take
traceViews and pass it on; without it they draw the tracing result, as
exports do. The trace-and-style prompt names the argument.

A supersampled render drew Outline view's lines, type outlines and dotted
guides as little as a quarter of an output pixel wide, so they came out
pale gray. The renderer now scales those widths and the guides' dashes by
the supersampling factor in the larger frame, so the lines stay one output
pixel wide.

Docs: docs/mcp.md (render_preview, screenshot), docs/control-protocol.md
(ui.render).
2026-10-26 09:09:45 +07:00
dotCooCoo 0641412cce Dialogs: ui.dialog.set returns an error for a field the open dialog does not read
ui.dialog.set stored any field name it was given, so a misspelled field
(`discrad` for `discard`) was kept without effect and the dialog then
ran with its old value. It now answers such a field with an error that
lists the dialog's fields, and leaves the dialog unchanged.

A dialog accepts the fields it holds, `__` fields, `discard` with a
discard button, `preview` with a live preview, the fields it reads
before a control adds them (each spec's `inputs`, for example Copy and
the object options of the Transform dialogs, Move's `distance` and
`angle`, the reference point, `path` of the export options dialogs,
`searchFolder`, Brush Options' `tips`, the Justification and
Hyphenation values that open blank, the Corners `kind` and `radius` of
corners that differ, the Gradient Stop popover's `color`, `opacity`,
`location` and `spread`, and a new artboard's `color` and display
marks), and the fields it passes to the command it runs: every
parameter of the generic `command` dialog's command, and the
`textureImage` that Load Texture… sets in the Glass and Texturizer
effects. Edit Selection now opens holding `deleted<i>` for each of its
rows, so setting a row number it does not have returns an error, and
Transparency Flattener Presets opens holding the selected preset's name
and options instead of adding them on its first frame.
2026-10-26 09:09:45 +07:00
dotCooCoo 3eda1b128c Image Trace: changes that wait with Preview off stay with their object
With Preview off, changes made in the Image Trace panel for one Image
Trace object were lost when another object was selected: selecting the
first object again showed its stored settings. The panel now keeps the
waiting changes for each object and shows them again when that object
is selected, unless the object's own settings changed in the meantime.
When Preview was turned on while another object was selected, the
object is traced with its changes when it is selected again.

Preview is now the UI command imageTrace.preview ({on?}: on, off or
toggle), and both the panel's checkbox and ui.set's imageTracePreview
run it. The command label has a row in every catalog.
2026-10-26 09:09:45 +07:00
dotCooCoo c9cc2ef076 Image Trace: Document Library keeps neutral tones off saturated library colors
With the Document Library palette, each pixel took the library color
nearest in plain Oklab distance. A 50% gray lies nearer in that distance
to a saturated blue of the same lightness than to black or a light
cream, and a muted brown is also nearer to the blue than to either. With
a black, cream and blue library, both traced as the blue.

This changes how Document Library matches pixels: each pixel now takes
the library color nearest with differences in hue and chroma (Oklab a
and b) counted three times as much as lightness. The same measure picks
which library colors are used. Neutral and muted tones take a neutral
library color, and the other palettes are unchanged.
2026-10-26 09:09:45 +07:00
dotCooCoo 529a2296a7 Shape Builder: erasing near the end of a thin region with split sides picks the region
When both sides of a 1.5 pt bar have a point level with a click 0.1 pt
from its end, the point of each side nearest the click is the end of a
segment, so the sides were not tried and an Alt-click there touched the
end edge.

A segment end now also counts when the segment is square there to the
line to the point, so splitting a side at the click gives the same
answer as an unsplit side.
2026-10-26 09:09:44 +07:00
Davit MatchakhelidzeandClaude Opus 5.5 5e68d5891c i18n(ka): shorter wording for labels that were cut off
Decided in the native-speaker review of the screens (all-t01).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-26 09:09:44 +07:00
dotCooCoo c527082ff1 Shape Builder: a click merges over the map the tool built for the hover
shapeBuilder.merge built the planar map of the selection again, on the
thread that runs the command, although the Shape Builder tool had just
built the same map for its hover. The tool now returns its map from a
new Tool::shape_builder_map, and the command uses that map when its
inputs are the merge's inputs and its gap is the merge's gap; otherwise
it builds its own as before. The tool's map has the outline edges, so
erasing and splitting a stroke use it too.
2026-10-26 09:09:44 +07:00
Angelo BernardiniandClaude Fable 5.1 a5806c8caa G11: the grid budget counts an item's distinct cells; parity row and evidence
CodeRabbit on #4080: `needed` summed footprint pieces before insertion
deduplicated them, so on a degenerate grid (ten collinear lines, 4,096 pieces
each in ten cells) every item exceeded the budget and went to the scanned list,
making the per-cell assertion vacuous. The cells are now collected in piece
order and consecutive repeats dropped before the budget check and the filing;
the horizontal fixture asserts `rest` is empty and that the lines are filed.
docs/target-app-parity.md: the Path operations area row, the Shape Builder
row and the evidence list record the bounded index (scores unchanged).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014gCpjL3yUhaH3jRp7ksufh
2026-10-26 09:09:44 +07:00
dotCooCoo 3567e5be7d Live Paint: a plain group named "Live Paint..." is not a Live Paint group
A group counted as a Live Paint group when its name started with "Live
Paint". A plain group named, for example, "Live Painting" was then read
as one. With it and another shape selected, the Shape Builder found no
regions in it, and a merge on the other shape deleted the group and its
paths. Make Live Paint took the group as a Live Paint group to merge
into, and its paths did not become sources.

A Live Paint group now also needs its sources group, the group named
"Live Paint Sources" that Make Live Paint puts in it. A plain group with
such a name is traversed like any other group.
2026-10-26 09:09:44 +07:00
acosimati 03ab7bb805 MCP: doc_inspect reports opacityPct in the percent scale the drawing tools take
draw_path, draw_shape and object.setProps take opacity in percent (0-100),
but the document.inspect / document.node summary behind doc_inspect,
inspect_document and vectorcraft://object/{id} reported the stored 0-1
fraction under the same name. An agent that read 0.55 and wrote it back
got a nearly invisible object.

The summary now adds opacityPct (0-100, rounded to 1/100 of a percent)
beside the unchanged opacity, and the tool, resource and command
descriptions say which scale each field uses. Round-trip test in the mcp
crate: draw at 55 %, read 55 back from doc_inspect, inspect_document and
the object resource, write it back unchanged.
2026-10-26 09:09:44 +07:00
bflatastic aadf73becd CLI help: one space before --editing-data, as before #4147 2026-10-26 09:09:44 +07:00
nrq6993-a11y 94832657d1 Star label: R2 from the preview's ratio, not the held radius 2026-10-26 09:09:44 +07:00
Cursor Agent 142942e6c4 G1: Shear tool Shift locks width or height
Squashed from #4164 onto main.
2026-10-26 09:09:44 +07:00
Cursor Agent e399427937 G1: Slice Selection resize honors Transform Tools
Squashed from #4168 onto main.
2026-10-26 09:09:44 +07:00
Cursor Agent a54d143b11 G1: Artboard resize honors Transform Tools readouts
Squashed from #4160 onto main.
2026-10-26 09:09:44 +07:00
Cursor Agentandnrq6993-a11y 988c958e3d ci: allow unknown_lints for manual_isolate_lowest_one on Rust 1.95
Co-authored-by: nrq6993-a11y <nrq6993-a11y@users.noreply.github.com>
2026-10-26 09:09:44 +07:00
dotCooCoo 62e562058b Shape Builder: erasing near the end of a thin region picks the region
A point 0.1 pt from the end of a 1.5 pt bar is nearest the end of the
bar, and the line from there through the point runs along the bar, so
the region did not count as narrow and an Alt-click there touched the
end edge.

A region now counts as narrow at a point when it is no more than twice
the tolerance across from any outline segment within the tolerance whose
point square to the line to the point lies inside the segment, as well
as from the nearest point of the outline. Segment ends other than the
nearest point are not tried, so a point added on an edge does not change
the result near a corner.
2026-10-26 09:09:44 +07:00
Angelo BernardiniandClaude Fable 5.1 6f8ac34f38 G11: Shape Builder's edge-source grid holds a bounded number of references
Follow-up to #4021. The grid filed each piece of a segment under its cells
without checking, so a degenerate grid (collinear horizontal lines: cells a
hundred points wide and a hair tall) stored one segment ~400 times per cell,
and coincident vertical segments (one column, a row per segment) filed every
segment under every row: a quadratic number of references, about a GiB for
16,384 segments within the Shape Builder's limit.

Now a segment is filed once per cell (its pieces come in order, so the cell's
last entry is enough to check), and the grid holds a budget of references
(64 per item plus four rows' or columns' worth, `reference_budget`); the
items past it go to the scanned list, so the index stays O(n·sqrt(n)) in
memory and every lookup still finds every segment through its point.

Regression: `rect_index_holds_a_bounded_number_of_references` (fails without
the change: 4,100 references per cell for ten collinear lines).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014gCpjL3yUhaH3jRp7ksufh
2026-10-26 09:09:44 +07:00
nrq6993-a11y 1579b65b07 convert: attachment note from the export result's warnings, not a file scan 2026-10-26 09:09:44 +07:00