Commit Graph
160 Commits
Author SHA1 Message Date
bflatastic 45ef37fc61 Docs: one row per item after the merge 2026-11-07 11:07:35 +07:00
Trevor BrownandClaude Fable 5.1 3647d9b4c2 Merge upstream/main into fix/control-arrows-pan
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 22:39:52 -05:00
bflatastic 9488088d48 Merge main into #1857 2026-11-07 10:21:28 +07:00
bflatastic a7fc90a7aa Merge main into #1857 2026-11-07 10:08:45 +07:00
bflatastic ba695199f2 Merge main into #2050 2026-11-07 10:06:56 +07:00
bflatastic a7ba9fb460 Merge main into #1855 2026-11-07 09:51:12 +07:00
bflatastic 235a2f3a53 Merge main into #1857 2026-11-07 09:50:38 +07:00
bflatastic 18d0853d9e Merge main into #2050 2026-11-07 09:49:37 +07:00
Trevor BrownandClaude Fable 5.1 09338adbac Merge upstream/main into fix/control-arrows-pan
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 21:40:27 -05:00
bflatastic 6139a37775 Merge main into #1855 2026-11-07 09:38:46 +07:00
bflatastic e619c509a0 Merge main into #1857 2026-11-07 09:38:13 +07:00
bflatastic 905144708b Merge main into #2050 2026-11-07 09:35:50 +07:00
bflatastic 105b3c8d1b Merge main into #2010 2026-11-07 09:35:30 +07:00
bflatastic 52739e28e1 Merge main into #2010 2026-11-07 09:23:17 +07:00
bflatastic 315f7e6755 Merge main into #1855 2026-11-07 09:22:57 +07:00
bflatastic 7c457e854c Merge main into #1857 2026-11-07 09:22:00 +07:00
bflatastic e47c91e131 Merge main into #2048 2026-11-07 09:21:25 +07:00
bflatastic 748a75cdd3 Merge main into #2050 2026-11-07 09:20:52 +07:00
BFlat 72b8d2f05a Merge pull request #1869 from TrevorBrown-dev/fix/place-crosshair
M6: the arrows show and move a placement crosshair with a shape or frame tool chosen, and Enter places there (#1839)
2026-11-07 10:20:06 +08:00
BFlat 5140a59c2e Merge pull request #2009 from ashokram-si/feat/side-buttons-pan-1758
feat(ui): mouse buttons 4 and 5 pan the canvas like the middle button (#1758)
2026-11-07 10:12:52 +08:00
bflatastic d33b30cac4 Merge main into #1855 2026-11-07 09:10:15 +07:00
bflatastic 5560cbdf3b Merge main into #1857 2026-11-07 09:08:29 +07:00
bflatastic 5aaec67e20 Merge main into #1869 2026-11-07 09:07:56 +07:00
bflatastic 3a77c95db5 Merge main into #2010 2026-11-07 09:01:22 +07:00
bflatastic 562d83c161 Merge main into #2048 2026-11-07 09:00:13 +07:00
bflatastic c7570645e8 Merge main into #2050 2026-11-07 08:59:37 +07:00
bflatastic 5f417b201b Merge main into #2009 2026-11-07 08:49:46 +07:00
bflatastic aa9aee4ec5 Merge main into #2010 2026-11-07 08:41:25 +07:00
Trevor BrownandClaude Fable 5.1 08958b47ba Merge upstream/main into fix/control-arrows-pan
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:54 -05:00
Trevor BrownandClaude Fable 5.1 fccefb1f39 Merge upstream/main into fix/field-alt-scrub
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:52 -05:00
Trevor BrownandClaude Fable 5.1 8a7414e3b0 Merge upstream/main into fix/text-mixed-fill-section
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-06 20:40:49 -05: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 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 162aeb4bda Merge main into #2048 2026-11-07 08:29:53 +07:00
bflatastic 704720d0e1 Merge main into #2050 2026-11-07 08:29:20 +07: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 98710acb80 M7: closing a tab with unsaved changes asks Don't Save / Cancel / Save (#2032)
Closing a tab whose file has unsaved changes, by its X, a middle click, File ▸ Close tab or its
shortcut, only showed a toast ("save first, or close again with Alt to discard"; from the menu
"close the tab with Alt-click") and left the tab open, so closing a tab seemed not to work. A
`file.close` refused for unsaved changes asked the UI with `dialog.unsaved`, which toasted too.

Closing such a tab now asks the unsaved-changes question the window asks when it closes
(`windows::unsaved_question`, shared): Don't Save closes the tab and drops the changes, Cancel or
Escape keeps it, Save saves the file next frame and then closes the tab. A file without a path, or
saved as .fig, asks where with Save as first; the tab closes once that saved it and stays open if
it is cancelled or fails. `UiState::close_tab` (`windows::TabClose`: Ask, Save, AfterSaveAs) keeps
where it is; `ask_close_tab` starts it for the tab strip, the menu and `dialog.unsaved`. Alt+close
still drops the changes without asking. The three toasts are gone from the code and the catalogs.

Reordering tabs by dragging, the issue's other half, already works on main (landed 2026-10-19,
`dragging_a_tab_along_the_bar_reorders_it_without_detaching`).

Tests: `titlebar_tests::closing_a_tab_with_unsaved_changes_asks` (the X asks, Escape keeps the tab,
Don't Save closes it, Alt+click closes without asking, File ▸ Close tab asks),
`titlebar_tests::save_in_the_tab_question_saves_then_closes` (Enter saves then closes; no path:
the tab stays). The title bar test harness can hold modifier keys. 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:39:39 +01:00
ashokram-si 30a1db7363 Merge remote-tracking branch 'origin/main' into feat/side-buttons-pan-1758
# Conflicts:
#	contributors/people.toml
#	docs/ui-parity.md
2026-11-06 09:44:15 +05:30
Trevor BrownandClaude Fable 5.1 a3e96bbb47 docs: ui-parity status line dated 2026-11-05 with its history row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 17:06:55 -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 cd1409e089 Merge upstream/main into fix/control-arrows-pan
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:41:41 -05:00
Trevor BrownandClaude Fable 5.1 fffdf98c0f Merge upstream/main into fix/field-alt-scrub
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:41:40 -05:00
Trevor BrownandClaude Fable 5.1 1cc9fb5535 Merge upstream/main into fix/text-mixed-fill-section
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:41:39 -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
Trevor BrownandClaude Fable 5.1 2baaa452ec Merge upstream/main into feat/boolean-button-icons-2003
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 16:41:33 -05:00
64f254a823 Colour picker: dragging a gradient handle on the canvas keeps the picker and the handles up (#1852) (#1985)
* M1: dragging a gradient handle on the canvas keeps the colour picker open (#1852)

A press on one of the open gradient's handles or stops closed the picker: the canvas took the press
and began the drag, then the picker, drawn later in the same frame, saw a press outside its card and
closed, committing the drag's interaction at once. The handles vanished with the picker and the drag
went on without an undo step of its own. The handles are the picker's controls: while a gradient
handle or stop drags (`handles::gradient_dragging`, the press included) the picker doesn't close on
an outside press, as it already doesn't while the eyedropper samples. A press elsewhere on the
canvas still closes it. Docs: ui-parity.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* M1: a handle drag released off the canvas ends there (#1852)

Review: a gradient handle drag whose button went up over a panel, over the colour picker or outside
the window stayed stashed, its interaction uncommitted, until the pointer was back on the canvas,
and the next press there moved the handle to wherever it landed; with the picker now held open while
a gradient drag is stashed, it would also have stayed open meanwhile. `handles::end_released_drag`
commits and clears a stashed drag when the button is up, called from the canvas input's off-canvas
branch and when the pointer is over something drawn above the canvas. Test:
`a_gradient_drag_released_off_the_canvas_ends_there` (released over the sidebar and over the picker).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* M1: a handle drag ends on a release over a ruler, and when Escape or Undo closes its gesture (#1852)

The release check ran only where the pointer was not on the canvas, after the
comment pins and ruler guides had their turn; both return early, so a gradient
handle released over a ruler stayed dragged, uncommitted, until the next press.
It now runs first, wherever the pointer is, and the frame it ends a drag on is
the handle's, as the release on the handle itself was.

Escape (the picker closes and commits) or Undo can also close the gesture while
the button is still down. The stashed drag then kept setting the fill every
frame with no gesture open, one undo step a frame; with no gesture open the
drag is now over.

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
2026-11-05 22:07:52 +01:00
Trevor BrownandClaude Fable 5.1 877d0c61dd M1: the boolean operation buttons carry original icons (#2003)
The Design panel's Boolean groups menu listed Union, Subtract, Intersect and Exclude as text only. Each entry now leads with its operation's icon, drawn in code from polygons and rectangles: two offset squares with the result filled at reduced alpha. The commands, enabled rules and layout are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 14:44:32 -05:00
Trevor BrownandClaude Fable 5.1 c16c3676c2 M4: text direction: CSS keeps Left beside a forced rtl, paragraph arrays read to the paragraph count, the empty last paragraph keeps its direction (#1830)
From review: `text-align: left` beside `direction: rtl` (Left is absolute on the canvas); the REST import reads the four parallel paragraph arrays up to the paragraph count, not the 256-entry list limit; `rtl_para` gets an entry for the position after the last char so an empty last paragraph keeps its forced direction; the localization status line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 03:46:28 -05:00
Trevor BrownandClaude Fable 5.1 cd5c9aeb09 M4: a paragraph's base direction can be forced: Text ▸ Text direction (#1830)
Direction came from the letters only; Add right-to-left text says controls override it per paragraph (Text > Text direction, Left to right or Right to left). `TextDirection` on `ParaList`, `Bidi::of` with a base level per paragraph, `text.direction` and the three menu commands (the edited paragraphs while editing), `node.set textDirection`, the Type settings control once a right-to-left script is in the text, inspect `textDirection` / `lineDirections`, the CSS `direction`, and the `.fig` lines' `sourceDirectionality` in and out.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-05 03:23:07 -05:00
ashokram-si f35af507ec M1, #1758: mouse buttons 4 and 5 pan the canvas like the middle button 2026-11-05 13:04:17 +05:30