Commit Graph
2306 Commits
Author SHA1 Message Date
dotCooCoo 72cf92e540 Document Info: Spot Color Objects lists colorized images and skips clear gradients
A grayscale or 1-bit image colorized with a spot color now counts as a
Spot Color Object. A gradient whose stops are all at an opacity of 0
draws nothing, so its spot stops no longer list the object.
2026-11-12 05:00:26 -08:00
dotCooCoo 1d7690029f Document Info: Spot Color Objects lists the objects that use spot colors
The spotColors category is now titled Spot Color Objects and lists each
object filled or stroked with a spot color, by name with the spot colors
it uses, instead of the spot swatch names. A solid color or a gradient
stop linked to a spot swatch at a tint above 0 counts; process colors
that look the same and Registration do not. Paint that draws nothing is
left out by the rules Pattern Objects and Gradient Objects follow, and
type whose characters use a spot color is listed. Objects counts the
listed objects as Spot Color Objects.

document.info returns spotObjects, spotColorNames and objects.spots;
spotColors now holds the spot colors those objects use. The report that
Document Info > Save... and Package write lists the same rows.

The Spot Color Objects, Pattern Objects and Gradient Objects titles have
a row in each of the 27 complete catalogs, and a test checks that every
complete catalog has the three.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 00:59:50 -08:00
BFlat eb608bb8b5 Merge pull request #6813 from dotCooCoo/feat/brush-place-art
Brushes: drag a brush onto the canvas to place a copy of its art
2026-11-12 15:14:18 +07:00
BFlat edeca27469 Merge pull request #6785 from dotCooCoo/fix/read-roots-save-export-results
MCP: save, export and package replies leave out paths outside a confined client's read roots
2026-11-12 15:14:09 +07:00
BFlat 1a7aa834db Merge pull request #6786 from dotCooCoo/fix/save-export-show-every-note
Save and Export: the status bar's hover lists every note
2026-11-12 15:13:51 +07:00
BFlat dcab893acd Merge pull request #6791 from dotCooCoo/feat/styles-painted-sketched-library
Graphic Styles: a built-in Painted and Sketched library adds watercolor, charcoal and ink styles
2026-11-12 15:13:39 +07:00
BFlat 0d550c6e6d Merge pull request #6796 from dotCooCoo/feat/patterns-grit-textures
Swatch libraries: Patterns › Grit Textures adds seamless grain, speckle and stipple patterns
2026-11-12 15:13:22 +07:00
BFlat 0ad57dc872 Merge pull request #6811 from dotCooCoo/fix/effect-refresh-deferred-nested
MCP: effect.refreshDeferred takes objects in symbol, pattern, brush and mask art
2026-11-12 15:13:13 +07:00
BFlat c8f31dd8a9 Merge pull request #6804 from dotCooCoo/fix/script-checker-name-escapes
Script checker: names with escaped characters are read as names
2026-11-12 15:13:04 +07:00
BFlat ba2aefb5dd Merge pull request #6815 from dotCooCoo/feat/para-style-options-tabs
Paragraph Styles: Style Options edits a style's tab stops
2026-11-12 15:12:55 +07:00
BFlat 27d00baaad Merge pull request #6689 from danngreen/feat/ruler-origin-snap
Rulers: the origin dragged out of the rulers' corner snaps as a drawn point does
2026-11-12 15:12:35 +07:00
BFlat 8782f6c697 Merge pull request #6794 from dotCooCoo/feat/blend-create-spine
Blend: the Blend panel's Create Spine menu sets whether new blends get a spine
2026-11-12 14:17:20 +07:00
BFlat 9a4c36dfed Merge pull request #6771 from dotCooCoo/fix/e4x-scope-name-assign
JavaScript: a bare E4X name inside with or a filter can be assigned
2026-11-12 14:17:08 +07:00
BFlat 5e63104d88 Merge pull request #6800 from dotCooCoo/fix/plugin-automation-install-approval
Plug-ins: an install that automation asked for is not approved in its dialog
2026-11-12 14:16:59 +07:00
BFlat abfd776ef4 Merge pull request #6797 from dotCooCoo/feat/dxf-leave-out-images-hatches
DXF: export options leave placed images and fill hatches out, and CNC / CAM turns both off
2026-11-12 14:16:20 +07:00
BFlat 354a12be3f Merge pull request #6805 from dotCooCoo/fix/read-roots-prefs
MCP: preferences replies leave out folders outside a confined client's read roots
2026-11-12 14:16:11 +07:00
BFlat 4899c51f3e Merge pull request #6803 from dotCooCoo/feat/dynamic-text-release
Type: Convert To Point Type turns Dynamic Text off, keeping the sizes Block set
2026-11-12 14:15:54 +07:00
BFlat 053dc7ab8c Merge pull request #6746 from dotCooCoo/fix/plugin-ignored-grants-shared
Plug-ins: a grant one session stops counting stops counting for every session in the process on its folder
2026-11-12 14:15:46 +07:00
dotCooCoo 44d5d20f58 Paragraph Styles: Style Options edits a style's tab stops
Paragraph Style Options and New Paragraph Style gain a Tabs section. It
lists the style's stops and edits the selected stop's Alignment, position
(X:, or Y: for vertical type), Leader and Align On character. Add puts a
left stop 36 pt past the furthest one, Delete Tab removes the selected
stop, and Clear All Tabs leaves the style with no stops. OK sorts the
stops by position and keeps the stop edited last when two share one
position. Reset Panel removes the style's tabs.

paraStyle.new, paraStyle.setAttrs and paraStyle.edit check changed tabs
stop by stop: at most 256 stops, and each changed stop's position from 0
to 100000 pt and leader of at most 8 characters. Stops the style already
has are kept as they are. Changed tabs are sorted by position, keeping
the first of stops at one position. text.tabs.set rejects a leader longer
than 8 characters, an Align On value of more than one character and more
than 256 stops. Loading paragraph styles skips a style whose indents,
spacing, hyphenation, justification or tabs are out of range.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 23:02:47 -08:00
dotCooCoo 1c28809333 Merge main into feat/patterns-grit-textures 2026-11-11 22:45:36 -08:00
dotCooCoo f494578072 MCP: effect.refreshDeferred takes objects in symbol, pattern, brush and mask art
effect.deferredStatus lists a stage in the art of a symbol, pattern, brush
or opacity mask by the id of the object in that art. effect.refreshDeferred
took such an id only while the object still had a deferred stage; an
existing object there without one was refused as no such object, while a
layer object without a stage was accepted. An id is now valid when it names
an object in the layers or in that art, an object without a stage adds
nothing to the counts, and an id of no object is an error.

The params text and docs/mcp.md said `id` names one object, but the params
text did not list the key, so `{id: N}` was refused as an unknown
parameter. It is now `{ids?|id?}`, and the command checks only the form of
the ids before it looks them up itself.

The requested ids are held in a set while the art is walked, and only those
with a stage are handed to the refresh.
2026-11-11 22:45:06 -08:00
dotCooCoo 97242068f0 Merge main into feat/styles-painted-sketched-library 2026-11-11 22:42:59 -08:00
dotCooCoo b9f7bd018f Merge main into fix/read-roots-save-export-results 2026-11-11 22:41:17 -08:00
Dan Green 949553b6ce Rulers: the origin dragged out of the rulers' corner snaps as a drawn point does
The zero point dragged out of the box where the rulers meet snaps as a
Pen or shape tool's point does: with Smart Guides onto the anchors,
centres, edges and paths of the art and the artboards or into line with
them, with Snap to Point onto the anchors and along the ruler guides,
else onto whole pixels or the grid. The guides showing what it snapped
to show during the drag and go when it is released or cancelled
(Escape, focus loss, another document). The origin is still set once,
on release (document.setRulerOrigin, one undo step).

The engine snaps it (Session::ruler_origin_drag, with the tools crate's
rulerguide::OriginDrag over PointSnap::drawn), as it does a guide
dragged out of a ruler.
2026-11-11 22:33:36 -08:00
BFlat 5eefe7d1c5 Merge pull request #6709 from dotCooCoo/feat/hang-report
Help: a stalled interface writes a hang report, and Copy Troubleshooting Info copies it
2026-11-12 13:18:28 +07:00
BFlat 959f3dc609 Merge pull request #6779 from dotCooCoo/fix/script-sleep-reads-doc-cancel
Scripts: a canceled request stops a run asleep in $.sleep at its next slice
2026-11-12 13:18:11 +07:00
BFlat 880033c2bb Merge pull request #6793 from dotCooCoo/feat/gradients-organic-fades
Swatch libraries: Gradients › Organic Fades adds soft multi-stop fades that thin out to transparent
2026-11-12 13:17:19 +07:00
BFlat ee6aae1d1d Merge pull request #6769 from dotCooCoo/fix/options-dialog-menus
EPS: Save As options are menus with readable names, and Export As's Range shows an example
2026-11-12 13:17:11 +07:00
BFlat 37a392f154 Merge pull request #6621 from makesomethingshit/fix/6373-live-paint-drag
Fix #6373: Live Paint Bucket fills faces crossed by a drag
2026-11-12 13:17:02 +07:00
dotCooCoo 00624da7ad MCP: preferences replies leave out folders outside the read roots
Under --automation-read-root, prefs.get, prefs.list, prefs.set and
prefs.reset returned the folder preferences (fontsFolder, pluginsFolder,
scratchPrimary, scratchSecondary, recoveryFolder, templatesFolder) and
the export presets' folder even when they were outside the read roots.
Such a folder preference is now null, as ui.inspect leaves it out, and
such a preset's folder is left out. An empty folder and the scratch disk
choices stay; without roots the replies are unchanged.
2026-11-11 22:13:53 -08:00
dotCooCoo bcc9901419 Brushes: drag a brush onto the canvas to place a copy of its art
A scatter, art or pattern brush dragged from the Brushes panel onto an
empty part of the canvas places a copy of its art there to edit,
centered where it is dropped (brush.placeArt). Dropped on a path, a
brush is still applied to it. A pattern brush is placed as its tiles in
a row, 10 pt apart, each in a group named for its tile, with an
unpainted rectangle at the back of a tile that has a repeat frame.
Calligraphic and bristle brushes have no art and are refused. A symbol
instance in the art is measured by its symbol's art.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 22:09:58 -08:00
dotCooCoo 5be501e47f DXF: an open path's fill outline is closed, as the fill is
A filled open path wrote its outline as an open polyline, so with fill
hatches left out (and in R12, and in CNC / CAM) the area lost its closing
edge. Fill outlines now close each open subpath that can enclose an area;
strokes of the same path stay open.
2026-11-11 22:09:14 -08:00
dotCooCoo a755082607 MCP: an error from Export for Screens into a preset folder outside the read roots names that folder by its name
document.exportForScreens without a folder writes into the folder its
exportPreset keeps. When that folder is outside the client's read roots
and the export fails, for example because the folder is also outside the
write roots, the error now names the folder by its name, as the reply of
a successful export leaves it out. A granted root in the same message
stays whole, and a folder the client gives stays whole in the error.
2026-11-11 22:06:52 -08:00
dotCooCoo c6ea02c114 Merge main into feat/styles-painted-sketched-library 2026-11-11 22:03:33 -08:00
dotCooCoo 56f9b6181e Merge main into fix/e4x-scope-name-assign 2026-11-11 22:03:32 -08:00
dotCooCoo 1eb02f2f7a Merge main into fix/plugin-ignored-grants-shared 2026-11-11 22:03:31 -08:00
dotCooCoo ad05c3b99d Plug-ins: an install that automation asked for is not approved in its dialog
An approval question that a control request, MCP, injected input, or a
file dialog one of them opened leads to now keeps OK disabled and
refuses every confirm, a person's click included. The dialog says to
choose Object › Plug-ins › Install Plug-in…, and ui.installPlugin answers
approval: "personMustStartInstall". The person's own Install Plug-in…,
File › Open or drop inspects the module again and asks a new question
with its half-second delay.

The origin is fixed when the request is made and goes with a native
file dialog's deferred answer and the web picker's answers, which now
arrive apart from drops and from window.vectorcraft.openFile (always
automation). A question about taking another module's place now opens
in the approval dialog, and automation's replace: true no longer skips
it. A module that needs no approval still installs at once.
2026-11-11 21:56:58 -08:00
dotCooCoo c02f95aa31 Type: Convert To Point Type turns Dynamic Text off, keeping the sizes Block set
Convert To Point Type left Dynamic Text on when it turned Block area
type into point type. Point type has no Dynamic Text, but the flag was
saved, and converting the type back to area type turned Block on again
and fitted the lines to the new frame. The conversion now turns it off;
the point type keeps the sizes and leading Block wrote into the
characters, and the conversion is still one undo step.
2026-11-11 21:52:24 -08:00
dotCooCoo ae587e459f Docs: the File formats row lists DXF export's image and hatch options 2026-11-11 21:52:17 -08:00
dotCooCoo 283e1267f6 Script checker: names with escaped characters are read as names
- A name may hold \u{...} escapes with any number of hexadecimal digits
  up to U+10FFFF. An empty, unclosed, out-of-range or surrogate escape is
  not part of a name. Each \u{...} escape read in a name is reported as
  syntax newer than ES3, with the escape as written.
- # followed by an escaped name start is one private name, also in the
  code of an XML literal, and its escapes are read in the report
  (this.#app is #app).
- A # and a name at the start of a line is a private name, not a
  directive, when the name starts with an escape, or when the line is
  inside braces and the name is not a directive's. A private name whose
  decoded name would make the line a directive is reported as written.
- The identifier test against vectorcraft-js also compares braced
  escapes.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 21:50:55 -08:00
BFlat 485d4e3fff Merge pull request #6747 from dotCooCoo/fix/plugin-grant-sealed-api
Plug-ins: only an approval records a grant, and installs need one
2026-11-12 12:41:15 +07:00
BFlat a8ac772c53 Merge pull request #6753 from dotCooCoo/feat/pixel-align-new-objects
Transform: Align New Objects to Pixel Grid makes new paths pixel-aligned
2026-11-12 12:41:07 +07:00
BFlat 7e27e6e4c9 Merge pull request #6761 from dotCooCoo/feat/dynamic-text-path-presets
Type: Dynamic Text Presets put type on a circle, arch or bow
2026-11-12 12:40:55 +07:00
BFlat 4eb0915795 Merge pull request #6781 from dotCooCoo/feat/diamond-gradient
Gradients: diamond gradients run the stops from the center out to a square
2026-11-12 12:40:46 +07:00
BFlat 247f9e1569 Merge pull request #6763 from dotCooCoo/feat/styles-textures-library
Graphic Styles: built-in Textures library with grain, canvas, craquelure and tile styles
2026-11-12 12:40:38 +07:00
BFlat 105536fff4 Merge pull request #6765 from dotCooCoo/fix/js-finally-sites-gc-test
Scripts: a finally block left early drops its saved throw site
2026-11-12 12:40:29 +07:00
BFlat df41593465 Merge pull request #6772 from dotCooCoo/fix/e4x-xml-declaration-check
Scripts: E4X checks the XML declaration and takes fuel for every run the parser scans
2026-11-12 12:40:21 +07:00
BFlat 63bdfc1655 Merge pull request #6758 from dotCooCoo/test/select-skips-raster-effects
Selection: a click on a drop shadow or glow selects the object under it
2026-11-12 12:40:12 +07:00
BFlat fee2b1340a Merge pull request #6773 from dotCooCoo/perf/flatten-opaque-chain
Flatten Transparency: opaque art that touches only opaque art stays vector
2026-11-12 12:39:46 +07:00
BFlat 72adc36f55 Merge pull request #6767 from dotCooCoo/feat/document-setup-color
Document Setup: a Color tab sets the color mode and the assigned profiles
2026-11-12 12:39:38 +07:00