What's Changed
- Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds by @dylanmtaylor in #1475
- M8: repair and library manifests check membership by set lookups (#1078) by @StrajnarFilip in #1480
- M8: normalising after a command runs under the panic guard (part of #1085) by @StrajnarFilip in #1481
- M1: the stroke weight keeps room for its value beside the variable button (#1452) by @StrajnarFilip in #1482
- M1: page ruler guides survive save and reopen (#1476) by @StrajnarFilip in #1485
- fix(present): prototype links open only behind the notice or a viewer's click (#1096) by @ChristopherLinnett in #1487
- i18n(sv): translate 47 new strings by @kler in #1393
- i18n(ka): Georgian for 76 strings added since the language landed by @devius in #1443
- M9: a ping every keep-alive interval, whatever else the client sends by @samhyun in #1424
- fix(ui): right-click on a frame's name label picks that frame by @watchakorn-18k in #1470
- fix(app): ask before ⌘Q quits with unsaved changes (#857) by @ChristopherLinnett in #1489
- M6: .fig embedded images are copied once per blob, not once per hash (#1059) by @StrajnarFilip in #1486
- fix(collab): image entries must match their hash and sane bounds (#1086) by @ChristopherLinnett in #1488
- M8: the browser refines a zoom only once it has paused by @samhyun in #1468
- M3: scaled instances keep their scale when their main is rebuilt (#922) by @StrajnarFilip in #1484
- M8: a progressive JPEG sampling a component finer than its first is refused, not decoded by @samhyun in #1491
- i18n(ar): add Arabic draft interface catalog by @hussain-hz in #1466
- M7: line the Home tab's divider up with the icon rail by @Skyfuller1303 in #1462
- feat: property copy/paste, blend-mode hover preview and clipboard fixes by @culiulemon in #1457
- M4: Thai lines keep marks and leading vowels with their letter (part of #1219) by @SusieeTheLinuxUser in #1400
- ui: show constraint guides for a selected layer in its frame by @yelintong in #1406
- M12: MCP comment feedback and live change events by @phonedu in #1465
- M4: draw dots for zero-length round dashes by @Guillergood in #1439
- Reject cornerRadius/padding/strokeSides arrays with non-numeric entries by @Silvertree2010 in #1405
- Cap Sketch image members by compression ratio and total size by @Silvertree2010 in #1398
- Keep the right edge of right-aligned auto-width text as it grows by @Silvertree2010 in #1479
- fix(engine): make Set as thumbnail affect saved files (#1428) by @Zaxaerith in #1432
- Reject '+' sign in NodeId::from_str by @Silvertree2010 in #1417
- M8: keep undo entries after a failed batch undoes an earlier edit (#1410) by @avhn in #1419
- Reject non-page ids in page.duplicate by @Silvertree2010 in #1469
- Reject non-numeric paddingHorizontal/paddingVertical in node.set by @Silvertree2010 in #1467
- Clamp Vector Drawable numbers to the f32 range so they stay finite by @Silvertree2010 in #1411
- Fix looks_like_svg rejecting DOCTYPE with an internal subset by @Silvertree2010 in #1404
- Keep session joins working when a document has out-of-range ids by @Silvertree2010 in #1444
- Reject colour arrays containing non-numeric entries in color_of by @Silvertree2010 in #1426
- Treat a % suffix on node.set opacity as a percentage by @Silvertree2010 in #1425
- M8: bound attached MCP replies to 512 MiB (#1113) by @avhn in #1407
- ui: rebuild the toolbar pill on a 32 pt grid, without the Resources button by @yelintong in #1210
- M4: preserve vector region fills across .fig import and native rendering by @Skyfuller1303 in #634
- M2: auto layout settings in one call don't depend on how their keys are spelled by @MortenHusted in #1458
- M7: Flutter code generation by @yelintong in #669
- M4: a generic popover — a 40-high header, dragged by its header by @yelintong in #789
- M0.9: commands, MCP tools and batch steps refuse names they don't take (#1413) by @MortenHusted in #1460
- M1: opening a file that is already open says when it changed on disk, and can read it again (#997) by @MortenHusted in #1461
- M0.9: find layer ids without changing the selection (#996) by @avhn in #1408
- M7: CSS system font names draw in macOS's System Font by @MortenHusted in #1459
- M6: Preserve FigJam sticky notes and shapes with text on import by @StrajnarFilip in #1397
- M4: the Design panel's sections on the design's 240 pt grid by @yelintong in #858
- M6: Sketch import (#1021 follow-up): match Sketch's renders rule by rule by @sarsonj in #1389
- M7: place images at their own size, in points for 2x screenshots by @denisg0mes in #1360
- M3: bind fill and stroke variables directly in layer props (#1000) by @avhn in #1421
- M1: Alt pressed during a drag turns the move into a copy (#1385) by @muamerETS in #1427
- M0.9: let batches continue after failed steps (#1386) by @avhn in #1409
- M6: import and export Penpot 2.x files offline by @Guillergood in #1143
- docs: rows from the round-4 community PRs (#858, #1409, #1397, #1389, #1143, #1427, #1421) by @bflatastic in #1504
- M1: Crop image from the Object menu, the right-click menu and the image fill row (#1464) by @bflatastic in #1501
- M3: shadows of images with transparent pixels follow their alpha (#1289) by @bflatastic in #1509
- M0.9: web wasm back under the 24 MiB gate (#1472) by @bflatastic in #1511
- M7: download a missing free font from the Missing fonts window (#754) by @bflatastic in #1510
- M6: .fig import keeps the file's saved line breaks while the text is unedited (#1236) by @bflatastic in #1519
- M6: .fig import resolves library text styles linked by asset key (#1234) by @bflatastic in #1515
- M8: the progressive JPEG check guards file thumbnails too by @bflatastic in #1517
- M8: large images on the canvas draw from a smaller copy (#1483) by @bflatastic in #1518
- M12: drawing a connector previews the connector it makes (#1387) by @bflatastic in #1526
- M9: a refused batch is fixed in linear time (#1063) by @bflatastic in #1522
- M3: the instance swap menus search as you type (#1338) by @bflatastic in #1527
- M9: an attached AI agent comments under its own name (#1414) by @bflatastic in #1529
- M9: sibling placement uses ordered lookups (#1065) by @bflatastic in #1523
- M8: an attached MCP call can name the document it acts on (#998) by @bflatastic in #1533
- M9: the replay log is bounded by default (#1069) by @bflatastic in #1524
- M0.9: edit.duplicate can return which copy is which (#995) by @bflatastic in #1528
- M3: components that would contain themselves are refused, and loops in files are repaired (#1084) by @bflatastic in #1540
- M8: masks allocate only over what they draw, under a layer budget (#1061) by @bflatastic in #1535
- M9: comment.list reports the names each message mentions (#1415) by @bflatastic in #1534
- M4: a letter and its combining marks shape with one font (#1478) by @bflatastic in #1532
- M8: SVG pattern tiles are drawn once per scale, within the layer budget (#1080) by @bflatastic in #1551
- M8: the browser applies input sent over its control channel by @samhyun in #1499
- M1: guides snap to layer edges and centres when dragged by @ahmed-226 in #1498
- Resolve stored variable ids by exact id, not by variable name by @Silvertree2010 in #1542
- Fix double alpha when binding a translucent variable to an empty fill by @Silvertree2010 in #1530
- M2: add auto layout from groups in the sidebar and convert them in place by @Carbocode in #1546
- Reject non-boolean values for node.set flag properties by @Silvertree2010 in #1545
- Neutralise CR and form feed in CSS variable export strings by @Silvertree2010 in #1539
- Keep full precision in export size labels so they parse back by @Silvertree2010 in #1507
- M9: a per-address budget for server admin requests, and join codes found by hash (#1075) by @bflatastic in #1552
- M8: the browser draws a zoom's full render a band at a time by @samhyun in #1496
- M1: add a draggable corner smoothing icon by @Carbocode in #1521
- ci(deps): bump storytold/craft-common-actions/.github/workflows/windows-arm64.yml from 8bb4e5ab95443171104ad88113fe1ef9b0e5ce3f to fa5ef18780cf5e7d5d3b8de068de56cffc83cac5 in the actions group by @dependabot[bot] in #1520
- M1: dismiss colour pickers outside and anchor them beside the sidebar by @Carbocode in #1544
- M9: joining a live session shows its progress, with Cancel and Try again (#1381) by @bflatastic in #1553
- board grid settings: dots, lines, graph paper or none by @liwaichung-source in #1547
- M4: a drag anywhere in vector edit mode draws a marquee (#1508) by @AganzeFelicite in #1516
- M9: one clear, persistent display name, renamed live in sessions (#1380) by @bflatastic in #1554
- M5: a Manual overlay can be dragged on the canvas (#405) by @bflatastic in #1555
- M9: the app shows where an attached AI agent is working (#1416) by @bflatastic in #1556
- M4: Thai, Lao, Khmer and Burmese lines break between words (#1219) by @StrajnarFilip in #1548
- M8: startup falls back to another GPU backend when the device is lost (#1438, #965) by @bflatastic in #1557
- M9: the admin budget test allows for refill during a slow run by @bflatastic in #1564
- M7: a portable install keeps its settings beside the app (#1320) by @bflatastic in #1558
- M8: SVG import reads color() and color-mix() colours (#1550) by @bflatastic in #1566
- M7: the browser can use fonts installed on the computer (#1051) by @bflatastic in #1568
- M9: publish and share online from the browser (#917) by @bflatastic in #1567
- M3: component properties keep their order on rename; Make slot asks for the name (#1536, #1537) by @bflatastic in #1565
- M7: selection and hover outlines follow a layer's rounded corners (#1506) by @bflatastic in #1573
- Reject non-finite hsl()/hsla() components in parse_css by @Silvertree2010 in #1559
- M8: the browser worker's preview and wait tests run on a clock and a threshold they set by @bflatastic in #1575
- M0.9: figcraft-cli parses its arguments with clap (part of #1396) by @bflatastic in #1570
- M8: Cap the input of boolean operations by @bflatastic in #1581
- M8: Keep unsaved files when an internal error stops the browser build by @bflatastic in #1580
- M9: comment.list: list only the threads that mention a name by @bflatastic in #1585
- M1: Preferences ▸ Scroll wheel zoom by @bflatastic in #1584
- M9: share links can comment (a comment access level beside edit and view) by @bflatastic in #1576
- M8: the Actions palette offers only commands that run from it by @bflatastic in #1582
- Keep combining marks inside the word in title case by @Silvertree2010 in #1579
- M8: stacked layer blurs keep the margin they reach together by @samhyun in #1583
- M8: exports hold what stacked layer effects paint together by @samhyun in #1589
- M1: compact Frame actions and dev status in the header by @YarilaFox in #1577
- M6: FigJam .jam files open, as boards (#1342) by @bflatastic in #1586
- M1: a recovery copy made during a version preview holds the file, not the version shown by @bflatastic in #1588
- M8: the SVG export chains layer blurs and casts shadows from the blurred layer by @samhyun in #1598
- M1: From the pen into vector edit mode: Enter and double-click edit instead of drawing on by @bflatastic in #1590
- M8: Grid auto-placement on an occupancy bitmap by @bflatastic in #1593
- M9: Comments: mentioned names in comment.people, and mentions in comment.next and comment.prompt by @bflatastic in #1591
- M8: .fig import: instance expansion without the quadratic walks and copies by @bflatastic in #1594
- CI: workflows only call craft-common-actions at @main (AGENTS.md; windows-arm64 unpinned) by @dylanmtaylor in #1587
- M8: a group's effects reach past what its children paint by @samhyun in #1603
- M8: hover hit-tests once per pointer move, and a moved auto layout frame keeps its layout by @bflatastic in #1601
- M8: One unpack budget per .figcraft open by @bflatastic in #1599
- M8: a server file everyone left stays loaded a minute, so idle join and leave do no disk I/O by @bflatastic in #1606
- M8: an explicit variables file is refused past 256 MiB or when it isn't a regular file (part of #1114) by @avhn in #1608
- M8: One depth cap for a whole render, and render threads with room for it by @bflatastic in #1605
- M8: Deep files import on the browser's 1 MB stack by @bflatastic in #1600
- M8: A batch keeps one undo snapshot, not one per step by @bflatastic in #1610
- M8: libraries and plugins larger than the download burst can be downloaded, more slowly by @bflatastic in #1619
- Docs: retake the README screenshots on current main by @bflatastic in #1623
- M8: a large selection's overlay and Design panel values are kept for frames where nothing changed by @bflatastic in #1611
- M8: doc.list gives AI agents and plugins file names, not paths by @bflatastic in #1620
- Update prompt shows the app icon and accent color instead of a letter by @dylanmtaylor in #1612
- M8: cap the people a client keeps track of and the deleted ids a session remembers by @bflatastic in #1622
- M8: effects reach as far under a scaled layer by @samhyun in #1626
- M8: Opening a file contacts no team library server it names until you check it by @bflatastic in #1621
- M9: the server compares the operator key by its hash (#1130) by @avhn in #1614
- M8: A component set's property rows fit the 240 px right panel by @bflatastic in #1629
- Fix pretend-version testing for update prompts by @dylanmtaylor in #1627
- M8: Every file a command reads by path is a regular file within a cap by @bflatastic in #1625
- M3: stored variable and collection references keep their identity (#1613) by @avhn in #1618
- M10: clarify German gradient, OpenType and startup labels by @markx77 in #1505
- M0.9: inspect layer trees with selected fields or a compact outline (#996) by @avhn in #1420
- M8: .fig ZIP image reads share a total byte budget (part of #1076) by @avhn in #1616
- M8: a patch reads no backdrop past the view's edge by @samhyun in #1633
- M8: an edit renders where the changed layer paints, its effects' margin once by @samhyun in #1630
- M0.9: generate shell completions and man pages for figcraft-cli (part of #1396) by @avhn in #1615
- M8: .fig import budgets four values per compressed canvas byte instead of one (#574) by @ChristopherLinnett in #1636
- M8: a grouped command whose closure panics leaves the document as before (#1085) by @avhn in #1609
- M4: an imported file finds an installed family under the other names its fonts give it by @bflatastic in #1628
- i18n(sv): translate 36 new strings by @kler in #1642
- Tests: read the docs' examples whatever the checkout's line endings by @bflatastic in #1645
- M12: create the next board shape already connected by @bflatastic in #1631
- M8: a drag that only moves the selection shifts what was worked out at its start by @bflatastic in #1640
- M3: colour variables can be calculated from others, faded or mixed per mode (#1280) by @ChristopherLinnett in #1641
- M6: figcraft-cli connect publish publishes code connect mappings to a design file by @bflatastic in #1643
- M6: plugin panels take a slider control by @bflatastic in #1637
- M6: .fig elbowed and curved connectors without a saved path are routed, not drawn straight by @bflatastic in #1649
- M6: Plugin widgets have hover styles by @bflatastic in #1634
- M3: typed and stored variable, collection and mode ids find exactly that object (rest of #1613) by @bflatastic in #1635
- Docs: one copy of each row and status item, and a check that keeps it so by @bflatastic in #1658
- M6: pasted layers keep the colours of their shared paint styles by @bflatastic in #1647
- M6: a pasted image the clipboard doesn't carry shows as missing and is named by @bflatastic in #1648
- M1: keep sidebar field text in place on focus by @Carbocode in #1651
- Text style dedupe is O(spans) by @lileeei in #1655
- bs: Bosnian (bs) interface catalog by @nine-codes in #1652
- M8: a font's damaged table offsets are skipped instead of wrapping on 32-bit targets (#1125) by @avhn in #1657
- M8: a drag moving many layers normalises only what sits around them by @bflatastic in #1656
- M6: .fig connector labels without a saved snapshot are kept, centred on their line by @bflatastic in #1659
- M6: plugin panels show images by @bflatastic in #1639
- Server tests: rate limits measured at a clock the tests hold still by @bflatastic in #1662
- M8: the Design panel and the selection overlays stop going over a large selection every frame by @bflatastic in #1660
- M6: a long frame name stays on one line in the Export button by @bflatastic in #1661
- M12: spreadsheet cells paste onto a board as a table by @bflatastic in #1663
- M12: line ends, dashes, weight and any colour on a board connector's bar by @bflatastic in #1632
- M5: skipping the Open link notice by command is saved at once by @bflatastic in #1667
- M3: team library analytics count detached instances by @bflatastic in #1668
- Live join: a large Welcome still downloading is not given up on at the idle timeout (#1664) by @MarekSpodBiedry in #1675
- M10: Bosnian catalog covers main's new paste strings by @nine-codes in #1676
- M9: a team list on figcraft-server, shown in Home ▸ Online, with links that carry no secret (part of #742) by @patlux in #1678
- M12: stamps stick to the objects they land on, which are highlighted first by @bflatastic in #1671
- M8: an edit checks only the layers it changed for out-of-range positions and sizes (#1672) by @saimskywalker in #1686
- M12: board votes say who voted for what, and earlier votes' results are kept by @bflatastic in #1666
- M8: a control request that times out says whether it was applied (#1673) by @bflatastic in #1692
- M9: a live session's welcome sends the document compressed (#1665) by @bflatastic in #1693
- M4: the eyedropper with Cmd/Ctrl+Shift makes a colour style or variable by @bflatastic in #1674
- M8: commands confined to automation roots reach no server (#1095) by @saimskywalker in #1697
- M4: editing a stroke's Dash or Gap keeps the rest of its dash pattern (#1681) by @saimskywalker in #1698
- M3: a collection of this file can be extended by @bflatastic in #1679
- i18n(fi): translate the 99 UI strings and 23 command labels Finnish lacked by @Janiz-zzz in #1700
- M5: an Open link action can open in place of the prototype, with Open in new tab off by @bflatastic in #1685
- M8: the Menu key opens the context menu; stale parity rows corrected by @bflatastic in #1677
- M11: a widget opens its plugin's panel (plugin API 5) by @bflatastic in #1684
- M8: a control request can set its own timeout, up to 10 minutes (#1696) by @bflatastic in #1706
- M4: a stroke's Custom style takes a dash pattern as a comma-separated list (#1681) by @bflatastic in #1712
- i18n(sv): translate 22 new strings by @kler in #1715
- M3: library analytics count insertions and show them over time by @bflatastic in #1704
- M12: boards have 16 more shapes, in grid pickers by @bflatastic in #1705
- M12: a connector's path can be reshaped by dragging its path handles (#1710) by @bflatastic in #1717
- M8: search fields in the left panels keep their text in the middle (#1703) by @bflatastic in #1709
- M4: a dashed line starts and ends with a half-length dash by @bflatastic in #1718
- M8: Show in folder works in the Flatpak build and selects the file on Linux (#1701) by @bflatastic in #1711
- M8: text reads only the fallback fonts it draws with by @WiktorKluczny in #1721
- M1: the Frame tool's Phone presets have the iPhone 17 family (#1691) by @bflatastic in #1720
- M1: the colour picker's Image tab has a placeholder, a preview and takes a dropped file (#1682) by @bflatastic in #1713
- Honour Round and Bevel joins on outside rectangle strokes by @Silvertree2010 in #1725
- M6: SwiftUI and Compose code name a bound variable by its code syntax by @bflatastic in #1716
- M1: images copied elsewhere paste on the desktop and in the browser by @bflatastic in #1723
- fix(flatpak): allow reading launcher version pins by @dylanmtaylor in #1722
- M8: a damaged image is refused with a reason instead of showing as an empty box by @bflatastic in #1724
- M8: regression tests for one-sided strokes on rounded shapes and XML-forbidden characters in SVG (#1351, #1124) by @bflatastic in #1719
- M12: a connector end dropped along a side of a shape attaches to that side (#1708) by @bflatastic in #1714
- M11: widgets draw lines and SVG pictures (plugin API 6) by @bflatastic in #1727
- M5: the Controller menu names each button as PlayStation and Switch controllers do by @bflatastic in #1726
- M3: library analytics list how each style and variable is used by @bflatastic in #1730
- M0.9: document that x/y offset a vector path by its own box by @zral in #1731
- Reject empty arguments in parse_css color functions by @Silvertree2010 in #1734
- M4: Dash cap setting for Dash and Custom strokes by @bflatastic in #1728
- M11: a tap on a plugin panel's button keeps what was typed in its fields by @bflatastic in #1732
- M12: a connector end on any part of an object with Cmd/Ctrl by @bflatastic in #1733
New Contributors
- @ChristopherLinnett made their first contribution in #1487
- @samhyun made their first contribution in #1424
- @hussain-hz made their first contribution in #1466
- @Guillergood made their first contribution in #1439
- @avhn made their first contribution in #1419
- @Carbocode made their first contribution in #1546
- @liwaichung-source made their first contribution in #1547
- @markx77 made their first contribution in #1505
- @nine-codes made their first contribution in #1652
- @saimskywalker made their first contribution in #1686
- @Janiz-zzz made their first contribution in #1700
- @WiktorKluczny made their first contribution in #1721
- @zral made their first contribution in #1731
Full Changelog: v0.12.1...v0.13.1