Commit Graph
4259 Commits
Author SHA1 Message Date
dotCooCoo bfabe4f980 Merge main into perf/flatten-opaque-chain 2026-11-11 19:18:07 -08:00
dotCooCoo f95c4b51c9 Flatten Transparency: opaque art that touches only opaque art stays vector
Grouping for flattening joined every pair of objects whose 1 pt reach
boxes touched, transitively, so a row or grid of opaque objects next to
one see-through object became one group and was flattened with it.

Now a group holds each see-through object and every object its reach
touches. An object without transparency joins only where its reach
touches a member and it lies above that member but below the group's
topmost object, whose place the group takes, so the stacking order
stays the same. In files without transparency with Clip Complex Regions
on, art under a group within one image pixel of a member joins it too,
with the pixel size taken from the image's actual resolution. Objects in
an overlap set that includes one inside a clip group or clipping layer
keep the previous grouping.

The 1 pt antialiasing margin now goes around a group's art once instead
of once per nested group (a stroked path's plain art is a group, so it
had 2 pt).

On 3,000 stroked rectangles, 60 with a drop shadow, the Flattener Preview
counts 180 affected objects where it counted 3,000, and Flatten
Transparency with the Medium preset makes 240 flat regions and 2 images
where it made one image of the whole grid.
2026-11-11 19:17:06 -08:00
dotCooCoo 50efa16303 MCP: a hidden library keeps the id it was first shown under
A library loaded from outside a confined client's read roots keeps its
`loaded/<file name>` id for the session, in ui.inspect, ui.docking and
the library commands, so an id taken from an earlier reply still finds
the same library after another library with the same file name is
loaded. swatch.library.copyToUser leaves out `path` when the file is
outside the read roots, as the saves do.

The ids come from the engine's concealed_library_ids, which now reads a
path written with either separator, counts another platform's absolute
path as outside the roots, and keeps each id in the session.
2026-11-11 19:16:17 -08:00
dotCooCoo dea30d6328 Scripts: a finally block left early drops its saved throw site
A finally block that break or continue leaves no longer keeps the saved
site of the exception it ran for. A Jump now removes the sites at or
above the stack's length, as a return already does, so a collection
after the stack grows back over that slot does not root and count the
old code.

New tests in crates/js/src/host_tests.rs: an error passed on by a
finally block that collects garbage under a 1 MiB heap is reported at
its throw; the saved site keeps direct eval code live through a
collection; a host abort inside a finally block leaves no saved site;
and break, continue and return out of a finally block drop the site.
2026-11-11 19:14:05 -08:00
dotCooCoo 1603e78afa Merge main into fix/inspect-library-ids-whole 2026-11-11 19:13:35 -08:00
dotCooCoo 396de45501 Merge main into feat/learn-panel 2026-11-11 19:10:42 -08:00
dotCooCoo 4f08f19ce4 Learn: a Learn panel lists tutorials by skill, opened from Explore tutorials on the app bar
Window › Learn and a new Explore tutorials button beside the search icon on
the app bar show and hide the Learn panel. Its For you tab holds a Get started
section with a Quick skill guide card that opens the Skills tab. The Skills tab
lists VectorCraft's own skills with their tutorial counts and empty progress
rings; a skill lists its tutorials, a tutorial shows its numbered steps, and
Back goes up one level. The tutorials live in a data catalog whose test checks
unique ids, that every named tool and command exists and that no skill is
empty.

- window.learn {show?} shows, hides or toggles the panel; showing it also
  shows a hidden dock, and the panel counts as hidden while the dock is hidden
  or a full screen mode hides the panels.
- learn.list lists the skills and tutorials; learn.show {tutorial} opens one.
  A missing, non-string or unknown id is an error and changes nothing.
- New labels and messages have rows in every catalog. The tutorial text is
  English.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
2026-11-11 19:10:02 -08:00
dotCooCoo 7559607037 Document Setup: a Color tab sets the color mode and the assigned profiles
Document Setup gets a Color tab with the document color mode (RGB Color
or CMYK Color), a Convert to CMYK or Convert to RGB box for a mode
change (cleared, the colors keep their numbers), and the RGB and CMYK
profiles assigned to the document, with a working-space entry for none.

When the tab changes something, OK runs document.setup, then
edit.assignProfile, then file.documentColorMode in one command.batch,
and the document's changes are one undo step. Assign Profile runs first,
so a mode change converts through the profile picked with it. An
unchanged Color tab adds no color commands, and Cancel, or OK with
nothing changed, records no undo step. A Color tab field with a value of
the wrong kind is an error, and the dialog stays open with nothing
changed. File › Document Color Mode and Edit › Assign Profile… stay
where they are.

Catalogs: "Working RGB (don't tag)" and "Assign Profile" rows in every
complete catalog, and the "`{key}` must be a profile name or null"
message in every complete-message catalog. Docs: docs/mcp.md,
docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 19:08:06 -08:00
BFlat 6b8be09699 Merge pull request #6688 from dotCooCoo/fix/plugin-call-reprepare-test
Edit: a command that ends a drag keeps its unapplied preview
2026-11-12 10:06:12 +07:00
dotCooCoo 935ebccc25 EPS: Save As options are menus with readable names, and Export As's Range shows an example
Save As to an EPS file showed Preview Format, Overprints and Flattener
Preset as text fields holding their ids (tiffColor, preserve, medium),
the PostScript level as a number field, and labeled every EPS option
except Use Artboards from its name ("Cmyk Post Script", "Thumbnails").

The dialog now shows the options Export's EPS Options shows. Preview,
Overprints, Flattener preset (the built-in presets, then saved ones) and
PostScript are menus of readable names. Transparent and Opaque apply to
the color TIFF preview only. Embed Fonts shows checked and disabled. The
PostScript level comes last. A pick writes the same values as before
(previewFormat "tiffColor", a built-in preset's id, a saved preset's
name, the level as a number). A value that the save would reject shows
as it is.

Every option the dialog shows has a written label. "Preview:" has a row
in every catalog, and the de, it, ja, ko, uk, vi and zh-hant catalogs
gain the menu names, which Export's EPS Options also showed in English.

Export As's Range field shows the "1-3, 5" example when emptied, as
Save As's does.
2026-11-11 19:04:27 -08:00
BFlat bac3be03cb Merge pull request #6716 from dotCooCoo/fix/3d-fill-walls-behind-stroke
3D: a stroke's walls cover the fill's walls at concave corners
2026-11-12 10:03:08 +07:00
dotCooCoo 1716f10790 Merge main into feat/type-path-center-on-top 2026-11-11 19:00:23 -08:00
dotCooCoo 3e0d5a0aaf MCP: a library saved with another platform's absolute path is hidden under a read root
Outside Windows, a library path that starts with a drive or a backslash counts as outside the read roots, since the file access check would read it as a name in the working folder.
2026-11-11 18:59:31 -08:00
dotCooCoo 7e071feb4d Merge main into feat/pixel-align-new-objects 2026-11-11 18:57:23 -08:00
Sven Lafebre 46e8f576cc Merge remote-tracking branch 'origin/main' into fix/5111-kern-paragraph-start
# Conflicts:
#	docs/target-app-parity.md
#	docs/type-parity.md
2026-11-12 03:56:06 +01:00
dotCooCoo 2649f20c8e Merge main into feat/styles-textures-library 2026-11-11 18:55:43 -08:00
BFlat 765bd30783 Merge pull request #6744 from dotCooCoo/feat/color-show-recent-colors
Color: the panel menu's Show Recent Colors shows or hides the Recent Colors row
2026-11-12 09:55:35 +07:00
dotCooCoo be4fd1c23e Merge main into fix/plugin-put-back-result 2026-11-11 18:55:34 -08:00
dotCooCoo 68cbf041a4 MCP: replies hide each sent path the same way whatever the outcome
Each hidden id or path is replaced once, chosen from the reply as given,
so a hidden path inside another library's shown id is not replaced
again, and a readable id written with %XX escapes keeps the hidden path
it begins with. A path quoted with {:?} is matched with its quotes and
control characters escaped. A path outside the read roots that the
request sent is shown by its file name in a reply that succeeded as in
one that failed, and a path param counts with a relative path too. A
relative path is not replaced where it ends a longer path. Without a
read root, a file: URL that names another host stays in ui.inspect's
recorded steps.
2026-11-11 18:50:00 -08:00
dotCooCoo 822efb5db9 Merge main into fix/plugin-grant-sealed-api
# Conflicts:
#	docs/target-app-parity.md
2026-11-11 18:49:27 -08:00
dotCooCoo 269a75c45c Merge main into feat/eps-save-use-artboards 2026-11-11 18:49:02 -08:00
dotCooCoo 558568d531 Merge main into feat/dynamic-text-release-path 2026-11-11 18:48:20 -08:00
dotCooCoo 19ed0889b1 Merge main into fix/script-files-followups
# Conflicts:
#	crates/engine/src/script/files.rs
2026-11-11 18:48:18 -08:00
dotCooCoo c0289333e1 Merge main into feat/control-bar-align-to 2026-11-11 18:47:46 -08:00
dotCooCoo c02f2a5d75 Merge main into fix/links-read-roots 2026-11-11 18:46:20 -08:00
BFlat eb35bd6b3b Merge pull request #6754 from dotCooCoo/feat/3d-shadows
3D and Materials: shadows behind or below the object, with Distance and Bounds
2026-11-12 09:45:11 +07:00
dotCooCoo 09c35cce38 Merge main into feat/char-style-options-tcy-offsets 2026-11-11 18:45:03 -08:00
dotCooCoo b403fe230f Merge main into fix/pdfa-14-long-pages 2026-11-11 18:43:27 -08:00
BFlat 3859e9b5ff Merge pull request #6748 from dotCooCoo/perf/gstyle-apply-shared-appearance
Graphic Styles: applying a style shares one appearance across the objects
2026-11-12 09:40:20 +07:00
BFlat aeffe1d004 Merge pull request #6731 from dotCooCoo/feat/actions-insert-menu-item
Actions: Insert Menu Item adds a menu command to an action
2026-11-12 09:40:12 +07:00
Christian Lappin 4e3ebb2810 M3: preserve effective text dimensions in Eyedropper picks (#6404) 2026-11-11 21:40:10 -05:00
BFlat 01efd56ee3 Merge pull request #6752 from dotCooCoo/fix/open-shows-every-import-note
Open: the status bar names what the file left out first, and its hover lists the notes
2026-11-12 09:40:03 +07:00
dotCooCoo e0e4d7e8d7 Merge main into fix/malformed-id-not-missing 2026-11-11 18:38:43 -08:00
dotCooCoo 982cf2ef5a Merge main into feat/hpgl-import 2026-11-11 18:38:00 -08:00
dotCooCoo 4bc50fa21f Type: Dynamic Text Presets put type on a circle, arch or bow
Type › Dynamic Text Presets › Circle, Arch and Bow
(`type.dynamicTextPreset {preset, position?, flip?, ids?}`) put the
selected point type and type on a path on a new path of that shape and
turn Dynamic Text on, so the text is sized to fill it.

- Circle is a circle as wide as the text, the text running clockwise
  from its bottom; Arch and Bow are a 120° arc whose chord is as wide as
  the text, bulging up or down. The shape is upright on the page when
  the object is rotated or scaled.
- `position` above, center or below sets Align to Path to Descender,
  Center or Ascender; `flip` turns the text to the other side of its
  path. Effect and Spacing stay.
- Area type is left as it is, threaded type on a path is refused, and a
  preset that changes nothing records no undo step.

Docs: docs/mcp.md, docs/target-app-parity.md.
Part of #4134.
2026-11-11 18:36:09 -08:00
dotCooCoo 417f687776 Merge main into feat/brushes-bristle-library 2026-11-11 18:34:50 -08:00
dotCooCoo 98ad53e799 Merge main into fix/js-tosource-property-flags 2026-11-11 18:34:29 -08:00
dotCooCoo 123c9b5e7d Brushes: built-in Bristle Brushes library with one bristle brush for each tip shape
Window > Brush Libraries > Bristle Brushes holds ten original bristle
brushes generated in code, one for each tip shape: Fine Liner, Pointed
Flat, Stubby Round, Dry Scrub, Soft Dome, Filbert, Angled Round, Angled
Flat, Fan Blender and Grass Fan. Their names and values are VectorCraft's
own, and every value lies inside the range the bristle brush keeps.

A test checks the ranges, that every tip shape is covered, that no name
matches a default brush or another library's brush, that adding the
library is one undo step and a second add adds nothing, and that a saved
library reopens with the same brushes. The library and brush names have
rows in every catalog. docs/mcp.md lists the library.
2026-11-11 18:33:53 -08:00
dotCooCoo d28b72a358 Scripts: toSource refuses read-only, non-configurable and non-extensible data it cannot write back
A literal makes an extensible object whose properties are writable and
configurable, and an array whose length is writable. toSource wrote a
property defined with writable or configurable false, a sealed, frozen or
non-extensible object or array, and an array with a read-only length as an
ordinary literal, so evaluating the text gave an open value.

toSource now throws a TypeError for each of these, at any depth, as it
already does for getters, hidden properties and other prototypes.
Properties defined with every flag on are written as before.
2026-11-11 18:33:42 -08:00
dotCooCoo 6eeff01625 Merge main into test/select-skips-raster-effects 2026-11-11 18:32:38 -08:00
BFlat 7dd71a6972 Merge pull request #6708 from dotCooCoo/feat/mojikumi-line-end-fit
Type: Mojikumi spacing at line ends counts when lines break
2026-11-12 09:32:21 +07:00
dotCooCoo 2a5f8d8d5d Selection: a click on a drop shadow or glow selects the object under it
Clicks, the hover pointer and marquees with the selection tools already
leave out the area that raster effects paint beyond an object. New tests
in crates/engine/src/tests/select_effects.rs hold that in place for drop
shadows, Outer Glow and Gaussian Blur on paths, groups, point type,
symbol art and images, for Shift-click, Direct Selection, the hover
pointer, a drag from a selected object's shadow and a marquee. hit_leaf
gets a doc comment, and docs/target-app-parity.md gets a line citing
https://helpx.adobe.com/illustrator/using/selecting-objects.html.
2026-11-11 18:31:51 -08:00
Dylan M. Taylor a971a14898 Fix Flatpak updates and bump to 0.24.1 (#6649)
* fix(flatpak): allow release checks and self-update helpers

* test: keep Flatpak permission parsing within strict Clippy rules

* chore: bump version to 0.24.1 for the Flatpak update fix

* test: locate CLI binaries after Nextest archive relocation

* docs: explain the Flatpak update permission bootstrap
2026-11-11 21:30:40 -05:00
dotCooCoo fabc28370f Merge main into fix/plugin-call-reprepare-test 2026-11-11 18:29:37 -08:00
dotCooCoo d7a32d09ec Merge main into feat/hang-report 2026-11-11 18:28:39 -08:00
BFlat 588f1678e3 Merge pull request #6750 from dotCooCoo/perf/eps-thumbnail-from-preview
EPS export: the thumbnail is made from the preview instead of drawing the document again
2026-11-12 09:27:26 +07:00
dotCooCoo 4795701122 Merge main into feat/styles-textures-library 2026-11-11 18:27:09 -08:00
dotCooCoo 2d29087ac2 Graphic Styles: built-in Textures library with grain, canvas, craquelure and tile styles
Window › Graphic Style Libraries › Textures, after Hand-Drawn, holds eight
styles that paint their fills and strokes with the texture effects: Fine
Grain (Grain), Canvas Weave and Burlap Sack (Texturizer), Cracked Glaze
(Craquelure), Mosaic Floor (Mosaic Tiles), Quilted Squares (Patchwork),
Leaded Glass (Stained Glass) and Damp Paper (Water Paper). The styles,
their names and their settings are VectorCraft's own.

Each catalog has rows for the library and style names. Docs: docs/mcp.md,
docs/gaps.md, docs/target-app-parity.md.
2026-11-11 18:25:50 -08:00
BFlat 2086ddbab9 Merge pull request #6660 from dotCooCoo/fix/i18n-plugin-limit-messages
i18n: plug-in limit messages are translated in every complete-message catalog
2026-11-12 09:24:03 +07:00
BFlat 6c68e13732 Merge pull request #6655 from dotCooCoo/fix/plugin-approval-ok-delay
Plug-ins: the approval dialog takes OK only once its question was shown for half a second
2026-11-12 09:23:52 +07:00