Commit Graph
3465 Commits
Author SHA1 Message Date
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
bflatastic 7214854ed5 Merge main into #2046 2026-11-07 08:26:08 +07:00
bflatastic 7f1c880d61 Merge main into #2025 2026-11-07 08:25:32 +07:00
BFlat 8cbac00bea Merge pull request #2024 from TrevorBrown-dev/feat/boolean-button-icons-2003
M1: the boolean operation buttons carry original icons (#2003)
2026-11-07 09:24:44 +08:00
bflatastic 7eac937acc Style-heavy files: a repeated name keeps its first place, and one more lookup uses the id set 2026-11-07 08:24:02 +07:00
bflatastic 03aa619fba Merge main into #1932 2026-11-07 08:24:02 +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 638ae9bd29 Merge main into #1895 2026-11-07 08:20:40 +07:00
bflatastic fe0ed7d7b8 Merge main into #2025 2026-11-07 08:20:30 +07:00
BFlat d6dc554f66 Merge pull request #2056 from ZIDAN44/fix/2043-variable-picker-height
Styles: the style and variable pickers grow back to their full height (#2043)
2026-11-07 09:20:26 +08:00
bflatastic 4e5f0f8c04 Merge main into #1900 2026-11-07 08:18:31 +07:00
bflatastic 252b4ce4b6 Spanish label for selection.createColorStyle 2026-11-07 08:17:40 +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 12dfb302da Merge main into #2020 2026-11-07 08:14:32 +07:00
BFlat c78f6b7080 Merge pull request #2031 from Silvertree2010/fix/2029-bug-snap-to-object-stops-working
Keep object snapping when Snap to Pixel Grid is on
2026-11-07 09:12:11 +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
BFlat 09e04e7176 Merge pull request #2037 from denisg0mes/go-to-library-main
M3: Go to main component opens the library file of a library component
2026-11-07 09:06:17 +08:00
bflatastic 69fb310f8f Merge main into #1992, keeping main's coverage numbers 2026-11-07 08:04:25 +07:00
bflatastic 1d292f8326 Merge main into #1943 2026-11-07 08:03:47 +07:00
BFlat ded38db8ef Merge pull request #2038 from denisg0mes/clipboard-png-decode
M7: #1360 follow-up: decode a clipboard PNG before pasting it
2026-11-07 09:03:29 +08:00
bflatastic 9ffe6b07e4 Merge main into #2046 2026-11-07 08:02:46 +07:00
bflatastic 7e316c2cf1 Merge main into #2047 2026-11-07 08:01:58 +07:00
bflatastic 9cbe2098c0 Merge main into #2048 2026-11-07 08:00:52 +07:00
bflatastic 3f3f42630c Merge main into #2050 2026-11-07 07:59:58 +07:00
bflatastic 06f29b08ef Pick select: say what the keys do in our own words 2026-11-07 07:59:24 +07:00
bflatastic c08eadf14a Spanish label for collab.reconnect 2026-11-07 07:59:03 +07:00
bflatastic 85a11f0409 Spanish label for tool.crosshair 2026-11-07 07:58:55 +07:00
bflatastic cf1fed3332 Spanish labels for the text direction commands 2026-11-07 07:58:49 +07:00
bflatastic b73c51c978 Merge main into #2024 2026-11-07 07:58:09 +07:00
BFlat 82dff040d4 Merge pull request #2053 from TrevorBrown-dev/fix/minimized-click-shifts-frame-2051
Minimize: a click that shows the right sidebar no longer moves the frame it selects (#2051)
2026-11-07 08:56:26 +08:00
bflatastic ae4d0c912e Merge main into #2055 2026-11-07 07:55:49 +07:00
BFlat 049772335b Merge pull request #2057 from aleksei-suholita/perf/glass-dispersion-narrow-window
M8: glass takes one sample where its colours split under 1/256 px
2026-11-07 08:53:12 +08:00
bflatastic bcc3facdce Local variables: work out a row's group list only when its menu is open 2026-11-07 07:52:58 +07:00
BFlat 43565b5bf6 Merge pull request #2052 from StrajnarFilip/claude/lan-share-read-only
M9: share a file on the local network read-only, with a view-only code
2026-11-07 08:50:25 +08:00
Filip StrajnarandClaude Opus 5.5 10df192b01 M9: a share on every interface links to an address others reach
A session hosted with `bind` 0.0.0.0 (or ::) kept listening on every
interface but put 0.0.0.0 in its edit and view links, URLs, join codes
and shown address, which nobody can connect to. They now name this
machine's local network address of the listener's family (loopback
without one), on the same port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvG6DxbDYxuPEA2pJirCLQ
2026-11-06 21:27:47 +01:00
Oleksii Sukholita 3d41394bfc M3: glass's docs say which centre splay bends away from and where a shape gets no core
Splay bends away from the centre of the layer's bounds, as the reference
tool's does: on a ring or an L that centre lies outside the shape, so an
inner edge bends towards the hole. Checked side by side on a ring and an
L at Splay 0% and 100%. The module doc still said splay 0 bends along the
edge's normal; it bends towards the core since #1889.

`MAX_SHAPE_PX` now says it is 4M px on the desktop and 1M on the web, and
that a bigger shape gets no core, so a large glass text or vector can bend
differently once zoomed into, in a 2× export, or on the web.

Docs only.
2026-11-06 20:29:14 +01: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 43403b3fed M8: glass takes one sample where its colours split under 1/256 px
The dispersion window samples the backdrop 18 times a pixel wherever the
curve bends it, even where the move is so short that the channels split
by a sliver of a pixel. Under 1/256 px every step lies within that of
the moved point, so one sample is within one level (of 255) of the window
over any backdrop, the hardest being 1 px columns of black and white or
of white and nothing. Those pixels now take one sample.

A larger split doesn't qualify: at 1/4 px one sample would move red and
blue by 1/8 px, up to 32 levels across a hard edge.
2026-11-06 19:56:36 +01:00
Trevor BrownandClaude Fable 5.1 36b728304b Minimize: a held press keeps its page point when the canvas moves, not only when it narrows (#2051)
While a press that went down on the canvas is held, the view centre now follows the canvas rect's own move as well as its size change, so a still pointer keeps its page point when the left sidebar or rail appears mid-press.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 13:43:32 -05:00
Oleksii Sukholita 104aa3deb1 M3: a glass's bound light angle turns round past ±180 instead of stopping
`Glass::set_bound` clamped a bound light angle to ±180, so a variable of
270 drew the light from 180, a quarter turn off, while a typed 270 draws
from -90. A bound angle now turns round into -180–180 (270 is -90, -0 is
0), the same direction the angle draws in.
2026-11-06 19:39:12 +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
Zinadin Zidan 8842019aa4 Styles: the style and variable pickers grow back to their full height (#2043)
egui lays an area out inside the size it had on the previous frame, and a
scroll area shrinks to fit its content, so once a search or a short list
had made the style or variable picker small, it stayed small, also on the
next open. Both now offer their content the screen's height on every
frame. Their lists still stop at their own caps, and placement keeps them
on screen.
2026-11-07 00:27:11 +06:00
Filip StrajnarandClaude Opus 5.5 b779e46d47 M9: a local view-only share's url is the view URL, not the edit URL
The previous fix made a local share's `link` follow the code shown, but its
top-level `url`, the session's WebSocket URL, still carried the edit token:
`collab.join {link: url}` from a view-only share joined with edit access and
the edit reached the host. The link layer now hands over the view way in as a
link and its URL (`SessionInfo::view`, a `WayIn`, in place of `view_link`), and
`collab.peers` gives a local share's `link` and `url` from the way in for the
code shown (`Live::invite`). Online shares are unchanged.

Regression test: `code_tests::a_local_view_share_s_link_and_url_only_let_people_look`
joins through the `link` and then the `url` over loopback; both are welcomed as
viewers whose edits never reach the host.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvG6E2VLhC9d5v8VSsf4ng
2026-11-06 19:12:40 +01:00
Trevor BrownandClaude Fable 5.1 5d21ca8791 Minimize: a click that shows the right sidebar no longer moves the frame it selects (#2051)
The view keeps its centre when the canvas is resized, so the right panel appearing (minimized UI, on the press that selects) shifted the pointer's page point by half the width over the zoom and the move handling took it as a drag. While a button that went down on the canvas is held, a resize now keeps the top-left instead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 12:51:52 -05:00
Filip StrajnarandClaude Opus 5.5 a05201e21f M9: a local view-only share's link is the view link, not the edit link
`collab.share {via: "local", access: "view"}` showed the view-only code but
gave the session's own invite link as `link`, and that link edits: whoever
joined through it could change the host's file. A local share's `link`, top
level and in `sessions`, is now the one that goes with the code shown, and it
follows `collab.share {access}`. Online shares keep the owner's own link there,
as before.

Regression test: `code_tests::a_local_view_share_s_link_only_lets_people_look`
joins through that link over loopback and is welcomed as a viewer whose edit
never reaches the host.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LvG6E2VLhC9d5v8VSsf4ng
2026-11-06 18:45:44 +01:00
Filip Strajnar a2be6632eb M9: share a file on the local network read-only, with a view-only code
The session the app hosts for a local network share now has two secrets:
the edit code and a view-only code (same address and port, a 44-bit secret
of its own). Whoever joins with the view code is welcomed as a viewer: they
see every change and presence, the app makes the file read-only for them,
and the session refuses their batches, as a server does for view links.

Share > Local network offers Can edit / Can view before sharing starts (the
edit code then never shows) and while sharing. collab.share {via: "local",
access: "view"} does the same; share in collab.peers lists both codes and
links. There is still no comment code on the local network.

Next::Stop boxes its event: SessionInfo grew past clippy's
large_enum_variant threshold, and it only ever carries a status or an end.

Tests: loopback_tests::a_view_token_lets_people_look_and_not_edit,
code_tests::a_local_view_code_lets_people_look_and_not_edit,
live_share_tests::a_local_share_can_start_for_looking_only, and the local
share tests that asserted edit-only codes. Docs: collab-protocol.md,
collaboration-parity.md.
2026-11-06 17:03:21 +01:00