Commit Graph
13024 Commits
Author SHA1 Message Date
BFlat 4b3df93745 Merge pull request #7371 from dotCooCoo/fix/batch-swatch-default-paint
Swatches: swatch steps in a batch change the paints for new art
2026-11-14 13:42:04 +07:00
BFlat 7fd4564c0c Merge pull request #7390 from dotCooCoo/fix/hyphenation-exceptions-relayout
Type: hyphenated type lays out again when the hyphenation exceptions change
2026-11-14 13:41:57 +07:00
BFlat 57933a8046 Merge pull request #7385 from dotCooCoo/fix/type-panels-story-wide
Type: Character and Paragraph panel changes apply to every frame of a selected story
2026-11-14 13:41:46 +07:00
BFlat 8cc8ab0781 Merge pull request #7352 from dotCooCoo/fix/zh-hant-message-rows
i18n: Traditional Chinese has a row for 1,813 of the messages the untranslated report lists
2026-11-14 13:41:36 +07:00
BFlat d8f180006a Merge pull request #7382 from ncic/pencil-alt-close-straight
Pencil: a closed stroke closes with a straight segment
2026-11-14 13:41:27 +07:00
BFlat 19dfce800a Merge pull request #7384 from storytold/fix/font-menu-test-settle
Tests: font menu tests draw until the menu stays put
2026-11-14 13:41:17 +07:00
BFlat ecd4b80af2 Merge pull request #7395 from storytold/fix/warichu-test-text-ops
Tests: warichu PDF check reads only text objects
2026-11-14 13:41:10 +07:00
dotCooCoo 5aeb42c6ee Merge main into fix/more-int-param-wrong-type 2026-11-13 22:39:06 -08:00
dotCooCoo c109d15896 Merge main into fix/3d-export-builds-once 2026-11-13 22:38:52 -08:00
dotCooCoo d1bd70fba9 Merge main into feat/colr-gradient-repeat 2026-11-13 22:37:59 -08:00
dotCooCoo de347b852e Merge main into fix/control-bar-narrow-fill-stroke 2026-11-13 22:37:57 -08:00
dotCooCoo fc14b8a78f EPS: a freeform gradient's image drawn more than once writes its samples once
A freeform gradient's image was sampled, encoded and written inline at
every fill, outside the reuse placed images have. Fields now go through
the same codes and placements: a fill whose encoded image (color setup,
image dictionary, filter, operator and samples) matches one already
kept draws from it, so its samples are written once in the setup as
VCim<i>. A field drawn once is still written where it is drawn.

A fill whose placement can't be drawn, or that arrives when the page is
already at the 256 MB limit, is no longer sampled first, and a field
image taken back with art that passed the limit is forgotten.
2026-11-13 22:34:26 -08:00
dotCooCoo 99501dea48 Merge main into feat/task-bar-blank-canvas 2026-11-13 22:34:04 -08:00
dotCooCoo 9685e1e312 Merge main into fix/mcp-docs-stack-file 2026-11-13 22:33:56 -08:00
dotCooCoo bb81d0d8b3 Merge main into feat/ai-art-brush-options 2026-11-13 22:33:50 -08:00
dotCooCoo be038e0a6f Merge main into fix/ko-message-rows 2026-11-13 22:29:34 -08:00
ruchirguitar d909659b45 Merge branch 'upstream/main' into feat/layers-row-context-menu 2026-11-14 11:58:46 +05:30
dotCooCoo 58bc03a3e7 Gradient tool: a vector drawn on the art snaps as other drawn points do
A gradient vector drawn on the art, a click that applies one, and the
dragged start and end handles snapped through snap_draw, which gathers
the bounds and anchors of the art only. Path segments, View › Snap to
Glyph's guides and the construction guides through the vector's start
did not pull them, and a click applied the gradient from the pointer
rather than from the snapped point. They now snap through DrawSnap, as
the Pen and Line Segment tools do:

- The press gathers the targets, for a vector drawn on the art and the
  start and end handles only, and the drag keeps them. A click applies
  the gradient from the snapped press.
- A dragged end or handle leaves its start as a Line Segment's end does:
  it lands on the construction guides through the start, and with Shift
  it keeps to 45° steps from the Constrain Angle and snaps along them.
- The pointer hovering where a press would draw a vector (anywhere with
  art selected, over art with nothing selected), and not over the
  annotator, shows the guides of the point the vector would start on.

A press that snaps onto a nearby target no longer starts the drag
early: the 3 px drag threshold counts from where the pointer was
pressed, not from the snapped start.
2026-11-13 22:25:34 -08:00
dotCooCoo 380b67f1bc Command Palette: Delete Selection asks first, as the Layers panel does
The palette listed the Layers panel's Delete Selection twice: as
Window › Layers › Delete Selection, which ran layer.delete and deleted a
layer holding art without asking, and as a bare Delete Selection, which
ran ui.layerDelete and asked first.

- The palette now lists one Window › Layers › Delete Selection result,
  which runs ui.layerDelete, so a pick asks before deleting a layer or
  sublayer that holds art. Scripts and the control channel still run
  layer.delete at once.
- New Brush…, Brush Options…, Symbol Options…, Import SVG Filter… and
  Convert to Text were also listed twice under the same name, once as
  the engine command, which the palette ran with no params. Each is now
  listed once, as the UI command that opens its dialog or file chooser
  or acts on the edited paragraphs.
- A search for a wrapped engine command's id or menu path still finds
  the one result.

Docs: docs/target-app-parity.md (Layers panel deletion).
2026-11-13 22:23:25 -08:00
dotCooCoo 70da63f5b0 Merge main into fix/polygon-sides-refused 2026-11-13 22:23:24 -08:00
dotCooCoo a008a0d68e SVG import: a nested tspan keeps its direction and unicode-bidi
A <tspan>, <textPath> or <a> inside a <text> whose unicode-bidi is embed
now gives its characters its direction as their Character Direction. An
element with normal stays in its parent's embedding, unicode-bidi is not
inherited (inherit takes the parent's value), and the <text> keeps its
own paragraph direction. A run that SVG export writes with direction and
unicode-bidi="embed" now opens with its Character Direction again.

Character Direction holds one level of embedding and no override or
isolation, so bidi-override, isolate and isolate-override are imported
as embeddings in their direction, plaintext as an embedding in the
direction of its first strong character, and an embedding inside
another as an embedding of its own, each with an import warning.
unicode-bidi: plaintext on the <text> runs and anchors each paragraph
in the direction of its first strong character.

https://www.w3.org/TR/SVG11/text.html#RelationshipWithBi-directionality
https://www.w3.org/TR/css-writing-modes-3/#unicode-bidi
2026-11-13 22:21:42 -08:00
ruchirguitar 46a4aa472b fix(xtask): disambiguate wasm packages with workspace versions 2026-11-14 11:51:06 +05:30
ruchirguitar 230c383452 #6613: match Gujarati availability to craft font installation 2026-11-14 11:48:25 +05:30
dotCooCoo 2a4185d6ca Merge main into fix/graph-series-gradient-per-mark 2026-11-13 22:15:43 -08:00
dotCooCoo bc6c48367e Merge main into fix/knockout-groups-flat-masks 2026-11-13 22:15:33 -08:00
dotCooCoo 519828ee33 Merge main into fix/fr-message-rows 2026-11-13 22:15:05 -08:00
dotCooCoo 3341061ca3 i18n: Simplified Chinese translates 114 status and error messages that no catalog had
untranslated_report lists 167 status and error messages that no
complete-message catalog translates. zh-hans.tsv gains 114 @msg rows for
the ones no open pull request covers: 3D and Revolve limits, image export
and encoding errors, color profiles, color books and swatch exchange
files, binary DXF and DWG import, path operations, swatch, graphic style
and action set libraries, and zip, script and regular expression errors.
Placeholders, backticked names, command ids and listed values stay as the
English writes them.

The other 53 (composite fonts, SVG filters, read roots and graph design)
are left to #7211, #7378 and #7405. docs/localization-parity.md and
docs/target-app-parity.md give the new counts: 3,554 @msg rows, and 55
messages the report lists for zh-hans, all of them translated by open
pull requests.
2026-11-13 22:11:05 -08:00
dotCooCoo 5d89b37040 Paste: graphs bring and follow the styles and swatches their labels keep
A graph keeps paints for its series and labels, and character and
paragraph style names for its labels, which each redraw gives the
marks and labels. Copy did not follow them, so a graph pasted into
another document left those swatches and styles behind, and a paste
that renamed them left the graph pointing at the old names.

Copy now collects them and paste relinks them, as it does for type.
Paste without Formatting drops the labels' style names, so it still
leaves text styles behind.
2026-11-13 22:10:18 -08:00
dotCooCoo 82842e4fe0 Clipboard: a Wayland read or send ends when the other app moves no data for 2 s
On the core Wayland clipboard, a read waited for the app that copied to
close its pipe, and a send wrote until the app that pastes took all of
the data. An app that left its pipe open and stopped held the one read
worker, so later pastes failed at once, or held one of the eight send
threads until it closed its end.

Reads and sends now use the pipe nonblocking and wait for it with poll.
When no byte moves for 2 s (VectorCraft's own limit, the existing text
wait) the read fails without pasting partial data and the send stops;
both close their pipe. The wait starts again after each byte that moves,
so a large transfer that keeps going is not cut short.
2026-11-13 22:09:17 -08:00
dotCooCoo af04ed26f4 Merge main into fix/ru-missing-message-rows 2026-11-13 22:01:41 -08:00
dotCooCoo d12cb2e1af Merge main into fix/pathops-turn-test-comment 2026-11-13 22:00:09 -08:00
dotCooCoo 76f07a626e Path ops: Offset Path turn test describes the cases it checks
The comment on the zigzag cases said the open zigzag grown by 1.5 leaves
stroker loops whose faces the distance test drops. With the turned branch's
distance test measuring points in the turned frame, or dropping no face at
all, the three zigzag cases still pass and only the plate case fails (201
contours instead of 101). The comment now says what the zigzag cases check:
one turn for the low path, none for the path stood on end, and the same
region from both. The plate comment says its narrow holes are dropped by
the distance test measured at points turned back into the plate's frame.
2026-11-13 21:59:20 -08:00
dotCooCoo 8c9e86af66 Document tabs: art dragged onto a document with other assigned profiles drops there
A drag of art across the document tabs ended whenever the source
document's revision changed. Since #7173, bringing a document with other
assigned color profiles to the front raises every open document's
revision so that each redraws in the new profiles, so holding art over
such a tab switched to it and then canceled the drag before the drop.

The drag now keeps the source document it left and ends only when that
document's content changes (DocState::same_content). A redraw keeps it,
and so does type measured again when the source comes back to the
front, which replaces the document without editing it.
2026-11-13 21:58:49 -08:00
dotCooCoo 960fd98d46 Merge main into fix/instance-row-raster-effects 2026-11-13 21:54:03 -08:00
dotCooCoo d3e520b14b Effects: raster effects on a symbol instance's fill or stroke are drawn
A raster effect (Drop Shadow, Outer Glow, Gaussian Blur and the other
effects that paint pixels) on a symbol instance's topmost fill now draws
on each filled shape of the symbol's art, and one on its topmost stroke
draws on each stroked shape, after any geometry effects listed before
it. The same rules as for geometry effects apply: only a visible fill or
stroke with an opacity above 0 counts, a group's own fills and strokes
in the art take the effect, and an instance inside the art passes it on.

The canvas, Use Preview Bounds and the drawn bounds, SVG and PDF export
draw it, and Object > Expand Appearance is enabled for such an instance:
a shadow or glow becomes an image under the instance, and a blur,
feather or inner glow replaces it with the image, in one undo step.

Existing documents with a raster effect on a symbol instance's fill or
stroke draw differently: before, the effect drew nothing.
2026-11-13 21:53:15 -08:00
ruchirguitar 0be4420393 Merge remote-tracking branch 'origin/main' into pr-6613 2026-11-14 11:19:16 +05:30
dotCooCoo 1d298ee0c9 Merge main into test/trace-mixed-width-scene 2026-11-13 21:48:59 -08:00
dotCooCoo b386d54264 Image Trace: centre-lines quality measures Create Strokes' split on a mixed-width body
The centre-lines class gains a mixed-width body scene: one disc of radius
24 px with arms of 2, 3 and 5 px that start inside it, Stroke 6 px, and no
other ink. A test checks that the scene is one connected shape and that
both the anti-aliased and hard input trace as one fill and three strokes
that reach all three free ends.

docs/image-trace-quality.md's centre-lines section is measured again on
current main (24 scenes, two runs identical in every column but ms). The
new scene finds 100.0% of its arms with 99.3% / 98.3% of the disc filled;
mix now traces as 6+3 paths with 99.9% / 99.8% found and 7/7 ends, where
the earlier whole-blob rows showed 3+1, 57.3% and 6/7. All other rows
are unchanged except ms.
2026-11-13 21:48:57 -08:00
dotCooCoo f56d97a21a Merge main into feat/every-line-composer-shaped-overflow 2026-11-13 21:47:35 -08:00
BFlat e56d1c7dce Merge pull request #7407 from storytold/fix/fmt-craft-libs-migration
Fix main CI after the craft-libs migration (fmt, wasm)
2026-11-14 12:46:39 +07:00
dotCooCoo 396796ff9b Type: the Every-line Composer sets the visible lines of a mixed-size paragraph that overflows a shaped frame
A paragraph whose characters differ in line metrics, in area type that is
not a rectangle or that wraps around an object, was broken line by line
with the Single-line Composer when the frame could not hold all of it.
The lines the frame holds are now composed with the whole paragraph: a
line the frame has no room for, and every line after it, is measured as
wide as the span of the last line set in the frame, less its indents.
Those lines overflow, or go on in the next threaded frame, which composes
them again at its own widths. A paragraph whose first line has no room,
and a search that passes its limits, still fall back to Single-line.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 21:46:30 -08:00
dotCooCoo ffc698d89c Merge main into fix/ru-missing-message-rows 2026-11-13 21:45:30 -08:00
dotCooCoo 9a2ce6d433 i18n: Russian translates 114 status and error messages that no catalog had
untranslated_report lists 167 messages under "messages, all 23 languages
checked". ru.tsv gains an @msg row for 114 of them, in one block at the end
of the file: image export and encoding errors, color profiles, color books
and swatch exchange files, binary DXF and DWG import, 3D and Revolve limits,
and script, zip, line and file errors. Placeholders, parameter names and
literal values stay as the English writes them.

The other 53 are left to the open pull requests that translate them
(composite fonts, SVG filters, read roots and graph design).
2026-11-13 21:44:53 -08:00
Dylan M. Taylor c11ee11c1c Merge pull request #7454 from storytold/codex/fix-ci
Fix CI formatting after craft-libs cutover
2026-11-14 00:44:10 -05:00
dotCooCoo a173ba75d2 Docs: script.run params text puts a space before $.includePath
The $.fileName clause in the script.run params text ended without a space before $.includePath.
2026-11-13 21:36:00 -08:00
Dylan M. Taylor 2ce569a6a7 Format svg adapter after craft-libs cutover 2026-11-14 05:14:16 +00:00
dotCooCoo df951caea4 Docs: $.fileName names the file being run in code eval or Function compiled
The script module docs, the script.run params text and the evidence line now
say that $.fileName in code that eval or Function compiled gives the file
being run, and the params text says that the empty name applies to code
compiled from a script given as text.
2026-11-13 21:09:02 -08:00
dotCooCoo 2d70c6b0ae Learn: the tabs, skill and tutorial rows and Back run commands
The For you and Skills tab buttons, a skill's row, a tutorial's row and
Back changed the Learn panel's view directly, so the control channel and
MCP could not choose a tab, open a skill's tutorials or go back.

- learn.tab {tab: forYou|skills} shows the panel on that tab; the Skills
  tab keeps the skill and tutorial it had open.
- learn.skill {skill} shows the panel on the Skills tab with that skill's
  tutorials and returns the skill as learn.list lists it.
- learn.back {} goes up one level, as Back does.
- A tutorial's row runs learn.show.
- The commands are listed in both UI command catalogs, and their labels
  have a row in every catalog.
- Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
2026-11-13 21:06:48 -08:00
dotCooCoo 3beda53fd0 i18n: French row counts match the branch after the merge of main
The French row of docs/localization-parity.md gave the counts on 92594378a. After main was merged in, fr.tsv holds 9,166 rows, 3,436 of them @msg and 48 @msgplural, and the untranslated report lists 178 missing French messages: 11 for French alone and 167 that main added for every language.
2026-11-13 21:03:26 -08:00
ruchirguitar 7929c95ce9 #6613: guard web Gujarati selection and address local review 2026-11-14 10:29:25 +05:30