Commit Graph
737 Commits
Author SHA1 Message Date
BFlat f244101b53 Merge pull request #1940 from storytold/fix/sec-effect-key-probe-bound
fix(engine): bound the keys an effect object is probed for
2026-11-07 11:23:06 +08:00
bflatastic af0c1b2ba7 Merge main into #2050 2026-11-07 10:01:19 +07:00
bflatastic 18d0853d9e Merge main into #2050 2026-11-07 09:49:37 +07:00
bflatastic 05530b794e Merge main into #2049 2026-11-07 09:42:38 +07:00
BFlat 4ad444ff19 Merge pull request #1907 from TrevorBrown-dev/fix/baseline-non-text
Auto layout: baseline alignment puts a layer without text with its bottom on the baseline (#1825)
2026-11-07 10:40:21 +08:00
bflatastic 905144708b Merge main into #2050 2026-11-07 09:35:50 +07:00
BFlat 2e7cafe662 Merge pull request #1876 from TrevorBrown-dev/feat/text-style-paragraph
M3: text styles carry paragraph spacing and indent, the list style and the OpenType features (#1829)
2026-11-07 10:29:27 +08:00
BFlat e9fc975aa6 Merge pull request #1756 from dotCooCoo/feat/vector-network-corner-smoothing
M4: closed vectors take corner smoothing
2026-11-07 10:27:00 +08:00
bflatastic 748a75cdd3 Merge main into #2050 2026-11-07 09:20:52 +07:00
bflatastic 3ebd14ad2d Merge main into #1876 2026-11-07 09:10:47 +07:00
bflatastic a632d63602 Merge main into #2049 2026-11-07 09:10:44 +07:00
bflatastic cd3c3a2fd4 Merge main into #2050 2026-11-07 09:10:30 +07:00
bflatastic 5aaec67e20 Merge main into #1869 2026-11-07 09:07:56 +07:00
BFlat 11b2ddfaf4 Merge pull request #1958 from MortenHusted/fix/import-variable-id-collisions
M3: importing a file keeps its own variables and styles when their ids are already taken
2026-11-07 10:03:52 +08:00
bflatastic c7570645e8 Merge main into #2050 2026-11-07 08:59:37 +07:00
BFlat 47b5979ef0 Merge pull request #2012 from TrevorBrown-dev/feat/text-direction-1830
M4: a paragraph's base direction can be forced: Text ▸ Text direction ▸ Left to right / Right to left (#1830)
2026-11-07 09:58:59 +08:00
bflatastic 88f6986bda Merge main into #2049 2026-11-07 08:58:17 +07:00
bflatastic 32f2f119f9 Merge main into #2050 2026-11-07 08:57:25 +07:00
BFlat 3a1b698ed4 Merge pull request #2055 from aleksei-suholita/fix/effect-binding-checks
M3: a layer binds an effect's field only when its effect has it, and a bound glass light angle turns round
2026-11-07 09:53:26 +08:00
BFlat 5762212ced Merge pull request #2006 from JonRC/fix/jpeg-quality-srgb-icc
M6: JPG exports take a quality and embed the sRGB profile (#2004)
2026-11-07 09:47:15 +08:00
Trevor Brown 67d5706d3a Merge the maintainer's merge of main (origin/feat/text-style-paragraph) into the local branch 2026-11-06 20:42:55 -05:00
BFlat 6bbaa27f97 Merge pull request #2007 from JonRC/fix/stroke-cap-error-values
fix(engine): an unknown stroke cap lists the caps node.set takes (#2005)
2026-11-07 09:42:05 +08:00
bflatastic 8523dd43b4 Merge main into #2050 2026-11-07 08:41:04 +07:00
Trevor BrownandClaude Fable 5.1 c838f2f587 Merge upstream/main into fix/place-crosshair
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:45 -05:00
Trevor BrownandClaude Fable 5.1 1ba0e1d62a Merge upstream/main into feat/text-style-paragraph
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:40 -05:00
bflatastic 468cab6b2b Merge main into #2055 2026-11-07 08:40:31 +07:00
Trevor BrownandClaude Fable 5.1 5a63c08a78 Merge upstream/main into feat/text-direction-1830
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:21 -05:00
bflatastic 593a689280 Merge main into #2049 2026-11-07 08:39:43 +07:00
BFlat a3460e4711 Merge pull request #1777 from Silvertree2010/fix/h4857-node-reorder-silently-turns-a-ne
Reject negative and fractional indexes in node.reorder
2026-11-07 09:34:48 +08:00
BFlat 97b16702d5 Merge pull request #1900 from Hamza0101/fix/text-layer-name-follows-characters
M4, #1747: a text layer's name follows the characters typed into it
2026-11-07 09:34:20 +08:00
bflatastic 704720d0e1 Merge main into #2050 2026-11-07 08:29:20 +07:00
bflatastic 75847329df Merge main into #2049 2026-11-07 08:29:16 +07:00
bflatastic 642d847329 Merge main into #2055 2026-11-07 08:28:47 +07:00
BFlat 6864ffff4f Merge pull request #1778 from Silvertree2010/fix/h4878-node-create-vector-create-silent
Reject invalid entries in vector.create points instead of dropping them
2026-11-07 09:27:01 +08:00
bflatastic 4d315206bb Merge main into #1876 2026-11-07 08:26:51 +07:00
BFlat 57496ae937 Merge pull request #1783 from Silvertree2010/fix/h5009-page-move-silently-turns-a-negat
Reject negative or fractional index in page.move
2026-11-07 09:21:59 +08:00
bflatastic 4e5f0f8c04 Merge main into #1900 2026-11-07 08:18:31 +07:00
bflatastic fb33f78269 Text styles: a style with no paragraph values keeps a bulleted text linked 2026-11-07 08:17:37 +07:00
BFlat 8f2f194cf4 Merge pull request #1787 from Silvertree2010/fix/h5159-variable-movemode-silently-turns
Reject negative and fractional index in variable.moveMode
2026-11-07 09:15:57 +08:00
bflatastic 30f149b939 Merge main into #2049 2026-11-07 08:11:36 +07:00
bflatastic 7c3a3b2703 Merge main into #2055 2026-11-07 08:07:48 +07:00
Oleksii Sukholita d23cebb12f M3: an effects key naming no effect's field binds nothing (#2055)
Review follow-up: `effects/x/radius`, `effects/0` and `effects` name no
effect's field, but `list_binding` doesn't parse them, so the layer's
check took them for some other field and kept an inert binding. A key
under `effects` that names no effect's field is now refused as well.
2026-11-06 20:18:10 +01:00
Oleksii Sukholita 5bdedc3930 M3: a layer binds an effect's field only when its effect has it
`variable.bind` on a layer checked only the variable's type against the
field's scope, so `effects/0/refraction` on a drop shadow, or a binding on
an effect the layer doesn't have (`effects/9/radius`), was kept and did
nothing. An effect style already refuses both. The layer now uses the same
check: effect `i` must exist and have the field, and the field's type
comes from that effect. A binding an older file has on such a field still
does nothing, and still unbinds.
2026-11-06 19:38:52 +01:00
Filip StrajnarandClaude Opus 5.5 20f1219fbc M1: Set default properties gives new shapes and text the layer's properties (#2028)
Edit ▸ Set default properties put the selected layer's properties into the Paste properties
clipboard and did nothing else: a rectangle drawn afterwards was still the default grey, and what
Copy properties had copied was replaced.

The defaults are now kept apart (`Session::default_props`: one set for shapes, set from any layer
but text, and one for text). Rectangles, ellipses, polygons and stars drawn or clicked with their
tools take the shape defaults: fills, strokes and their settings, effects, opacity, blend and
corners (only where the shape has corners), through `apply_copied_props`, the rules Paste
properties already used (now shared). New text from the Text tool takes a text layer's fills and
font and is laid out at that size. Frames, sections, slices, lines, arrows, vectors and layers made
by commands keep their own look; the help center is silent on those. `edit.setDefaultProperties`
answers `{for: shapes|text, properties}`.

Tests: `default_props_tests::new_shapes_drawn_with_the_tools_take_the_default_properties`,
`setting_defaults_leaves_the_copied_properties_alone`,
`new_text_takes_a_text_layers_defaults_and_shapes_keep_theirs`. Docs: ui-parity.md, ROADMAP.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvG6E2LxvJ6MuFmiLA6Zqm
2026-11-06 12:55:21 +01:00
Filip StrajnarandClaude Opus 5.5 7f62fc1416 M5: proto.settings refuses an unknown device and answers the settings (#2027)
`proto.settings` took any string as the device ("Pixel Nonexistent", "iphone 16") and saved it in
the file: the presenter then drew no device frame while its picker showed the name as if it were
one. An unknown colour was already refused with the device's colours, but a typo in the device
went unnoticed, and an agent couldn't read the settings back (`proto.settings {}` answered
`{ok: true}`, and neither `inspect_document` nor `get_node` shows a page's prototype settings).

An unknown name, or a value that isn't a string, is now refused with every name the picker offers
("None", "Custom size" and the devices), and nothing changes. A known name is taken in any case and
with spaces around it, and stored as the picker spells it (`known_device`). Every call answers the
page's settings as they are after it (`settings_json`): device, background, rotation, the colour
shown, the screen as presented (null without a device), the custom size and responsive, beside the
`ok: true` it answered before; `proto.settings {}` reads them.

Test: `proto_present_tests::unknown_devices_are_refused_and_settings_read_back`. Docs: mcp.md,
prototyping-parity.md, ROADMAP.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvG6E2LxvJ6MuFmiLA6Zqm
2026-11-06 12:44:01 +01:00
Denis GomesandClaude Opus 5.5 6a31ea7360 M3: Go to main component names a library copy with no link
A file imported from another app can hold library copies in its library
store with no record of the library they came from. On an instance of
one, the command took the local path and failed in selecting it with
"isn't on a page (it is a library component)", which says nothing about
what to do. It now says the copy has no link to its library and that
enabling the library reaches it.

Found on a real imported file, where copies of the same library set were
cached more than once and only one of them could be linked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 02:53:58 -05:00
Denis GomesandClaude Opus 5.5 76af4e3f43 M3: Go to main component opens the library file of a library component
On an instance of a library component the command refused with "open
that file to edit it". The help center describes it opening the file that
holds the main ("Edit main components"), so it now does: the linked
library file opens in a tab, or its open tab comes to the front, on the
main's page with the main selected and zoomed to.

The library keeps the file's layer ids, so the copy's id map
(ImportedComponent::ids) leads from the local copy back to the exact
layer: a nested instance reaches its own main and a variant that variant.

The new tab takes the canvas size of the tab it came from. A tab still at
the default 1200x800 is refitted to the whole page on its first frame,
which would replace the zoom to the main.

A main deleted from the library file since it was published leaves the
file open with a note. A moved library file, a team library on a server
and a path off this computer are refused before anything opens; the last
uses the same check that guards library reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 02:21:20 -05:00
Trevor BrownandClaude Fable 5.1 25cc0eb643 Merge upstream/main into fix/place-crosshair
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:45:02 -05:00
Trevor BrownandClaude Fable 5.1 2e331ecd70 Merge upstream/main into feat/text-style-paragraph
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:45:00 -05:00
Trevor BrownandClaude Fable 5.1 7c6bc49e9f Merge upstream/main into feat/text-direction-1830
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:41:34 -05:00