Commit Graph
6509 Commits
Author SHA1 Message Date
jmvergesandClaude Opus 5.5 bf716bfecc .ai import: envelopes of type keep their drawn art in layers used though they differ from the page
An envelope of type opens live only where the layers with it draw as
the page. Two ways of using layers that don't left it live all the
same: the editing data trusted (they come from it with a note), and
the objects that draw differently coming in as the page's art. In both
the envelope now keeps its drawn art and its type, hidden, with the
note, as where its drawn art is put back. A .ai whose layers would
open alone, without its PDF part, then opens alone again, as it did
before envelopes of type could open live, rather than compared with
the page.

The type put back no longer carries the mark of type made from the
text document in its name.

Part of #3179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 17:26:19 +00:00
jmvergesandClaude Opus 5.5 0916b40654 .ai import: the page check weighs a live envelope of type as the art it draws
The comparison with the page counts the area of each text object that
shows as type, which it holds to less (type laid out again from the
file's text can sit a little apart from the page's). It took the text
object in a live envelope's contents for such type, at its own unbent
box, so most of what an envelope of type draws went unweighed: one
opened live where the page draws other art there, with only a note
that the type differs. The envelope draws its type bent, as art, and
is now weighed as such, as the drawn art it takes the place of is.

Part of #3179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 17:26:19 +00:00
jmvergesandClaude Opus 5.5 47b20b4366 .ai import: envelopes of type open live where they draw as their drawn art
An envelope whose contents hold type kept its drawn art, with the type
hidden, because the type is laid out from the text document only after
the layers are read. It now waits for that, as warped type does: once
its text slots hold their type, the envelope is made of that type and
drawn by VectorCraft's own rule, and where it draws as the drawn art the
file saves (the same check and budget as other envelopes) it takes the
drawn art's place, with the type visible and editable in Edit Contents.
The hidden copy of the type goes.

As other live envelopes are, it is held to the page: when the layers
with it don't draw as the page, its drawn art and hidden type are put
back. A .ai whose layers would open alone, without its PDF part, now
waits on the PDF part when an envelope of type is in them; where none
opens live, the layers open alone as before. Layers built without a page
leave envelopes of type their drawn art.

Elsewhere it keeps its drawn art and hidden type, with the note: type in
a font that isn't available, a slot without made type (threaded, bound
to a text variable, a wrap object, type a look draws), an envelope that
doesn't read, no check left, or one that draws differently. Envelopes in
a symbol's or a pattern's art keep their drawn art.

Part of #3179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 17:26:19 +00:00
makesomethingshit a96f442e8c #6369: Reconcile roadmap and parity notes with main 2026-11-11 00:47:14 +09:00
BFlat e1137877ac Merge pull request #6424 from Messhias/feat/g5-style-lib-game-hud
G5: built-in Game HUD graphic style library
2026-11-10 22:19:35 +07:00
BFlat a991ec8dd6 Merge pull request #6432 from ruchirguitar/fix/3565-direct-select-type-path
Direct Selection shows and drags type on a path's direction handles (#3565)
2026-11-10 22:11:14 +07:00
makesomethingshit 0d198483f6 #6369: Merge main and preserve halftone preview notes 2026-11-11 00:00:30 +09:00
BFlat 0e63933019 Merge pull request #6431 from ruchirguitar/test/verify-stale-high-issues
Regression tests for #3566 (SVG entities in element content) and #3084 / #2096 (Export for Screens JPGs)
2026-11-10 21:52:51 +07:00
Fabio William Conceição df6065b5b4 G5: assert Mana Glow appearance after addFromLibrary 2026-11-10 14:26:37 +00:00
Fabio William Conceição 710e14a33a G5: built-in Game HUD graphic style library 2026-11-10 14:26:37 +00:00
ruchirguitarandClaude Opus 5.5 b29f02a42e Test #3084: test that Export for Screens JPGs open in every colour model
Exports RGB, CMYK and grey JPGs at qualities 100, 80 and 50, at 1x and 2x,
and decodes each one. It also checks that only the CMYK files leave out the
JFIF segment (#3140). Covers #2096 too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 19:39:18 +05:30
ruchirguitarandClaude Opus 5.5 5fe12c205c Test #3566: test entity references in element content against the expansion limit
The existing entity tests are unit tests that place the references in
attributes. This adds an import-level test with the references inside
<desc>, which the import refuses, and checks that the namespace entities
drawing apps write (&ns_svg;) still import.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 19:39:18 +05:30
ruchirguitar 74ae6fdd05 #3565: Direct Selection shows and drags type on a path's direction handles
Direct Selection showed and dragged the anchors of type on a path's path
(#3980) but not their direction handles: handle_anchors read only a
path's own data, and the canvas draws only a path's handles.

- text.setPathHandle moves a handle of type on a path's path, in
  document space, as path.setHandle moves a path's; the brackets keep
  their fractions and the text reflows. One undo step.
- Direct Selection draws the handles of selected type on a path and
  drags them with it (Alt: one side, Shift: 45 degree steps).
2026-11-10 19:35:29 +05:30
BFlat 73dc058596 Merge pull request #6352 from christianlappin/codex/fix-6318-thumbnail-test-race
Tests: synchronize the thumbnail queue priority assertion
2026-11-10 20:19:11 +07:00
BFlat 207091564e Merge pull request #6349 from juliusvaart/5421-line-arrowhead
Stroke: Line Arrow arrowhead (part of #5421)
2026-11-10 20:19:01 +07:00
BFlat d80e73b76e Merge pull request #6342 from christianlappin/codex/fix-6322-rotate-view-mcp
MCP: handle Rotate View gestures in the desktop canvas
2026-11-10 20:10:24 +07:00
BFlat 776e468e89 Merge pull request #6242 from annoybot/fix/pdf-gradient-forms-macos
M4: fix PDF gradient placement in transparency groups
2026-11-10 20:05:34 +07:00
makesomethingshit 129ef8a83b #6369: Merge main and retain halftone roadmap evidence 2026-11-10 22:05:29 +09:00
BFlat f680f8b1fd Merge pull request #6339 from christianlappin/codex/fix-6323-kashida-test-order
Tests: preserve duplicate glyph order in kashida ownership checks
2026-11-10 20:05:25 +07:00
BFlat 67190e6737 Merge pull request #6243 from z3r0pix3l/fix/6072-pdf-arabic-ligatures
PDF import: Arabic ligatures keep their letters in order (#6072)
2026-11-10 20:01:04 +07:00
BFlat 8365bba400 Merge pull request #6397 from AhmedKhan-GH/fix/virtiofs-enotty-full-flush
Fall back to a plain flush when F_FULLFSYNC fails with ENOTTY
2026-11-10 20:00:55 +07:00
ruchirguitarandFredApps 243bdb3f63 Fix #5713: resizable icon flyouts and bottom-aligned panel footers (#5973)
* Fix #5713: resize icon flyouts and anchor panel footers

* Fix #5713: reconcile parity evidence with upstream docs

* Fix #5713: keep Actions rows above the pinned footer

* Fix #5713: align documentation dates and regression claims

* Fix #5713: keep short Glyphs grids above the footer

* Fix #5713: pin craft-ui host minimum-size correction

---------

Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
2026-11-10 13:40:55 +01:00
makesomethingshit 3eea6f1475 #6369: Clarify halftone preview documentation 2026-11-10 20:54:35 +09:00
jmverges 636c7951f9 Merge main into fix/3179-envelope-type-note
# Conflicts:
#	docs/file-format-parity.md
2026-11-10 11:00:42 +00:00
Julius van der Vaart c65613aaf0 Merge branch 'main' of github.com:storytold/vectorcraft into 5421-line-arrowhead
# Conflicts:
#	docs/target-app-parity.md
2026-11-10 11:56:48 +01:00
Fabio William Conceição e3a17716ed G5: built-in Map Markers symbol library 2026-11-10 10:09:21 +00:00
Julius van der Vaart 2f662ca509 Merge branch 'main' of github.com:storytold/vectorcraft into 5421-line-arrowhead 2026-11-10 10:06:42 +01:00
BFlat 3290350b90 Merge pull request #6413 from jmverges/fix/envelope-check-white-art
.ai import: the live envelope and warped type check sees white art (#6412)
2026-11-10 15:50:33 +07:00
Julius van der Vaart 5b7325483a Merge branch 'main' of github.com:storytold/vectorcraft into 5421-line-arrowhead
# Conflicts:
#	docs/target-app-parity.md
2026-11-10 09:50:32 +01:00
BFlat 1341833542 Merge pull request #6407 from Hassan1305/feat-4936-context-menu-auto-spell
#4936: Spelling › Auto Spell Check in the context menu of type
2026-11-10 15:48:01 +07:00
BFlat d7ebc2f5ba Merge pull request #6411 from dotCooCoo/feat/script-run
Scripts: File › Scripts › Other Script… runs JavaScript files
2026-11-10 15:47:19 +07:00
BFlat a76d3b9dbb Merge pull request #6409 from dotCooCoo/fix/dimension-anchor-clicks
Dimension tool: a click on an anchor of any path takes that anchor
2026-11-10 15:31:18 +07:00
BFlat cd9dc52c79 Merge pull request #6408 from dotCooCoo/fix/outline-mode-canvas
View: Outline draws on a white canvas, with artboards as their edges
2026-11-10 15:18:48 +07:00
Julius van der Vaart 8508c9c620 Merge branch 'main' of github.com:storytold/vectorcraft into 5421-line-arrowhead 2026-11-10 09:13:56 +01:00
jmvergesandClaude Opus 5.5 3b1b5c7d47 .ai import: the live envelope and warped type check sees white art (#6412)
The check that keeps a live envelope or warped type only where it draws
as the art saved with it renders each on its own, over nothing, and
compared the pixels as seen on white. White art over nothing looks like
nothing on white, so white contents that drew somewhere else passed and
opened live in the wrong place.

Pixels now also differ when they look different seen on black, so such
art keeps its saved art, as colored art does. Opaque colored art is
compared as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 07:59:02 +00:00
BFlat 8400af1065 Merge pull request #6405 from dotCooCoo/fix/escape-resets-rotation-once
View: one Escape resets a rotated view when it has nothing else to end
2026-11-10 14:47:22 +07:00
dotCooCoo 7b44ef5737 Merge main into feat/script-run 2026-11-09 23:43:37 -08:00
dotCooCoo 59791c8c0f Dimension tool: a click on an anchor of any path takes that anchor
With the Linear mode, two problems kept a click on an anchor from
taking it:

- A press on an anchor that moved more than 3 pixels before the release
  dragged out the dimension of the segment under the pointer and
  committed it almost on top of the art. A press on an anchor now picks
  it unless the pointer moves past the anchor's 8-pixel reach; a longer
  drag still dimensions the segment.
- A pick linked only an anchor of the segment nearest the pointer. An
  anchor of another path near that segment, for example one inside a
  group lying just inside another object's edge, was taken at most as a
  Smart Guides point with no link, so the dimension did not follow it
  when the art changed. A pick now links the nearest anchor of any
  visible, unlocked path within reach, in groups and compound paths too.
2026-11-09 23:38:23 -08:00
dotCooCoo a0c2dbb6da View: Outline draws on a white canvas, with artboards as their edges
In Outline the canvas kept the Preview pasteboard color and filled each
artboard with white paper. Paths and type draw as black hairlines, so
art on the pasteboard was close to invisible in the dark interface
brightnesses.

In Outline the whole canvas is now white in every interface brightness
and Canvas Color, pasteboard included. The artboards draw no paper and
show as their edges, so Simulate Colored Paper, an artboard's background
color and the paper of View > Hide Artboards no longer show in Outline.
The artboard names and the ruler origin's crosshair draw in dark gray
there. In split views and floating windows the artboard names follow
that window's own Outline setting, as the canvas already did.
2026-11-09 23:34:14 -08:00
BFlat dc456e18c7 Merge pull request #6401 from dotCooCoo/fix/svg-export-mask-regions
SVG export: mask and filter regions cover the art they apply to
2026-11-10 14:31:02 +07:00
dotCooCoo 19ce2b2547 Scripts: a command's savepoint copies no undo steps but the newest
Each command a script runs keeps a savepoint of the state it may need
to put back if it fails. The savepoint cloned every open document's
whole undo history, so a script that made N edits did O(N^2) work.

- The savepoint now clones each document's state without its history
  and keeps a mark: the newest undo and redo steps and the serials of
  the steps under them. Until the command ends, the history trims no
  step, and a new step sets the redo steps aside instead of dropping
  them. A failed command truncates both stacks back to the mark.
- file.close, file.closeAll, document.close and file.revert still keep
  a whole copy, since they remove the history or the document.
- When a failed command removed or changed a step under the newest
  one, the history cannot be put back exactly, and the run stops with
  an error; its rollback restores the documents as they were before
  the run.
- run_guarded no longer copies the histories during a script's run,
  and a committed run moves the histories from before it back instead
  of copying them.
- Symbol editing mode shares its saved redo steps between copies of a
  document's state.
- A script cannot run edit.clearHistory. A run keeps each document's
  undo steps from before it, so the command reported a clear that the
  commit then undid.
2026-11-09 23:23:27 -08:00
BFlat c86c535389 Merge pull request #6402 from dotCooCoo/feat/text-glyph-bounds
Type: an optional setting measures point type by its glyph outlines
2026-11-10 14:14:00 +07:00
HassanKhan 27616b1d7b #4936: Spelling › Auto Spell Check in the context menu of type
A right-click on type has a Spelling submenu with Auto Spell Check, as the
public Check and correct spelling page describes. A submenu that holds only
toggles shows their check marks, even in the context menu.
2026-11-10 12:09:02 +05:00
dotCooCoo 858e4235db View: one Escape resets a rotated view when it has nothing else to end
Escape reset a rotated view only as the second of two presses less than
a second apart, and a click or another key between them started the
count again. With the Rotate View tool one press reset it.

Now an Escape that has nothing else to end resets the rotation. An
Escape that ends something else (isolation mode, a path being drawn, a
full screen mode, a dialog and the others listed in
docs/target-app-parity.md) ends only that, and the next Escape resets
the view, however long after it comes. Tools report a path or pick that
Escape ends with `Tool::ends_on_escape`.

The rotate view tests that needed two presses now check one press, and
the screen mode test that named the old pair is renamed.

Docs: docs/target-app-parity.md.
2026-11-09 22:56:53 -08:00
makesomethingshit db419f1aad Hide selection marks during Vector Halftone preview 2026-11-10 15:41:18 +09:00
BFlat f23624aeba Merge pull request #6398 from Hassan1305/feat-4936-context-menu-followups
Part of #4936: follow-ups to #6385 (only the topmost type's word; dictionary tests one at a time)
2026-11-10 13:37:41 +07:00
dotCooCoo 8ae9ca2012 SVG export: masks over type keep the full region; live art measured expanded
A mask, inverted mask or knockout group over type now keeps the region
that covers any artwork. Type is measured by its layout or, on a path,
by the path, and a reader that sets live type in its own font can draw
it wider, so a region sized from that box could cut glyphs off.

A live object (blend, envelope, repeat, mesh, placed document,
intertwine) under a mask is measured as the art the writer writes for
it, expanded on its own with the same limits.

The writer keeps its symbol boxes and symbols' art reach in plain
fields instead of cells.
2026-11-09 22:37:17 -08:00
BFlat 9761a5a514 Merge pull request #6400 from dotCooCoo/fix/revolve-clear-face-opacity
Revolve: a member whose fill or stroke is at 0% opacity stays invisible in a revolved group
2026-11-10 13:33:21 +07:00
BFlat d576dd0d39 Merge pull request #6399 from dotCooCoo/feat/api-reference
Commands: engine.apiReference returns the command API reference in Markdown
2026-11-10 13:28:44 +07:00
dotCooCoo bd0515ccc8 SVG export: mask and filter regions cover the art they apply to
Opacity masks, inverted and unclipped masks, and knockout groups were
written with mask and filter regions of 200,000 x 200,000 units around
the origin. CairoSVG draws each mask into an image of its region's size
and stops with "out of memory", so a file with any of them did not
open; Firefox drew inverted masks wrong and WebKit drew knockout groups
and inverted masks wrong.

Each region now covers what the masked or knocked-out art paints: its
visual box grown by its raster effects, brush art and members' reach,
the mask art's box, and in a scaled symbol instance its strokes and
effects at their own size. A mask whose art reaches past its object
still comes back whole on import.
2026-11-09 22:16:58 -08:00