What's Changed
- test: explain the discarded reads in the fake servers (SonarCloud rust:S7450) by @dylanmtaylor in #1221
- packaging: bash test and function hygiene (SonarCloud S7688, S7679, S7682, S131, S7677) by @dylanmtaylor in #1201
- packaging: use [[ for bash conditional tests (SonarCloud S7688) by @dylanmtaylor in https://github.com//pull/1225
- CI: one test binary per crate, nextest, line tables only by @aiongg in #1208
- Packaging: pin the signing client and appimagetool, and check their hashes by @aiongg in #950
- Tests: paragraph indent test no longer depends on test order by @aiongg in #1227
- CI: shared gate workflow; FreeBSD nightly and on release by @aiongg in #1206
- Docs: roadmap entries for the community PRs in #507, #510, #529 and #530 by @bflatastic in #587
- i18n: a missing translation fails no check; cargo xtask i18n-report lists them by @aiongg in #1228
- M6: Dev Mode tail: imports in layer trees, compare with versions, an inspect-only canvas by @bflatastic in #538
- ci(sonar): stop cancelling main-branch runs so coverage is published by @dylanmtaylor in #1231
- M12: Boards — a collaborative whiteboard file kind by @bflatastic in #1229
- PDF: write with craft-libs' krilla, which bounds decoded PNGs by @aiongg in #1240
- chore: resolve SonarCloud maintainability issues by @dylanmtaylor in #1241
- Community batch r2-1: 63 reviewed PRs by @bflatastic in #1244
- Cap the issue list returned by Document::validate by @Silvertree2010 in #1187
- Strip bidi control characters from names and report reasons by @Silvertree2010 in #1192
- Regression test for #237 by @skylartaylor in #1197
- M3: instance-swap properties in the Dev Mode component playground by @marcoarnulfo in #1199
- Control server: wait after a failed accept instead of retrying at once by @oracola91 in #1212
- M5: a top-level frame taller than the device scrolls without an overflow setting by @seltzdesign in #1232
- Fix duplicate SVG ids when a layer name matches a generated id by @Silvertree2010 in #1238
- engine: fill rules as vector.fillRule and vector.reverseLoop by @yelintong in #740
- M1: write grid track sizes in .fig export (#465) by @xiaou61 in #904
- Keep a solid paint's own opacity when binding a colour variable by @Silvertree2010 in #948
- fix(ui): keep the style picker open while editing a style's colour by @kollakek1 in #976
- Fix invisible dropdown options in the light theme by @Ridzzz0Alam in #983
- fix: = zooms in, matching - zooming out (#973) by @Ridzzz0Alam in #986
- M7: keep keyboard focus inside the Interface size menu by @YarilaFox in #1014
- M1: a selected unfilled shape drags from inside its box (#910) by @muamerETS in #1018
- fix(engine): show the Pen's Shift 45° step in its preview line (#970) by @vxMacDev in #1023
- M1: individual corner fields sit at their corners, each with its own icon (#1002) by @muamerETS in #1030
- Treat U+2007 FIGURE SPACE as non-breaking in line breaking by @Silvertree2010 in #1031
- M8: save-format tests keep their temp folders apart by @MortenHusted in #1032
- M3: a variant switch takes the new variant's resizing unless the instance set its own by @MortenHusted in #1033
- M6: SVG import fills open subpaths the way SVG does by @MortenHusted in #1034
- M3: a variable mode set on a layer inside an instance is an override by @MortenHusted in #1037
- Keep
not <var>from reading back as a variable named "not …" by @Silvertree2010 in #1041 - M3: style links given in a call apply after its values by @MortenHusted in #1042
- M3: a swapped nested instance keeps its outer main's overrides by @MortenHusted in #1043
- M4: individual stroke weights follow the corner radius like CSS borders by @MortenHusted in #1044
- M7: Type settings keeps its width with long labels (#1029) by @AganzeFelicite in #1047
- Drop XML-forbidden control characters from live-text SVG export by @Silvertree2010 in #1052
- M5: prototype actions lay out what they change like the canvas does by @MortenHusted in #1135
- Write a final Greek sigma in lower-case text layout by @Silvertree2010 in #1142
- Remove all leftover temp files at server startup by @Silvertree2010 in #1145
- Guard file generation increments against u64 overflow by @Silvertree2010 in #1146
- Restrict a pre-existing data directory to 0700 by @Silvertree2010 in #1147
- Bound the library/plugins close drain with a deadline by @Silvertree2010 in #1149
- Never drop Sync events when the live inbox is full by @Silvertree2010 in #1151
- Match widget data check depth to serde_json's recursion limit by @Silvertree2010 in #1153
- FreeBSD: package the aarch64 cross build (craft-common-actions#39) by @zuujiscom in #1158
- M0.9: figcraft-cli export names files as the app's export does (#1154) by @switch87 in #1160
- M0.9: --help and -h after a figcraft-cli subcommand print the usage (#1155) by @switch87 in #1161
- Reject non-finite coordinates in control-channel ui.input by @Silvertree2010 in #1164
- Make SVG unique_id linear for repeated layer names by @Silvertree2010 in #1165
- M7: Cmd/Ctrl+S saves while a panel field has the keyboard (#1157) by @switch87 in #1166
- Refuse library versions that leave no newer one to publish by @Silvertree2010 in #1169
- Never overwrite a file's log when it can't be read by @Silvertree2010 in #1171
- M8: the unsaved-changes question on close offers Save (#1170) by @switch87 in #1173
- Keep the hello size limit until a connection is admitted by @Silvertree2010 in #1175
- Enforce per-address storage caps per IPv6 /64, /56 and /48 by @Silvertree2010 in #1178
- Refuse text.loadFont path for plugins by @Silvertree2010 in #1181
- Shut kicked and removed connections when their close can't be queued by @Silvertree2010 in #1182
- Enforce an absolute pre-hello deadline against ping slowloris by @Silvertree2010 in #1183
- Make is_ancestor fail closed on deep or looping parent chains by @Silvertree2010 in #1185
- Stop stale next_id from making pastes overwrite existing nodes by @Silvertree2010 in #1186
- M4: vector edit transform box around points of several layers by @marcoarnulfo in #1189
- Refuse non-local library paths in the library Cache by @Silvertree2010 in #1190
- Deny library.publishToServer to plugins by @Silvertree2010 in #1191
- Accept a version string for the plugin manifest api field by @Silvertree2010 in #1195
- Don't run the expiry sweep from offline CLI commands by @Silvertree2010 in #1196
- fill/stroke props: accept "none" and null as no paint by @lileeei in #1198
- The colour picker's eyedropper applies the colour to the paint the picker edits (Reported in storytold/vectorcraft#3342) by @marcoarnulfo in #1200
- Honour even-odd fill rule when hit testing vectors by @Silvertree2010 in #1230
- M5: one presentation tab per page of a file by @JimKnoxx in #660
- M1: say that the automation roots reach only the headless side (#835) by @xiaou61 in #905
- Keep literal true/false distinct from variables named true/false by @Silvertree2010 in #1038
- M6: Dev Mode measurements kept on the canvas, a read-only layers panel by @bflatastic in #1248
- variable.export css: number lengths in px by @lucasmartins-ai in #1008
- Show a boolean property's default on the main component's bound layers by @kkilchrist in #1006
- MCP: inspect_document answers within what a client can read by @Hamza0101 in #915
- node.reparent: index is the layer's final position by @kkilchrist in #1005
- node.set: accept
pathto replace a vector's geometry by @kkilchrist in #1004 - data.fill and text.fit: fill copies of a frame from rows of data by @lucasmartins-ai in #1009
- chore: drop redundant 'static lifetimes (Sonar S8863) by @dylanmtaylor in #1254
- fix(security): prevent symlink traversal in asset walker, safe cert tmpdir, and safe icon copy by @dylanmtaylor in #1255
- fix(security): owner-only recovery permissions, linear cli export suffixing, and web noopener by @dylanmtaylor in #1256
- fix(security): bound decoration steps, text-on-path elements, and rename expansions by @dylanmtaylor in #1257
- fix(security): cap COLR layers, PNG glyph dimensions, and layout cache capacity by @dylanmtaylor in #1264
- fix(security): linear docprops reordering and deduplicate restored deletion nodes by @dylanmtaylor in #1258
- Clamp control-channel document.inspect depth to 64 by @Silvertree2010 in #1162
- Convert text decoration colour in colour profile conversion by @Silvertree2010 in #1247
- Clip Inside/Outside strokes by the shape's even-odd fill rule by @Silvertree2010 in #1253
- Validate image member names when reading .figcraft archives by @Silvertree2010 in #1148
- Clear plugin settings when a plugin id is re-registered by @Silvertree2010 in #1159
- Restore the clipboard when a command fails and is rolled back by @Silvertree2010 in #1167
- Cap layout.setTrack track count at MAX_TRACKS by @Silvertree2010 in #1168
- Keep wrong join-code streak when a correct code is tried by @Silvertree2010 in #1174
- Check SVG nesting depth after DTD entity expansion by @Silvertree2010 in #1177
- Count scalar kiwi fields against the decoded-value budget by @Silvertree2010 in #1188
- Require a per-client secret to resume a collab client id by @Silvertree2010 in #1193
- security: linear vector import, stroking and rounding, validation, and cyclic dev snapshots by @dylanmtaylor in #1306
- Merge 13 open PRs (tested batch) by @aiongg in #1311
- M3: apply and detach color variables from Selection colors by @dotCooCoo in #1273
- M6: Dev Mode refuses edits from dropped files, the Pages list and the Assets panel by @dotCooCoo in #1277
- M3: bind variables to a text style's fields from the style editor by @dotCooCoo in #1281
- M3: style variable pickers offer only variables scoped to the field by @dotCooCoo in #1283
- M3: apply variables to a text layer's font family and font style by @dotCooCoo in #1284
- M4: corner smoothing on polygons and stars by @dotCooCoo in #1286
- M1: the iOS button next to Corner smoothing sets 60% by @dotCooCoo in #1288
- Docs: parity rows for mouse-trigger delays, outline options and missing fonts by @dotCooCoo in #1293
- M4: the Text on a path tool by @dotCooCoo in #1298
- M4: text put on a path takes the path's fill and effects by @dotCooCoo in #1301
- M5: a notice before a prototype's Open link leaves for a website by @dotCooCoo in #1304
- M7: with Contents only on, a slice in a frame or group exports only that container by @dotCooCoo in #1305
- M7: the export settings name Ignore overlapping layers and offer Include bounding box for text layers only by @dotCooCoo in #1307
- Follow-ups from the #1311 review: link notice clicks, variable scopes, corner tooltip by @aiongg in #1316
New Contributors
- @aiongg made their first contribution in #1208
- @oracola91 made their first contribution in #1212
- @seltzdesign made their first contribution in #1232
- @xiaou61 made their first contribution in #904
- @kollakek1 made their first contribution in #976
- @Ridzzz0Alam made their first contribution in #983
- @zuujiscom made their first contribution in #1158
- @switch87 made their first contribution in #1160
- @lileeei made their first contribution in #1198
- @lucasmartins-ai made their first contribution in #1008
- @kkilchrist made their first contribution in #1006
- @dotCooCoo made their first contribution in #1273
Full Changelog: v0.10.0...v0.11.2