Commit Graph
3801 Commits
Author SHA1 Message Date
BFlat fdb5ef4aa0 Merge pull request #2081 from TrevorBrown-dev/fix/ellipse-four-anchors-2080
Ellipse: an unsliced ellipse edits as four anchor points, not six (#2080)
2026-11-12 09:55:56 +07:00
BFlat ed83ff3f26 Merge pull request #2161 from TrevorBrown-dev/fix/variant-connection-2158
M7: a connection dropped on a sibling variant creates Change to (#2158)
2026-11-12 09:53:51 +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
BFlat 47d44760b6 Merge pull request #2125 from Janiz-zzz/fi-update-20261108
i18n(fi): translate the 50 labels Finnish lacks; fix Past year
2026-11-12 09:49:42 +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 5975f4d4c6 Merge pull request #2126 from impulsado/fix/2124-inherited-slot-text
M3: resolve inherited slot properties by their defining component
2026-11-12 09:45:04 +07:00
BFlat b69e9ed529 Merge pull request #2251 from storytold/fix/sec-svg-import-attrs-text
svg import: cap attributes per element, map span offsets to characters once
2026-11-12 09:43:26 +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 9b7d50fff1 Merge pull request #2253 from storytold/fix/sec-grid-snap-budget
layout: bound the snap lines a frame's grids generate
2026-11-12 09:39:14 +07:00
BFlat c2d61d36bb Merge pull request #2164 from TrevorBrown-dev/fix/sticky-text-size-2157
M12: a sticky's text keeps its size and the note grows taller (#2157)
2026-11-12 09:37:23 +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
BFlat 2846ce7727 Merge pull request #2255 from storytold/fix/sec-widget-image-pixels
widgets: bound the decoded pixels of a widget's images, read from their headers
2026-11-12 09:35:03 +07:00
BFlat 0dddfe1a65 Merge pull request #2115 from GiovanniBot/fix/vector-node-corner-radius
M6: a vector point without a corner radius of its own takes the layer's on .fig import (#2114)
2026-11-12 09:33:43 +07:00
BFlat 01c25a726d Merge pull request #2256 from storytold/fix/sec-peer-roster-bytes
collab-net: cut a host's peer names and colours where the guest keeps them
2026-11-12 09:32:07 +07:00
BFlat af600507d7 Merge pull request #2101 from TrevorBrown-dev/fix/loaded-font-wins-2092
Text: a font loaded with text.loadFont wins over the built-in and installed faces of its family and style (#2092)
2026-11-12 09:32:02 +07:00
BFlat abe87363a8 Merge pull request #2108 from TrevorBrown-dev/test/paste-placement-rules
Tests: paste lands in place, at the view's centre, or in a selected frame's centre, as measured in Figma
2026-11-12 09:30:36 +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
BFlat a1c2836bdb Merge pull request #2153 from ljkx/fix/automation-network-paths-1094
M8: automation roots refuse a path on another computer before resolving it (#1094)
2026-11-12 09:28:06 +07:00
BFlat f9c8a623dd Merge pull request #2248 from TrevorBrown-dev/feat/typed-number-starts-list
M4: a typed number and full stop start a numbered list at that number, as measured in Figma
2026-11-12 09:27:46 +07:00
BFlat 37af80ed89 Merge pull request #2160 from Ragulsundaram/tamil-ui
i18n: Tamil (ta) interface catalog
2026-11-12 09:26:49 +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
BFlat 0839958f54 Merge pull request #2142 from TrevorBrown-dev/feat/al-drag-reorder-edge
Auto layout: a dragged child passes a sibling when its leading edge reaches the sibling's middle
2026-11-12 09:23:43 +07:00
bflatastic b1ee6535c9 Ellipse tests: drop an unused binding and a comment about an allowance main never had 2026-11-12 09:23:03 +07:00
BFlat 5de88b69f8 Merge pull request #2154 from ljkx/fix/crop-from-fill-strip-2150
M1: Crop chosen in the colour picker enters crop mode (#2150)
2026-11-12 09:22:07 +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 eddddb6e3c Merge main into #2105 2026-11-12 09:20:27 +07:00
bflatastic 82da8f513a file.openRecent: check the index with the shared req_index 2026-11-12 09:19:05 +07:00
BFlat 0fd45a2eb2 Merge pull request #2107 from TrevorBrown-dev/fix/escape-deselects-measured
Selection: Escape clears the selection instead of stepping out to the parent, as in Figma
2026-11-12 09:18:27 +07:00
BFlat d3138da22f Merge pull request #2120 from Silvertree2010/fix/h11642-exportsize-parse-accepts-a-sign
Reject signs and exponents in ExportSize::parse
2026-11-12 09:17:41 +07:00
BFlat 736a1efe1a Merge pull request #2148 from TrevorBrown-dev/feat/scale-tool-focus-2146
Scale tool: K focuses the Scale field, so K, 2, Enter scales by two (#2146)
2026-11-12 09:15:53 +07:00
Trevor BrownandClaude Sonnet 5.5 c47479bd7f Merge upstream/main into fix/sticky-text-size-2157
boards/board.rs: kept this branch's STICKY_TEXT_SIZE export (sticky_font_size is gone) and main's settle_mind_maps export. Docs: main's status line with ours in front, both revision rows.

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 20:40:08 -05:00
Dylan M. Taylor e2b6b4cd87 chore: bump to 0.18.1 for the Flatpak updater patch release (#2279) 2026-11-11 19:01:50 -05:00
Trevor BrownandClaude Opus 5.5 20f02bb7c1 M12: Boards: mind maps in the document and engine (#2226, step 1) (#2228)
* M9: Boards: mind maps in the document and engine (#2226)

Part of #2226, step 1 of 4. A mind map node is a board object of its own (BoardItem::MindNode: a frame hugging its text, no box) and a branch is a connector marked `branch`; the tree is read from the branches alone. `board.mindMap` places a first node with three children and `board.mindMapAdd` adds a child or a sibling, each one undo step. The normalize pass (`board::settle_mind_maps`, `figcraft_doc::mind_layout`) lays a touched map out again from its first node: 88 between columns, 48 between siblings, each stack centred on its parent; a branch that no longer joins two layers of its page is removed. Branches are curved, stroke 4, #757575, round caps. Numbers are from a FigJam map saved and decoded. No toolbar entry, shortcuts or import yet.

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

* M12: Mind maps: a map around its own container stays put; a moved branch re-flows its old map (#2226)

A map holding a layer and something inside it is skipped by the settle pass (it never settled). Every touched branch now stirs its old ends, so re-attaching a branch's start re-flows the map it left. Boards without branches return early, a map over MIND_MAX_NODES is left whole, shift skips non-finite moves, and the doc tests share one six-node helper.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Fable 5.1 reviewed; Sonnet 5.5 wrote at medium

* M12: Mind maps: FigCraft's own starter texts (#2226)

A new map's starter children read "Idea 1", "Idea 2" and "Idea 3", as the design specified,
instead of the incumbent's wording, which the first commit had copied from the measurement.

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

* M12: Docs: the mind-map revision rows go in the revision history (#2226)

The 2026-11-10 rows sat in ROADMAP.md's Headline numbers table and docs/roadmap.md's Alpha gate
table; each now opens its file's revision history.

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>
2026-11-12 00:47:05 +01: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 0da027292e Merge upstream/main into fix/escape-deselects-measured
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:55:27 -05:00
Trevor BrownandClaude Opus 5.5 3a4b6f0e1f Merge upstream/main into feat/scale-tool-focus-2146
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 17:49:15 -05:00
FredAppsandFredApps e8b53e3393 Release: FigCraft v0.18.0 on main (#2275)
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
2026-11-11 23:27:43 +01:00
FredApps 8f36c3f16b CI: nightly release dry run (#2274)
release.yml also runs nightly on main with craft-common-actions' dry-run: every release build
except macOS, with nothing signed, pushed or drafted. Breakage that only the release build hits
(riscv64, Flatpak, FreeBSD, packaging) then shows up the next morning instead of on release
day, as it did on 11 Nov 2026.
2026-11-11 23:04:08 +01: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
Trevor BrownandClaude Sonnet 5.5 7c3f9ce7e3 M4: the list start reset runs once per edit and leaves plain paragraphs' levels alone
insert_model cleared the copied start with one set_para_lists call per newline, each scanning the whole text, and set_para_lists also zeroed the level of plain paragraphs. Add TextData::clear_list_starts (one pass, touches only start_offset, no-op when no paragraph has a start) and call it once over the created paragraphs, only when the text has a newline.

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 16:03:31 -05:00
Dylan M. Taylor 3b9bf8c9a2 batch: bound how much referenced data one step's params copy (#2257)
* batch: bound how much referenced data one step's params copy

* batch: check a list's size before queuing its elements
2026-11-11 15:55:11 -05: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 898bfc2e60 Fix Flatpak updates and bump to 0.17.1 (#2267)
* fix(flatpak): allow release checks and self-update helpers

* test: keep Flatpak permission parsing within strict Clippy rules

* chore: bump version to 0.17.1 for the Flatpak update fix
2026-11-11 15:01:36 -05:00
Dylan M. Taylor 554ad0ea77 pathops: budget the closed faces input, share the dash allowance, index point incidence (#2249)
* pathops: check closed inputs before faces normalises, share the dash allowance across subpaths, index point incidence once

* pathops: leave out move-only subpaths when closing, budget dashes by the fitted pattern, index only join points
2026-11-11 14:49:49 -05:00
Dylan M. Taylor 81371f4a53 render: seed and mix the node-id cache hash, skip the cell allocation past the pattern limit (#2254)
* render: seed and mix the node-id cache hash, skip the cell allocation past the pattern limit

* render: use hash_one in the bucket test
2026-11-11 14:49:35 -05:00
Dylan M. Taylor 9032dc3e67 svg export: embed each image's bytes once per file (#2250) 2026-11-11 14:49:20 -05:00
Dylan M. Taylor 64e91207f1 svg import: bound the layer stack a filter chain builds (#2252) 2026-11-11 14:49:06 -05:00
Dylan M. Taylor 6e9582c0a0 codeConnect.import: index components by name and describe each once (#2265) 2026-11-11 14:48:52 -05:00