Commit Graph
1339 Commits
Author SHA1 Message Date
Trevor BrownandClaude Fable 5.1 246a89733c M12: quick-create drag: stickies and shapes in sections, parent coordinates, the handle's side, no drop off the canvas (#1919)
Review: the drop target is the topmost sticky or shape under the pointer, sections and frames
looked into (board::sticky_or_shape_at, instead of the stamp's any-layer hit test on the page's
children); the drop point is placed in the parent's coordinates; the connector leaves by the
handle's side (as the preview draws it) and arrives by the facing side; a handle let go off the
canvas makes nothing; the parity rows on quick-create handles agree.

Tests: dropping_a_handle_on_a_shape_inside_a_frame_joins_it, letting_a_handle_go_over_a_panel_makes_nothing,
the_next_one_goes_where_it_is_dropped (frame case).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 12:44:59 -05:00
Trevor BrownandClaude Fable 5.1 d48aa59ec7 M12: drag a "+" handle to drop the next shape anywhere or join another object (#1919)
The quick-create handles only took a click. As the help says ("drag the preview to any location
on your board"), a handle can now be dragged: the preview follows the pointer and, let go on empty
board, the next sticky or shape is made there, centred on the pointer, joined by a connector whose
ends take the sides facing each other (board.addConnected gains at: [x, y]); let go on another
sticky or shape, a connector joins the two instead (board.connector), that object outlined while
over it. figcraft_engine::board::object_at exposes the hit test a stamp uses. The click is as
before.

Tests: board_connect_tests (two), board_connected_tests::the_next_one_goes_where_it_is_dropped.
Docs: boards-parity row, status line and revision history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 11:52:41 -05:00
Trevor BrownandClaude Fable 5.1 4ad80fa7be M1: Layers panel width: measure every candidate as painted, cap painting, no drops past the list (#1904)
Review: the widest name is found by laying rows out in descending order of a bound on their width
until the bound falls under the widest found, with no cut at 48 rows; each name is laid out as it
is painted (one line, cut at NAME_ROOM); the painted room is capped at NAME_ROOM too; and a drag
over a wide row counts only inside the list's clip rect, so a layer released over the canvas drops
nowhere.

Tests: a_wide_name_among_many_long_narrow_ones_is_still_measured,
a_name_with_line_breaks_is_measured_as_painted, a_drag_released_over_the_canvas_drops_nowhere.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:57:59 -05:00
SHXJ 9770f1696e M10: Traditional Chinese (Taiwan) interface draft
Add a 2,647-row zh-Hant catalog (1,975 UI strings, 641 command labels, 31 menu wordings), locale mapping for zh-TW/zh-HK/zh-MO/zh-Hant, and a Noto Sans CJK TC-first fallback. The catalog is marked draft pending native review; the web picker stays hidden because craft-fonts currently ships only the Simplified CJK face.
2026-11-03 22:56:03 +08:00
Trevor BrownandClaude Fable 5.1 fe18f6d96d M6: .jam import: a connector end with an AUTO or CENTER magnet faces the other end (#1909)
An end whose magnet is AUTO has no fixed point: FigJam picks the side when it draws, and the file
keeps whatever relativePosition the end last had, so the importer sent every automatic end out of
the stale side (the left one in the reporter's file). AUTO and CENTER ends now attach to the side
facing the other end, as a board connector drawn here does, for straight, elbowed and curved
connectors alike; named magnets and ends without one are unchanged.

Test: connectors_with_an_automatic_side_leave_the_side_facing_the_target (the fixture schema gains
the ConnectorMagnet enum). Docs: file-format-parity .jam row, status line and revision history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:48:51 -05:00
Trevor BrownandClaude Fable 5.1 be04efc4fb M10: embeddable script faces as document fallbacks; the Arabic UI with Arab embedded (#1902)
Review: Noto Sans Hebrew, Devanagari and Georgian join Arabic and Thai in FALLBACK_FAMILIES, so a
web build that embeds one draws that script in an Inter document; with Arab embedded the picker
offers the Arabic UI catalog, as cjk::can_show intends (the docs said otherwise); the docs
example lists one tag per script.

Test: every_embeddable_script_face_is_a_document_fallback.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:41:15 -05:00
Trevor BrownandClaude Fable 5.1 14431850ca M1: Layers panel as wide as its widest name, scrolling sideways (#1904)
The Layers panel cut a name that didn't fit with an ellipsis and had no horizontal scrollbar, so
an imported component set's variants all read "Size=small, Type=prim..." and a deeply nested name
lost its room to the indent. The row cache now also keeps the width the widest row needs (a few
names measured per rebuild, picked by a bound on their width), the list takes that width and
scrolls both ways, revealing a layer scrolls up or down only, and a name past 1200 pt still
elides (#1650).

Tests: layers_wide_names_tests. Docs: ui-parity Layers panel row, status line and revision
history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:34:08 -05:00
Trevor BrownandClaude Fable 5.1 89d411d50f M1: Layers panel component rows in the theme's component tint, at AA contrast (#1903)
The Layers panel drew component, variant and instance names and icons in the canvas outline
purple whatever the theme (3.1:1 on the dark panel, 2.7:1 on the selected row), and the rows
inside a selected component in the plain selection's green. They take the theme's component
token (the dark theme's lilac; the light theme's a shade darker than the canvas purple, so it
reads at AA on a selected and a hovered row too), and a new component_row_child token paints the
rows inside a selected component in a tone of its row. The canvas keeps its purple.

Test: layers_component_rows_tests (both themes). Docs: ui-parity themes row, status line and
revision history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:29:49 -05:00
Trevor BrownandClaude Fable 5.1 1354c6bb6f M10: FIGCRAFT_EMBED_SCRIPTS embeds other scripts' craft-fonts faces in a web build (#1902)
The browser has no system fonts and the text crate's build script keeps the web catalog to Inter,
Noto Sans Georgian, the wordmark and (with FIGCRAFT_EMBED_CJK) Noto Sans CJK, so craft-fonts'
Noto Sans Arabic never reached a web build and Persian or Arabic text drew as missing-glyph
boxes. FIGCRAFT_EMBED_SCRIPTS names script tags as the manifest lists them (Arab, Hebr, ...);
a web build keeps the faces of those scripts as well. The default build is unchanged.

Test: web_embeds_other_scripts_faces_only_when_asked (build script). Docs: localization-parity
(web fonts paragraph, Arabic row, status line, revision history), translating.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:23:44 -05:00
Trevor BrownandClaude Fable 5.1 bb7d568d49 M2: baseline alignment puts a layer without text on the line with its bottom (#1825)
In the baseline branch of the flow layout only an item with a text baseline got one; any other
layer stayed at the top of the line. A layer without a text baseline now uses its bottom edge, as
the help center's figure shows ("the bottoms of the icon and the word home are aligned on the red
line"): an icon next to a text sits on the text's baseline, a layer reaching below it moves the
text down, and a line with no text lines the layers' bottoms up (CSS does the same).

Tests: alignment_rules (three cases), baseline_alignment_horizontal, engine
baseline_alignment_puts_an_icons_bottom_on_the_text_baseline. Docs: auto-layout-parity row,
status line and revision history.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-03 09:13:19 -05:00
Carbocode 901bc6d4fc M8: compute layer selection roots once per visible row 2026-11-03 10:39:24 +01:00
Carbocode ee6ca15ccf M8: join and round layer hierarchy highlights 2026-11-03 10:38:54 +01:00
Hamza 58af1a6237 M4, #1747: a text layer's name follows the characters typed into it 2026-11-03 12:41:29 +05:00
Trevor BrownandClaude Opus 5.5 564dbcfe52 Merge upstream/main into fix/scrub-speed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:39:16 -05:00
Trevor BrownandClaude Opus 5.5 bc140f51cd Merge upstream/main into fix/text-mixed-fill-section
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:38:49 -05:00
Trevor BrownandClaude Opus 5.5 1496b8028c Merge upstream/main into fix/place-crosshair
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:38:48 -05:00
Trevor BrownandClaude Opus 5.5 1c26c03e2f Merge upstream/main into fix/field-alt-scrub
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:38:48 -05:00
Trevor BrownandClaude Opus 5.5 a3cadb66cf Docs: one vector edit row after the merge
The merge with main kept both versions of the row; they are combined, the Bend click sentence and the region fill sentences together.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:12:47 -05:00
Trevor BrownandClaude Opus 5.5 a22d8b1f9e Merge upstream/main into feat/region-fills
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:12:17 -05:00
Trevor BrownandClaude Opus 5.5 b936b95fd9 Stack on #1857: merge fix/text-mixed-fill-section
Both redirect the Fill section's reads and writes: the selected regions of a vector come first (#1878), else a text's characters' shared fills (#1857), in the Fill section, the colour picker, the canvas handles, fill.copy, fill.set and fill.move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:12:08 -05:00
Trevor BrownandClaude Opus 5.5 4671402df5 Stack on #1854 and #1869: merge fix/control-arrows-pan
Pick select changes the same ui_key and key_event paths as the crosshair and the pan; stacked on them as the maintainers asked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:55:16 -05:00
Trevor BrownandClaude Opus 5.5 66a98b108b Merge upstream/main into fix/padding-all-sides
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:47:59 -05:00
Trevor BrownandClaude Opus 5.5 8c028c1ace Stack on #1855: merge fix/field-alt-scrub
Both change number_field_impl's click and drag handling; stacked so the combination is reviewed and tested together, as the maintainers asked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:47:39 -05:00
Trevor BrownandClaude Opus 5.5 e884e3373a Merge upstream/main into fix/control-arrows-pan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:46:51 -05:00
Trevor BrownandClaude Opus 5.5 84a0693076 Fill section: the canvas crop and gradient handles follow the characters' shared fill
The handles read the paint list the Fill section and the colour picker show (character_fills), so with the characters' image already in Crop mode the crop handles show and edit it, not the layer's own fill at that index; writes still go through fill.set, which moves the characters' list to the layer first. No undo step on entering crop mode. Test canvas::handles::character_fill_tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:45:53 -05:00
0e86f3597a M4: wrap style on a text layer: Auto, Balance and Pretty decide where its lines break (#1827) (#1871)
* M4: wrap style on a text layer: Auto, Balance and Pretty decide where its lines break (#1827)

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

* Docs: no table pipe inside the wrap-style row's code span

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

* Wrap styles: no new emergency breaks, hanging punctuation in Pretty's width, wrap style as an override

Balance and Pretty reject a re-break with more mid-word breaks than the greedy lines; Pretty narrows a line by its text less its hanging marks; wrapStyle joins the textStyle override group; docs wording. Tests.

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-03 00:13:48 -05:00
a579ba2d3c M8: a click with the Bend tool curves a sharp point, its handles along the line between its neighbours (#1875) (#1877)
* M8: a click with the Bend tool curves a sharp point, its handles along the line between its neighbours (#1875)

A release without movement on a sharp point between two segments runs ops::auto_smooth instead of cancelling; a curved point still sharpens, a drag still sets the handles by hand, an endpoint is left alone. Tests; docs.

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

* Vector edit hit test: the nearer of a handle's end and a point wins

A short path's handles end within the point's hit tolerance; a click on the point is on the point, one on the handle's end still takes the handle. Test short_handles_leave_their_point_clickable.

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

* Vector edit hit test: the nearer of a handle's end and a point is judged on the page

Candidates stay within the tolerance as before; ranking by page distance keeps a non-uniform scale from favouring the wrong one. Test a_handle_and_a_point_are_compared_on_the_page.

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

* Vector edit hit test: a handle wins a tie with a point, as before

A handle snapped onto another point stays selectable there. Test a_handle_on_another_point_is_still_the_handles (fails with the strict comparison).

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-03 00:13:38 -05:00
Trevor BrownandClaude Opus 5.5 aa2fed07e2 Region fills: fill.pattern stays on the layer; the canvas handles and the picker's image paths edit the region's paint
fill.pattern sets the layer's fill as its spec says. The gradient and crop handles read the paint from the stack fill.set writes (the selected regions' while there are any); for a region's paint, Upload from computer and image presets write the paint like any edit, and a drop on the picker goes to the canvas (image.replace and image.adjust edit layer paints). Tests in regions_tests, canvas/handles/region_tests and colorpicker image tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 09:49:10 -05:00
Trevor BrownandClaude Opus 5.5 d2e7c49e57 Region fills: each region once, no override for a no-op, Copy fill reads the region, layer-only controls off region rows
Named regions are deduplicated; an inheriting region stays inheriting when an edit leaves its stack as it was, and its own stack is only replaced once the edit succeeds; fill.copy reads the selected regions' paint; the Fill section leaves the fill style, a variable bound to the layer's fill and the image crop off region rows. Tests in regions_tests and region_fill_rows_tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 09:14:55 -05:00
Trevor BrownandClaude Fable 5.1 da4a798323 M1: pick select: Tab while the keyboard selection box shows walks the layer tree with a pink outline, Space selects (#1836)
Tab or the chord again switches the box to a pick cursor; Tab/Shift+Tab move between sibling layers, Enter/Shift+Enter into and out of a layer, Space selects, Escape or a canvas press ends it; ui.key takes the same keys. Gesture and parity rows, catalog, test, docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 08:13:54 -05:00
Trevor BrownandClaude Fable 5.1 2e392e99b1 M8: a fill per region: the Fill section and the fill commands edit the regions selected in vector edit mode (#1875)
fill.set/add/remove/move/paste on the edited layer go to the selected regions' own fill stacks (or those named by regions), the layer's fills untouched; the Fill section and the colour picker list them. Test regions_tests::the_fill_commands_edit_the_selected_regions; docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 07:55:27 -05:00
Trevor BrownandClaude Fable 5.1 90bec33322 Crosshair: the board Shapes tool places on it, and the view pans to keep it in sight
draws_shape includes BoardShape (tool.place lets the tool centre its own shape); a nudge past an edge of the view pans by the overshoot. Tests; docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 07:23:33 -05:00
Trevor BrownandClaude Fable 5.1 0a9ecbe596 Merge fix: 135 documented shortcut rows, 134 bound
Both sides of the merge added a documented row: the counts the parity test and the docs table quote move with them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 07:09:01 -05:00
Trevor BrownandClaude Fable 5.1 695ca07528 M3: text styles carry paragraph spacing and indent, the list style and the OpenType features (#1829)
ParagraphStyle beside TextStyle in StyleKind::Text: style.create takes it from the layer or a value, style.apply sets it (the list on the paragraphs touched for a range), style.update moves it, editing it unlinks, .fig files keep it with the style; tests in styles_behaviour_tests and fig_export_assets_tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:43:02 -05:00
Trevor BrownandClaude Fable 5.1 69d3012d82 Merge upstream/main into fix/field-alt-scrub
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:02:49 -05:00
Trevor BrownandClaude Fable 5.1 e04e86f38d Merge upstream/main into fix/text-mixed-fill-section
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:02:49 -05:00
Trevor BrownandClaude Fable 5.1 41ee4584cb Merge upstream/main into fix/place-crosshair
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:02:48 -05:00
Trevor BrownandClaude Fable 5.1 b846d586a8 Merge upstream/main into fix/padding-all-sides
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:02:48 -05:00
Trevor BrownandClaude Fable 5.1 e87b46b4e3 Merge upstream/main into fix/scrub-speed
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 06:02:47 -05:00
Trevor BrownandClaude Fable 5.1 3d704ce4c0 M1: scrubbing a field faster or slower by the pointer's height, with a notice of the speed (#1837)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 05:32:33 -05:00
e65ce42000 M7: Minimize collapses the navigation bar and both sidebars, the right one back while something is selected (#1835) (#1865)
* M7: Minimize collapses the navigation bar and both sidebars, the right one back while something is selected (#1835)

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

* M7: a narrow window ignores Minimize, and a rename started while minimized waits without repaints

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:31:32 -05:00
1f0acd2bbd M4: Alt+Enter while editing text opens the link at the caret (text.openLink) (#1860)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:31:21 -05:00
f9d507f7b0 M2: a child resized to the full available space of its auto layout frame becomes Fill container (#1859)
* M2: a child resized to the full available space of its auto layout frame becomes Fill container

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

* Auto layout: a child becomes Fill for the full space only across the flow or alone along it

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

* Auto layout: the full available space is what layout leaves (padding and an included inside stroke), judged after a new path's size

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

* M2: a rotated child resized to the frame's room stays Fixed (review)

CodeRabbit on #1859: a rotated layer's local size isn't the room layout
gives it, so Fill would squash its geometry.

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:31:11 -05:00
9f09b7163c M2: a double-click on an auto layout edge sets Hug contents, with Alt Fill container (#1838) (#1867)
* M2: a double-click on an auto layout edge sets Hug contents, with Alt Fill container (#1838)

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

* Auto layout edges: a text child fills with Alt too, and still enters on a plain double-click

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:31:00 -05:00
c44cfc94af M4: superscript and subscript are synthesised where the font has no glyphs for them (#1828) (#1868)
* M4: superscript and subscript are synthesised where the font has no glyphs for them (#1828)

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

* Text: a zero OS/2 script offset counts as unset, and the native-glyph check sees the case-mapped characters

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:30:50 -05:00
e9eb7ce7f4 M4: max lines on auto-width text keep it auto width, hugging that many lines (#1864)
* M4: max lines on auto-width text keep it auto width, hugging that many lines

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

* M4: an auto-width text with max lines hugs the ellipsis on its last line, and the editing test expects auto width

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:29:59 -05:00
3358961033 M4: Backspace or Delete at a list item's start keeps its indentation level (#1862)
* M4: Backspace or Delete at a list item's start keeps its indentation level

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

* Lists: the level is kept by Backspace and Delete alone, and the tests read the text's own glyph

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:29:33 -05:00
5d387bb3b4 M2: fill container children share the free space by their content area, border-box fashion (#1824) (#1861)
* M2: fill container children share the free space by their content area, border-box fashion (#1824)

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

* Layout: rustfmt's line for the frozen-share closure

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

* M2: one doc comment on distribute (review)

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

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-11-02 05:29:23 -05:00
Trevor BrownandClaude Fable 5.1 367f188b34 M6: the arrows show and move a placement crosshair with a shape or frame tool chosen, and Enter places there (#1839)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 04:39:07 -05:00
Trevor BrownandClaude Fable 5.1 50eb28e0ac M2: a Cmd/Ctrl-click on a padding field sets all four sides with the value typed
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 02:06:57 -05:00