Commit Graph
1903 Commits
Author SHA1 Message Date
dotCooCoo 13bee0d6ef MCP: a readable library id keeps its text when a space follows the hidden part
A hidden id or path stays only where it begins another loaded library's whole id with no `.` or `..` part, also when that id has a space after the hidden part.
2026-11-12 07:17:46 -08:00
dotCooCoo 00f5a16494 MCP: replies hide library paths outside the read roots in more forms
- Every request under a read root records the hidden libraries before it
  runs, and the reply hides those and the ones hidden after it. A panic
  is answered inside the request, so its error is hidden too.
- A hidden path followed by more path text stays only when the longer
  text is another loaded library's id with no `.` or `..` part.
- Encoded file data is skipped only for a base64 string under
  `dataBase64`, `pngBase64` or `thumbnailBase64`; objects and lists under
  those keys, and other keys ending in `Base64`, are searched.
- The error of a failed request hides a path outside the read roots that
  the request sent by its file name, so it reads the same whether or not
  a library was loaded from that path.
- Paths written with `%XX` escapes are hidden, and on Windows paths in
  another letter case.
- Recorded steps in `ui.inspect` leave out `~`, paths under `~` and paths
  starting with `./` or `../` outside the read roots under any param.
- Hidden libraries are numbered in load order and keep their id from one
  request to the next.
2026-11-12 07:17:46 -08:00
dotCooCoo a2c08dec27 MCP: replies hide a library path outside the read roots wherever it appears
Under the read roots, every control reply now shows a hidden library's
id as loaded/<file name> and its path as the file name in every string
and key: status text, dialogs, the command palette query, a script's
report, recorded steps and errors. The id and path are replaced at any
boundary, so a path between spaces, brackets or quotes, followed by a
period or by more path text (<path>.bak), or quoted with escaped
backslashes is hidden too. An occurrence that continues into a longer
path stays only when the request may read that longer path, so a
readable library's id that begins with a hidden one keeps its text.
The libraries hidden after the request ran are hidden, and for a
request that names one, those hidden before it too. A reply with no
path separator in it is not searched. Encoded file data (dataBase64,
pngBase64) is sent unchanged.

Recorded steps in ui.inspect leave out a path outside the read roots
under path, paths, file, files, folder and any param whose name ends in
Path, Paths, File, Files or Folder (diffPath, fontFiles,
destinationFolder), and an absolute path or file: URL outside the roots
under any other param or in any list. The file: scheme is matched in
any case, a URL's %XX escapes are decoded before the check, a file: URL
inside the roots stays, and a file: URL that
names another host is always left out. file_access::is_path_key holds the list of
path params, and testkit's is_path_key uses it.
2026-11-12 07:17:45 -08:00
dotCooCoo a1ece0052b MCP: hidden library ids name their library in requests and are rewritten only as whole ids
Follows #6608. ui.inspect shows a library loaded from outside the read
roots as loaded/<file name>. A request may now name the library or its
panel by that id in a panel, library or panels param, in a docking
destination (anchor, before, onto, above, below) and in
window.panel.layout's action: ui.set {panel} reopens the closed panel
instead of floating a new one. The reply to such a request, an error
included, shows the shown id.

ui.inspect rewrites only whole ids, and only in the fields that hold
library and panel ids, so a readable library's id that begins with a
hidden one keeps its path, and status text, the command palette query
and a script's report keep their text. A hidden library does not take
the id of a library loaded without a path.

ui.inspect also leaves out of recorded action steps the path and folder
params, params named like destinationFolder and the entries of a paths
list that lie outside the read roots, also inside a batch step's
commands. It hides a library id holding a path written with either
separator, and checks a folder preference against the roots as written,
without trimming spaces.
2026-11-12 07:17:44 -08:00
BFlat f5c5d9a702 Merge pull request #6829 from dotCooCoo/feat/dynamic-text-point-type
Type: Dynamic Text turns point type into area type with Block on
2026-11-12 22:02:05 +07:00
BFlat ddafb28aeb Merge pull request #6888 from dotCooCoo/fix/read-roots-scripts-recovery
MCP: plug-in, recovery and script report replies leave out paths outside the read roots
2026-11-12 22:01:56 +07:00
BFlat a1abf13a8a Merge pull request #6852 from dotCooCoo/feat/objects-on-path-select-move-detach
Objects on Path: the Select/Move widget chooses an object and drags it to another place along the path
2026-11-12 22:01:35 +07:00
BFlat c607814697 Merge pull request #6798 from dotCooCoo/feat/brushes-dry-media-library
Brushes: a built-in Dry Media library of grainy chalk, pencil, crayon and charcoal art brushes
2026-11-12 22:01:26 +07:00
BFlat 8b6ed41ef0 Merge pull request #6846 from dotCooCoo/test/not-aligned-pixel-grid-kinds
Select: test Not Aligned to Pixel Grid with images, symbols, type and live objects
2026-11-12 22:01:15 +07:00
BFlat c44103f8c3 Merge pull request #6853 from dotCooCoo/feat/patterns-optical-effects
Swatch libraries: Patterns › Optical Effects adds wave, moiré and op-art patterns
2026-11-12 22:00:23 +07:00
BFlat 5c5bb69c37 Merge pull request #6671 from thisisgomaa/file/save-read-only-offers-save-as
Save on a read-only location offers Save As
2026-11-12 22:00:00 +07:00
BFlat 71b889605d Merge pull request #6717 from dotCooCoo/feat/type-path-center-on-top
Type: Center on Top and Center on Bottom for type on a closed path
2026-11-12 21:04:31 +07:00
BFlat 9fcddf68d1 Merge pull request #6849 from dotCooCoo/feat/warp-images
Warp: the Warp effects bend an image's pixels with its frame
2026-11-12 21:04:22 +07:00
BFlat 16bb8c37dc Merge pull request #6843 from dotCooCoo/fix/read-roots-findfiles
Read roots: links.findFiles and image.info follow the configured read roots
2026-11-12 21:04:04 +07:00
dotCooCoo 2212739c54 MCP: plug-in, recovery and script report replies leave out paths outside the read roots
A client confined by --automation-read-root saw paths outside its read
roots that the person or an earlier request had put in the session:

- plugin.list: the plug-in folder last loaded and its failed files;
  plugin.list and plugin.info: a plug-in's source file; plugin.list,
  plugin.safeMode and plugin.setEnabled: the file of a plug-in turned
  off for the next launch.
- file.recovery.list and file.recovery.restore: a document's original
  file; file.recovery.list and file.recovery.save: the recovery folder.
- ui.inspect's scriptReport: the files a run wrote and the included
  file a failed run stopped in.

A folder outside the read roots is now null, and a file outside them is
named by its file name. plugin.setEnabled {file} takes that name. The
restored documents keep their files, and unconfined clients and the
app's own UI see the same replies as before.
2026-11-12 06:03:01 -08:00
dotCooCoo 0576806e1a Merge main into feat/patterns-optical-effects 2026-11-12 05:55:42 -08:00
dotCooCoo 0b22997201 Docs: the Dynamic Text entries in docs/mcp.md name point type
The Dynamic Text: Block entry says the Contextual Task Bar offers the
item for point type too, and that turning it on makes point type area
type with Block on. The Dynamic Text entry no longer says point type in
the selection is left as it is.
2026-11-12 05:33:38 -08:00
dotCooCoo 6e9ffa92cc Merge main into feat/brushes-dry-media-library 2026-11-12 05:31:21 -08:00
Ahmed Gomaa 421fead32b Merge upstream main into file/save-read-only-offers-save-as 2026-11-12 15:24:23 +02:00
BFlat 89fba4ebfd Merge pull request #5446 from Taha-Mahmoodi/fix/import-document-title
Fix #3626: an imported document takes the title the file carries
2026-11-12 20:09:15 +07:00
dotCooCoo 1996a6df52 Merge main into feat/objects-on-path-select-move-detach 2026-11-12 05:07:11 -08:00
dotCooCoo 480cd96035 Merge main into feat/dynamic-text-point-type 2026-11-12 05:00:38 -08:00
dotCooCoo 61c37f0b2e Merge main into feat/type-path-center-on-top 2026-11-12 04:59:45 -08:00
dotCooCoo 67ebbf0b53 Merge main into feat/warp-images 2026-11-12 04:59:37 -08:00
BFlat 81247fdae9 Merge pull request #6666 from dotCooCoo/fix/malformed-id-not-missing
MCP: a malformed object id is refused as such, not reported as missing
2026-11-12 19:14:06 +07:00
BFlat 7f9866f42a Merge pull request #6818 from dotCooCoo/feat/korean-line-break-anywhere
Type: Korean words break at spaces unless Korean Line Break Anywhere is on
2026-11-12 19:13:57 +07:00
BFlat 36e51c2be5 Merge pull request #6812 from dotCooCoo/feat/cut-order
HP-GL export: insideFirst cuts the paths inside a shape before the shape
2026-11-12 19:13:37 +07:00
Ahmed Gomaa c66335eaa7 Merge upstream main into file/save-read-only-offers-save-as 2026-11-12 13:40:13 +02:00
Taha-Mahmoodi 93e40537bc Merge remote-tracking branch 'origin/main' into fix/import-document-title 2026-11-12 15:54:47 +04:30
Taha-Mahmoodi ae2800f159 Merge remote-tracking branch 'origin/main' into fix/import-document-title
# Conflicts:
#	docs/target-app-parity.md
2026-11-12 15:52:02 +04:30
BFlat 4306a1d1fb Merge pull request #6808 from dotCooCoo/feat/stencil-bridges
Cutting Tools: Stencil Bridges keeps the islands of a stencil attached
2026-11-12 18:19:57 +07:00
BFlat a8879b9fb8 Merge pull request #6760 from dotCooCoo/feat/brushes-bristle-library
Brushes: built-in Bristle Brushes library with one bristle brush for each tip shape
2026-11-12 18:19:32 +07:00
BFlat f4df78ef4a Merge pull request #6790 from dotCooCoo/feat/hpgl-export
File formats: HP-GL (.plt) plots export for pen plotters and cutters
2026-11-12 18:19:22 +07:00
BFlat 65fb71fff5 Merge pull request #6836 from dotCooCoo/fix/symbol-redefine-drops-undrawn-paints
Symbols: redefining a dynamic symbol drops paints its new objects do not draw
2026-11-12 18:19:10 +07:00
BFlat 24905d721c Merge pull request #6839 from dotCooCoo/fix/script-targetengine-error-site
Scripts: an error in a function from an earlier #targetengine run names that run's file and line
2026-11-12 18:18:31 +07:00
BFlat 14c764218f Merge pull request #6840 from dotCooCoo/fix/tab-stops-limit
Tabs: the ruler and Repeat Tab stop at 256 tab stops, and a paragraph with more can lose them
2026-11-12 18:18:21 +07:00
BFlat b6e58f728e Merge pull request #6667 from slafebre/fix/5111-kern-paragraph-start
Fix #5111: kerning at the caret before a line's first character moves it
2026-11-12 18:18:10 +07:00
Taha-Mahmoodi 3eb9e0271c Merge remote-tracking branch 'origin/main' into fix/import-document-title
# Conflicts:
#	docs/file-format-parity.md
#	docs/gaps.md
#	docs/target-app-parity.md
2026-11-12 15:18:59 +04:30
dotCooCoo 51d816e5dc Merge main into fix/read-roots-findfiles 2026-11-12 02:29:16 -08:00
dotCooCoo 50e3c0b7ca Merge main into test/not-aligned-pixel-grid-kinds 2026-11-12 02:28:25 -08:00
dotCooCoo 2ee2ac6245 Objects on Path: the Select/Move widget chooses an object and drags it to another place along the path
With one Objects on Path group selected, the Selection and Objects on Path
tools show a ring on each object's attachment point. A click chooses that
object while the group stays selected; dragging a ring along the path moves
its object to the nearest object's place, and the objects between move one
place toward where it was, in one undo step. Hidden and locked objects have
no ring and keep their places. On a closed path the drag goes on round
across the first anchor, and Escape cancels it.

- object.objectsOnPath.selectMember {member} chooses an object.
- object.objectsOnPath.moveMember {member, target, group?} moves an object
  to another object's place; only the order along the path changes.

Docs: docs/mcp.md, docs/target-app-parity.md. Not yet: Detach.
2026-11-12 01:41:55 -08:00
bflatastic 0f65f6d3f4 Revert "Merge pull request #6656 from dotCooCoo/fix/inspect-library-ids-whole"
This reverts commit 3ed0dc64a8, reversing
changes made to 70ba41bb2b.
2026-11-12 16:35:41 +07:00
dotCooCoo 4e03d655c0 Select: test Not Aligned to Pixel Grid with images, symbols, type and live objects
Adds tests for Select > Object > Not Aligned to Pixel Grid with embedded
images, symbol instances, point, area and path type, gradient meshes,
placed documents, guides and live shapes, with paths on template layers,
hidden and locked sublayers and locked artboards, and with the paths in
clip groups, blends, envelopes, repeats and Intertwine groups. A compound
path is selected by its own property, whatever the property of its paths.

The command's params text and docs/mcp.md now say that it looks into
clip groups, blends, envelopes, repeats and Intertwine groups.
2026-11-12 01:20:37 -08:00
dotCooCoo a1a23c46e4 Warp: the Warp effects bend an image's pixels with its frame
A Warp effect on an image, or on a group that holds one, bent the image's
frame but drew the pixels unbent, cut by the bent frame. The image now
bends with the frame as a raster mesh warp, as an envelope bends it: after
the last effect in the list, the image is cut into 10 x 10 cells of two
triangles, each a clipped piece of the image under its own affine map,
through every Warp it took and the Transform moves between them. Effects
after a Warp reshape only the frame, and a placed gradient on a group
that holds the image follows the group's bounds as the pieces draw them.
The image itself is unchanged, so editing or removing the warp redraws
it. The images stay unbent when their pieces would make the art pass 2
million objects, and an image stays unbent when its clipping frame keeps
its shape because the warp would pass the effects' anchor budget.

- SVG export writes the image once and draws the pieces with <use> when a
  group holds pieces of one image clipped by triangles. PDF, EPS, .ai and
  PNG exports write the bent pieces.
- Envelopes: a grayscale image's fill color now colorizes the pieces an
  envelope cuts. Before, the pieces drew the gray image.
- Geometry effects: an image under any geometry effect keeps its fill
  color and its smoothing setting. Before, it drew the gray image,
  smoothed.

Docs: Warp params text, docs/mcp.md, docs/target-app-parity.md.
2026-11-12 01:18:57 -08:00
dotCooCoo 55b1421dca Merge main into feat/dynamic-text-point-type 2026-11-12 01:13:39 -08:00
dotCooCoo c35d5f5b34 Read roots: links.findFiles and image.info follow the configured read roots
With automation read roots in force, links.findFiles and text.findFontFiles
replies, including later polls and stops of a search another client started,
leave out the files found outside the caller's read roots, a sought link's
saved path outside them and the folder searched when it is outside them. A
failed search then gives its reason without the path. The rows keep their
names, ids and status, and the counts stay.

image.info gives link: null for a linked file outside the read roots, as
links.info does. text.addFontFiles gives folder: null when the Fonts folder
is outside the read roots and names the copies there by their file names;
the fonts are still copied.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 01:03:41 -08:00
BFlat 61650e44a2 Merge pull request #6814 from dotCooCoo/feat/brush-replace-art
Brushes: Alt-drag art onto a brush to replace its art
2026-11-12 16:02:52 +07:00
BFlat 87c0d5cb5e Merge pull request #6826 from dotCooCoo/feat/3d-classic-rotate
3D (Classic): Rotate (Classic) turns flat art in 3D with the No Shading and Diffuse surfaces
2026-11-12 16:02:41 +07:00
BFlat 744c37d12f Merge pull request #6669 from dotCooCoo/feat/dynamic-text-release-path
Type: Release Type on a Path keeps the size Dynamic Text drew the type at
2026-11-12 16:02:25 +07:00
BFlat 183b2ed7e4 Merge pull request #6770 from dotCooCoo/feat/learn-panel
Learn: a Learn panel lists tutorials by skill, opened from Explore tutorials on the app bar
2026-11-12 16:02:15 +07:00