What's Changed
- fix(collab): place keyed-list puts through an index within a batch by @dylanmtaylor in #1893
- Reject fractional index in proto.interaction.remove and set by @Silvertree2010 in #1874
- Reject fractional index in layout.setTrack by @Silvertree2010 in #1892
- Reject invalid dashes in node.set instead of dropping entries by @Silvertree2010 in #1899
- perf(color): sort gradient stops once per diamond texture by @dylanmtaylor in #1894
- perf(format): drop dangling Penpot token aliases with a worklist by @dylanmtaylor in #1897
- M8: an ellipse whose start has gone round many turns keeps its sweep in .fig by @samhyun in #1891
- M7: a file tab's menu and the board bar's shape menu read in the light theme by @aleksei-suholita in #1890
- M8: a click with the Bend tool curves a sharp point, its handles along the line between its neighbours (#1875) by @TrevorBrown-dev in #1877
- M4: wrap style on a text layer: Auto, Balance and Pretty decide where its lines break (#1827) by @TrevorBrown-dev in #1871
- fix(format): index kiwi field lookups and bound schema and empty-array growth by @dylanmtaylor in #1896
- fix(pathops): sanitize a brush's width profile once before sampling by @dylanmtaylor in #1948
- perf(text): compute each glyph's cluster end once per run by @dylanmtaylor in #1963
- perf(doc,engine): rebuild a widget by removing its children in one pass by @dylanmtaylor in #1967
- perf(engine): look up a component's asset root once per usage report, and skip mode migration without instances by @dylanmtaylor in #1966
- perf(collab): check a replaced list's entries against sets, not a scan per entry by @dylanmtaylor in #1962
- fix(format): a saved file replaces its predecessor with the same permissions by @dylanmtaylor in #1957
- fix(engine): never let document text close the generated HTML style element by @dylanmtaylor in #1955
- perf(engine): keep each events.poll topic once by @dylanmtaylor in #1935
- fix(doc): list a page once however often a file lists it by @dylanmtaylor in #1927
- fix(layout): end the fill distribution loop when no child can freeze by @dylanmtaylor in #1926
- fix(svg): refuse a document compressed twice and charge a refused embedded one by @dylanmtaylor in #1924
- fix(mcp): render prompt placeholders in one pass over the template by @dylanmtaylor in #1922
- fix(render): check the nesting limit for mask content and bound GIF frame buffers by @dylanmtaylor in #1925
- perf(engine): list a few step names in a missing-reference error by @dylanmtaylor in #1941
- perf(svg): hash an embedded image's bytes once per import by @dylanmtaylor in #1945
- fix(doc): bound the string bytes an expression holds and stop concatenating at the cap by @dylanmtaylor in #1950
- fix(engine): hold a plugin's text.preview to the permissions of the command it previews by @dylanmtaylor in #1959
- fix(ui): write a plugin's offered file through the confined file helper by @dylanmtaylor in #1960
- perf(collab): memoise layer depths in diff and skip the sibling scan for a new child by @dylanmtaylor in #1961
- perf(vectordrawable): resume each repeated name's suffix search where it stopped by @dylanmtaylor in #1964
- perf(pdf): collect each text style's outlines and decorations in one pass by @dylanmtaylor in #1965
- perf(engine): index variables once when following a library's alias chains by @dylanmtaylor in #1968
- fix(format): import a Sketch page once however often the file lists it by @dylanmtaylor in #1973
- fix(engine): count each id Shape Builder is given once by @dylanmtaylor in #1974
- perf(engine): replace linear scans that made document-sized inputs quadratic by @dylanmtaylor in #1921
- fix: create test and benchmark temp directories fresh, never adopt an existing one by @dylanmtaylor in #1977
- fix(server): clean a published file's name when it is taken from the file by @dylanmtaylor in #1978
- fix(collab): build no repair for a batch refused for lack of permission by @dylanmtaylor in #1980
- Pass the Linux signing key to the release workflow by @dylanmtaylor in #2001
- feat(web): a host bridge for embedding pages, ?host=parent and data-host="page" (#1356) by @helenkwok in #1358
- figcraft-web: a Save of a host-opened document goes out under the host's file name (builds on #1358) by @helenkwok in #1806
- fix(ui): About credits table columns can be dragged wider or narrower by @FredApps in #1969
- Colour picker: dragging a gradient handle on the canvas keeps the picker and the handles up (#1852) by @TrevorBrown-dev in #1985
- M3: glass effects take variables, and their frost stays within 0–100 by @aleksei-suholita in #1886
- M3: glass bends with the reference tool's thick-lens profile and splits its colours over 8 steps by @aleksei-suholita in #1887
- M3: glass's light is a line on its bevel, and splay turns the bend towards the centre by @aleksei-suholita in #1888
- M3: glass bends towards its core, and rounded rectangles work it out in closed form by @aleksei-suholita in #1889
- Copy the shared house rules into AGENTS.md by @FredApps in #2040
New Contributors
- @aleksei-suholita made their first contribution in #1890
- @helenkwok made their first contribution in #1358
- @FredApps made their first contribution in #1969
Full Changelog: v0.15.1...v0.16.0