Commit Graph
874 Commits
Author SHA1 Message Date
bflatastic 7d860329a2 Merge main into #2244 2026-11-12 11:30:59 +07:00
BFlat a49817259d Merge pull request #2106 from TrevorBrown-dev/fix/arrow-pan-step-measured
View: the arrow keys pan 64 px, 320 with Shift, as measured in Figma
2026-11-12 11:22:17 +07:00
bflatastic ad9933b8ed Merge main into #2244 2026-11-12 11:17:56 +07:00
bflatastic 7ecb6f1c03 Merge main into #2094 2026-11-12 11:07:19 +07:00
bflatastic ea7f7a7145 Merge main into #2106 2026-11-12 11:07:09 +07:00
BFlat 0ac9399a53 Merge pull request #2223 from TrevorBrown-dev/feat/text-style-font-weight-2174
M7: Text styles: bind a number variable to the weight (#2174)
2026-11-12 11:05:41 +07:00
BFlat 3740806656 Merge pull request #2221 from TrevorBrown-dev/fix/export-backdrop-blur-2213
M10: Export: a background blur or glass exported on its own keeps the content behind it (#2213)
2026-11-12 11:01:42 +07:00
bflatastic 42f92b727a Merge main into #2244 2026-11-12 10:55:41 +07:00
bflatastic 3c0505def6 Merge main into #2094 2026-11-12 10:50:07 +07:00
bflatastic cf28715c18 Merge main into #2221 2026-11-12 10:47:13 +07:00
bflatastic 998ed4bc78 Merge remote-tracking branch 'origin/main' into landb/2106 2026-11-12 10:46:52 +07:00
bflatastic 15d07d049d Merge remote-tracking branch 'origin/main' into landb/2143 2026-11-12 10:45:42 +07:00
bflatastic a5b98d9612 Merge main into #2223 2026-11-12 10:11:57 +07:00
bflatastic 7901713555 Merge main into #2106 2026-11-12 10:07:38 +07:00
BFlat d3f68c9f77 Merge pull request #2269 from TrevorBrown-dev/fix/instance-lists-its-variant-props-2022
M3: an instance lists the properties its variant uses; long property names stay on one line (#2022)
2026-11-12 10:07:37 +07:00
bflatastic 4565ed9686 Merge main into #2143 2026-11-12 10:06:02 +07:00
bflatastic c7db986de5 Merge main into #2244 2026-11-12 09:58:03 +07:00
BFlat 4531e99e5c Merge pull request #2070 from dotCooCoo/fix/export-color-docs
Export: color profile text states which formats are tagged and that CMYK PDF is DeviceCMYK
2026-11-12 09:56:27 +07:00
bflatastic 17104743b4 Merge main into #2143 2026-11-12 09:52:05 +07:00
BFlat ff749aa831 Merge pull request #2128 from Silvertree2010/fix/h12225-file-openrecent-silently-turns-a
Reject negative and fractional index in file.openRecent
2026-11-12 09:51:01 +07:00
bflatastic 0ff08f96a6 Merge main into #2106 2026-11-12 09:49:45 +07:00
BFlat 7006141600 Merge pull request #2105 from TrevorBrown-dev/feat/vector-edit-clipboard-1875
M8: copy, cut and paste in vector edit mode act on the selected points and segments (#1875)
2026-11-12 09:47:24 +07:00
BFlat b9c1bee665 Merge pull request #2262 from storytold/fix/sec-load-penpot-svg-fonts
load: share one layer allowance across Penpot raw SVGs, sum font-run coverage once
2026-11-12 09:41:46 +07:00
BFlat 483582c8aa Merge pull request #2078 from Silvertree2010/fix/h8510-image-savepreset-silently-turns
Reject negative and fractional index in image.savePreset
2026-11-12 09:40:22 +07:00
BFlat 73d252970f Merge pull request #2140 from ljkx/fix/pencil-stroke-spikes
M4: a Pencil stroke stays where it was drawn, without spikes off it (#1741)
2026-11-12 09:36:42 +07:00
BFlat 96430480a7 Merge pull request #2266 from storytold/fix/sec-rest-link-main-paths
components: work out each main's layer paths once while linking imported instances
2026-11-12 09:35:06 +07:00
bflatastic d1e7a299b0 Merge main into #2269 2026-11-12 09:33:25 +07:00
BFlat d0c4aca65b Merge pull request #2095 from TrevorBrown-dev/feat/create-multiple-components-dropdown-2088
Components: several layers selected, the component button offers Create multiple components (#2088)
2026-11-12 09:28:25 +07:00
bflatastic 190b8b4c80 Merge main into #2094 2026-11-12 09:27:04 +07:00
BFlat fe5e0eb35f Merge pull request #2112 from Silvertree2010/fix/h10143-file-export-exports-the-whole-pa
Reject invalid layer ids in file.export and file.exportLayers
2026-11-12 09:25:28 +07:00
bflatastic 1a4824e9e9 Merge main into #2143 2026-11-12 09:23:31 +07:00
BFlat f2c593ff6e Merge pull request #2117 from Silvertree2010/fix/h11295-node-reparent-silently-turns-a-n
Reject negative or fractional index in node.reparent
2026-11-12 09:20:42 +07:00
bflatastic 82da8f513a file.openRecent: check the index with the shared req_index 2026-11-12 09:19:05 +07:00
Trevor BrownandClaude Opus 5.5 71723cd428 Merge upstream/main into feat/text-style-font-weight-2174
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:38:54 -05:00
Trevor BrownandClaude Opus 5.5 b25858550b Merge upstream/main into feat/wrap-style-paragraph-and-style-1827
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:55:44 -05:00
Trevor BrownandClaude Opus 5.5 7d6274d6be Merge upstream/main into feat/vector-edit-clipboard-1875
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:55:32 -05:00
Trevor BrownandClaude Opus 5.5 4a9006fc29 Merge upstream/main into fix/arrow-pan-step-measured
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:55:29 -05:00
Trevor BrownandClaude Opus 5.5 d5eec3ec6e Merge upstream/main into feat/annotation-tool-1840
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:49:22 -05:00
Dylan M. Taylor cf77dfdabc load: an SVG that doesn't fit the allowance is taken out again; charge after cleanup 2026-11-11 21:31:26 +00:00
24cf70329b M5: Locked layers follow Figma's rules: no nudge, a locked parent's children stay locked (#1560) (#2219)
* M5: Locked layers follow Figma's rules: no nudge, a locked parent's children stay locked (#1560)

Pins Figma's locked-layer behaviour (measured in Figma's web app, 2026-11-10; help center "Lock and unlock layers") in a new lock_behaviour_tests suite. Fixes the divergences: transform.nudge and transform.nudgeSize skip locked layers, object.toggleLock without a value counts a child of a locked parent as locked (so it never locks the child on its own), and the Layers panel padlock on such a child is inert.

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

* Layers panel: a padlock sweep skips the children of a locked layer (#1560)

A padlock drag sweep no longer collects rows with `locked_above`, so
dragging across a locked frame's children leaves their own flags alone
and draws no swept value on them. An eye sweep 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

* M5: Lock/Unlock leaves a locked layer's child alone in a mixed selection (#1560)

With a locked frame's child and an unlocked layer selected, Lock/Unlock set both own flags, so
the child stayed locked once the frame was unlocked. With no explicit `locked` value, the command
now skips a layer whose parent is locked, as its padlock does; an explicit value (scripts) still
sets it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove and wrote

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
2026-11-11 21:06:56 +01:00
Dylan M. Taylor 6bc8bbaef1 inspect: work out a grid's cells once per inspection (#2260) 2026-11-11 14:48:38 -05:00
Trevor BrownandClaude Sonnet 5.5 14670b99d4 M3: an instance lists the properties its variant uses; long property names stay on one line (#2022)
In Figma's data a component set holds one text property per variant (plus leftovers of deleted variants), and an instance lists only the ones its current variant's layers read (measured in Figma's web app). FigCraft listed every definition on every instance, and wrapped a long property name inside an 84 x 20 box so its lines painted over the rows around it.

- components::instance_prop_list: prop_list keeping slots and the properties a layer of the component references (a nested instance counts, its layers and slot content are not entered). component.properties and the Properties panel use it for instances; sets, components and variants still list every definition.
- prop_label cuts the name to one line with an ellipsis and shows the full name on hover.
- Tests: an_instance_lists_only_the_properties_its_variant_uses, a_long_property_name_stays_on_one_line, and the pin a_set_keeps_each_named_text_definition_and_layers_read_their_own. Two tests and one setup that listed an unbound boolean on an instance now bind it to a layer.
- docs/components-parity.md: the properties row, header and revision history.

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-11 14:42:37 -05:00
Dylan M. Taylor a8e34e75a8 components: work out each main's layer paths once while linking imported instances 2026-11-11 18:38:59 +00:00
Dylan M. Taylor 2f8dd85f42 load: share one layer allowance across Penpot raw SVGs, sum font-run coverage once 2026-11-11 17:43:55 +00:00
Trevor BrownandClaude Opus 5.5 9f51517f23 M8: view.pan's parameter text and the MCP guide give the measured steps
64 screen pixels a step, five times as far with big (320), as the code
and the measurement have it; they still said ten times and 20 / 200.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 12:39:56 -05:00
Trevor BrownandClaude Opus 5.5 a1cb5309f4 Merge upstream/main into feat/vector-edit-clipboard-1875
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 11:39:44 -05:00
Trevor BrownandClaude Opus 5.5 74d7cff672 Merge upstream/main into fix/arrow-pan-step-measured
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 11:39:41 -05:00
Trevor BrownandClaude Sonnet 5.5 641cc41594 M4: Flatten bakes a vector's point corner radius into its path (#2195)
Flatten used the vector's network as stored, so a rounded point kept its radius and the box kept the cut-off sharp vertex. It now takes the network as the layer draws it (VectorNetwork::rounded_smoothed through geometry::drawn_network): each rounded point becomes the arc's end points joined by curves, every radius reads 0, and the layer's box is re-fitted to the baked geometry. Shapes' own radii were already baked; a rounded point beside a curved segment keeps today's behaviour.

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-11 04:54:20 -05:00
Trevor BrownandClaude Sonnet 5.5 ccb33e0bbc M7: Text styles: bind a number variable to the weight (#2174)
A text style takes a Number variable on `fontWeight` (`style.bind`): the style gets the face nearest the number and sets the `wght` axis, so static and variable fonts both follow. A bound weight and a bound face name replace each other, and the weight wins in a file carrying both. The style editor's weight menu offers number variables beside string ones, and a variable bound to a weight is Unitless in the CSS export. A number bound to a line height stays pixels, as the reference tool applies it; a test pins that.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Fable 5.1 designed; Sonnet 5.5 wrote at medium
2026-11-10 12:43:24 -05:00
Trevor BrownandClaude Sonnet 5.5 020388cf1f M10: Export: a background blur or glass exported on its own keeps the content behind it (#2213)
An export of a layer draws only that layer, so a background blur or glass in it read an empty
backdrop. The export now renders the page's layers below the first exported layer, with the margin
the effects reach, as the backdrop (render_area_over), clipped to the export area; only the exported
layers are drawn on top. Layers without those effects, and every other export path, are 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-10 10:31:10 -05:00