Commit Graph
3381 Commits
Author SHA1 Message Date
BFlat bf9c8b4e59 Merge pull request #6806 from dotCooCoo/fix/recovery-missing-folder
Data Recovery: a folder error names the folder that is missing or is not a folder
2026-11-12 15:13:59 +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 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
BFlat ccfe14f671 Merge pull request #6799 from Hassan1305/docs-6340-followup
Commands: draw_shape and object.reflect say which way they turn (#6340 follow-up)
2026-11-12 14:15:37 +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 78e8957f71 Data Recovery: a removal that Windows reports as missing names a file in the way
On Windows, removing a copy whose path runs through a file reports the copy as missing, so the removal counted as done and the file in the way went unreported, while a listing names it. The removal now names that file, and a copy that is just not there still counts as removed.
2026-11-11 22:47:44 -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
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 e65da617cc Merge pull request #6787 from dotCooCoo/fix/convert-artboards-ids
Artboards: Convert to Artboards gives each new artboard its id without reading every artboard
2026-11-12 13:18:19 +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 41e4126089 Merge pull request #6679 from dotCooCoo/fix/plugin-grants-delete-test-portable
Plug-ins: the failed delete of grants.json is tested on every platform
2026-11-12 13:18:04 +07:00
BFlat c7f3c87c5c Merge pull request #6766 from dotCooCoo/fix/recovery-retake-lock
Data Recovery: a running app locks its area again when the lock file is removed
2026-11-12 13:17:40 +07:00
BFlat fb3f051922 Merge pull request #6792 from dotCooCoo/perf/remove-background-distance
Remove Background: distance mode finds the nearest color before converting
2026-11-12 13:17:28 +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 ca90946d8d Data Recovery: a folder error names the folder that is missing or is not a folder
When a folder on the way to the Data Recovery folder was missing and
couldn't be made, or was a file, the error named the area folder or the
copy inside it, for example `<recovery>/1794385145-1: Not a directory
(os error 20)`. Errors on the store's folders and files now name the
first folder on the way, from the top, that is not a folder ("<path> is
not a folder: <OS error>") or is missing ("couldn't make <path>: <OS
error>" while the store makes it, "<path> is missing" otherwise). When
every folder on the way is there, the error names the folder or file it
happened on. When reading a folder reports it missing, listing checks
the folders on the way, so a file there is an error and not an empty
list.
2026-11-11 22:10:09 -08:00
dotCooCoo c6ea02c114 Merge main into feat/styles-painted-sketched-library 2026-11-11 22:03:33 -08:00
dotCooCoo 1eb02f2f7a Merge main into fix/plugin-ignored-grants-shared 2026-11-11 22:03:31 -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 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
HassanKhan 386e405800 Commands: draw_shape and object.reflect say which way they turn; test the notes the key walk misses (#6340)
draw_shape's rotation also turns rectangles and ellipses; object.reflect's numeric axis is counter-clockwise from horizontal. A test covers that axis and the Scatter brush's rotation range, which every_turn_param_says_which_way_it_turns can't reach.
2026-11-12 10:47:06 +05: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 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 1f1e7354ea Merge pull request #6780 from dotCooCoo/fix/action-batch-param-types
Actions: Batch refuses options of the wrong type before it writes
2026-11-12 12:39:54 +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
dotCooCoo 9fc4e3c5cf Swatch libraries: Patterns › Grit Textures adds seamless grain, speckle and stipple patterns
Window › Swatch Libraries › Patterns and the Swatches panel's library
menu gain a second built-in pattern library, Grit Textures, with eight
black textures on square grid tiles of 18 to 36 pt: Fine Grain, Coarse
Grit, Sand, Speckle, Stipple, Scratches, Sparse Flecks and Dense Flecks.
Each is drawn in code from a fixed seed, so it is the same every time.
Marks that reach past a tile edge are drawn on the next tile by the
tiling, so the tiles join without a seam.

Docs: docs/mcp.md, docs/target-app-parity.md, ROADMAP.
2026-11-11 21:30:00 -08:00
dotCooCoo 1e70274189 Swatch libraries: Gradients › Organic Fades adds soft multi-stop fades that thin out to transparent
Window › Swatch Libraries › Gradients gains Organic Fades, a gradient
library of fifteen fades (ten linear, five radial). Each runs through
three to five unevenly spaced stops with off-center midpoints, mixes
with the Perceptual method, and thins out to transparent at the end of
a linear fade or at the edge of a radial one. The colors are computed
from VectorCraft's own OKLCH anchors.

The library also lists in the Swatches panel's library menu, in
swatch.library.list (category "gradients") and in the Gradient panel's
Presets. swatch.library.add keeps each fade's stops, opacities,
midpoints and method in RGB and CMYK documents.

The other built-in libraries are unchanged: their gradients still mix
with Classic and keep centered midpoints, and a test checks it.

- Gradient previews in the Swatch Libraries panel, the Gradient
  panel's Presets menu, swatch tiles and the toolbar drew every stop
  opaque. Each chip vertex now takes the sampled opacity as its alpha
  (freeform points too), and a chip with any translucent vertex draws
  a white and gray checkerboard under the gradient. Opaque gradients
  draw as before.
- When the preferences are applied, a saved gradient preset whose name
  matches a built-in preset, or an earlier saved preset, in any case,
  is renamed to the first free "<name> N" (N from 2), so a saved
  preset named like a new built-in fade stays listed and can be
  applied and deleted.
2026-11-11 21:26:11 -08:00
dotCooCoo 0ef33f6e41 Remove Background: distance mode finds the nearest color before converting
In distance mode, each pixel took a square root for every background color.
The nearest color is now found by squared distance, and only that distance is
converted to a percentage. The levels do not change.
2026-11-11 21:24:45 -08:00
dotCooCoo f82a31045c Blend: the Blend panel's Create Spine menu sets whether new blends get a spine
The Blend panel gets a Create Spine menu (Auto, Always, Never) under Make,
and object.blend.createSpine {mode?} sets or reads it. It is kept with the
preferences, is not an undo step and leaves blends already made as they are.
object.blend.make takes createSpine to choose for one new blend.

Auto and Always give every new blend a straight spine, as before. Never
makes a blend without one: its steps sit where a straight spine puts them,
object.blend.info reports hasSpine: false, easing is refused and dimmed,
Reverse Spine and the spine point commands refuse it, Release gives back
no spine path, and Replace Spine gives it a spine. A blend taking more keys
keeps whether it has a spine. Native files save noSpine; older files open
with their spines.

Builds on #5177 by adambelis.
2026-11-11 21:11:12 -08:00
dotCooCoo c4ace05dbf Graphic Styles: a built-in Painted and Sketched library adds watercolor, charcoal and ink styles
The Graphic Styles library menu lists nine libraries. Painted and
Sketched follows Hand-Drawn and holds Washed Blue, Bristle Ochre,
Pastel Heather, Charcoal Shade, Ink Contour, Wet Ink and Fine Pen. Each
style is a solid fill, two with a 1 pt stroke, under one watercolor,
dry brush, rough pastels, charcoal, ink outlines, sumi-e or graphic pen
effect with every setting given. The library and style names have rows
in all 27 catalogs, and docs/mcp.md describes the library.
2026-11-11 21:11:09 -08:00
dotCooCoo f1251af6e4 DXF: export options leave placed images and fill hatches out, and CNC / CAM turns both off
DXF Options gets Include Placed Images and Include Fill Hatches, and
document.exportDxf and document.export {format: dxf} take
includeImages and includeHatches. Both are VectorCraft's own options
and default to true, so Custom exports write what they wrote before.

- includeImages: false writes no IMAGE entity, IMAGEDEF, reactor or
  linked file for a placed image, and does not decode its pixels.
- includeHatches: false writes each filled area's outlines without the
  solid HATCH after them.
- Each adds one note to warnings when it left something out. R12,
  which has neither, keeps its own notes.
- The CNC / CAM preset sets both to false, so its drawing holds the
  cutting paths alone; the options given still override it, and
  changing either checkbox shows Custom.

Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 21:10:30 -08:00
dotCooCoo cdeb7946e0 Data Recovery: a left copy that can't be removed yet stays the session's own
drop_left forgot a copy in an area the session left before removing it, so a copy whose removal failed (the area read-only for a moment) could later be offered back to the same session as a crash's copy. The entry now stays until both files are removed, and the next heartbeat tries again.
2026-11-11 21:05:30 -08:00
dotCooCoo 2f7c3854c7 Merge main into fix/script-sleep-reads-doc-cancel
# Conflicts:
#	docs/target-app-parity.md
2026-11-11 21:01:53 -08:00