Commit Graph
5589 Commits
Author SHA1 Message Date
Dylan M. Taylor caef923806 feat: startup update prompt modal and direct self-updating (#4138)
* feat: startup update prompt modal and direct self-updating

The update flow (check at start or on request, the startup prompt, the self-update worker) is craft-update's Updater; the app only supplies the suite, its close path and its status window. The check at start is opt-in for the desktop app, and the Windows update helper runs before argument parsing.

Ref: storytold/craft-libs#319

* refactor(updates): hold the install back while documents are unsaved

* fix(updates): drop the manual window's custom id; pin craft-update to craft-libs main (db19c37)

* fix(updates): address review feedback

Wake the UI when a manual check is queued from a menu callback; the update prompt owns the keyboard while it is open (LightCraft); Download opens through the desktop URL hook (FilmCraft); the Help menu dispatches through menus::invoke (FigCraft); print jobs and comment drafts hold an install back (WordCraft); Check for Updates is a registered command (GridCraft); an install holds back while documents are unsaved.

* fix(updates): localize the update status messages

* build: resolve the craft-update pin after rebasing
2026-10-25 16:22:52 -04:00
aiongg 714434527e Docking: panels on craft-ui's shared docking, floating panels in OS windows (#4135)
* Build: craft-libs at 2869b8cc

Pin craft-pdf, craft-print, craft-docpath, craft-ui, craft-keymap,
craft-window and the patched hayro/krilla backends to craft-libs
2869b8cc1077530bd07a7e192fb2b0e1304a1354, with the pdf-deps gate,
NOTICE, ASSETS.md and docs/pdf-backend.md at the same revision.

PDF: no modification date beyond the creation date, DeviceN images
are not JPEG-encoded, and clipping text draws nothing (its outlines
arrive as a clip path).

* Docking: compile against craft-ui at 2869b8cc

Floating windows are trees of groups: window_panels and window_active
read one as a flat group, and windows rebuilt from the legacy groups
keep their ids. Unknown dock actions are rejected, the new ones are
checked like the old, and every panel a close action removes keeps its
return location.

* Docking: panels and canvas on craft-ui's docking area

* Docking: tests for the dock area, flyouts, floating panels and the Tools panel

* Docking: catalogs without the old dock's strings

* Build: craft-libs at 8a503cfe

* Docking: floating panels in OS windows of their own on the desktop

* Docking: modal dialogs block panel windows; their keys and dropped files reach the main window

* Docking: art dragged onto a panel in its own window drops there

* Docking: module doc names the OS windows

* Build: craft-libs at a042cf26

* Docking: onto, above, below, collapsed, icon and column places on Float and Dock Panel; ui.docking

* Docking: command descriptions of Float, Dock, Move and Collapse Panel for the craft-ui layout

* Docking: control protocol describes the craft-ui layout, its commands and ui.docking

* Docking: rustfmt

* Docking: layouts saved before the canvas joined convert on load

Saved ui.json files and workspaces from before the shared layout held the
canvas (a dock-only tree plus floating_panels, docking_icons,
docking_collapsed, dock_collapsed and dock_width) convert into one layout:
the dock tree's groups in the main column, the icon column with the panels
dropped on it, floating groups and sets, sets docked as columns, collapsed
groups, the dock width and the places of closed panels. The legacy fields
are read, never written. A ui.json read only in part is copied to
ui.unreadable.json before anything saves over it.

* Docking: catalogs without the old collapse message

* Docking: converted floating sets start at most 720 points tall

* Docking: closed icon panels convert into the icon column; old floating rects, set heights and a copy of the file before conversion

* Build: craft-libs at 27e60765

* Docking: dock column places and icon count from the icon column; a docked column moves to a later place

* Build: craft-libs at d24e4bcc

* Build: craft-libs at 5bbe9f62

* Docs: floating panels in OS windows of their own close the other-monitor gap

* Docking: keys forwarded from a floating panel's OS window run shortcuts while the main window is unfocused
2026-10-25 15:25:35 -04:00
Dylan M. Taylor 6e7854967d Merge pull request #4113 from storytold/codex/egui-037-vectorcraft-20261023
Migrate VectorCraft input, text and capture to egui 0.37
2026-10-25 14:09:31 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 f05c33cdfc Security: document model bounds (id hashing, page ranges, overprint migration, auto slices, nested Repeat bounds) (#3888)
* Audit: document model bounds (id hashing, ranges, overprint migration, auto slices)

* Audit: nested Repeat bounds are measured once per level

* fix(slices): bound auto_slices accumulation strictly by MAX_AUTO_SLICES

* chore(text): use is_some_and instead of unnecessary map_or (clippy)

* Refuse automatic slice layout past a cut-rectangle bound

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 12:32:45 -04:00
6b0df68cc6 Security: EPS and legacy Illustrator bounds (operator recursion, bind, copy, cvn, previews, writer output, ink name) (#3883)
* Audit: EPS interpreter and import bounds

* Audit: EPS writer stops expanding at 256 MB of body

* fix(eps): enforce MAX_BODY budget before committing node and image output

* chore(text): use is_some_and instead of unnecessary map_or (clippy)

* Fix clippy unnecessary_map_or false-default in ITXT compression flag scan

* Reject EPSI previews with an odd number of hex digits

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Dylan Taylor <dylan@craftmaker.dev>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 12:32:14 -04:00
Brandon Thomas f792c63597 Merge pull request #4090 from marcoarnulfo/feat/recolor-picker
Recolor Artwork: double-click a new color to pick it in the Color Picker, in the model it was picked in
2026-10-25 10:56:13 -04:00
Brandon Thomas e14b2b2c79 Merge pull request #4070 from marcoarnulfo/fix/direct-select-type-on-path
Direct Selection: an anchor of type on a path's path drags and the type reflows along it
2026-10-25 10:56:10 -04:00
Brandon ThomasandClaude Opus 5.5 f0a4f189f3 Docs: Direct Selection reshapes the path of type on a path outside perspective
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 10:44:35 -04:00
Brandon Thomas 378d7d4c6a Merge pull request #4125 from Silvertree2010/fix/h2473-safe-file-name-leaves-a-windows
Protect Windows device names followed by a space in safe_file_name
2026-10-25 10:42:55 -04:00
Brandon Thomas c5c44e0dfb Merge main into fix/h2473-safe-file-name-leaves-a-windows
Combines this branch's screens.rs test module with the one #4123 added.
2026-10-25 10:38:39 -04:00
Brandon Thomas 70a05ba09b Merge pull request #4068 from dotCooCoo/fix/eps-no-art-central-file-text
EPS: the help text says no central file is written when no art shows
2026-10-25 10:38:12 -04:00
Brandon Thomas a25360483f Merge pull request #4077 from dotCooCoo/fix/trace-palette-drops-unused-colors
Image Trace: a color with no traced paths is left out of the palette
2026-10-25 10:38:08 -04:00
Brandon Thomas 45afd85452 Merge pull request #4066 from dotCooCoo/fix/flat-logo-anchor-limit-counts-kept-outlines
Image Trace: Flat Logo counts only the outlines it keeps toward the anchor limit
2026-10-25 10:38:04 -04:00
Brandon Thomas f0e5b5e902 Merge pull request #4069 from dotCooCoo/fix/set-paint-object-count
MCP: set_paint reports how many objects it painted
2026-10-25 10:38:01 -04:00
Brandon Thomas 39e10c81a1 Merge pull request #4108 from dotCooCoo/fix/mcp-headless-relative-paths
MCP: headless file tools pass relative paths to the engine as given
2026-10-25 10:37:57 -04:00
Brandon Thomas dda90f0f4f Merge pull request #4060 from dotCooCoo/feat/unknown-command-suggestion
Commands: an unknown command id is answered with the nearest command id
2026-10-25 10:37:54 -04:00
Brandon Thomas ffa2ced99e Merge pull request #4063 from dotCooCoo/fix/cli-subcommand-help
CLI: --help after a subcommand prints the usage
2026-10-25 10:37:50 -04:00
Brandon Thomas 774314a351 Merge pull request #4050 from dotCooCoo/fix/screens-filename-is-file-name
Export for Screens: <filename> takes the saved document's file name
2026-10-25 10:37:45 -04:00
Brandon Thomas e8c92f6bee Merge pull request #4081 from dotCooCoo/fix/flat-logo-bar-three-pixels-long
Image Trace: Flat Logo finds a bar two pixels wide and three pixels long in its own color
2026-10-25 10:37:40 -04:00
Brandon Thomas f775a31a80 Merge pull request #4117 from zsoltmar/fix/3536-pen-cursor-axis
Pen cursors: a fountain-pen nib on the selection arrow's axis
2026-10-25 10:37:36 -04:00
Brandon Thomas d51660d46e Merge pull request #4064 from dotCooCoo/feat/pencil-continue-line-cursor
Pencil: a path-continuation cursor shows over an end a straight line continues
2026-10-25 10:37:33 -04:00
Brandon Thomas c95d1c403c Merge pull request #4053 from marcoarnulfo/fix/icc-reload-direct-cache
Color management: loading the working RGB profile again under its name takes effect at once
2026-10-25 10:37:29 -04:00
Brandon Thomas 0d50e5f6ce Merge pull request #4059 from dotCooCoo/fix/new-symbol-threaded-text-keeps-its-text
Threaded text: New Symbol on a frame no longer duplicates its text
2026-10-25 10:37:26 -04:00
Brandon Thomas a43a99f531 Merge pull request #4056 from marcoarnulfo/fix/set-bounds-compound-member
Properties and Transform: X, Y, W and H of a compound path's member set only that path
2026-10-25 10:37:22 -04:00
Brandon Thomas 1d1d0192ba Merge pull request #4072 from dotCooCoo/fix/recovery-threaded-continuation-marks
Type: a recovered document keeps continued paragraphs in threaded frames
2026-10-25 10:37:19 -04:00
Brandon Thomas d57bcc3a39 Merge pull request #4047 from dotCooCoo/fix/rasterize-threaded-text-keeps-its-text
Threaded text: Rasterize on a frame no longer duplicates its text
2026-10-25 10:37:15 -04:00
Brandon Thomas 7fc7b41e71 Merge pull request #4061 from dotCooCoo/fix/trace-abutting-seam-note
Docs: the Image Trace page describes the background line between Abutting colors
2026-10-25 10:37:12 -04:00
Brandon Thomas 9a352a285c Merge pull request #4102 from dotCooCoo/fix/mcp-docs-eps-export-files
MCP docs: export's EPS row names its one-file default and rect refuses artboards
2026-10-25 10:37:09 -04:00
Brandon Thomas 4e3c2581c4 Merge pull request #4073 from dotCooCoo/fix/command-chord-test-on-mac
Shortcuts: the Ctrl+Alt chord test presses Cmd on a Mac
2026-10-25 10:37:06 -04:00
Brandon Thomas 33f4246464 Merge pull request #4096 from dotCooCoo/fix/cmd-escape-test-on-windows
Shortcuts: the Cmd+Escape test expects no binding on Windows
2026-10-25 10:37:03 -04:00
Brandon Thomas 9bc0a545a6 Merge pull request #4131 from Silvertree2010/fix/h2469-base64-decode-accepts-misplaced
Reject misplaced or excess '=' padding in base64_decode
2026-10-25 10:36:59 -04:00
Brandon Thomas ca02626de0 Merge pull request #4123 from Silvertree2010/fix/h2465-export-for-screens-size-parser-a
Refuse signs, exponents and non-numeric text in Export for Screens sizes
2026-10-25 10:36:56 -04:00
Brandon Thomas a515e390e5 Merge pull request #4126 from Silvertree2010/fix/h2467-unit-parse-accepts-scientific-no
Reject exponent notation in the pica form of Unit::parse
2026-10-25 10:36:53 -04:00
Brandon ThomasandClaude Opus 5.5 43313f9451 Release 0.17.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.17.0
2026-10-25 09:26:31 -04:00
NetterSilverandClaude Haiku 5.5 7a9818679f Reject misplaced or excess '=' padding in base64_decode
Found while testing crates/format/src/lib.rs:690-717 (base64_decode)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 12:00:58 +00:00
NetterSilverandClaude Haiku 5.5 76f8574b4b Reject exponent notation in the pica form of Unit::parse
Found while testing crates/doc/src/lib.rs:363-373 (parse_measure pica branch)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 10:56:54 +00:00
NetterSilverandClaude Haiku 5.5 80363c7e60 Protect Windows device names followed by a space in safe_file_name
Found while testing crates/engine/src/cmd/fileio/screens.rs:168-177 (safe_file_name)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 11:52:29 +01:00
NetterSilverandClaude Haiku 5.5 50b067c089 Refuse signs, exponents and non-numeric text in Export for Screens sizes
Found while testing crates/engine/src/cmd/fileio/screens.rs:49 (ScreenSize::parse)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 11:16:58 +01:00
Zsolt van den Már de18d80399 Pen cursors: a fountain-pen nib on the selection arrow's axis
The old pen glyph was a crude pentagon with a floating dot and a stray
stem. Redraw it as the precision instrument it is: the pen-tool icon's
nib — sharp point on the hotspot, shoulders flaring to their widest
two-thirds back, a narrower flat heel, a slit widening into the round
breather hole — swung round onto the selection arrow's midline
(arrow_axis), so holding Cmd/Ctrl to swap between the Pen and the
selection tools no longer rotates the cursor under the pointer.

Badges keep their meanings (*, +, -, o, /, j, ^, ~) and multi-stroke
ones now draw all halos under all ink via strokes(), so neighbouring
strokes no longer cut each other into blobs.
2026-10-25 00:19:53 -07:00
skylartaylor 349dafc0bd M0: preserve IME typing sessions and simplify input handling 2026-10-25 08:14:45 +01:00
dotCooCoo 538c7c2d07 MCP: headless file tools pass relative paths to the engine as given
Since #3971, open_file, save_file, export and screenshot made every path
absolute against the server's working directory, headless as well as
with --connect. Headless, the engine runs in the server's process and
resolves a relative path against the same directory, so the conversion
is only needed for a connected app. It also made a relative path fail
headless when the absolute path is not UTF-8.

The server now makes these paths absolute only for a connected app, as
docs/mcp.md describes. Headless, it sends them as given.
2026-10-24 20:51:25 -07:00
skylartaylor 340e3495d8 egui037: migrate VectorCraft UI and reconcile current main 2026-10-25 03:27:29 +01:00
dotCooCoo 3c3cf90e79 MCP docs: export's EPS row names its one-file default and rect refuses artboards
Without an artboard choice an EPS export writes one file of the visible
art, not one file per artboard. options.rect is also refused with
options.artboards, as page_rect checks every artboard param.
2026-10-24 18:44:21 -07:00
dotCooCoo eec78cfdf8 Shortcuts: the Cmd+Escape test expects no binding on Windows
craft-keymap reserves Cmd+Escape (Ctrl+Esc, the Start menu) on Windows,
so since #3119 binding Show Grid to it there is refused and Cmd+Escape
goes to the tool. a_command_on_cmd_escape_runs_without_the_tools_escape
asserted the bound behavior on every platform and failed on Windows.
On Windows it now checks that Cmd+Escape stays unbound and ends the
Pen tool's path; elsewhere it checks the bound behavior as before.
2026-10-24 16:15:50 -07:00
Marco Arnulfo 932d1bc187 Recolor Artwork: the picker test checks the picker previews nothing on the art itself (part of #4028) 2026-10-25 00:15:39 +02:00
Marco Arnulfo 0ade6ce4f0 Recolor Artwork: the picker test recolors one of two rows and checks the preview; a Lab new color is kept but can't be typed yet (part of #4028) 2026-10-25 00:04:49 +02:00
dotCooCoo 179db957f7 Image Trace: a color with no traced paths is left out of the palette
A filled path that straightens to no area is left out of the trace
(#3949). When that removed every path of a color, the color stayed in
the trace's palette, so the Image Trace panel's Colors count and the
`colors` that `imageTrace.make` returns included it. The palette now
lists only the colors that have a path.
2026-10-24 14:39:58 -07:00
Marco Arnulfo c9c7eaa468 Recolor Artwork: double-click a new color to pick it in the Color Picker, in the model it was picked in (part of #4028) 2026-10-24 23:35:14 +02:00
dotCooCoo 4210c2447f EPS: the useArtboards help text separates false from absent
useArtboards: false writes one file of the visible art even when artboards are named. With useArtboards absent, naming artboards writes the same files as useArtboards: true, including the no-art exception for the central file. The option description and the document.exportEps params text now say so, and the EPS test covers both cases.
2026-10-24 14:00:32 -07:00
dotCooCoo be8c4b2010 Shortcuts: the Ctrl+Alt chord test presses Cmd on a Mac
ctrl_alt_chords_without_typed_text_still_run sent Ctrl+L and Ctrl+Alt+L
as egui reports them off the Mac (ctrl and command held). Since #3119
the keymap reads a Mac's Ctrl as a key of its own, so on macOS the test
pressed Cmd+Ctrl+L, which has no binding, and failed with
("Hi", 1) != ("Hi", 2).

The test now holds the command key egui reports on the platform the
keymap follows: Cmd on a Mac, Ctrl elsewhere. Off the Mac it sends the
same events as before.
2026-10-24 13:53:16 -07:00