What's Changed
- Affinity import: bound archive index names and charge failed entry extraction by @dylanmtaylor in #5291
- Native format: document.save can write path coordinates at a fixed precision by @dotCooCoo in #3990
- Drop invalid XML characters from SVG link URLs and aria-labels by @Silvertree2010 in #5279
- Fix #5312: EPS files written by Ghostscript's eps2write open by @JonRC in #5314
- Docs: file-format-parity keeps one .ai editing-data paragraph by @dotCooCoo in #5269
- Type: Tate-chu-yoko offsets in character style definitions stay in range by @dotCooCoo in #5259
- Document Info: Objects counts each object once by @dotCooCoo in #5260
- PDF export: spot inks named All or None print as spot inks by @dotCooCoo in #5250
- Type: an inline graphic takes its character's manual kerning by @dotCooCoo in #5245
- Select: Same › Text Fill & Stroke Color selects type whose fill and stroke both match by @dotCooCoo in #5244
- SVG: an exported ellipse imports as the four-anchor ellipse it was written from by @dotCooCoo in #5243
- i18n(ru): translate the 130 strings the report listed as missing by @rahul05ranjan in #5240
- i18n(sv): translate the 22 strings the report listed as missing by @rahul05ranjan in #5242
- Geometry: a projective map's horizon and invertibility checks do not depend on its scale by @dotCooCoo in #5271
- DXF export: bound curve flattening work and expanded symbol art by @dylanmtaylor in #5289
- Repeat: the instance budget counts opacity-mask art and the nodes each copy holds by @dylanmtaylor in #5290
- Page ranges: overlapping intervals skip indices already picked by @dylanmtaylor in #5292
- Depth limit: merge containers at the cap in one pass over the siblings by @dylanmtaylor in #5294
- Gradients: midpoints and freeform points find their stops by binary search by @dylanmtaylor in #5298
- Brush and symbol libraries: look definitions up by name by @dylanmtaylor in #5300
- Affinity import: count path segments and masks in master page copies; range-check vector masks by @dylanmtaylor in #5302
- Export for Screens: name patterns and taken names take linear work by @dylanmtaylor in #5304
- Affinity import: index the fields of large objects and read four rectangle corners by @dylanmtaylor in #5310
- Global Edit: a Shift-click on a highlighted match leaves it out of the edit by @dotCooCoo in #5237
- Recolor Artwork: the Edit tab shows the colors on a smooth wheel, a segmented wheel or as color bars by @dotCooCoo in #5249
- Symbols: 9-slice guides are shown and dragged on the canvas while editing a symbol by @dotCooCoo in #5280
- Fix Simplified Chinese translation of Luminosity by @cybermaxwel in #5329
- Brushes: leave out an opacity mask whose root symbol draws a brushed stroke by @dylanmtaylor in #5293
- Threaded text: a frame listed twice flows the story once by @dylanmtaylor in #5303
- Place: the place cursor reads its files within the roots it was loaded in by @dylanmtaylor in #5306
- Fix #5316: StandardEncoding and ISOLatin1Encoding are Encoding resources by @JonRC in #5317
- Fix #5318:
knownanswers false for keys no dictionary holds by @JonRC in #5319 - Fix #5321:
currentfilein a file being run is that file by @JonRC in #5323 - Clipboard: leave out the PNG of art too large to scale to 4096 pixels by @dylanmtaylor in #5301
- Flatten Transparency: group overlapping objects without comparing every open pair by @dylanmtaylor in #5307
- Export for Screens: keep PDF passwords out of remembered settings by @dylanmtaylor in #5305
- ICC: refuse a profile whose tag table lists a tag twice by @dylanmtaylor in #5299
- DXF import: budget dash patterns, copied text and names, and block items looked at by @dylanmtaylor in #5288
- Fix #4559: shortcuts can use the ISO key next to left Shift by @dotCooCoo in #5276
- Type: text.setStyle sets the text's stroke as well as its fill by @dotCooCoo in #5257
- Measure: a Shift-drag snaps its end point on its 45° step by @dotCooCoo in #5277
- Canvas: moves after the button-up do not join a stroke by @dotCooCoo in #5268
- Canvas: a dropped press cancels the tool's drag instead of ending it by @dotCooCoo in #5234
- Character Styles: Style Options sets character color and OpenType features by @dotCooCoo in #5255
- Window: Float in Window, Float All in Windows and Cascade float documents by @dotCooCoo in #5278
- Window: drag a document tab out to float it, and a window back to dock it by @dotCooCoo in #5286
- Window: with Open Documents As Tabs cleared, new documents open in windows by @dotCooCoo in #5295
- Window: Tile with one document open leaves the documents under their tabs by @dotCooCoo in #5256
- Preserve SVG styles with encoded attribute selectors by @dotCooCoo in #5325
- Exclude empty runs from matching text selections by @dotCooCoo in #5328
- Update SVG, type, recoloring, and symbol feature records by @dotCooCoo in #5326
- Path type brackets: 8 px reach, hover highlight, and the nearest of a bracket and a port takes the press by @ham9zah in #5332
- Objects on Path: the Space widget spaces the attached objects along the path by @dotCooCoo in #5275
- Type: step font families with the mouse wheel by @dotCooCoo in #5331
- Selection: a click on a large compound path is culled by its control points by @thisisgomaa in #5261
- Render: a compound path's members are assembled once and kept with the node by @thisisgomaa in #5262
- Find Font: Change and Change All add no undo step when no text changes by @dotCooCoo in #5204
- Type: Find Font's Replace With Font From lists the document's, recent or installed fonts by @dotCooCoo in #5217
- Variables: Import Data Sets reads every column as a variable and replaces the data sets by @dotCooCoo in #5151
- Type: the caret, a click and the arrow keys reach the characters inside a ligature by @dotCooCoo in #5225
- .ai import: version 7 pattern definitions come in as pattern swatches by @dotCooCoo in #5189
- .ai import: Effect › Pathfinder on a group opens as a live effect by @dotCooCoo in #5150
- Group flattened multi-line transparent type by line by @Prin-Ing in #5338
- Fix #5342:
eexecskips in the file it is given by @JonRC in #5343 - Fix #5236: Use System Defaults for Edit Original (Preferences › File Handling) by @ruchirguitar in #5327
- Docs: consolidate assessment target metadata by @dotCooCoo in #5352
- Tests: isolate font wheel picking from missing-glyph protection by @dotCooCoo in #5353
- Fix #4924: Text Tweaker ramps or randomises one character attribute letter by letter by @ruchirguitar in #5344
- chore(deps): bump wat from 1.262.0 to 1.263.0 by @dependabot[bot] in #5346
- Paint: use CMYK defaults when creating gradients in CMYK documents by @dotCooCoo in #5354
- Actions: New Action asks for the action's name, set, function key and color by @dotCooCoo in #5270
- Character style evidence links to help without copied instructions by @dotCooCoo in #5358
- Docs: record Find Font replacement sources by @dotCooCoo in #5359
- Transform previews typed values in its effect dialog by @dotCooCoo in #5357
- SVG import preserves selector matches while retaining metadata by @dotCooCoo in #5361
- Type: keep composition spacing along the line when characters rotate by @dotCooCoo in #5370
- Lasso picks gradient mesh points instead of dropping the mesh by @Silvertree2010 in #5371
- Dashes: a pattern whose period overflows to infinity draws solid by @dylanmtaylor in #5373
- Illustrator import: refuse arrays nested past the depth limit by @dylanmtaylor in #5374
- Data Recovery: read only plain files in this account's own areas by @dylanmtaylor in #5375
- Links: the link watch and Link Info read within the asking caller's roots by @dylanmtaylor in #5376
- Placed documents: a refused read shows the preview, not another caller's cached full read by @dylanmtaylor in #5377
- App: open and copied-file paste read only regular files by @dylanmtaylor in #5378
- App: keep preference copies, dialog passwords and migrated folders private by @dylanmtaylor in #5379
- Save: the Templates folder needs write access; portal saves keep the exact file name by @dylanmtaylor in #5380
- Atomic save: a replacement takes no inherited ACL the old file lacked by @dylanmtaylor in #5381
- Recolor: clustering seeds each colour once by @dylanmtaylor in #5382
- Automation roots: refuse network paths outside the roots before resolving them by @dylanmtaylor in #5383
- PDF and print presets: imports number duplicate names in linear time by @dylanmtaylor in #5384
- Gradients drawn pixel by pixel find their stops by binary search (EMF export, Affinity overlays) by @dylanmtaylor in #5385
- Brush and library names number repeats without rescanning by @dylanmtaylor in #5386
- WMF import: a full object table is not rescanned for every creation by @dylanmtaylor in #5387
- Graph designs: Delete Design handles each listed name once by @dylanmtaylor in #5388
- Slices: Create from Guides stops at one past the slice limit by @dylanmtaylor in #5389
- Illustrator import: look swatch names up in a set by @dylanmtaylor in #5390
- Data Recovery: an image entry shared by several keys is written and read once by @dylanmtaylor in #5391
- MCP: busy replies don't repeat a long request id by @dylanmtaylor in #5392
- Geometry: anchor positions and Simplify measure curves through the guarded arc length by @dylanmtaylor in #5393
- Place: a placement read again when it completes stays within the roots it was read in by @dylanmtaylor in #5394
- Brushes: a brush name the library lacks doesn't make art draw a brushed stroke by @dylanmtaylor in #5398
- Threads: a frame left alone by a dropped repeat is flowed again by @dylanmtaylor in #5396
- DXF import: charge every dash copy and symbol name, name the block-work limit by @dylanmtaylor in #5397
- Export for Screens: settings saved without their PDF passwords don't export unprotected by @dylanmtaylor in #5400
- Copy: a PNG too large to make is not offered, and the status bar says why by @dylanmtaylor in #5399
- Fix #5360: Type on a Path Options has a Preview checkbox by @ruchirguitar in #5402
- SVG: CSS class names and imported symbol names take linear work by @dylanmtaylor in #5405
- SVG: the entity expansion cap counts every declaration and refuses names it can't follow by @dylanmtaylor in #5406
- SVG glyphs: keep only typed raster data URLs, and no links by @dylanmtaylor in #5407
- CSS export: line breaks and angle brackets in names can't end a CSS string by @dylanmtaylor in #5408
- PDF: bound marked-content lookup, ASCII85, editing-data hashing, image decodes and ink warnings by @dylanmtaylor in #5410
- Tools: Shape Builder hatch lines are counted; Liquify simplification is linear by @dylanmtaylor in #5411
- Trace: empty and mismatched rasters, and large swatch libraries, take bounded work by @dylanmtaylor in #5412
- Type: a paragraph looks only at its own runs by @dylanmtaylor in #5414
- Render: symbol instances with effects use the symbol budget; CMYK decodes are admitted; checked Targa size by @dylanmtaylor in #5415
- Fonts build: craft-fonts manifest paths stay inside the checkout; licences are published as text by @dylanmtaylor in #5416
- UI: automation can't open the browser or viewer; Preview in Browser stays in its folder; Graph Data is bounded by @dylanmtaylor in #5417
- UI: opening, file picks and the render worker keep the automation roots they started under by @dylanmtaylor in #5418
- Testkit: a reused temp dir must belong to this user by @dylanmtaylor in #5419
- Type: Character menu Kashidas controls selected text by @dotCooCoo in #5404
- Add Enclosing Lasso as an optional tool by @dotCooCoo in #5362
- Type: move right-to-left characters with Touch Type by @dotCooCoo in #5366
- Fix #5369: every way of opening a file focuses its open tab by @ruchirguitar in #5420
- MCP: render_preview and window captures decode the app's PNG under size limits by @dylanmtaylor in #5445
- Render: keep the native thread helper out of Wasm libraries by @dotCooCoo in #5430
- Reject doubly signed OpenType feature tags by @dotCooCoo in #5473
- Clear stale Find Font warning after successful replacement by @dotCooCoo in #5425
- Type: the stop inside an upright ligature on a vertical path follows its drawn cell by @dotCooCoo in #5468
- Resolve GDEF contour-point ligature carets by @dotCooCoo in #5452
- Use original wording for Action Options documentation by @dotCooCoo in #5433
- Docs: replace quoted help-page sentences with plain statements by @dotCooCoo in #5435
- Keep Blend reset after a dropped press by @dotCooCoo in #5434
- Keep dropped placement presses from creating dimensions by @dotCooCoo in #5432
- Measure tool: Shift keeps the end on the pointer's step after the grid rounds it by @dotCooCoo in #5438
- Edit Original: read PhotoCraft's App Paths entry as UTF-16 on Windows by @dotCooCoo in #5440
- Read compound effects when opening effect dialogs by @dotCooCoo in #5428
- Geometry: inverses and conjugates by small affines are no longer refused by @dotCooCoo in #5472
- DXF: paths of lines and circular arcs export as polylines with bulges by @dotCooCoo in #5466
- .ai save: errors and notes name the legacy or non-PDF-compatible .ai by @dotCooCoo in #5471
- Opening an already-open file: close Home, check read roots, wait for dialogs (#5369 follow-ups) by @ruchirguitar in #5437
- Bound work: flattening of huge curves, print layout past the page limit, script-check file names by @dylanmtaylor in #5443
- Path booleans: refuse out-of-range input, guard the contour pass, cuts report refusals (#5465) by @vangel76 in #5474
- Offset Path: skip far segments and stop early in the spurious-contour check (#5455) by @vangel76 in #5460
- Linear-time scans: Add Anchor Points, swatch library adds, export placements, width profiles, symbolism previews by @dylanmtaylor in #5441
- Trace: look up the smoothing weights instead of computing them per pixel (#5454) by @vangel76 in #5458
- Image Trace: noise removal keeps its regions in u32 arrays (#5462) by @vangel76 in #5467
- Image Trace: all_within hashes its grid cells with a small hasher (#5463) by @vangel76 in #5469
- Image Trace: fit the components of a layer in parallel, in chunks (#5464) by @vangel76 in #5470
- Check stroke.set params: a misnamed key is refused (#1442) by @FrancoJacquet in #5453
- About: credits tables fit without side-scrolling and their columns resize by @FredApps in #5449
- Window: New Window opens a second view of the current document by @dotCooCoo in #5461
- Select: the font Same commands take their reference from type that can be selected by @dotCooCoo in #5479
- Contextual Task Bar: type on a path offers Type on a Path Options by @dotCooCoo in #5480
- .ai import: objects that draw differently from the page come in as its art, and the layers stay by @dotCooCoo in #5486
- Add command to begin recording Actions by @dotCooCoo in #5488
- Control server: the junk-closes test leaves no unread input by @bflatastic in #5489
- Fix #2920: an open path in a PDF-compatible .ai opens as drawn by @mockydevs in #4616
- Restore Type editing after a dropped press by @dotCooCoo in #5490
- Toolbars: Manage Toolbars renames, copies and deletes the toolbars made with New Toolbar by @dotCooCoo in #5492
- Preview dimensions on placement press by @dotCooCoo in #5494
- EPS import: bound and charge the filter chain over a pending file by @dylanmtaylor in #5495
- Layers: Layer Options for several rows sends only the settings set in it by @dotCooCoo in #5496
- Fonts: cap the name records and decoded bytes read per name id by @dylanmtaylor in #5497
- 3D effects: every ring pair counts toward the containment budget; no zero-sized inflate cells by @dylanmtaylor in #5413
- .ai save: write editing data with layers, paths, colors and artboards by @dotCooCoo in #4968
- i18n(ka): Georgian for 23 new strings by @devius in #5431
- Docs: reconcile Kashidas and Type options parity by @dotCooCoo in #5436
- Docs: describe help-page behavior in our own words by @dotCooCoo in #5498
- Cap radar graph dimensions, resume slice-name suffix search, weigh plug-in cache keys by @dylanmtaylor in #5499
- Graphs: series marks keep a fill or stroke opacity when the graph is drawn again by @dotCooCoo in #5501
- .ai import: boxes of differing patches on an image-only page use the comparison raster's pixel size by @dotCooCoo in #5503
- .ai import: copies drawn by a layer's or group's look keep their type by @dotCooCoo in #5505
- Fix range text stroke weight defaults and scaling by @dotCooCoo in #5487
- Text Tweaker: refuse ranges that aren't whole bytes, make no step when nothing changes (#4924) by @ruchirguitar in #5509
- Symbols: Break Link keeps the instance's opacity mask by @dotCooCoo in #5506
- Select: the font Same commands take their reference from the type on a selected layer by @dotCooCoo in #5508
- Color controls: preserve working RGB components in numeric edits by @dotCooCoo in #5507
- MCP docs: vertical text uses vert alternates, and duplicate defaults to the current set by @dotCooCoo in #5513
- Actions: New Action leaves its set as the only selected set by @dotCooCoo in #5512
- Select: Same commands take their reference from an object that can be selected by @dotCooCoo in #5510
- Docs: cite where a group's or layer's effect comes from in the .ai look copies entry by @dotCooCoo in #5515
- .ai save: an artboard the document does not have is refused, as an export refuses it by @dotCooCoo in #5517
- Tests: the Color Picker's R, G and B fields show the working RGB values by @dotCooCoo in #5521
- Select: the font Same commands look through a selected group that holds the isolated group by @dotCooCoo in #5522
- Actions: exclude recorded steps from playback by @dotCooCoo in #5422
- Type: typing a list's start in a continued paragraph starts no list by @dotCooCoo in #5523
- Live Paint: preserve face colors at shared curved boundaries by @dotCooCoo in #5524
- Docs: name glows with shadows in the pan raster entry, and mark VectorCraft's own values by @dotCooCoo in #5527
- Add font-aware OpenType stylistic sets menu by @dotCooCoo in #5447
- Docs: Perceptual spot gradients with more than 4,096 curve stops export as images by @dotCooCoo in #5536
- Render: placed-document bitmaps draw undecoded-image marks when the view does by @dotCooCoo in #5535
- .ai import: the layers are compared with every page of a multi-artboard file by @dotCooCoo in #5533
- Layers: Layer Options keeps a Dim Images that was set before Template changes by @dotCooCoo in #5516
- Blends: Convert on a replaced spine changes only its handles by @dotCooCoo in #5538
- Type: Select All in a threaded frame selects the whole story by @dotCooCoo in #5542
- Select: Same Symbol Instance takes its reference from an object that can be selected by @dotCooCoo in #5511
- Expand: selected symbol instances become their art, as Break Link places it by @dotCooCoo in #5543
- Images: a PNG read a row at a time counts all of the reader's buffers by @dotCooCoo in #5556
- Type: list stylistic sets whose lookups come from FeatureVariations by @dotCooCoo in #5551
- .ai import: blends keep their Specified Distance and Smooth Color spacing by @dotCooCoo in #5554
- PDF/.ai import: the file is read and checked once when it opens by @dotCooCoo in #5552
- Control bar: the Global Edit Options dropdown shows while Start Global Edit can run by @dotCooCoo in #5553
- .ai import: brushes come in from the editing data by @dotCooCoo in #5046
- Single instance: the stale-endpoint test connects to no freed port by @bflatastic in #5562
- Fix #5555: Cmd+V pastes once on the web by @byoungyoon in #5561
- .ai import: objects come in bound to their variables by @dotCooCoo in #5481
- i18n: leading and Tracking term checks match whole words in the right label by @dotCooCoo in #5558
- Type: text commands refuse negative or fractional byte offsets by @dotCooCoo in #5537
- Panels: showing a hidden floating group returns its window's panels by @dotCooCoo in #5564
- Render: a long stroke is outlined only near the view after an edit by @dotCooCoo in #5563
- Document Color Mode: convert reusable paints and restore them with Undo by @dotCooCoo in #4517
- Select: the font Same commands skip type on a template sublayer by @dotCooCoo in #5566
- Render: node renders follow the anti-aliasing option by @dotCooCoo in #5567
- Shortcuts: a held Escape that cancels a Tools or ruler move skips the tool by @dotCooCoo in #5568
- .ai import: a brush object without a name counts as a brush left out by @dotCooCoo in #5569
- Object: Unselected Artwork keeps groups that hold a selected layer or a locked guide by @dotCooCoo in #5570
- Direct Selection: a marquee over a long path tests its segments without building a path for each by @dotCooCoo in #5571
- Tests: skip the Arabic Optical kerning test without craft-fonts by @dotCooCoo in #5572
- Canvas: a drag's release reads Backtick as it was at the button-up by @dotCooCoo in #5575
- Type: Done during a Cmd press does not save empty point type by @dotCooCoo in #5576
- Preferences: a Render Threads change before the first UI pass restarts the canvas renderer by @dotCooCoo in #5579
- Type: Kerning menu lists Auto and Optical for mixed kerning modes by @dotCooCoo in #5580
- Global Edit: the options dropdowns close when Global Edit starts by @dotCooCoo in #5583
- Select: describe which object Same Symbol Instance compares with by @dotCooCoo in #5577
- Dialogs: a color with an alpha part is refused instead of losing its alpha by @dotCooCoo in #5574
- Layers: a layer or gap color with an alpha part is refused instead of losing its alpha by @dotCooCoo in #5581
- Validate character style numeric dimensions by @dotCooCoo in #5540
- Navigator: Panel Options sets the view box color and draws dashed lines as solid by @dotCooCoo in #5541
- Character: Kerning reads (10+5)2 as nothing instead of 10+52 by @dotCooCoo in #5585
- Text Tweaker: align byte ranges to character boundaries by @dotCooCoo in #5586
- Keyboard Shortcuts: the backtick key's label ignores the next key's text on the web by @dotCooCoo in #5587
- Appearance: the active row is matched in each selected object on its own by @dotCooCoo in #5591
- Type: the font warning leaves out characters Missing Glyph Protection kept by @dotCooCoo in #5592
- Docs: list PDF spot gradients written as images in process colors by @dotCooCoo in #5593
- Gradient: method help names the PDF Separation and DeviceN shadings by @dotCooCoo in #5596
- Appearance: Add New Fill's params text says it copies the active row's paint by @dotCooCoo in #5589
- Font fields: handle wheel input in floating native windows by @dotCooCoo in #5597
- Native files: documents from before 0.21.0 keep their Twist turning as saved by @dotCooCoo in #5599
- PDF/.ai import: a file whose type all comes from its text document opens without its PDF part by @dotCooCoo in #5598
- Area Type Options: applying to several frames keeps each frame's own options by @mockydevs in #5602
- Fix #3759: vertical alignment buttons for area type in the Properties and Control panels by @mockydevs in #5100
- Commands: a color param with an alpha part is refused instead of losing its alpha by @dotCooCoo in #5603
- Fix #3226: copy and paste ruler guides by @mockydevs in #5085
- Fix #4921: Image Trace > Batch Trace Folder by @mockydevs in #5072
- Actions: Playback Options plays actions accelerated, step by step or with a pause between steps by @dotCooCoo in #5600
- Tests: the Render Threads restart test stays within the preference's range by @dotCooCoo in #5604
- PDF export: freeform gradients without points warn about spot stops by @dotCooCoo in #5605
- Type: Kerning menu checks neither method for a manual value by @dotCooCoo in #5606
- i18n: the package status stays English until the status bar shows it by @dotCooCoo in #5607
- Shortcuts: an Escape that cancels a Tools or ruler move runs no Escape command by @dotCooCoo in #5608
- Shape Builder Tool Options: a highlight color with an alpha part is refused by @dotCooCoo in #5609
- Appearance: Add New Fill and Add New Stroke params text match the code by @dotCooCoo in #5610
- Tabs: setting the stops a paragraph already has records no undo step by @dotCooCoo in #5611
- Fix #5483: a large font library no longer keeps the window from opening by @mockydevs in #5613
- Tests: the opening queue tests wait on the worker's signal instead of the clock by @dotCooCoo in #5615
- Character: Kerning reads (10+5) with a manual value too by @dotCooCoo in #5616
- Accessibility: screen readers can set a dialog slider's number by @dotCooCoo in #5617
- New Document: units belong to the chosen preset, not the whole tab by @FractalEncrypt in #5614
- Tests: the font menu and idle-socket tests don't fail on a busy machine by @bflatastic in #5624
- Gradient: Perceptual spot ink mixes stay continuous from red to blue by @dotCooCoo in #5618
- Type: Touch Type moves an upright character in vertical type down and across its column by @dotCooCoo in #5619
- Type: baseline shift moves an upright glyph across the column in vertical type by @dotCooCoo in #5620
- Gradient: PDF shading notes name linear and radial gradients and DeviceN by @dotCooCoo in #5621
- Fix #5502: Export As PNG exports the active artboard, not always the first by @mockydevs in #5623
- Symbols: the quick box of a 9-slice instance holds art its guides move by @dotCooCoo in #5625
- Symbols: saving leaves out a nested editing layer and keeps layers named in file data by @dotCooCoo in #5626
- i18n: a count in a translated message matches only a number by @dotCooCoo in #5627
- Docs: type-parity lists manual tate-chu-yoko once by @dotCooCoo in #5629
- Type: right-to-left manual kerning keeps whole-point spacing on both sides by @dotCooCoo in #5628
- OpenType: a menu choice at a Type tool caret reaches every character by @dotCooCoo in #5631
- Select: All on Same Layers takes the layers of objects that can be selected by @dotCooCoo in #5634
- Fix #5160: a slow first frame is waited for, not blamed on the graphics adapter by @mockydevs in #5635
- Tests: a file placed while idle renders on the test thread by @dotCooCoo in #5637
- Plug-ins: color parameters, and filters that make guides and lock by @d8abyte-dk in #5630
- .ai save: the editing copy keeps transparency, clipping and opacity masks by @dotCooCoo in #5639
- Glyphs panel: alternates for the current text selection by @dotCooCoo in #5442
- Type: Tate-chu-yoko Settings refuses a value that is not a length by @dotCooCoo in #5640
- Geometry: the nearest point on a long path skips segments whose box is farther than the best found by @dotCooCoo in #5643
- File dialogs: Open and Place list files with capitalized extensions on Linux by @dotCooCoo in #5644
- File formats: Pixar tile pointers into the header or tile table are refused by @dotCooCoo in #5645
- Select by Artboards: select objects overlapping, inside or outside chosen artboards (#5525, #5548, #5549) by @ruchirguitar in #5633
- Docs: the byte-offset rule names only commands that take a range by @dotCooCoo in #5649
- About: let every credits column be dragged and refit changed tables by @FredApps in #5650
- Canvas: Space during a tool's drag keeps the tool's cursor by @sadkotheguest in #5651
- Tests: native menu tests wait for the installed fonts' scan by @dotCooCoo in #5653
- Appearance: Add New Fill and Add New Stroke comment names the paint they take by @dotCooCoo in #5652
- Control bar: the inline X, Y, W and H fields show only when they fit by @dotCooCoo in #5655
- Images: a PNG read a row at a time counts the reader's buffer while it grows by @dotCooCoo in #5656
- Glyphs: the default glyph can be chosen back under a substituting feature by @dotCooCoo in #5657
- Tests: an RGB spot color converts with Document Color Mode and stays spot by @dotCooCoo in #5659
- Select by Artboards dialog: a plain click keeps artboards the search hides by @ruchirguitar in #5662
- i18n(fi): translate the 5 labels Finnish lacks by @Janiz-zzz in #5664
- Plug-ins: compound guides aren't filter inputs; colors follow the working RGB space by @d8abyte-dk in #5665
- About: refit credits tables on what they measure by @FredApps in #5667
- Tabs: setting the stops a paragraph already has ends the typing session by @dotCooCoo in #5668
- Keep drawing cursor during mid-drag Cmd+Space by @dotCooCoo in #5669
- Character: Kerning refuses (1,000) instead of reading it as 1 by @dotCooCoo in #5670
- Package: name every font left out when no dialog is shown by @dotCooCoo in #5671
- Gradient: Perceptual PDF help counts stops as written, CMYK documents included by @dotCooCoo in #5672
- Glyphs: a character with a combining mark reports the glyph it is drawn with by @dotCooCoo in #5674
- Glyphs: overflowing vertical type keeps a chosen default glyph by @dotCooCoo in #5676
- Tooling: reject numeric prerelease leading zeros by @MMexicann in #5678
- Tests: the link-watch and place tests wait for the link scan instead of sleeping by @dotCooCoo in #5679
- Preserve styled text after copying a Type range by @dotCooCoo in #5680
- Pathfinder: holes that touch at a point stay holes of their region by @bflatastic in #5683
- Numeric fields: 1,000% in a size field is refused by @dotCooCoo in #5682
- Preferences: Data Recovery's Folder gets a Choose button by @dotCooCoo in #5681
- Symbols: quick boxes hold art that nested 9-slice guides move by @dotCooCoo in #5685
- Fix #5336: Optical kerning spaces pairs by the font's own stem spacing by @ruchirguitar in #5686
- Render: a long dashed stroke is outlined only near the view after an edit by @dotCooCoo in #5690
- Gradient: Perceptual PDF help says an RGB destination keeps RGB stops in RGB by @dotCooCoo in #5691
- Appearance: edits to the active row reach the matching row in each selected object by @dotCooCoo in #5692
- Glyphs: the Glyphs query reports a consonant's glyph, not its vowel sign's by @dotCooCoo in #5697
- Use destination style for external same-text paste on Windows by @dotCooCoo in #5696
- Transform Each: Relative and Absolute scaling, the scale link, and the documented panel order by @FractalEncrypt in #5695
- Find Font: Replace With Font lists family and style rows by @sadkotheguest in #5677
- Layers: thumbnails of long paths are drawn off the UI thread by @dotCooCoo in #5700
- Glyphs: a consonant's ligature in a cluster with its vowel sign is its glyph by @dotCooCoo in #5701
- Pass the Linux signing key to the release workflow by @dylanmtaylor in #5702
- Fix tinted symbol colors in Expand Appearance by @dotCooCoo in #5703
- Keep symbol colors when expanding a hidden tint by @dotCooCoo in #5704
- Layers: opacity masks and edited objects count toward the thumbnail anchor limit by @dotCooCoo in #5705
- Render: the frame after anchors of a long path move updates only the segments that touch them by @dotCooCoo in #5706
- Glyphs: the Glyphs query reports the glyph of an overflowing character by @dotCooCoo in #5707
- Menus: Delete Empty Artboards and Save Gradient Preset decide their enabled state with less measuring by @dotCooCoo in #5708
- Type: Paste keeps a copy the system clipboard refused by @dotCooCoo in #5709
- Control server: close connections gracefully, so a reply is not lost to a reset by @bflatastic in #5716
- Docs: describe what a Layers row shows while its first thumbnail renders by @dotCooCoo in #5711
- Glyphs: a character's glyph is the first of its glyphs in its cluster by @dotCooCoo in #5712
- Symbols: an instance fill with no opacity keeps the art's swatch links by @dotCooCoo in #5717
- Glyphs: the Glyphs query reports the fallback glyph of an overflowing character by @dotCooCoo in #5718
- Type: a copy elsewhere during a refused write wins the paste by @dotCooCoo in #5719
- SVG export: type with Mojikumi and no Japanese characters is laid out once by @dotCooCoo in #5720
- Glyphs: a fallback face's consonant glyph is reported, not its vowel sign's by @dotCooCoo in #5721
- Type: a refused copy is dropped when a textless clipboard can't track it by @dotCooCoo in #5722
- Tests: the Type › Font menu test waits for the installed fonts' scan (#5647) by @mockydevs in #5723
- PDF import: a DeviceN gradient of a spot ink over process plates keeps the ink and the plates, and PDF export writes it as DeviceN again (#3235) by @mockydevs in #5724
- Isolation mode: a locked or hidden layer keeps the isolated art from clicks and marquees (#5309) by @mockydevs in #5726
- Numeric fields: a decimal comma works in arithmetic next to a number with a point (#5684) by @mockydevs in #5727
- Color Halftone: Max Radius in pixels of the raster effects resolution by @datatimp in #4784
- Effects: Expand Appearance makes each copy of a path's Transform effect an object of its own (#5612) by @mockydevs in #5728
- Layers: heavy type, symbols, meshes and images get their first thumbnail off the UI thread on the desktop by @dotCooCoo in #5730
- Artboards: Shift- and Ctrl/Cmd-click in the Artboards panel select several artboards with any tool, and Fill applies to all of them (#5698) by @mockydevs in #5731
- Render: a moved path reuses its stroke outline by @dotCooCoo in #5732
- Set Corners: round all, odd-numbered or even-numbered anchors (#5546) by @mockydevs in #5733
- fix(ui): avoid duplicate cursor without Wayland theme by @makzumi in #5734
- Control bar and task bar: idle frames borrow the selected object instead of copying it by @dotCooCoo in #5735
- Gradient panel: Delete Stop sits beside the ramp, so a short panel no longer hides it (#5403) by @mockydevs in #5736
- Set Corners: round only the corners in an angle range (#5545) by @mockydevs in #5737
- Fix #5532: Release Type on a Path splits type on a path into point type and its path by @ruchirguitar in #5738
- Preferences: Additional Plug-ins Folder gets Choose…, and OK checks typed folders by @dotCooCoo in #5741
- Render: at very large coordinates an edited path is not taken for a moved one by @dotCooCoo in #5743
- Rasterize: Color Model is a dropdown of the document's model, Grayscale and Bitmap (#5660) by @mockydevs in #5747
- Keep Pencil and Paintbrush Fidelity in screen pixels at any zoom by @Silvertree2010 in #5748
- Document tabs: drag a tab along the strip to reorder the open documents (#5663) by @ruchirguitar in #5749
- Part of #394: each run hyphenates in its own language; Default Language sets new type's by @jo-quast in #2818
- Global Edit: the enabled check decides without normalizing every anchor by @dotCooCoo in #5751
- Contour: live offset tool with a floating bar and its own icon by @K1nsmark in #5694
- MCP: pointer_gesture waits for a key sent before it by @dotCooCoo in #5753
- MCP: remote press_key does not run single-key shortcuts by @dotCooCoo in #5754
- Line a moved selection's edges up with ruler guides by @Silvertree2010 in #5755
- Render: a moved path reuses its gradient stroke slices by @dotCooCoo in #5756
- Compound shapes default by @K1nsmark in #5757
- Layers: the shown document's thumbnails are not held up by another document's queue by @dotCooCoo in #5758
- Fix #5526: select images by link status by @ruchirguitar in #5759
- Render: adding or deleting an anchor of a long path splices the kept path by @dotCooCoo in #5744
- Shape Builder: a merge or erase takes the stretch of every coincident line by @dotCooCoo in #5761
- MCP: pointer_gesture rejects a backquote that is not a boolean by @dotCooCoo in #5762
- SVG export: numbers are written from integers, not through the exact float formatter by @dotCooCoo in #5763
- Tests: the Devanagari fallback-glyph test passes when the fallback face substitutes the vowel sign by @dotCooCoo in #5764
- Type: text cleanup and Convert to Text act on every frame of a selected story by @dotCooCoo in #5766
- MCP: a given-up pointer request no longer holds back later requests by @dotCooCoo in #5768
- .ai save: guides in the editing copy end with the guide operator only by @dotCooCoo in #5770
- .ai save: the editing copy keeps gradients and patterns by @dotCooCoo in #5771
- MCP: pointer_gesture fails when the input sent before it is dropped by @dotCooCoo in #5772
- Document tabs: views stay with their documents when one batch closes and moves documents (#5663) by @ruchirguitar in #5774
- .ai import: object tags open as each object's URL and data by @dotCooCoo in #5775
- .ai/EPS import: type that names no style takes the normal styles by @dotCooCoo in #5777
- #1280: perf --deep measures pointing; PathData::bounds builds no path by @FredApps in #5778
- .ai import: version 7 linked images open as linked images with a placeholder by @dotCooCoo in #5779
- Keep font wheel input with the top native panel layer by @dotCooCoo in #5780
- #1280: PathData::bounds closes a NaN anchor as kurbo does; the perf row names what it times by @FredApps in #5781
- MCP: given-up stale pointer requests do not use up a frame's request limit by @dotCooCoo in #5782
- .ai import: area type with linked areas opens as threaded frames by @dotCooCoo in #5783
- .ai save: the editing copy keeps images and linked files by @dotCooCoo in #5784
- .ai save: new gradient names continue from the last one given by @dotCooCoo in #5786
- Panels: a floating palette keeps out of the way of modal dialogs and menus by @sadkotheguest in #5787
- perf(pathops): optimize Pathfinder Trim, Crop and Merge with batched face classification (#4503) by @el-j in #4511
- Refresh Find Font warnings after document changes by @dotCooCoo in #5773
- .ai import: several clipping paths clip to their intersection by @dotCooCoo in #5789
- .ai import: 1-bit image masks open colorized by their fill color by @dotCooCoo in #5790
- Layers panel: a layer that does not print shows its name italic by @sadkotheguest in #5791
- Export: raster output defaults to the document resolution by @KnottyDyes in #3071
- .ai import: type with the older TS, Te and TM operators opens by @dotCooCoo in #5792
- fix(pathops): bound offset path complexity and handle arrangement failure safely (#4145) by @el-j in #4345
- M2.1: copy and cut direct-selected segments and anchors as independent paths (#2122) by @el-j in #3903
- .ai import: a re-encoded font's own encoding pairs decode its type by @dotCooCoo in #5793
- Keep Group Selection drags on the selected outlined component by @FractalEncrypt in #3272
- Preserve raster coverage of thin curved strokes by @FractalEncrypt in #3273
- Reject malformed Batch Trace Folder options by @dotCooCoo in #5794
- Release Layers thumbnails when a document closes by @dotCooCoo in #5795
- i18n(ka): Georgian for 1 new string by @devius in #5798
- Actions: loading an action set checks its size before reading it by @dotCooCoo in #5799
- .ai import: gradients and patterns are named up to the newline in their names by @dotCooCoo in #5800
- .ai import: legacy type used as a mask clips its clipping group by @dotCooCoo in #5801
- Stop queued Layers thumbnails when both thumbnail panels are hidden by @dotCooCoo in #5802
- Tests: the read_file_head test creates its file exclusively and removes it on failure by @dotCooCoo in #5803
- Disable Object > Path items when no path is selected by @Silvertree2010 in #5805
- Color Effects: Apply Fill to Stroke and Apply Stroke to Fill (#5530) by @Hamza0101 in #5776
- Layers: closing a document drops its running thumbnail job's image by @dotCooCoo in #5806
- Links: a classic Mac OS path is named by its file name by @dotCooCoo in #5807
- .ai import: the file opens on its active artboard by @dotCooCoo in #5808
- Fix thumbnail work for active collapsed flyout tab by @dotCooCoo in #5809
- Preserve queued key order before MCP tool selection by @dotCooCoo in #5810
- .ai import: legacy type keeps its tab stops by @dotCooCoo in #5811
- .ai import: 6D Art Pen brushes open live, and Windows reads pen tilt and rotation (#372) by @Locme in #5815
- Images: a colorized image's missing-link placeholder shows in its own colors by @dotCooCoo in #5817
- Skip unused path bounds during SVG export by @dotCooCoo in #5818
- Clean up temporary files in desktop tests by @dotCooCoo in #5819
- Add-on: 3D Box tool and context-sensitive customizable shape controls by @odysseexp in #5765
- Docs: the .ai editing-data checklist lists how several clipping paths clip by @dotCooCoo in #5821
- Pencil: a new stroke with Keep selected off leaves nothing selected (#5752) by @sadkotheguest in #5822
- Avoid measuring selected art twice for library paint by @dotCooCoo in #5823
- .ai import: version 7 pattern fills in brush art use their operands by @dotCooCoo in #5824
- Skip path rebuild for single-stroke Eyedropper samples by @dotCooCoo in #5825
- Links: Find Linked Files resolves parent folders in a saved path by @dotCooCoo in #5826
- Appearance: Delete Selected Item on an Opacity row sets it back to Default (#5742) by @mockydevs in #5827
- Libraries: spot colours stay spot colours in every document (#5812) by @mockydevs in #5829
- Links: params text and MCP docs say parent folders are resolved by @dotCooCoo in #5830
- .ai import: graphic style libraries open with their styles by @dotCooCoo in #5831
- Selection: a hover checks the bounds memo once, not once per object by @FredApps in #5832
- .ai import: objects other than type keep some Distort & Transform effects live by @dotCooCoo in #5833
- Type: Show Snap to Glyph Options scrolls the Character panel to the options (#5273) by @mockydevs in #5834
- Links: the hashing limit reads 1 GiB in the docs by @dotCooCoo in #5836
- Dialogs: the header that moves a dialog keeps the arrow cursor until dragged (#5246) by @mockydevs in #5837
- .ai import: symbols and their instances open live by @dotCooCoo in #5838
- Shape tools: a shape just drawn shows its bounding box and Live Shape widgets, and its corner and pie widgets drag with the shape tool (#5477) by @mockydevs in #5839
- Effect dialogs: a colour swatch beside a hex colour opens the Color Picker (#5365) by @sadkotheguest in #5843
- Images: a reduced image is shrunk before it is separated into ink planes (#4155) by @simonhull in #5845
- Type: Enter, arrows, Home, End, Tab and the clipboard apply in order with the frame's text by @dotCooCoo in #2636
- Control bar: Paragraph options while type is selected (#5372) by @ZIDAN44 in https://github.com/storytold/vectorcraft/pull/5847
- Canvas: a document's first frame renders on the render worker (#4155) by @simonhull in https://github.com/storytold/vectorcraft/pull/5848
- Tests: the first-frame worker test tolerates another test's placed document by @bflatastic in https://github.com/storytold/vectorcraft/pull/5853
- SVG import: a clipPath's children clip to their union, each under its own clip-rule (#5840) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5849
- Join tool: scrubbing the ends of two crossing paths trims them and joins the paths at the crossing (#5844) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5850
- Direct Selection: Cmd/Ctrl held lends the Selection tool and shows its bounding box (#3901) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5851
- SVG import: textLength and lengthAdjust fit text to its length (#5842) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5852
- Blend spine: Shift-click picks several spine points, which drag together (#5285) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5854
- SVG import: clip path on clipPath children clips child silhouettes before union (#5841) by @kk376 in https://github.com/storytold/vectorcraft/pull/5855
- Images: an image zoomed in on has its colours made only for the tiles in view (#4155) by @simonhull in https://github.com/storytold/vectorcraft/pull/5856
- Intertwine: the object brought over leaves no hairline of the one below (#5337) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5857
- Properties: Quick Actions has Repeat Options for a selected repeat (#5181) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5858
- Effects: an image's Inner Glow follows its visible pixels, not its frame (#5308) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5859
- Variables: Load Variable Library keeps a bound text variable the library declares (#4136) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5860
- Tests: two canvas tests render on their own thread by @bflatastic in https://github.com/storytold/vectorcraft/pull/5862
- Scrubby labels: the Control bar's Stroke: and Opacity: links scrub their fields (#4088) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5861
- Tests: the Cmd bounding box test clears its texture delta by @bflatastic in https://github.com/storytold/vectorcraft/pull/5864
- Properties: Edit Artboards shows a Transform section above the artboard options (#5219) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5863
- Reuse text outlines across moves by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5865
- Rebuild fitted text geometry after scaling by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5866
- Reject invalid Slice toggle parameters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5867
- Reuse selected object locations for large transforms by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5868
- Reject invalid Transparency Grid parameters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5869
- .ai import: symbol, pattern and brush definitions share the file's blend and envelope limits by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5871
- Reject invalid Guide Lock parameters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5872
- Speed up hover hits on long plain paths by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5873
- Reject invalid New Art Basic parameters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5874
- Direct Selection: the cursor reuses the hit result over a path by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5879
- Docs: the .ai notes no longer list guides as a known failure by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5880
- Selection: empty-canvas hover skips distant widgets in large selections by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5881
- i18n: add Hindi interface and message catalog by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/5882
- Tests: a fitted text test changes its fit scale by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5884
- Rendering: open width-profile strokes outline only near the view by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5883
- .ai import: legacy type keeps one copy of tab stops its paragraphs share by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5885
- .ai import: a file whose editing data has no layers also opens on its active artboard by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5886
- Commands: true/false flags reject other values everywhere by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5888
- Docs: .ai symbols are read with the file's layers by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5892
- Text: empty later frames preserve an edited paragraph style by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5893
- fix(eps): bitshift by the most negative integer no longer overflows on negation by @jayzed80 in https://github.com/storytold/vectorcraft/pull/5894
- i18n(sv): translate 1432 new strings, use the agreed terms in 2 by @kler in https://github.com/storytold/vectorcraft/pull/5895
- Automation roots: refuse COM¹ to LPT³ as Windows device names by @adikshan11 in https://github.com/storytold/vectorcraft/pull/5896
- Text: a restyled empty frame keeps its style before an unedited empty frame by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5897
- Layers: F2 renames the selected layer, group or object (#5324) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5828
- Reject invalid Tab Stop string parameters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5899
- Blend spine: moveAnchor refuses
withalongsidehandle; spine built once per overlay and drag by @mockydevs in https://github.com/storytold/vectorcraft/pull/5904 - .ai import: a pattern or color named as another swatch keeps its swatch by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5903
- SVG import: gradients with color-interpolation="linearRGB" mix their stops in linear light (#5878) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5905
- Legacy .ai export: black-and-white colorized images save as image masks by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5906
- PDF and .ai export: objects' URLs become clickable links (#5785) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5908
- SVG import: Gaussian blurs keep color-interpolation-filters; Gaussian Blur can blur in linear light (#5877) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5909
- Stroke Weight Up and Down: Cmd/Ctrl+Alt+. and , step the selected strokes' weight (#5797) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5910
- SVG import: filter and mask regions clip what they declare (#5876, #5875) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5913
- Keep the other library when two names share a file name by @adikshan11 in https://github.com/storytold/vectorcraft/pull/5914
- Keep a symbol's options when pasting it into another document by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/5915
- Drop Shadow and Outer Glow: spinner arrows step Opacity, the offsets, Blur and Darkness (#5367, #5368) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5916
- Copy the shared house rules into AGENTS.md by @FredApps in https://github.com/storytold/vectorcraft/pull/5923
- Path booleans: check the windings against the operands' areas and resolve the operands when they don't add up (#5478) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5917
- Drop Shadow: a swatch beside Color opens the Color Picker (#5364) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5918
- Find and Replace: type inside a locked or hidden group is left alone (#5900) by @Hamza0101 in https://github.com/storytold/vectorcraft/pull/5921
- Find Whole Word: a change of style inside a word is not a word boundary (#5901) by @Hamza0101 in https://github.com/storytold/vectorcraft/pull/5922
- fix(text): a gutter too huge to step past no longer stalls area type layout by @jayzed80 in https://github.com/storytold/vectorcraft/pull/5924
- Effects: a Transform effect's copies of a filled and stroked path stack one above another by @mockydevs in https://github.com/storytold/vectorcraft/pull/5927
- Don't copy a library on every save when its format keeps no title by @adikshan11 in https://github.com/storytold/vectorcraft/pull/5928
- Perspective grid: a grid dragged off its preset reports no preset name by @mockydevs in https://github.com/storytold/vectorcraft/pull/5931
- Type: pin that a Type-range paste into new point type keeps its formatting (#5929) by @Hamza0101 in https://github.com/storytold/vectorcraft/pull/5932
- Snap to Glyph: each glyph's bounding-box corners are snap points, and the box turns with rotated type by @mockydevs in https://github.com/storytold/vectorcraft/pull/5937
- 3D effects: Extrude & Bevel, Inflate and Rotate apply to groups, turned about one shared axis by @mockydevs in https://github.com/storytold/vectorcraft/pull/5938
- Type: Alt + numeric-keypad codes (Alt+0176 → °) type their character on Windows; type.insert takes a code by @mockydevs in https://github.com/storytold/vectorcraft/pull/5939
- Appearance and Eyedropper: reading an object's paint does not measure its bounds by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5940
- Paste: cells copied from a spreadsheet paste as a table of type over gridlines by @mockydevs in https://github.com/storytold/vectorcraft/pull/5942
- Direct Selection: with Snap to Grid, a dragged straight segment lands its anchors on the grid by @mockydevs in https://github.com/storytold/vectorcraft/pull/5947
- Languages: Bulgarian, with its quote marks and the fonts' Bulgarian forms (#5945) by @Hamza0101 in https://github.com/storytold/vectorcraft/pull/5948
- Opening a slow file shows a progress window with Cancel and Continue in Background by @mockydevs in https://github.com/storytold/vectorcraft/pull/5950
- .ai save: the editing copy names the active artboard by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5951
- .ai import: the other Effect › Pathfinder operations open as live effects on a group by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5952
- Legacy .ai export: a flattened transparent image's clip follows its edge smoothly by @mockydevs in https://github.com/storytold/vectorcraft/pull/5953
- Type: layout keeps each font face's shaping plans by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5955
- UI: centre the Home screen and use the accent for the Discord button (#4684) by @SofiaAFigueredo in https://github.com/storytold/vectorcraft/pull/4732
- Transform fields: Tab moves from one field to the next, one press each by @FractalEncrypt in https://github.com/storytold/vectorcraft/pull/5957
- Shape tools: move the selection from its centre point and turn it outside a corner by @FractalEncrypt in https://github.com/storytold/vectorcraft/pull/5958
- .ai import: ASCII85 data in a section does not hide the section's end by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5959
- PDF export: members of a plain group or layer are measured once to leave out off-page art, and the link walk measures only what it reads by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5963
- .ai import: envelopes map from their stroked box when the file saves its size by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5966
- .ai import: paths with an Art brush open with the brush on their stroke by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5967
- Fix #5714: widths run smoothly between width points by @slafebre in https://github.com/storytold/vectorcraft/pull/5968
- Type: switching to the Eyedropper keeps a whole-story selection by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5969
- Part of #5964: stroke gradients cover an arrowhead to the end of its reach by @slafebre in https://github.com/storytold/vectorcraft/pull/5971
- Canvas: selection outlines and anchors are reused between frames by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5972
- .ai save: the editing copy keeps type as type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5965
- Add hyphenation for eleven Indian languages by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/5946
- SVG: centred and right-aligned type on a path keeps its place by @kylekanouse in https://github.com/storytold/vectorcraft/pull/5977
- .ai import: images, meshes, blends and styled objects keep the knockout shape flag by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5978
- Links: a link check whose worker ends without a result no longer stops later checks by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5982
- Artboards: the panel menu's New Artboard makes the new artboard active by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5986
- Docs: PDF password export says when the file ID and the bytes vary by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5989
- .ai import: opacity mask art of one object opens as that object by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5990
- Save: notes on unread save options name the legacy or non-PDF-compatible .ai, in every save command by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5993
- EPS import: bind leaves the procedures it already bound alone (Ghostscript eps2write files open) by @mockydevs in https://github.com/storytold/vectorcraft/pull/6000
- EPS import: SubFileDecode reads counts past 4 MiB (eps2write files with long streams open) by @mockydevs in https://github.com/storytold/vectorcraft/pull/6001
- EPS import: cvi and cvr read radix numbers (eps2write spot colours with spaces) by @mockydevs in https://github.com/storytold/vectorcraft/pull/6002
- EPS import: an image too large to read skips its data instead of failing the file by @mockydevs in https://github.com/storytold/vectorcraft/pull/6003
- Image Trace: the logo fitter keeps no piece over its tolerance by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6008
- Artboards: the Artboard tool's canvas menu cuts, copies, pastes, renames, rearranges and exports artboards by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5983
- Offset Path: the spurious-contour check tests only the source segments near each contour by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5988
- Dialogs: a held Enter or Escape stops at the dialog it opened or closed by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6004
- Preferences: prefs.set refuses a missing or unusable recovery or plug-ins folder by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6005
- EPS/.ai editing data: symbols defined before the art styles take them by @mockydevs in https://github.com/storytold/vectorcraft/pull/5992
- EPS/.ai editing data: blends with no spine written come in live by @mockydevs in https://github.com/storytold/vectorcraft/pull/6011
- EPS/.ai editing data: a transparency set inside a clipping group stays after it by @mockydevs in https://github.com/storytold/vectorcraft/pull/6014
- .ai import: drawn looks in pattern and brush art count in the note by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6017
- Type: story-wide panel changes follow the story's current thread by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5985
- .ai import: legacy type keeps its writing direction, Tate-chu-yoko runs and upright Roman characters by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6012
- vectorcraft-web: window.vectorcraft takes its request functions from craft-web-api by @helenkwok in https://github.com/storytold/vectorcraft/pull/6015
- Release: refresh contributor credits for each release (#5997) by @Luis-0508 in https://github.com/storytold/vectorcraft/pull/5998
- #5980: macOS save sheet uses alloc/init instead of +savePanel by @BOXELS in https://github.com/storytold/vectorcraft/pull/5984
- Engine: execute refuses keys a command doesn't name, in every build by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5890
- .ai save: a reopened file opens on the artboard active when it was saved by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5975
- Artboards: duplicate, copy, cut, move and rearrange journal whether locked and hidden art goes by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5994
- Simplify: fitted curves stay within the tolerance of the path, and serpentines simplify faster by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5995
- .ai import: type on a path keeps its effect, alignment and flip by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5996
- .ai import: spot colors in a kept brush's art become swatches by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6006
- .ai save: the editing copy keeps variables, data sets and bindings by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6024
- Actions: Insert Stop pauses playback and shows a message by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6028
- Color fields: a pasted hex code replaces the field's digits by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6030
- .ai import: a filled clipping path keeps its fill by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6032
- Dimension tool: Expand keeps a dimension as plain art after it moves by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6033
- .ai import: legacy overflow breaks keep the direction and paragraph attributes they were read with by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6034
- Fix #5347: a floating panel's menu scrolls inside its window by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6036
- Menus: Delete Empty Artboards' enabled check does not walk the document every frame by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6037
- Panels: floating panels reopen on the monitor where they were left by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6038
- Paste: skips relinking copies with no renames, global swatches or styles, and finds type in one walk by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6044
- i18n: the Turkish params and effect errors name their own keys by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6045
- Tests: the Mac menu bar tests do not depend on fonts other tests install by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6046
- Fix #5813: floating panels hide while a tool group's flyout is open by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6049
- Panels: long swatch, preset and Add New Effect popups scroll inside a short window by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6050
- Docs: the stroke outline reuse line is listed once by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6051
- Menus: the wasm build has no unused import warning for menu_open by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6053
- Open: the first frame drawn after the open uses the layouts it made for type objects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6054
- i18n: Turkish error messages keep the parameter keys they name by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6055
- Tests: the shape builder and large edit guards count work instead of timing it by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6056
- PDF export: warn when a PDF/X file leaves out the document's bleed by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6057
- Font menu: the wasm build has no unread wheel-field warnings by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6058
- Keyboard Shortcuts: Export Text saves the shortcut list as a text file by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6068
- Graphs: Appearance commands and the Eyedropper update a series' stored paint by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6069
- Canvas: a pan by whole pixels copies the pixels that stay on screen by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6070
- Selection: a group dragged with Real-time Drawing off shows each member's outline by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6073
- History: the New Document button makes a document from the selected state by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6074
- Tests: the CSS, glow and .ai Zstandard guards count work instead of timing it by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6075
- Symbols: Reset Transformation returns an instance to its symbol's scale, rotation and shear by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6076
- Fix #5816: CJK and other fallback faces in the interface sit on the Latin baseline by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6079
- Type: Cmd+Enter (Ctrl+Enter) ends text editing and keeps the text by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6080
- i18n: error messages keep the keys and values they name without backticks by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6081
- Type: layout looks up each style run's face once by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6082
- Smart Guides: Snap to Last Location puts a moved selection back where it began by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6086
- Shortcuts: export, import, set, list and preset reject a param of the wrong type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6087
- Preferences: a search field finds a setting and goes to its category by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6088
- .ai import: type on a later page of a PDF of some artboards goes to its artboard by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6091
- Canvas: moving anchors of a long path redraws only around them by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6092
- Object: Reset Bounding Box also squares the objects inside the selection by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6095
- Path ops: stroke outlining and unions sweep long, low paths along their length by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6097
- Tests: huge-selection vertex counts leave out the art's raster by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6102
- SVG import: each linked file keeps image keys of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6103
- Control bar: the panel menu and the gripper dock it to the top or the bottom of the window by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6090
- Color: Recent Colors keeps the last 30 colors used, across documents by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6108
- .ai import: legacy type in CJK fonts decodes by the font's CMap by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6114
- Type: find and replace and Type menu commands reject a param of the wrong type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6116
- Artboard Options: Fade Region Outside Artboard darkens the area outside the artboards by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6118
- Image Trace: buttons above the Preset menu choose the Auto Color, High Color, Low Color, Grayscale, Black and White and Outline presets by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6119
- Links: links inside symbols, patterns and masks follow a moved folder and are updated like links in the layers by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6120
- Build: linesweeper from craft-libs' vendored copy at 481f66d by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6122
- Envelopes: commands reject a style, orientation or preserveShape of the wrong type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6124
- Fix #6110: pattern brush corner tiles line up with the side tiles by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6126
- Flattening: stop building a group's regions at the first one past the region limit by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6127
- Color management: commands reject a param of the wrong type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6129
- Blend: Smooth Color counts a step per level of color change by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6130
- .ai import: warped type that draws differently from the file opens as its drawn art by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6133
- Text styles: load character and paragraph styles from another document by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6141
- PDF import: cropTo, password, colorMode and textAs reject a value of the wrong type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6142
- .ai save: the editing copy keeps live effects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6150
- Fields: Tab moves from a field to the next past its spinner and preset chevron by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6151
- 3D and Materials: Window › 3D and Materials edits the selection's 3D effect in place by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6153
- JavaScript: vectorcraft-js parses ES5 scripts into a syntax tree, checked with cargo xtask test262 by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6155
- Reference point: the locator is one Tab stop, and the arrow keys move the point by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6159
- Commands: an id that is not an object id is refused by commands that otherwise use the selection by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6163
- Shortcuts: holding a tool's single-key shortcut uses the tool until the key is let go by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6172
- Envelopes: type maps from its glyph outline bounds by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6173
- Plug-ins: manifests list permissions, the user grants them at install, and the host enforces the grant by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6176
- Swatches: Add Used Colors, Select All Unused and new swatch naming use hash lookups for colors and names by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6177
- Links: Relink can replace all instances, the folder's missing links or each link separately by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6182
- .ai import: legacy binding punctuation opens as Burasagari's Force setting by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6183
- Plug-ins: API level 2 lets a plug-in report progress, see Cancel and write log lines by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6184
- Dialogs: New Workspace and New Toolbar fit their contents instead of opening 420 pt tall by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6186
- Color: Generic CMYK separates nearby colors alike when an ink sits at 0 or 100% by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6187
- .ai import: Scatter brushes in Tints open in Tints, and brush art drops its frame by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6188
- Plug-ins: a run keeps the fuel left in a slice at a bulk memory instruction by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6190
- Fix #2786: the web build uses WebAssembly SIMD, so the canvas renders about 2.5x faster by @vangel76 in https://github.com/storytold/vectorcraft/pull/5284
- SVG: keep CSS classes of imported elements on export (#2414) by @vangel76 in https://github.com/storytold/vectorcraft/pull/2480
- Variables: a second text variable on one type object is refused by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/2642
- Image Trace: Flat Logo can trace only the named colors, without a white of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/3946
- Document: document.compare measures how far an artboard's render is from an image by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/3995
- Image Trace: Expand can group the traced paths by color by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/4058
- Actions: Batch over data sets keeps Save and Close and warns when each data set saves over one file by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5015
- Canvas: a General option makes Cmd/Ctrl-wheel scroll the canvas sideways
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5023 - Paragraph: Reset Panel also resets the Mojikumi Set and tab stops
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5025 - Type: Type Orientation is a setting of the whole thread
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5027 - Render: the decoded-image cache can grow to a quarter of installed memory on every desktop OS
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5034 - Type: add a VectorCraft preference for typed list detection
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5039 - Type: typed
+,#and>start lists with a hollow circle, square and dash
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5040 - Shortcuts: F2, F3 and F4 also cut, copy and paste on Windows and Linux
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5041 - Perspective grid: Snap to Grid moves objects at every depth by one plane offset by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5196
- Drawing tools: Escape on an arc, spiral or grid drag puts back the options it changed by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5202
- Title bar: the app bar shows no brand mark under the desktop's own frame by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5211
- Document Info: Pattern Objects lists the objects painted with patterns by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5220
- Selection QoL: marquee modes with visible feedback by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5313
- Workspace: add an option to keep Tools beside the canvas with left-side panels by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5395
- File formats: HEIC and HEIF images open and place by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5518
- Type: upright glyphs on a vertical path face the path's start, so ligatures read in order by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5557
- .ai import: Bas Relief opens with its settings by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5227
- Save: include a PDF in new native files by default by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5320
- DXF: a CNC / CAM preset sets the export options for cutting software by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5500
- Layers: a document opened after a close keeps its thumbnail jobs by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5814
- Symbols: Direct Selection sets the solid fill and stroke of one object in a dynamic instance by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5962
- .ai import: placed PDF and .ai pages open as placed documents by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6083
- Graphs: graphic styles and Default and Swap Fill and Stroke update a series' stored paint by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6094
- i18n: error messages in every catalog keep true, false, null and the keys they name by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6100
- Title bar: a Linux and BSD preference uses the app bar where the desktop draws the frame by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6101
- Artboard tool: buttons on the selected artboard's edges add an artboard beside it by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6111
- .ai save: the editing copy keeps symbols and their instances by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6136
- Path ops: region building lists the shapes covering each region instead of a flag per shape by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6144
- Actions: Load Actions… reads action sets saved as .aia files by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6149
- Asset Export: 3D objects export as USDA, USDZ, glTF or OBJ meshes by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6168
- Transform: Align to Pixel Grid keeps an object's horizontal and vertical edges on the pixel grid by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6169
- JavaScript: vectorcraft-js runs ES5 scripts with a garbage-collected heap and execution limits by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6178
- Plug-ins: Safe Mode starts without plug-ins, offered after a launch stops while one loads by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6185
- Path ops: Merge finds every fill's faces in a few contour passes instead of one per fill by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6191
- Envelopes: a top object's sides share the content by control polygon length by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6195
- Plug-ins: the fuzz test generates bulk memory operations by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6198
- Effects: placed gradients move with Transform and Free Distort effects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6199
- Effects: Effect › SVG Filters applies the document's SVG filters as live effects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6200
- .ai import: the editing-copy paragraph in the file-format doc appears once by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6202
- Panels: tests pin the palette windows staying shown for torn-off strips and new toolbars by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6203
- SVG export: type on a path with Skew, 3D Ribbon, Stair Step or Gravity keeps its look by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6206
- Legacy .ai: the type attributes warning covers kerning, margins, Align to Path and end brackets by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6207
- Type: docs say Escape returns to the tool that double-clicked into the type by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6208
- Docs: the Reset Transformation entry is listed once in the evidence list by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6216
- .ai import: type keeps Standard Vertical Roman Alignment from its editing data by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6217
- Tests: workspace and toolbar dialog test checks the gap above OK and Cancel's place by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6218
- .ai import: a palette gradient swatch's paint is not linked to itself by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6219
- Swatches: a new swatch holds no link or placement from the paint it is made from by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6222
- .ai save: the editing copy keeps Standard Vertical Roman Alignment by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6226
- .ai import: objects in pattern and brush art take the file's art styles by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6230
- Scale the EPS operation budget with the program's length by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/5423
- Typographer's Quotes: a lone typed ” opens like a straight quote by @VladimirCeric in https://github.com/storytold/vectorcraft/pull/5459
- Affinity import: one shared work and name budget across repeated links by @dylanmtaylor in https://github.com/storytold/vectorcraft/pull/5491
- Select Text by Font: limit it to artboards or layers (#5529) by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/5578
- EPS/.ai editing data: art-style strokes aligned inside or outside keep their alignment by @mockydevs in https://github.com/storytold/vectorcraft/pull/6010
- .ai import: opacity mask art without its own paint takes the paint before its dictionary by @magyarb in https://github.com/storytold/vectorcraft/pull/6021
- i18n(ka): Georgian for 1 new string by @devius in https://github.com/storytold/vectorcraft/pull/6062
- Fix #5960: a narrow part of a variable-width stroke paints over a wide part only where they overlap by @slafebre in https://github.com/storytold/vectorcraft/pull/6093
- Cut PSD Unicode layer names on a character boundary by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6096
- Alt + keypad codes: with NumLock off the keypad keys count as digits and don't move the caret by @mockydevs in https://github.com/storytold/vectorcraft/pull/6105
- Fix #5188: a Shift-click on a corner widget of a whole path picks its corner by @slafebre in https://github.com/storytold/vectorcraft/pull/6106
- Strip CSS comments from style attributes and rule declarations by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6128
- Pen: Copy and Cut take the anchors a Cmd-lent Direct Selection picked (#6123) by @slafebre in https://github.com/storytold/vectorcraft/pull/6132
- UI tests: gradient and rotation controls are found in release builds by @thisisgomaa in https://github.com/storytold/vectorcraft/pull/6156
- Preferences: inputs expose their labels to accessibility tools by @thisisgomaa in https://github.com/storytold/vectorcraft/pull/6157
- Ignore non-digit suffixes in next_asset_name by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6167
- Text styles: double-click opens Character/Paragraph Style Options, and the dialog scrolls in a fixed width by @sadkotheguest in https://github.com/storytold/vectorcraft/pull/6171
- Layers: Delete clears the selection after the last row is deleted (#5870) by @alosslessdev in https://github.com/storytold/vectorcraft/pull/6175
- Export for Screens: an artboard name keeps its dots (fixes #6143) by @SBaksa in https://github.com/storytold/vectorcraft/pull/6180
- Canvas: a document opens at the zoom of the settled window by @KaboomFox in https://github.com/storytold/vectorcraft/pull/6196
- Reject a plus sign in Windows GPU PCI id hex digits by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6197
- Don't treat a pattern named "Name +N" as a numbered copy on import by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6213
- Fix #6205: support Registration and named swatches in AI art styles by @el-j in https://github.com/storytold/vectorcraft/pull/6214
- Fix #6135: opening a .ai with editing data skips the Import PDF dialog by @slafebre in https://github.com/storytold/vectorcraft/pull/6225
- 3D effects: resolve overlapping contours before building a solid by @addibble in https://github.com/storytold/vectorcraft/pull/6229
- Reject a plus sign in type.insert unicode hex digits by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6240
- EPS import: composite fonts draw their Type 42 glyphs (pdftops EPS shows its type) by @mockydevs in https://github.com/storytold/vectorcraft/pull/5999
- .ai import: images past 2^25 pixels in the editing data keep the layers by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5143
- Commands: an ids list with an entry that is not an id is refused instead of dropping the entry by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6179
- Plug-ins: a plug-in keeps settings and a cache of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6228
- Links: a missing linked file keeps its relative folder when a moved document is saved by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6231
- Asset Export: the 3D mesh triangle limit bounds memory across all exported objects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6241
- Type: Composite Fonts… sets each class of character in a font of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6244
- Color: Generic CMYK tints gain as CGATS TR 001 gives for SWOP printing by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6245
- Keyboard Shortcuts: each Object › Plug-ins filter has a row of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6246
- Type: Align to Path moves each character by its own font's metrics by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6247
- .ai import: the editing-copy paragraph in the file-format doc appears once again by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6249
- Effects: hidden layer children and edited freeform gradients follow the Transform and Free Distort effects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6250
- Image Trace: Ignore Color can leave out only the background by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/3952
- Type: Tab and Shift+Tab move a list item down and up a level
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5037 - Exit isolation on empty double-click with Direct Selection (#4466) by @onion3130 in https://github.com/storytold/vectorcraft/pull/4595
- Symbols: symbol.instance.setAppearance refuses a fill or stroke an object does not draw by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6232
- Preferences: the settings filter builds without a clippy warning on macOS by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6235
- 3D export: Revolve mesh normals are unit length and short walls face out by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6251
- SVG export: outlined type keeps its text as an accessible name by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6255
- SVG Filters: export writes a filter live only when import can read it back by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6256
- M2.1: blend Align-to-Path smooth on curved spines by @adambelis in https://github.com/storytold/vectorcraft/pull/6254
- Type: docs say Escape returns to the tool whose double-click chose the Type tool by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6257
- Image Trace: keepColors traces only the listed palette colors by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/3968
- Plug-ins: clearing every plug-in's cache is tested in a binary of its own by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6258
- .ai import: opacity mask art in pattern and brush art takes document ids by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6259
- Spiral: Decay applies once per full wind by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5475
- Fix #3748: in isolation mode, art outside a clip group's mask can be selected and dragged
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5030 - Artboards: a Cut or Copy with the Artboard tool replays on its artboards by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6052
- Effects: placed gradients move and scale with the Warp effects by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6236
- Export: the export commands refuse an unknown option key by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6061
- Outline Stroke: geometry effects reshape the path that is outlined, as on the canvas
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5024 - Graphs: a series keeps the object opacity and blend modes set on one of its marks by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6104
- .ai import: symbol libraries open with their symbols by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6109
- Actions: Batch's Override Export sends Export for Screens files to the destination folder
by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5029 - Plug-ins: a plug-in adds menu commands of its own under Object › Plug-ins by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6193
- Character: Anti-aliasing Method sets how a type object's edges are drawn as pixels by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5058
- .ai save: the editing copy keeps graphic styles and links to them by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6161
- JavaScript: a realm has the String, Number, RegExp and Date built-ins by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6194
- Reject non-digit object ids in MCP object resource URIs by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6253
- EPS import: gradients drawn as abutting strips come in as one gradient, without seams by @mockydevs in https://github.com/storytold/vectorcraft/pull/5991
- Numeric fields: step on wheel hover without taking focus by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/6113
- UI: show or hide the Help Bar independently by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5355
- Path ops: boolean contour passes test the shapes covering each face instead of a flag per shape by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6152
- Tests: the filter plug-in shortcut test accepts the macOS chord text by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6261
- i18n(ka): update the Georgian catalog (59 strings) by @devius in https://github.com/storytold/vectorcraft/pull/6262
- Type: type in a composite font is measured in its own document's definition by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6260
- 3D (Classic): Extrude & Bevel (Classic) extrudes art with Wireframe, No Shading, Diffuse and Plastic surfaces by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6174
- Plug-ins: a permission grant covers only the module that was approved by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6263
- Effects: fitted gradients turn with the Transform effect by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6233
- Blend: a pending pick starts over when the document's history changes by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/4599
- Paragraph: Kinsoku Shori Type chooses Push In First, Push Out First or Push Out Only by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5070
- Fix #6252: selecting an object gives new art its fill, stroke and weight by @slafebre in https://github.com/storytold/vectorcraft/pull/6267
- Plug-ins: importer plug-ins open file types VectorCraft does not read by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6264
- JavaScript: vectorcraft-js adds ES5 Object, Array, Math, JSON and Function.prototype.bind by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6189
- .ai save: the editing copy stops at the reader's object limit by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6220
- .ai import: Art brushes in the older form of their objects come into the Brushes panel by @mockydevs in https://github.com/storytold/vectorcraft/pull/6007
- Drawing tools: Escape on a polygon, star or rounded rectangle drag puts back the option it changed by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5213
- Gradients: freeform points that share a color model mix in that model by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6268
- Recolor: report the locked and hidden art a recolor of everything left out by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/4536
- Variables: a visibility variable shows and hides locked art by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/2780
- Fix #3526: the bounding box follows a resize drag by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5042
- Plug-ins: live effects at API level 2 can paint the pieces they return by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6265
- File formats: JPEG XL (.jxl) images open and place by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/2606
- Linux: VECTORCRAFT_TITLEBAR takes precedence over System Title Bar for the run it is set in by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5036
- Updates: the updater reports installing, ready, installed and failed, and installs at exit by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6271
- Plug-ins: settings and the cache total stay in memory between storage calls by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6269
- Print: Copies per Sheet prints as many copies of each artboard as fit the sheet by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/2552
- Type: a pushed-in line leaves the gap after inline art open by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6274
- Docs: a plug-in with no permissions list needs no grant by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6270
- Part of #978: Window › Color Wheel picks colors on a hue ring and a saturation and brightness square by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/2279
- Tools: setting another tool's option leaves a drag's options alone by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6273
- Plug-ins: removing a plug-in moves the revision while it holds the set by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6272
- Plug-ins: filters can ask to read type, images and symbol instances by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6223
- EPS/.ai editing data: paths keep art styles of several fills and strokes live by @mockydevs in https://github.com/storytold/vectorcraft/pull/6016
- Plug-ins: lastError keeps a failed run's error, and hit tests follow swatch changes by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6276
- Updates: take craft-update from craft-libs main at 1b34eba41 by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6275
- .ai import: names that aren't UTF-8 can be read in a legacy code page by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5158
- Save: the save commands and Export for Screens refuse an unknown option key by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6234
- Linux: docs say which VECTORCRAFT_TITLEBAR values take precedence by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6277
- Shape Builder: a large selection merges on another thread by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/4379
- .ai/EPS import: type keeps its tab stops, and right-aligned lines with tabs lay out as the file's page by @magyarb in https://github.com/storytold/vectorcraft/pull/6148
- Workspace: the Tools panel docks on the right too, left of the panels by @vecteza in https://github.com/storytold/vectorcraft/pull/6280
- Docs: docs/mcp.md lists save_file once by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6279
- .ai import: objects with a centered variable-width stroke come in as their drawn outline by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/5200
- Plug-ins: docs say when pixelsOmitted is set by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6283
- New Document: the name field is labeled Document Name by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6284
- Add collapse-to-icons arrows to floating panels and rail flyouts by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/6215
- EPS import: sampled functions interpolate between their samples (function shadings no longer come in as flat blocks) by @mockydevs in https://github.com/storytold/vectorcraft/pull/6018
- M2.1: split ordinary path objects after deletion by @ruchirguitar in https://github.com/storytold/vectorcraft/pull/6078
- Workspace: window.panel.dock rejects a Tools side that isn't text by @vecteza in https://github.com/storytold/vectorcraft/pull/6287
- Plug-ins: a filter's read-only objects stay in its input and failed decodes count by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6282
- Plug-ins: docs limit the 64 MiB decoder note to non-CMYK images by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6288
- Plug-ins: replacing a granted plug-in with one that lists no permissions removes the grant by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6286
- EPS import: an image's transient data stops counting against the memory budget by @mockydevs in https://github.com/storytold/vectorcraft/pull/6019
- New Document: screen readers hear each Preset Details field's name by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6289
- Part of #4936: text.spelling.check lists unknown words, text.spelling.suggest suggests by @Hassan1305 in https://github.com/storytold/vectorcraft/pull/6212
- Updates: the update dialogs hold the keyboard and floating windows, and updates wait for running work by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6291
- Plug-ins: permissions and a heavy budget need a person's approval or a start-up flag by @dotCooCoo in https://github.com/storytold/vectorcraft/pull/6285
- Follow-up to #6252: a selected colorized image gives new art its fill by @slafebre in https://github.com/storytold/vectorcraft/pull/6293
- EPS import: CID-keyed fonts draw the glyphs of the CIDFonts the file carries by @mockydevs in https://github.com/storytold/vectorcraft/pull/6031
- EPS import: Type 42 fonts take their characters and widths from the font they carry; show spacing kept as tracking by @mockydevs in https://github.com/storytold/vectorcraft/pull/6023
- Show 0 instead of -0 for tiny negative graph labels by @Silvertree2010 in https://github.com/storytold/vectorcraft/pull/6294
- EPS import: kshow runs its procedure between the characters of live type by @mockydevs in https://github.com/storytold/vectorcraft/pull/6064
- EPS import: embedded Type 1 fonts draw and space their type with their own glyphs by @mockydevs in https://github.com/storytold/vectorcraft/pull/6035
- EPS import: CMap mappings to base fonts' codes and glyph names draw their glyphs by @mockydevs in https://github.com/storytold/vectorcraft/pull/6066
- EPS import: CID-keyed fonts in a FontSet's CFF data draw their glyphs by @mockydevs in https://github.com/storytold/vectorcraft/pull/6065
- EPS import: CIDFonts only named, over a Unicode CMap, set their characters as live type by @mockydevs in https://github.com/storytold/vectorcraft/pull/6067
- Follow-up to #6254: the blend spine keeps only the subpath it samples by @adambelis in https://github.com/storytold/vectorcraft/pull/6297
- EPS/.ai editing data: a ligature glyph named by a private-use character matches its text object by @mockydevs in https://github.com/storytold/vectorcraft/pull/6047
- Part of #4936: custom dictionary and Ignore All commands by @Hassan1305 in https://github.com/storytold/vectorcraft/pull/6296
New Contributors
- @JonRC made their first contribution in #5314
- @cybermaxwel made their first contribution in #5329
- @thisisgomaa made their first contribution in #5261
- @FrancoJacquet made their first contribution in #5453
- @byoungyoon made their first contribution in #5561
- @d8abyte-dk made their first contribution in #5630
- @sadkotheguest made their first contribution in #5651
- @makzumi made their first contribution in #5734
- @jo-quast made their first contribution in #2818
- @K1nsmark made their first contribution in #5694
- @Locme made their first contribution in #5815
- @simonhull made their first contribution in #5845
- @ZIDAN44 made their first contribution in https://github.com/storytold/vectorcraft/pull/5847
- @kk376 made their first contribution in https://github.com/storytold/vectorcraft/pull/5855
- @adikshan11 made their first contribution in https://github.com/storytold/vectorcraft/pull/5896
- @SofiaAFigueredo made their first contribution in https://github.com/storytold/vectorcraft/pull/4732
- @slafebre made their first contribution in https://github.com/storytold/vectorcraft/pull/5968
- @kylekanouse made their first contribution in https://github.com/storytold/vectorcraft/pull/5977
- @helenkwok made their first contribution in https://github.com/storytold/vectorcraft/pull/6015
- @Luis-0508 made their first contribution in https://github.com/storytold/vectorcraft/pull/5998
- @BOXELS made their first contribution in https://github.com/storytold/vectorcraft/pull/5984
- @magyarb made their first contribution in https://github.com/storytold/vectorcraft/pull/6021
- @alosslessdev made their first contribution in https://github.com/storytold/vectorcraft/pull/6175
- @SBaksa made their first contribution in https://github.com/storytold/vectorcraft/pull/6180
- @onion3130 made their first contribution in https://github.com/storytold/vectorcraft/pull/4595
Full Changelog: v0.21.0...v0.23.0