Commit Graph
371 Commits
Author SHA1 Message Date
BFlat 78d45ee14a Merge pull request #7699 from dotCooCoo/fix/panel-view-command
Panels: ui.panelView sets the Swatches, Graphic Styles and Symbols panel views
2026-11-15 09:47:37 +07:00
BFlat 40f096f32b Merge pull request #7213 from dotCooCoo/feat/rotated-box-scale-reflect
Transform: Scale and Reflect act along a rotated bounding box
2026-11-15 09:47:18 +07:00
BFlat 34ffc46cb5 Merge pull request #7687 from dotCooCoo/feat/links-copy-info
Links: Copy Info in the panel menu copies the selected links' file names
2026-11-15 08:25:44 +07:00
dotCooCoo 67fd1cd127 Merge main into feat/live-paint-bucket-multi-click 2026-11-14 15:48:45 -08:00
dotCooCoo 2b9325b9e0 Merge main into feat/links-copy-info 2026-11-14 15:21:36 -08:00
BFlat dafd993395 Merge pull request #7658 from dotCooCoo/feat/svg-filter-defaults
Effects: Effect › SVG Filters lists default filters
2026-11-15 06:18:12 +07:00
dotCooCoo 93a7d532c7 Merge main into feat/rotated-box-scale-reflect 2026-11-14 15:17:16 -08:00
dotCooCoo 21f79816a1 Panels: ui.panelView sets the Swatches, Graphic Styles and Symbols panel views
The view items of these panels' menus kept their choice in egui panel
state, so no command could set the view. The views now live in the UI
state for the session, and ui.panelView {panel, view?} sets or reads
them; the menu items and the Swatches panel's list and thumbnail buttons
run it. An unknown panel or view is an error and changes nothing.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-14 14:57:41 -08:00
dotCooCoo 7293cdf1fe Links: the panel menu's Copy Info copies the selected links' file names
The Links panel menu gets Copy Info, which runs the new UI command
links.copyInfo {ids?}: the file names of the selected rows (or of ids),
one per line in the order the panel shows them, go to the clipboard.
The item is off with no row selected. An id that is not an image or a
placed document, or a malformed ids, is an error and leaves the
clipboard as it was.
2026-11-14 13:51:22 -08:00
dotCooCoo 0e6e7df695 Merge main into feat/live-paint-bucket-multi-click 2026-11-14 13:02:52 -08:00
dotCooCoo c7fa644f2f Merge main into fix/text-wrap-offset-refused 2026-11-14 12:30:12 -08:00
dotCooCoo fb8afd7919 Merge main into feat/svg-filter-defaults 2026-11-14 12:12:02 -08:00
dotCooCoo 0b1e1e99a1 Effects: Effect › SVG Filters lists default filters
Effect › SVG Filters and Apply SVG Filter list 14 default filters in
every document, before the document's own. The set, the names and the
values are VectorCraft's own, written with SVG 1.1 filter primitives
(crates/effects/src/svg_filter/defaults.rs).

A document holds none of the defaults until one is applied or edited
there. svgFilter.apply with a default's name copies it into the document
in the same undo step, and svgFilter.define with replace naming a default
adds the edited copy under that name. The copy is listed in the default's
place. svgFilter.delete refuses a default the document holds no copy of,
and deleting the copy lists the default again.

svgFilter.list also returns the defaults. svgFilter.apply takes index and
item to put the filter in the place of an applied SVG filter, which the
dialog's OK uses when it is opened for an applied effect; an index that
is not an applied SVG filter, null included, is an error.
2026-11-14 11:19:22 -08:00
dotCooCoo 1c4cc88e90 Merge main into feat/live-paint-bucket-multi-click
# Conflicts:
#	crates/tools/src/builder/live_paint.rs
2026-11-14 10:19:24 -08:00
dotCooCoo e1da80a2c8 Merge main into fix/learn-panel-commands 2026-11-14 09:52:25 -08:00
BFlat 78131ae11c Merge pull request #7419 from dotCooCoo/fix/type-dialogs-story-wide
Type: Justification, OpenType, text styles and Convert to Text change every frame of a selected story
2026-11-15 00:42:04 +07:00
BFlat 63129de08a Merge pull request #7595 from dotCooCoo/fix/image-scaling-alpha
Images: scaled-down images keep their color beside clear pixels
2026-11-15 00:41:27 +07:00
dotCooCoo 745dccb376 Merge main into fix/learn-panel-commands 2026-11-14 08:15:49 -08:00
BFlat 2ebf037bc5 Merge pull request #7360 from dotCooCoo/feat/learn-progress-rings
Learn: steps get check boxes, and skill rings fill as tutorials are finished
2026-11-14 21:55:49 +07:00
dotCooCoo 0173367444 Merge main into fix/text-wrap-offset-refused 2026-11-14 06:09:19 -08:00
BFlat 8d1aa857d5 Merge pull request #7276 from dotCooCoo/fix/issue-6784
Contextual Task Bar: Smooth opens the Smooth slider with Direct Selection
2026-11-14 20:38:54 +07:00
dotCooCoo e385d92b1b Merge main into feat/live-paint-bucket-multi-click 2026-11-14 05:25:24 -08:00
dotCooCoo b562fc1c54 Text wrap: an out-of-range or non-number offset is refused
object.textWrap.make and object.textWrap.options kept an offset outside
-1000 to 1000 pt at the nearer end of the range, and read an offset that
is not a number, or an invert that is not true or false, as if it had
been left out. Both commands now return an error for such a value and
leave the wrap options and the undo history unchanged. An omitted or
null value still takes the default (6 pt and no invert for Make, the
current options for Text Wrap Options), and Text Wrap Options with only
null values reads the current options. A stored offset outside the range
is kept when only Invert Wrap changes.

The MCP text_wrap tool checks offset, invert and release before it
changes the selection, so a refused call changes nothing, and a release
that is not true or false is an error instead of making a wrap.
2026-11-14 05:12:58 -08:00
dotCooCoo 786dcc5581 Images: scaled-down images keep their color beside clear pixels
The image crate's filtered resize filters each channel on its own, which
is correct only for premultiplied pixels, and its thumbnail averages each
channel on its own too. Placed images, linked-image previews, MCP
captures and previews, metafile bitmaps, PDF downsampling and library
thumbnails passed straight RGBA to them, so the color under clear pixels
(usually black) bled into the opaque pixels beside them and darkened
cut-out edges.

vectorcraft_doc::resample scales such images with each pixel's color
weighted by its alpha: filtered resampling premultiplies the pixels in
place and divides them back after, and averaging takes the area-weighted
mean of the pixels each new one covers. Opaque and alpha-free images are
scaled as before. PDF export also multiplies the inks of a CMYK image
with alpha by that alpha before resampling them, and divides them by the
resampled alpha after.
2026-11-14 05:07:39 -08:00
dotCooCoo b651301b1e Merge main into fix/learn-panel-commands 2026-11-14 04:50:50 -08:00
BFlat a47d7eec91 Merge pull request #7478 from dotCooCoo/fix/export-selection-pdf-options
Export Selection: the picked format's options dialog follows the save panel
2026-11-14 19:38:30 +07:00
dotCooCoo dcd3adc445 Merge main into fix/learn-panel-commands 2026-11-14 02:33:25 -08:00
dotCooCoo f5eda0e5d9 Merge main into fix/issue-6784 2026-11-14 02:11:12 -08:00
dotCooCoo b67a9320bb Merge main into feat/learn-progress-rings 2026-11-14 01:49:40 -08:00
dotCooCoo acb5b3293f Merge main into fix/type-dialogs-story-wide 2026-11-14 01:47:35 -08:00
BFlat 9ce826bc24 Merge pull request #7358 from dotCooCoo/feat/actions-button-mode
Actions: Button Mode shows actions as colored buttons that play on a click
2026-11-14 13:44:09 +07:00
BFlat 18266da1e1 Merge pull request #7328 from dotCooCoo/fix/save-unused-option-notes
Save, Export for Screens: warnings name an option the file doesn't read
2026-11-14 13:42:55 +07:00
dotCooCoo b39bfbed4f Export Selection: the picked format's options dialog follows the save panel
document.exportSelection run with no params or {} (a shortcut, or an
automation call) wrote the picked file straight away with each format's
defaults: a PDF used the default preset, so Save PDF's options, such as
writing long pages in points, could not be chosen. It now takes Export
As's route after the save panel: Save PDF without its Artboards
section, SVG Options without its artboards, the raster options, EPS
Options, DXF Options, Text Export Options with Selection Only on, or an
exporter plug-in's parameters. OK writes the selection alone, cropped
to it, with the chosen options. While a dialog is open the call returns
null, and OK returns what file.exportAs returns, without format or
bounds.
With a path or any option it still writes straight away.

- file.exportAs takes exportSelection: true and then writes the
  document that document.exportSelection writes
  (fileio::selection_doc), without artboard choices. The options
  dialogs and the replace-file questions pass it on.
- Nothing selected stops before the save panel.
- SVG Options opened by Export Selection leaves the remembered Use
  Artboards as it was.
- Exports through file.exportAs (Export As and the options dialogs)
  apply Appearance of Black's rich black, as document.export does.

Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
2026-11-13 21:44:06 -08:00
dotCooCoo 2d70c6b0ae Learn: the tabs, skill and tutorial rows and Back run commands
The For you and Skills tab buttons, a skill's row, a tutorial's row and
Back changed the Learn panel's view directly, so the control channel and
MCP could not choose a tab, open a skill's tutorials or go back.

- learn.tab {tab: forYou|skills} shows the panel on that tab; the Skills
  tab keeps the skill and tutorial it had open.
- learn.skill {skill} shows the panel on the Skills tab with that skill's
  tutorials and returns the skill as learn.list lists it.
- learn.back {} goes up one level, as Back does.
- A tutorial's row runs learn.show.
- The commands are listed in both UI command catalogs, and their labels
  have a row in every catalog.
- Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
2026-11-13 21:06:48 -08:00
dotCooCoo 15bf65f014 Merge main into fix/issue-6784 2026-11-13 20:54:25 -08:00
dotCooCoo 4819fdbc0a Type: Justification, OpenType, text styles and Convert to Text change every frame of a selected story
With the Selection tool, the Justification dialog, the OpenType panel, a
Character or Paragraph Styles row (Alt-click and Clear Overrides
included) and Type > Bullets and Numbering > Convert to Text now change
every frame of each selected threaded story, locked and hidden frames
included, in one undo step. Before, they changed only the selected
frames.

- The Justification dialog keeps the frames of the stories selected when
  it opened for its preview and OK.
- The OpenType panel's Figure menu shows Mixed and its checkboxes show a
  dash when the characters differ; a click on a dash turns the feature
  on everywhere.
- The style panels highlight a style only when all of the text has it,
  and show "+" when any of it overrides the style.
- Convert to Text takes the same stories as Apply Bullets and Apply
  Numbers.
2026-11-13 19:45:29 -08:00
dotCooCoo 9644811965 Merge main into feat/live-paint-bucket-multi-click 2026-11-13 19:18:43 -08:00
dotCooCoo bc2caaaa37 Live Paint: a triple-click matches the first fill of a face clicked again
A triple-click whose clicks land on a face, another face, then the first
face again matched the fill the first click gave that face. It now
matches the fill the face had before the first click that painted it, as
the tool's doc comment and docs/mcp.md say.

- With Space held for the view tools, the Live Paint Bucket outlines no
  face or edge, as a press there paints nothing.
- A scoped livePaint.fill or livePaint.strokeEdge where every face or
  edge reached already has the paint records no undo step; a test covers
  it, and one where only some faces need the paint.
- An MCP test drives the bucket through ui.pointer with mods.space.
- The tool's doc comment and the progress line state the rule.
2026-11-13 19:10:40 -08:00
BFlat 446bf59bc2 Merge pull request #7265 from dotCooCoo/feat/live-paint-cursor-swatch-preview
Live Paint Bucket: Cursor Swatch Preview and arrow keys pick swatches
2026-11-14 09:33:39 +07:00
dotCooCoo 33319b2c4d Merge main into feat/live-paint-bucket-multi-click 2026-11-13 18:04:02 -08:00
BFlat c1efdbdaae Merge pull request #7255 from dotCooCoo/fix/folder-prefs-out-of-recorded-steps
Actions: keep folder preferences out of saved sets and confined replies
2026-11-14 08:40:15 +07:00
dotCooCoo 00c0c1d6ea Learn: steps get check boxes, and skill rings fill as tutorials are finished
Each step of a Learn tutorial now has a check box that marks it done
once the tutorial's practice sample is open, and Finish tutorial marks
every step done. A skill's ring fills by the share of its tutorials
finished, its count shows tutorials finished of all, and a finished
tutorial has a check mark in its skill's list. Screen readers get the
count and the finished state as the rows' values.

The progress is saved with the UI preferences and read leniently: an
unknown tutorial, a step a tutorial does not have, a repeated entry or a
value of the wrong kind is skipped without resetting other preferences.
Reset progress under the list of skills clears it. A finished tutorial
can be finished again after a restart without reopening its sample.

- learn.markStep marks or clears one step; learn.resetProgress clears
  the progress; learn.list adds done and total per skill and finished
  and completedSteps per tutorial. Both new commands are in the UI
  command catalogs, and bad params are errors that change nothing.
- New labels and messages have rows in every catalog.
- Docs: docs/mcp.md, docs/target-app-parity.md and docs/ui-parity.md.
2026-11-13 17:26:47 -08:00
dotCooCoo 91f77f1eb8 Actions: Button Mode shows actions as colored buttons that play on a click
The Actions panel menu has a Button Mode item with a check mark. While it
is on, the panel shows every action of every set by name as a button in
its Action Options color, without set names, steps or checkmarks, and a
click on a button plays that action without its excluded steps. Choosing
Button Mode again shows the list.

- ui.action.buttonMode {enabled?} switches the view (left out: the
  other view) and is kept with the UI preferences; it cannot be turned
  on while an action records.
- ui.action.playAt {set, action} plays an action by its place, as the
  buttons do.
- An action without a color is an ordinary button. The bottom bar shows
  only Stop Playing/Recording while an action plays or records, and Play
  Current Selection while one waits at a stop. Menu items for a selected
  action or the current set are off in Button Mode.

Docs: docs/mcp.md, docs/ui-parity.md, docs/target-app-parity.md.
2026-11-13 17:26:31 -08:00
dotCooCoo 45be5112e9 Merge main into fix/save-unused-option-notes 2026-11-13 16:56:43 -08:00
dotCooCoo adc60bfb16 Merge main into feat/rotated-box-scale-reflect 2026-11-13 16:42:07 -08:00
BFlat 92d9604726 Merge pull request #7264 from dotCooCoo/fix/confined-svg-export-script-paths
MCP: SVG export by a confined caller refuses script links outside its read roots
2026-11-14 07:34:26 +07:00
dotCooCoo d30831bd5a Merge main into feat/live-paint-cursor-swatch-preview 2026-11-13 15:54:47 -08:00
dotCooCoo 6fb49b9c4b Merge main into fix/issue-6784 2026-11-13 15:40:31 -08:00
dotCooCoo 3429bbc76a Save, Export for Screens: warnings name an option the file doesn't read
The save commands' warnings now follow an export's .ai rules: a legacy
.ai file (aiVersion "7") reads only its own options, and the other .ai
and .ait files don't read outlineText, hiddenObjects, transparentImages
or preserveEditing. They name any option given beside the path that the
file doesn't read, not only compress, version, preview and precision,
and any such key in options. The bytes a save writes don't change.

The Save Options dialog sends a .ai save only the options the chosen
version reads, so a save from the dialog gets none of these warnings.
When the document's own file is already a .ai, the .ai options that a
save doesn't give and its file doesn't read keep their remembered
values, so the dialog still shows them; the save doesn't write them, and
a retry in another folder doesn't send them.

Export for Screens and Export Assets already accepted a key in a format
row or in a format's settings that only another format takes. Their
warnings now name it as given (formats[0].quality, settings.png.quality).
A key in a format's settings is named only when no row of that format,
as the export writes it, reads it. The options of an exportPreset, and
for assets.export the settings the document keeps, get no warning.

Docs: params text of document.save, document.exportForScreens and
assets.export; docs/mcp.md; docs/target-app-parity.md.
2026-11-13 15:34:25 -08:00
BFlat efba8bfd89 Merge pull request #7295 from dotCooCoo/fix/negative-wrap-offset
Text Wrap: a negative Offset lets text run into the wrap object
2026-11-14 06:26:39 +07:00