What's Changed
- Part of #4936: follow-ups to #6296 (read the dictionary file whole; keep other windows' words when a save fails) by @Hassan1305 in #6303
- Control bar: add glyph and alignment guide toggles to Snapping by @thisisgomaa in #6166
- Type: colouring Arabic marks preserves joining and glyph ownership by @thisisgomaa in #6158
- macOS: deliver canvas cursors through AppKit pending a winit fix by @thisisgomaa in #6306
- PDF export: dithered and Perceptual CMYK gradients stay CMYK by @dotCooCoo in #6317
- PDF import: image masks open colorized by the color they are painted in (#6313) by @jmverges in #6321
- G5: dynamic symbol parts take opacity, blend and non-solid paint by @Messhias in #6308
- Fix #6320: EPS import warns about fonts that aren't available by @JonRC in #6326
- Strip leading byte-order mark in graph CSV parser by @Silvertree2010 in #6325
- G5: built-in UI Frames symbol library with default 9-slice by @Messhias in #6329
- EPS import names the missing fonts of the document's type (#6326 follow-up) by @JonRC in #6334
- PDF export: letters with marks are written once in the text layer by @thisisgomaa in #6330
- Part of #4936: Auto Spell Check underlines the unknown words of the type by @Hassan1305 in #6341
- PDF import: Separation images keep their ink (#6314) by @jmverges in #6347
- 3D effect dialogs say why a selection is refused and turn OK off (#6140) by @slafebre in #6346
- PDF import: preserve authored text in ActualText spans by @thisisgomaa in #6327
- Canvas: Cmd/Ctrl-wheel input finer than a whole notch zooms; only whole notches scroll sideways by @dotCooCoo in #6360
- G2: Effect Gallery thumbnails and an in-dialog preview by @ruchirguitar in #6359
- Fix #6125: raster exports keep a Screen glow on the bare page by @dotCooCoo in #6355
- Canvas: a 3D effect changed on type or a group redraws where its solid was by @addibble in #6290
- Commands: the View commands check their params against machine-readable schemas by @dotCooCoo in #6364
- Part of #5632: Convert to Grayscale stores an image with one gray channel by @dotCooCoo in #6366
- Path ops: Unite sweeps a single path once when its own sweep leaves its segments as they are by @dotCooCoo in #6357
- Fix #6316: a Transform effect's copies of a group are whole groups below the original by @dotCooCoo in #6363
- Measure: both ends land on glyph guides with Snap to Glyph on by @dotCooCoo in #6368
- Canvas: a touchpad's End or Cancel ends its wheel turn with Zoom with Mouse Wheel on by @dotCooCoo in #6372
- Render: the glow pan test checks fractional pans, and background docs say straight alpha by @dotCooCoo in #6370
- Font menu: a panel scrolled past a closed font field keeps scrolling by @dotCooCoo in #6375
- .ai import: images in a spot ink's Separation space keep their ink (#6350) by @jmverges in #6379
- Transform: butt-capped lines measure to their end points with Use Preview Bounds by @dotCooCoo in #6380
- MCP: docs list every JSON Schema keyword in a command's schema by @dotCooCoo in #6381
- Part of #6361: Cut takes direct-selected anchors out of the path by @dotCooCoo in #6371
- Revolve: type, groups and layers revolve, and the profile and face limits are higher by @dotCooCoo in #6365
- Font menu: a font field covered by an overlay needs the pointer moved again by @dotCooCoo in #6384
- Part of #4936: right-click an underlined word for its suggestions, Ignore All and Add to Dictionary by @Hassan1305 in #6385
- PDF import: DeviceN images of one ink or of process plates keep their inks (#6348) by @jmverges in #6386
- Guides: Lock Guides by Default in Preferences locks guides when the app starts by @dotCooCoo in #6367
- New Document: More Settings is a pop-up, and Save Preset a mode of Preset Details by @dotCooCoo in #6377
- #6307: Keep numeric spinner arrows repeating while held by @makesomethingshit in #6328
- Revolve: a hidden Revolve's profile is measured before the effects after it by @dotCooCoo in #6390
- Transform: a butt-capped curve with a handle on its end point stops at that end by @dotCooCoo in #6389
- MCP: command listings give each command with a schema an inputSchema by @dotCooCoo in #6392
- 3D: a profile's empty contours count toward its point limit by @dotCooCoo in #6391
- Number fields: a panel scrolled past a number field keeps scrolling by @dotCooCoo in #6387
- Revolve: a group's faces keep one back-to-front order when a member is transparent by @dotCooCoo in #6395
- Export: exported objects keep the clips, masks and effects around them by @dotCooCoo in #6396
- Commands: engine.apiReference returns the command API reference in Markdown by @dotCooCoo in #6399
- Revolve: a member whose fill or stroke is at 0% opacity stays invisible in a revolved group by @dotCooCoo in #6400
- Part of #4936: follow-ups to #6385 (only the topmost type's word; dictionary tests one at a time) by @Hassan1305 in #6398
- Type: an optional setting measures point type by its glyph outlines by @dotCooCoo in #6402
- SVG export: mask and filter regions cover the art they apply to by @dotCooCoo in #6401
- View: one Escape resets a rotated view when it has nothing else to end by @dotCooCoo in #6405
- View: Outline draws on a white canvas, with artboards as their edges by @dotCooCoo in #6408
- Dimension tool: a click on an anchor of any path takes that anchor by @dotCooCoo in #6409
- Scripts: File › Scripts › Other Script… runs JavaScript files by @dotCooCoo in #6411
- #4936: Spelling › Auto Spell Check in the context menu of type by @Hassan1305 in #6407
- .ai import: the live envelope and warped type check sees white art (#6412) by @jmverges in #6413
- G5: built-in Map Markers symbol library by @Messhias in #6416
- .ai import: a note for type in an envelope (part of #3179) by @jmverges in #6383
- Fix #5713: resizable icon flyouts and bottom-aligned panel footers by @ruchirguitar in #5973
- Fall back to a plain flush when F_FULLFSYNC fails with ENOTTY by @AhmedKhan-GH in #6397
- PDF import: Arabic ligatures keep their letters in order (#6072) by @z3r0pix3l in #6243
- Tests: preserve duplicate glyph order in kashida ownership checks by @christianlappin in #6339
- M4: fix PDF gradient placement in transparency groups by @annoybot in #6242
- MCP: handle Rotate View gestures in the desktop canvas by @christianlappin in #6342
- Stroke: Line Arrow arrowhead (part of #5421) by @juliusvaart in #6349
- Tests: synchronize the thumbnail queue priority assertion by @christianlappin in #6352
- Regression tests for #3566 (SVG entities in element content) and #3084 / #2096 (Export for Screens JPGs) by @ruchirguitar in #6431
- Direct Selection shows and drags type on a path's direction handles (#3565) by @ruchirguitar in #6432
- G5: built-in Game HUD graphic style library by @Messhias in #6424
- Keep selection outlines off the Vector Halftone preview (#6369) by @makesomethingshit in #6403
- Docs: move stray notes at the top of ROADMAP.md into Revision history by @ruchirguitar in #6443
- Docs: tidy misplaced and duplicated notes at the top of docs/gaps.md by @ruchirguitar in #6444
- .ai import: envelopes of type open live where they draw as their drawn art (#3179) by @jmverges in #6421
- Step a blank Stroke Weight from 0.25 pt (#5349) by @MarekSpodBiedry in #5559
- Crop Image: cut plain raster images from their pixels instead of re-rendering (#5534) by @MarekSpodBiedry in #5560
- #4936: Edit › Edit Custom Dictionary… dialog by @Hassan1305 in #6425
- Scripts: a framed run keeps the file-access roots it started under by @dotCooCoo in #6449
- 3D: Extrude & Bevel and Inflate build detailed shapes they refused as too complex by @dotCooCoo in #6450
- Docs: with glyph bounds, the font size follows the vertical scale by @dotCooCoo in #6452
- Fix #6419: Edit › Assign Profile… and Color Settings… scroll to the Color Settings by @slafebre in #6446
- G5: built-in Game Trails brush library by @Messhias in #6353
- #6429: a value typed in a Stroke popup sticks when a click outside closes it by @slafebre in #6451
- JavaScript: identifiers follow Unicode's ID_Start and ID_Continue properties by @dotCooCoo in #6454
- G9: .ai save names a variable font instance's design space (#6388) by @ruchirguitar in #6453
- Fix #2752: a gradient mesh keeps the outline of the path it is made from by @dotCooCoo in #6458
- Edit: Copy and Cut of a whole compound member take only that member by @dotCooCoo in #6461
- Undo: the history keeps steps within a quarter of installed memory on every desktop OS
by @dotCooCoo in #5035 - Tests: test262 skips a test only when its code uses a missing built-in by @dotCooCoo in #6463
- Plug-ins: an API level 2 plug-in calls the commands its manifest lists by @dotCooCoo in #6462
- Fix #6382: PDF export says how a page longer than 200 inches is written by @dotCooCoo in #6464
- Fix #6335: Color Settings are remembered across restarts by @slafebre in #6457
- Expand: object.expand rejects a param of the wrong type by @dotCooCoo in #6466
- 3D: effects build from clipping groups, blends and symbol instances by @dotCooCoo in #6418
- Path commands: Offset Path, Simplify, Split Into Grid, Clean Up, Trap and Contour reject a param of the wrong type by @dotCooCoo in #6467
- Edit: a copied compound member takes the compound's graphic style link by @dotCooCoo in #6468
- Plug-ins: no command call is made after a run's failed call by @dotCooCoo in #6471
- Transparency: opacity mask commands reject a param of the wrong type by @dotCooCoo in #6473
- 3D: a symbol's 9-slice guides and overrides count before its art is placed by @dotCooCoo in #6474
- 3D: expanded solids keep the art's curves in caps and the walls' cap edges by @dotCooCoo in #6469
- MCP: answer_dialog sets the fields and answers the dialog in one request by @dotCooCoo in #6476
- Scissors: a cut leaves one of the two new end points selected by @dotCooCoo in #6479
- Repeat, Pattern: the Repeat and pattern commands reject a param of the wrong type by @dotCooCoo in #6481
- Type: vertical-only settings keep horizontal ligatures whole by @dotCooCoo in #6480
- sonar: MD5 in PDF encryption is the format's, not a choice by @dylanmtaylor in #6483
- Preferences: Reset Preferences leaves the open document's units alone by @dotCooCoo in #6482
- Actions: test Batch folder names that differ only in case or are empty by @dotCooCoo in #6484
- Docs: spot gradients with RGB or Lab stops keep the ink in a CMYK document by @dotCooCoo in #6485
- Symbols: separations, proofing and color conversion reach a dynamic instance's own colors by @dotCooCoo in #6487
- Type: character formats, Ruby and Move Type Path Handle reject a param of the wrong type by @dotCooCoo in #6477
- 3D: an opacity mask on a group member masks its solids by @dotCooCoo in #6478
- Perspective grid: Snap to Grid reads a flat first object at the depth it attaches to by @dotCooCoo in #6489
- Preferences: Reset Preferences asks first by @dotCooCoo in #6491
- Perspective grid: docs say when Snap to Grid moves an edge onto a gridline by @dotCooCoo in #6486
- Reshape: a drag stretches an open path from the dragged point to its two ends by @dotCooCoo in #6492
- Dimension tool: linear dimensions measure horizontally, vertically or aligned by @dotCooCoo in #6494
- Canvas: installing or removing a plug-in draws its effects again by @dotCooCoo in #6495
- Guides: an option makes Cmd/Ctrl ruler drags artboard guides by @dotCooCoo in #6496
- Smart Guides: tools do not snap to Smart Guides while Pixel Preview is on by @dotCooCoo in #6498
- Preferences: export and import preferences as a JSON file by @dotCooCoo in #6501
- .ai import: stroked type keeps its cap, join and miter limit by @jmverges in #6500
- Docs: pattern.options keeps a pattern's current values for omitted params by @dotCooCoo in #6493
- Menus: a long menu stays in one place instead of jumping between two places by @dotCooCoo in #6503
- Scripts: Window › Script Console shows script output, errors and run reports by @dotCooCoo in #6499
- .ai import: warps of type open as mesh envelopes on their saved grid by @jmverges in #6508
- Artboards: an artboard's guide label colors its own guides by @dotCooCoo in #6511
- Native files: open reads the PDF preference in the same pass as the document by @dotCooCoo in #6512
- Keep blank value row in single-column graph CSV round trip by @Silvertree2010 in #6266
- Symbols: Break Link keeps a hidden or locked instance's art hidden or locked by @dotCooCoo in #6513
- Menus: a scrolling list keeps each label on one line by @dotCooCoo in #6516
- Character Styles: the style dialogs' fields have accessible names by @dotCooCoo in #6518
- #5820: files that record no units open in Preferences › Units › General by @ruchirguitar in #6514
- Reshape: a click sets a focal point and a drag moves every focal point by @dotCooCoo in #6519
- Symbols: Break Link selects no art inside a hidden or locked group by @dotCooCoo in #6520
- Render: type in a document's own composite font draws in its definition by @dotCooCoo in #6523
- Render: node renders and thumbnails follow the supersample and precise options by @dotCooCoo in #6522
- Scripts: File › Scripts lists the Scripts folder, subfolders as submenus by @dotCooCoo in #6525
- Native files: a document past a read budget is refused after one read by @dotCooCoo in #6524
- Dimension tool: both ends of a dimension follow the art it measures by @dotCooCoo in #6527
- Docs: the roadmap lists each milestone once by @dotCooCoo in #6531
- Stores: saving a preset, profile or plug-in reads at most one byte past it from the file it replaces by @dotCooCoo in #6529
- Type: on a vertical path, letters lie a quarter turn clockwise from upright glyphs, in a column centered on the path by @dotCooCoo in #6530
- Character Styles: the Fill and Stroke Tint fields have distinct names by @dotCooCoo in #6533
- Scripts: #include and the other preprocessor lines run, and $.evalFile runs a file by @dotCooCoo in #6536
- .ai import: stroked type in an envelope maps from its glyphs grown by half its stroke by @jmverges in #6535
- Paths: Add Anchor Point keeps the same anchors and segments selected by @dotCooCoo in #6528
- Reshape: a step recorded without focal points plays by the earlier rule by @dotCooCoo in #6534
- Symbols: an instance that only moves holds the art its 9-slice guides move by @dotCooCoo in #6538
- Symbols: Break Link keeps new art on a locked artboard selected by @dotCooCoo in #6539
- Expand Appearance: tinted symbols keep their colors under a color adjustment by @dotCooCoo in #6537
- PDF export: PDF/X-1a, X-3 and 1.3 keep the art under the hidden part of cropped art by @dotCooCoo in #6540
- Render: a placed document drawn exactly lends its own composite fonts by @dotCooCoo in #6542
- Character Styles: a tint error names the Fill Tint or Stroke Tint field by @dotCooCoo in #6544
- Appearance: aligned Remove Item and Duplicate Item keep the active row by @dotCooCoo in #6547
- Reshape: an empty focal list cannot be combined with radius by @dotCooCoo in #6550
- Type: tracking and manual kerning take the Horizontal Scale by @jmverges in #6546
- G5: built-in Inventory Icons symbol library by @Messhias in #6442
- Contextual Task Bar: screen readers name the text buttons by @dotCooCoo in #6553
- Scripts: a script chosen from File › Scripts reads its #include files and runs $.evalFile by @dotCooCoo in #6549
- Glyphs: text.setGlyphAlternate with gid null reports the glyph drawn by @dotCooCoo in #6554
- Docs: the Dynamic symbols entry says Edit Symbol keeps instances linked by @dotCooCoo in #6552
- Scripts: alert, confirm and prompt open dialogs with Stop, and headless runs take their answers from script.run by @dotCooCoo in #6557
- SVG import: a clip path made of text clips by the text by @dotCooCoo in #6556
- Dimension tool: a dimension selected with its art stays live through Expand and Outline Stroke by @dotCooCoo in #6559
- G5: built-in Status Effects graphic style library by @Messhias in #6459
- Docs: the Control bar's Paragraph alignment buttons are pinned at 1536 pt by @dotCooCoo in #6558
- Graphs: labels keep their paragraph settings and anti-aliasing when the graph is drawn again by @dotCooCoo in #6561
- Effects: pasted art keeps an SVG filter whose name the document gives another filter by @dotCooCoo in #6560
- Glyphs: gid null inside a ligature reports the ligature by @dotCooCoo in #6565
- Docs: gaps.md no longer says .ai editing data is not written by @dotCooCoo in #6566
- Docs: a series mark's row without paint leaves the stored paint, not its opacity by @dotCooCoo in #6564
- Flatten Transparency: a long rasterized area is placed whole by @dotCooCoo in #6567
- Plug-ins: live effects of a document's first view share a 2,000 ms budget by @dotCooCoo in #6555
- Fix #5239: double-clicking a ruler adds a guide there by @Taha-Mahmoodi in #5457
- Rasterize: art longer than 32,768 pixels at the resolution is refused, not cut off by @dotCooCoo in #6573
- Tests: the command sweep sends file and folder params only into its temp folder by @dotCooCoo in #6572
- Type: an opened file flows its threads in its own composite fonts by @dotCooCoo in #6575
- Scripts: #strict on runs the script with strict write checks instead of refusing it by @dotCooCoo in #6569
- Graphs: centered labels with an empty middle line stay centered by @dotCooCoo in #6574
- Effects: a pasted SVG filter at the size limit still draws under its new name by @dotCooCoo in #6576
- Print: Print as Bitmap prints all of a page longer than 32,768 pixels by @dotCooCoo in #6578
- .ai save: stroked type keeps its cap, join and miter limit by @jmverges in #6581
- Plug-ins: the web build times the first-view budget and each run's limit by @dotCooCoo in #6584
- Legacy .ai export: a long transparent image is flattened whole by @dotCooCoo in #6579
- Pen: one Escape after deselecting the path being drawn ends something else by @dotCooCoo in #6586
- MCP: ui.menu.list leaves out recent files outside the read roots by @dotCooCoo in #6580
- Blob Brush: a round tip's preview is the outline of the area, round at both ends (#4343) by @SofiaAFigueredo in #6587
- Scripts: an error $.evalFile could not run, caught and thrown again, is reported where it was thrown again by @dotCooCoo in #6577
- Type: text.setStyle refuses a leading with trailing text by @dotCooCoo in #6590
- Rasterize: art that rounds to 32,768 pixels a side is no longer refused by @dotCooCoo in #6588
- #6502: .ai layer colour index follows the file's numbering by @ruchirguitar in #6589
- Plug-ins: the web build's heavy filter runs stop at the 300 s limit too by @dotCooCoo in #6591
- Effects: a pasted SVG filter is not renamed to a name the document's effects use by @dotCooCoo in #6592
- Script Console: report lines match script.console, counts of one are singular, every run ends by @dotCooCoo in #6562
- Effects: bound 3D paint copies, dash restarts and trap candidate pairs by @dylanmtaylor in #5493
- Fix #4312: a Shift move lands the selection's edges and centre on ruler guides by @SofiaAFigueredo in #4338
- Document tabs: a middle-click closes the tab, as the × does (#6506) by @Hassan1305 in #6568
- Tests: a recent file outside the read root is not listed even as a disabled row by @dotCooCoo in #6594
- Scripts: $ has the Dollar object's other members, with localize and toSource by @dotCooCoo in #6563
- Outline view: a click on a path's outline selects it through an image or a gradient mesh in front (#6437) by @Hassan1305 in #6585
- Effects: a pasted SVG filter avoids brush effect names and is refused with no free name by @dotCooCoo in #6598
- .ai import: an envelope in Edit Contents opens on its drawn art when its mesh lies away by a move by @jmverges in #6571
- 3D effects: Extrude & Bevel, Inflate and Rotate on a group keep each member's blending mode by @dotCooCoo in #6602
- Effects: a pasted SVG filter takes a free capital letter or punctuation character when no lowercase name is free by @dotCooCoo in #6607
- Gradients: picking a part of a symbol instance leaves no gradient stop selected by @dotCooCoo in #6605
- MCP: ui.inspect leaves out paths outside the read roots by @dotCooCoo in #6608
- Plug-ins: setting the plug-ins folder again after clearing it installs its plug-ins by @dotCooCoo in #6611
- MCP: list UI_COMMANDS in command_list and close catalogue gaps (#6460) by @Messhias in #6551
- JavaScript: run E4X XML literals and the XML, XMLList, Namespace and QName objects behind an option by @dotCooCoo in #6612
- Updates: take craft-update from craft-libs main at 6e03f65bf by @dotCooCoo in #6616
- Simplify: a closed subpath whose refit is one curve stays in the path by @dotCooCoo in #6614
- Links: groups of one file share one decoded image per operation by @dylanmtaylor in #6620
- Type: aligned lines leave the tracking after their last character out by @jmverges in #6619
- ci: run Harden-Runner on every job by @dylanmtaylor in #6629
- Swatches: default names read a -0 component as 0 by @dotCooCoo in #6623
- G5: built-in Skill Icons symbol library by @Messhias in #6624
- Updates: take craft-update from craft-libs main at 6e03f65bf by @dylanmtaylor in #6633
- Release: VectorCraft v0.24.0 by @FredApps in #6599
New Contributors
- @AhmedKhan-GH made their first contribution in #6397
- @z3r0pix3l made their first contribution in #6243
- @christianlappin made their first contribution in #6339
- @annoybot made their first contribution in #6242
- @juliusvaart made their first contribution in #6349
Full Changelog: v0.23.0...v0.24.0