Commit Graph
3008 Commits
Author SHA1 Message Date
BFlat 10f6f4ffb2 Merge pull request #6518 from dotCooCoo/fix/char-style-basic-names
Character Styles: the style dialogs' fields have accessible names
2026-11-11 12:31:01 +07:00
BFlat ac33652fe3 Merge pull request #6516 from dotCooCoo/fix/menu-scroll-wrap
Menus: a scrolling list keeps each label on one line
2026-11-11 12:26:41 +07:00
dotCooCoo c676051641 Character Styles: the style dialogs' fields have accessible names
The text fields and menus of the Basic Character Formats, Advanced
Character Formats, Character Color and OpenType Features sections, and
the Style Name field of Character Style Options, are now named by the
label beside them, so screen readers announce them. This covers both
Character Style Options and New Character Style, which share the
sections. The New Character Style UI test runs with the accessibility
check on again, and a new test opens every section of both dialogs and
checks that no input is unnamed.
2026-11-10 20:53:24 -08:00
BFlat bc814012d9 Merge pull request #6511 from dotCooCoo/feat/artboard-color-labels
Artboards: an artboard's guide label colors its own guides
2026-11-11 11:27:16 +07:00
dotCooCoo 549391a50d Menus: a scrolling list keeps each label on one line
A popup measures its list on the first frame, when the scroll area does
not yet show its bar. When the bar then appeared, its column took its
width from the items, and the widest label wrapped onto two lines:
Distort & Transform in the Add New Effect menu, and Black and White Logo
in the Image Trace presets, in short windows.

menu_scroll now lays the items out at least as wide as on the popup's
first frame, so the bar's column widens the popup instead. That width
is kept until the popup closes and is never wider than the window has
room for. The items are laid out in the same child Ui on every frame,
so their ids do not change when the width does.
2026-11-10 20:23:42 -08:00
BFlat 98fe060bb0 Merge pull request #6499 from dotCooCoo/feat/script-console
Scripts: Window › Script Console shows script output, errors and run reports
2026-11-11 10:48:06 +07:00
dotCooCoo 29437fed48 Merge main into feat/artboard-color-labels 2026-11-10 19:38:12 -08:00
dotCooCoo beef32b8a3 Artboards: an artboard's guide label colors its own guides
Each artboard can carry a guide label: one of the layer colors or a
custom RGB. Guides that belong to an artboard draw in its label color,
and guides without an artboard, or on an artboard without a label, keep
the guide color from the preferences. Selected guides still draw in the
selection color.

- Artboard Options has a Guide Label row (None, the layer colors with
  swatches, or Custom with a color swatch).
- artboard.new and artboard.setProps take guideLabel: null, a layer
  color's name, or #rrggbb. Any other value is an error. The inspect
  summary lists guideLabel when one is set.
- The native format saves the label and skips it when unset; a preset
  index outside the layer colors reads as no label.
- artboard.setProps no longer adds an undo step when nothing changes.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-10 19:37:17 -08:00
BFlat add0fcbe03 Merge pull request #6503 from dotCooCoo/fix/fx-menu-flicker
Menus: a long menu stays in one place instead of jumping between two places
2026-11-11 10:29:19 +07:00
BFlat ec89f3f26e Merge pull request #6501 from dotCooCoo/feat/prefs-export-import
Preferences: export and import preferences as a JSON file
2026-11-11 10:01:01 +07:00
dotCooCoo e4830a0e2c Docs: the Script Console note shows only after dropped or cut lines
The panel's note and the doc comment on ui.copyScriptConsole now say the
count of dropped and cut lines appears only when there are any, and the
returned lines count leaves that line out.
2026-11-10 18:51:13 -08:00
dotCooCoo 6643991710 Docs: ui.copyScriptConsole adds the count line only after dropped or cut lines
A copy of every Script Console line starts with the count of dropped and
cut lines only when there are any, and the returned lines count leaves
that line out. The end-line text is described without a code span that
ends in a space.
2026-11-10 18:30:11 -08:00
dotCooCoo ef07aecd96 Menus: a long menu stays in one place instead of jumping between two places
A scrolling menu list took its height from its own top down to the
window's bottom bars. egui picks a popup's side from its size on the
previous frame and moves a popup that does not fit back into the
window, so the list's height changed with where the popup was drawn.
In a short window the Add New Effect menu and other long menus moved
between two places while open, and a menu that did not fit crept a
few points per frame.

The list now takes its height from the room below and above the
button, row or point it opens from: below while that side leaves the
120 pt minimum, otherwise on the side with more room. A submenu
measures down from its row's top or up from its row's bottom. The
change is in menu_scroll, so it applies to every menu built on it.
2026-11-10 18:29:20 -08:00
BFlat 4c2b8df865 Merge pull request #6498 from dotCooCoo/fix/smart-guides-snap
Smart Guides: tools do not snap to Smart Guides while Pixel Preview is on
2026-11-11 09:26:08 +07:00
dotCooCoo d426c70a92 Preferences: export and import preferences as a JSON file
Part of #6435. An optional VectorCraft feature: the Preferences dialog's
Export Preferences... saves the applied preferences to a JSON file (the
web build downloads it), and Import Preferences... applies such a file and
shows the imported values. They run the new commands prefs.export {path?}
and prefs.import {path | data}.

The file holds every preference prefs.list lists and the eyedropper,
perspectiveWidget, pathfinder and glyphSnap groups, without the four
folder preferences and saved presets. prefs.import reads at most 1 MB and
checks every value first: another format, a newer version, an unknown
preference, a bad value or a folder preference is an error, and nothing
changes. It keeps the open document's units, records no undo step, and is
refused as a command.batch step. prefs.set now rejects a group value that
is not an object.
2026-11-10 18:11:01 -08:00
BFlat af66951c41 Merge pull request #6496 from dotCooCoo/feat/ruler-artboard-guides
Guides: an option makes Cmd/Ctrl ruler drags artboard guides
2026-11-11 09:04:35 +07:00
BFlat d2b1fe74cf Merge pull request #6495 from dotCooCoo/fix/canvas-redraws-on-plugin-change
Canvas: installing or removing a plug-in draws its effects again
2026-11-11 08:58:49 +07:00
BFlat 69d36e961d Merge pull request #6494 from dotCooCoo/feat/dimension-horizontal-vertical
Dimension tool: linear dimensions measure horizontally, vertically or aligned
2026-11-11 08:50:56 +07:00
dotCooCoo 4060480ef1 Smart Guides: tools do not snap to Smart Guides while Pixel Preview is on
With View > Pixel Preview on, the tools still snapped to Smart Guides
and showed their guides; only the Object Highlighting outline was
hidden. Work with Smart Guides says Smart Guides cannot be used while
Snap to Grid or Pixel Preview is on.

ViewInfo has a pixel_preview field, and Session::with_tool_cx turns
Smart Guides (and Snap to Glyph, which needs them) off in the tools'
context while it is set. VectorcraftApp::view_info passes View > Pixel
Preview. View > Smart Guides keeps its setting.

Docs: docs/target-app-parity.md.
2026-11-10 17:43:29 -08:00
dotCooCoo df9c8d992d Merge main into feat/script-console 2026-11-10 17:27:35 -08:00
dotCooCoo 342d082c2b Scripts: Window › Script Console shows script output, errors and run reports
Scripts write to a new Script Console with $.write(...values) and
$.writeln(...values), each value as String(value) gives it. vc.log
entries, a run's uncaught error as name:line:column: message, and a
start, end and report line for each run go there too. The report line
gives the run's time, host calls and slowest commands.

- The console keeps at most 2,048 lines and 1 MiB of text, dropping the
  oldest and counting what it dropped. A line is cut at 4,096 bytes and
  a script's name at 256 bytes, with a count of cut lines. Line feeds,
  carriage returns and CRLF break lines; other control characters show
  as Unicode Control Pictures.
- script.run's result and scriptReport gain runTimeMs, timingAvailable,
  hostCallCounts, slowestCommands and the run's own console. A failed
  run's report has them too.
- script.console and script.console.clear read and empty the console;
  ui.copyScriptConsole {first?, last?} copies lines as the panel shows
  them.
- The panel lays out only the rows in view, selects with click and
  Shift-click, and has Clear, Copy Selected and Copy All. Output goes on
  while it is closed, and Clear works during a run.

Docs: docs/mcp.md, docs/gaps.md, docs/roadmap.md,
docs/target-app-parity.md.
2026-11-10 17:26:30 -08:00
dotCooCoo afac976482 Canvas: installing or removing a plug-in draws its effects again
The canvas key did not change when a plug-in was installed, replaced or
removed, so the canvas kept showing the frame drawn with the old plug-in,
and a pan by whole pixels copied that frame's pixels next to strips drawn
with the new one.

The key now carries the plug-in revision of the last install or removal
after which the document draws a plug-in effect, in its layers, in a
symbol's or pattern's art, or in a brush's art. The canvas looks through a
document once after each install or removal; a document without a plug-in
effect keeps its key.
2026-11-10 17:09:41 -08:00
dotCooCoo ed17e8fc17 Dimension tool: linear dimensions measure horizontally, vertically or aligned
A linear dimension between two clicked points, or dragged out from a
segment, always measured the straight distance between its points and
drew its line parallel to them, so two points at different heights gave
only a slanted dimension. The linear dimensions help describes aligned,
horizontal and vertical linear dimensions: after the second click,
clicking again gives an aligned one and moving the pointer gives a
horizontal or vertical one.
https://helpx.adobe.com/illustrator/desktop/measure-and-align/plot-and-measure/plot-linear-dimensions-of-objects.html

While a linear dimension is being placed, the pointer's position sets
whether it is aligned, horizontal or vertical. The rule is VectorCraft's
own. With the pointer beside the two points (the nearest point of the
line through them lies between them) or on that line, the dimension is
aligned. Past either point, the line through the points and the
perpendicular through that point bound a quarter on each side of the
line. The quarter that holds the direction straight up or down gives
the horizontal distance, and the quarter that holds the direction
straight left or right gives the vertical distance. A click within
reach of the second point, or of where the pointer was for the second
click, places it aligned. Points on one horizontal or vertical line
give an aligned dimension. The dimension stays linked to the anchors it
measures.

- Dimension recipes carry an orientation (aligned by default; files
  without it open as before). The line runs along the axis, and each
  extension line runs from its point to it.
- dimension.create and dimension.update take orientation: aligned,
  horizontal or vertical, for linear dimensions only. Any other value
  is an error. A new orientation keeps the line on the side of the
  points it was on, and an update that changes nothing records no
  undo step.
- A horizontal or vertical dimension keeps its orientation when it or
  the art it measures turns, and shows 0 when its points come into line
  across its axis. A line that lay outside the points stays outside
  them after a turn.
- The hint bar names the two-click placement.

Docs: docs/dimensions.md, the Evidence list in docs/target-app-parity.md.
2026-11-10 16:54:35 -08:00
dotCooCoo a2d13cd6a8 Merge main into feat/ruler-artboard-guides 2026-11-10 16:27:09 -08:00
dotCooCoo 91509f1776 Guides: an option makes Cmd/Ctrl ruler drags artboard guides
Preferences > Guides & Grid gets Artboard Guides with Cmd/Ctrl + Ruler
Drag (cmdRulerDragArtboardGuides), off by default. With it on, Cmd/Ctrl
held when a drag leaves a ruler makes a guide of the active artboard,
with any tool but the Artboard tool; with the Artboard tool it makes a
canvas guide instead. The key is read when the drag starts, so letting
it go during the drag keeps the kind of guide. Such a guide shows and is
made only where it lies within the active artboard; released elsewhere,
it makes no guide and no undo step. A ruler click still makes no guide.

This is VectorCraft's own option. The documented way to limit a guide
to one artboard, dragging it out with the Artboard tool, is unchanged.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-10 16:26:14 -08:00
dotCooCoo 8413ca6226 Merge main into feat/prefs-reset-confirmation 2026-11-10 16:16:18 -08:00
dotCooCoo 4574ab047d Preferences: Reset Preferences asks first
Part of #6435.

Reset Preferences in the Preferences dialog now opens a question over
the dialog (`resetPreferences`). Cancel or Escape goes back to
Preferences as it was, with its edits, category and search kept. OK goes
back with every preference at its default value; OK in Preferences
applies them and Cancel there discards them, as before. `prefs.reset`
still resets at once.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-10 16:07:25 -08:00
BFlat 745fb4edd7 Merge pull request #6482 from dotCooCoo/fix/prefs-reset-keeps-document-units
Preferences: Reset Preferences leaves the open document's units alone
2026-11-11 07:04:48 +07:00
dotCooCoo 6732dbab1e Preferences: Reset Preferences leaves the open document's units alone
Reset Preferences put Points in Units > General, and OK sent it to
prefs.set, which also set the open document's units as an undo step.
OK after Reset now resets the General preference and leaves the
document's units as they are. Choosing a General unit after Reset, in
the dialog or with ui.dialog.set, still sets the document's units.

prefs.set takes documentUnits (default true); false makes unitsGeneral
set only the preference. Docs: params text, docs/mcp.md.

Part of #6435
2026-11-10 15:21:18 -08:00
dotCooCoo d9e9adbf45 MCP: answer_dialog sets the fields and answers the dialog in one request
answer_dialog sent ui.dialog.set and then ui.dialog.confirm or
ui.dialog.cancel as two requests. A dialog another control connection
opened between them was confirmed or canceled without the fields.

ui.dialog.set takes `action: confirm | cancel`, checked before any field
is set, and confirms or cancels the dialog the fields were set in within
the same request, replying {dialog, result}. answer_dialog sends set and
action together; an app whose reply has no `dialog` key did not answer
it, and the dialog is then confirmed or canceled with its own request.
2026-11-10 14:51:50 -08:00
BFlat 349385fd56 Merge pull request #6418 from dotCooCoo/fix/3d-more-object-kinds
3D: effects build from clipping groups, blends and symbol instances
2026-11-11 05:13:37 +07:00
BFlat 3cb6f44c9b Merge pull request #6464 from dotCooCoo/fix/issue-6382
Fix #6382: PDF export says how a page longer than 200 inches is written
2026-11-11 04:46:38 +07:00
dotCooCoo 667204e7c4 3D: dialog tests use an image as the object a 3D effect refuses
Three Extrude & Bevel dialog tests used a clipping group as their example
of an object a 3D effect refuses, and clipping groups now apply. Their
helper now places an image, and they check for the image message ("can't
build a solid from an image") in place of "requires a path".
2026-11-10 13:03:34 -08:00
dotCooCoo a960ba0d08 PDF export: pages that exported before keep exporting
- PDF 1.3 and 1.4 files, PDF/X-1a, PDF/X-3, PDF/X-4 and PDF/A-2b at
  PDF 1.4 among them, write a page longer than 14,400 pt in points
  again, now with a warning that apps that keep to the limit cut it to
  200 in. Only a page that failed with
  "PDF writer error: Limit(TooLargeFloat)" gets the new error: one
  whose size or art needs a real number past 32,767, the most PDF 1.4
  holds. Whole numbers are written as integers, so a page of whole
  points past 32,767 is written as before.
- A page whose side is past 32,767 pt and not a whole number of points
  is refused before the thumbnails are drawn and the transparency is
  flattened.
- A PDF 1.5 file written as PDF 1.6 for a long page keeps PDF 1.5's
  encryption (128-bit RC4), which the Save PDF dialog shows.
- A long page whose short side would be under 3 units at its UserUnit
  (ISO 32000-1, Annex C.2), such as 50 m x 4 mm, gets a smaller
  UserUnit that keeps the short side at 3 units, with a warning.
- The warnings give a page's size rounded up, as the error does.

A page of 14,400 pt or less is written as before. The new warning has
rows in every complete catalog. Docs: docs/mcp.md,
docs/target-app-parity.md and the document.exportPdf params.
2026-11-10 12:31:53 -08:00
dotCooCoo 085609e398 Merge main into feat/plugin-call-commands 2026-11-10 12:01:07 -08:00
BFlat 6622a3ea30 Merge pull request #6451 from slafebre/fix/6429-dash-fields-commit-on-blur
#6429: a value typed in a Stroke popup sticks when a click outside closes it
2026-11-11 02:57:28 +07:00
BFlat fa13af4b8f Merge pull request #6353 from Messhias/feat/g5-brush-lib-game-trails
G5: built-in Game Trails brush library
2026-11-11 02:53:07 +07:00
BFlat 2caa5670dd Merge pull request #6446 from slafebre/fix/6419-assign-profile-panel
Fix #6419: Edit › Assign Profile… and Color Settings… scroll to the Color Settings
2026-11-11 02:47:51 +07:00
dotCooCoo c6c57a80ef Merge main into feat/plugin-call-commands 2026-11-10 11:26:41 -08:00
Sven Lafebre 40368e77e0 #6429: the Appearance popup's last frame puts surrender_focus_on back however it ends
A drop guard restores egui's app-wide option, so a panic in the popup's panel
(caught by the app's guard) no longer leaves presses ending every field's edit.
2026-11-10 20:15:44 +01:00
Fabio William Conceição 9dc15b8f1f G5: built-in Game Trails brush library
Add Speed Line, Dash Trail, Burst Ray and Zigzag as original art brushes so motion and impact strokes are one library click away.
2026-11-10 19:04:40 +00:00
BFlat d2402b75bf Merge pull request #6425 from Hassan1305/feat-4936-edit-custom-dictionary
#4936: Edit › Edit Custom Dictionary… dialog
2026-11-11 02:01:47 +07:00
Sven Lafebre 332e8fe15c #6429: a value typed in a Stroke popup sticks when a click outside closes it
The Properties panel's Stroke link and the Appearance panel's Stroke: row open
the Stroke panel as a popup. A click outside closed it without drawing it
again, so the dash field (or any other field in it) never saw itself lose the
keyboard, and what was typed went back. A popup closing while one of its
fields has the keyboard now draws once more first: the field lets go of the
keyboard to the click and commits, as it does in a panel. The Appearance
popup closes on the press, before it is a click, so for that last frame a
press is what lets go of the keyboard. Escape still drops what was typed.
2026-11-10 19:57:24 +01:00
Sven Lafebre 2dd63e7240 Fix #6419: document the Separations Preview panel's Color Settings section functions 2026-11-10 19:55:53 +01:00
dotCooCoo f51a9dc16d Merge main into feat/plugin-call-commands 2026-11-10 10:16:48 -08:00
dotCooCoo f921a6923d Plug-ins: an API level 2 plug-in calls the commands its manifest lists
A filter at plug-in API level 2 with the new `commands` permission names
the commands it may run in its manifest's `commandAllowlist` and runs
them with `env.vc_call`, reading each result with `env.vc_call_result`.
Each call runs through Session::execute on the run's document and sees
what earlier calls changed; the calls and the filter's output are one
undo step, and a run that fails, is cancelled or makes a failed call
leaves the documents, their history and the session state the commands
change as they were.

Commands that touch files, the clipboard, preferences, the view,
scripts, actions, plug-ins, open documents or the undo history are never
callable, and every other command must be listed as allowed in
cmd/plugin_call/reviewed.rs, so a new command is refused until placed.
Calls are capped at 1,000 a run, 8 MiB a call and 64 MiB a run, and each
costs instructions from the run's budget. plugin.install refuses a
manifest that lists a refused command and reports unknown ids;
plugin.inspect lists both, and the approval dialog lists the commands.

Refs #2186
2026-11-10 10:16:28 -08:00
Sven Lafebre 64fb4d4554 Fix #6419: Edit › Assign Profile… and Color Settings… scroll to the Color Settings
Both commands show the Separations Preview panel (#4542), whose Color Settings
section, with the Assign row, comes after the plates and Proof Setup. A
floated panel fits its content only up to 320 points, so the section opened
out of sight and the panel looked like the wrong one. The commands now leave a
one-shot flag that scrolls the section into view, without animation, the next
time the panel draws. Window › Separations Preview and edits made in the panel
leave the scroll alone.
2026-11-10 19:14:48 +01:00
MarekSpodBiedry e9069e1418 Restore the spacing in the Weight spinner test helper (#5349) 2026-11-10 18:39:05 +01:00
MarekSpodBiedry a7df8985f9 Clear the textures delta in the Weight spinner test helper (#5349) 2026-11-10 18:38:50 +01:00
MarekSpodBiedry eac92af537 Find the Weight spinner in the blank-weight tests from its rect, not fixed offsets (#5349) 2026-11-10 18:36:09 +01:00