Commit Graph
17 Commits
Author SHA1 Message Date
Trevor BrownandClaude Opus 5.5 44a761e783 Merge upstream/main into fix/snap-threshold-measured
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 04:59:25 -05:00
bflatastic 8cb527bd21 Merge main into #2200 2026-11-12 12:25:09 +07:00
Trevor BrownandClaude Opus 5.5 cc36771713 M8: absoluteRotation turns a selected parent before the layers in it (#2196)
A page angle depends on the parents', so a frame and a layer inside it set together both land on the typed page angle whatever the order of the ids (the layer went to 80 for 45 when it came first).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove and wrote (review fix, no brief)
2026-11-10 03:06:32 -05:00
Trevor BrownandClaude Sonnet 5.5 d0379dc70d M8: Rotation field shows and sets the rotation on the page (node.set absoluteRotation)
The Design panel's Rotation field now reads and writes the layer's rotation on the page (its own angle plus its parents'), as measured in Figma's web app, 2026-11-10. A new additive node.set key, absoluteRotation, does the work (one call for every selected layer, so one undo step and the moved rotation origin still apply); rotation stays the angle to the parent for scripts, inspect, codegen and the formats. Closes #2196.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Fable 5.1 briefed; Sonnet 5.5 wrote at medium
2026-11-10 03:02:09 -05:00
Trevor BrownandClaude Opus 5.5 da81d55a64 Transform: Shift-rotating inside a rotated frame lands the page rotation on multiples of 15
Measured in Figma: a layer's rotation field shows its rotation on the page, also inside a rotated frame or group, and Shift snaps that value. A test pins it; the doc comment on shared_rotation_degrees says so. Review item on #2096.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove and wrote; Sonnet 5.5 measured in Figma
2026-11-10 02:14:17 -05:00
Trevor BrownandClaude Sonnet 5.5 a1ac22f12f Transform: Shift while rotating lands on multiples of 15°, not 15° steps from the start
Measured in Figma: a layer at 7° (or -4.27°) Shift-rotated by its corner ends at 15°; FigCraft rounded the turn since the drag began, so a layer at 7° landed on 7 + k*15. The rotate gesture keeps the selection's shared rotation and Shift rounds base + turn; a selection with different rotations keeps rounding the turn. Test: a layer at 7° Shift-turned by 37° ends at 45°, by 3° at 15°, and a free turn is unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Opus 5.5 briefed; Sonnet 5.5 wrote at medium
2026-11-07 21:23:25 -05:00
Trevor BrownandClaude Sonnet 5.5 a198046384 Smart guides: objects snap within 4.5 screen pixels, as measured in Figma
Figma snaps a dragged object's edge to another's at a gap of 4.4 screen pixels and not at 4.6, at 100% and at 200% zoom, so the threshold is about 4.5 screen pixels; FigCraft used 5. The object snap (move, resize, draw, vector points) now uses 4.5, and the equal-spacing snap in a move shares that threshold so it follows. Ruler-guide and rotation-origin snapping keep 5, unmeasured.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove and briefed; Sonnet 5.5 measured and wrote at medium
2026-11-07 19:57:05 -05:00
NetterSilverandClaude Opus 5.5 39c5833818 Keep object snapping when Snap to Pixel Grid is on
Fixes #2029

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 04:10:50 +01:00
bflatastic a44bba56a0 #703: Cmd/Ctrl-resize crops a layer whose size was bound to a variable as well: the resize detaches the binding (#809), so the new size sticks 2026-10-24 10:09:28 +07:00
timrrrr 8a77ef6759 M1: preserve image fills with variable-bound resize dimensions 2026-10-17 01:18:07 +03:00
timrrrr 9397d2ca03 M1: crop image fills during Command/Ctrl resize (#702) 2026-10-16 23:16:26 +03:00
bflatastic 92d00ca04a Merge #388: Keep corner resize cursors diagonal on wide and tall layers (@Silvertree2010) 2026-10-15 15:08:52 +07:00
NetterSilverandClaude Haiku 5.5 fc6f52e852 Keep corner resize cursors diagonal on wide and tall layers
Fixes #370

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 03:50:00 +02:00
Marco Arnulfo e92792e3e8 M1: a press on a corner handle resizes instead of picking the corner-radius handle (fixes #292)
The corner-radius handle sits 10 px in from each corner and answers within 6 px, so a press on the inner half of the 8 px corner square picked it: the drag rounded the corners or, dragged outward, did nothing. Inside the drawn square the corner now resizes both sides (in ratio with Shift or the constrain-proportions link); further in the radius handle still answers.
2026-10-14 14:36:39 +02:00
fede9234 db55720c93 fix(engine): keep proportions when a linked width or height is typed (#222)
With a layer's proportions locked, setting only its width or only its height through node.set (the W and H fields) scales the other side by the layer's own ratio; setting both in one edit leaves them as typed, an unlinked layer is unchanged, and a zero side has no ratio to keep. Fixes #220.
2026-10-14 07:31:19 +07:00
bflatastic 485715f11e M1: cursors per tool and modifier, panel widths, outline options, dark pages
- Cursors: the engine names a cursor for every tool, modifier and hover
  target (rotate turned to its corner, pen states, eyedropper, comment,
  copy on Alt, not-allowed while an instance refuses the edit); the UI shows
  the system's or draws its own; guides and handles keep their cursors;
  ui.inspect reports it.
- Panels: each edge drags its panel within limits, a double-click resets,
  widths are per window and kept in the preferences (view.panelWidths); a
  small window keeps its canvas.
- Outline mode: Include hidden layers and Include object bounds
  (view.outlinesHiddenLayers, view.outlinesObjectBounds), drawn and
  clickable; light lines on a dark page; check marks in the View menu.
- A file or page made in the dark theme has a #1E1E1E page (sessions
  without an interface keep #F5F5F5); text drawn on a dark page is white.
- Tests for Enter and Escape on a selected text.
2026-10-13 00:29:41 +07:00
BFlat 894f25c4c4 M1: selection and transform behaviour suite and fixes (#133)
A selection and transform behaviour suite derived from public documentation, with fixes: Alt-resizing shrinks as well as grows; groups, Scale-constrained frames and multiple selections resize each layer along its own axes keeping rotation and flip; several layers flip together past an edge; a flipped layer reads back the typed rotation; resizes land on whole pixels with the pixel grid; presses inside tiny layers move them; locked layers get no handles; a marquee can start on a top-level frame's background; select inverse skips hidden layers. Adds equal-spacing snapping with labelled gaps and Cmd/Ctrl to ignore constraints while resizing a frame.
2026-10-11 20:30:38 +07:00