Commit Graph
2082 Commits
Author SHA1 Message Date
dotCooCoo ff036557fb Symbols: Edit Symbol opens the symbol in its own editing mode, and every instance follows each edit
Squashed from #5064 onto main.
2026-11-01 11:09:03 +07:00
dotCooCoo 94ef9b87c2 Type: Character panel toggles show off for a mixed selection, and text.setFormat checks on/off values
The Character panel's All Caps, Underline and Strikethrough buttons, and
its menu's All Caps, Underline, Strikethrough, Proportional Metrics,
Tate-chu-yoko and No Break, read the first selected character's style.
With only some characters marked they could show on, and choosing one
turned the attribute off for every character. They now show on only
when every selected character has the attribute, and a click on a mixed
selection turns it on for all, as Small Caps and Standard Vertical Roman
Alignment do. type.underline (Cmd+Shift+U) underlines a mixed selection
the same way. The Character Alignment and Digits submenus check no item
while the selected characters differ.

text.setFormat ignored a value that was not true or false for underline,
strikethrough, allCaps, proportionalMetrics, tateChuYoko,
standardVerticalRoman, noBreak, hyphenate, hyphenateCapitalized and
romanHangingPunctuation. It now refuses it with "`<key>` must be true or
false" and changes nothing, as text.setRangeStyle does.
2026-11-01 11:08:56 +07:00
dotCooCoo 427bce12b0 Character: Font Size can measure the cap height, x-height or ICF box
Squashed from #5026 onto main.
2026-11-01 11:08:55 +07:00
bflatastic 9b9f0918f0 Fix #4687: the Artboards panel reorders artboards by dragging a row 2026-11-01 10:17:29 +07:00
bflatastic 2d95cd667b Document Tools: catalog rows for Export All Open Documents, and its failure message as one translatable message 2026-11-01 09:24:25 +07:00
Don Omondi 1e8ac2434c Fix #4920: Document Tools exports every open document
addon.document.exportAllOpen {folder, format?} writes a copy of every
open document to one folder as Save a Copy does, each named after its
document with taken names numbered so no file is replaced. Documents
keep their paths and modified state, the active one stays active, and a
document that can't be written is reported while the others are still
written. Object > Plug-ins > Document Tools gets Export All Open
Documents as PDF and as SVG, which ask for the folder.
2026-11-01 09:24:25 +07:00
dotCooCoo 18b9c6113e .ai import: one object the reader can't read comes in as the page's art, and the layers stay
Squashed from #5050 onto main.
2026-11-01 09:24:23 +07:00
bflatastic 84336967aa Fix #4922: Expand Dashes into Paths 2026-11-01 09:08:07 +07:00
bflatastic 317423c514 Fix #4908: Glyphs panel highlights the selected character 2026-11-01 09:08:04 +07:00
dotCooCoo d72022daf5 Grid tools: F, V, X and C change the divider skews by 10 while a grid is dragged out
Squashed from #5019 onto main.
2026-11-01 08:33:02 +07:00
dotCooCoo f07b9ab765 Live Paint: Live Paint Bucket Options set what a click paints and the highlight
Double-clicking the Live Paint Bucket did nothing, and the tool always
filled on a click, stroked on Shift-click and highlighted in red at
4 px. It now opens Live Paint Bucket Options with Paint Fills, Paint
Strokes, Highlight, Color and Width.

- Paint Fills (on) and Paint Strokes (off) set what a click paints.
  With Paint Strokes alone, a click strokes the edge within 4 px of the
  pointer. With both on, a click strokes an edge within 4 px and
  otherwise fills the face. With both off, a click paints nothing.
- Shift switches Paint Fills alone to Paint Strokes alone and back, and
  switches both to Paint Fills alone. With the defaults, Shift-click
  strokes the edge as before.
- Highlight turns the outline of the face or edge under the pointer on
  or off; Color (a layer color or a custom color) and Width (1 to 20 px)
  set it. With Paint Strokes alone, a selection of ordinary paths no
  longer highlights a region, since a click there paints nothing.
- The options are tool options (tool.setOption {tool:
  "livePaintBucket"}): they last across tool switches and are saved
  with the preferences.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-01 08:32:57 +07:00
dotCooCoo ece78f052f Type: Standard Vertical Roman Alignment stands half-width characters upright in vertical type
Character panel menu > Standard Vertical Roman Alignment, with Show East
Asian Options, is now a check item. It sets a new character attribute,
`standardVerticalRoman` (text.setFormat, text.setRangeStyle), off by
default and saved only when on. In vertical type the marked Latin
letters, digits and other characters that would lie on their side stand
upright one below the other, each in its upright cell. Spaces keep their
width and tate-chu-yoko blocks stay across the column. Horizontal type
keeps the mark and does not change. A combining mark shaped as its own
glyph turns with its letter, in Latin and CJK upright type alike.

Character Style Options labels the Character Alignment row "Character
Alignment" and gives Standard Vertical Roman Alignment its own checkbox.
Reset Panel turns the attribute off. PDF and SVG export place the glyphs
from the layout and need no change.
2026-11-01 08:32:55 +07:00
dotCooCoo 6b4ced2b96 Tests: the backtick menu test passes on macOS
menus_and_tooltips_show_the_backtick_key_as_it_types put Edit › Clear on Cmd+~.
craft-keymap reserves Cmd+` on macOS, so the override is refused there and
the menu kept Delete. The test now uses Alt+~, which no platform reserves.
2026-11-01 08:32:52 +07:00
bflatastic cd277d5d84 Fix #4917: Sort Objects sorts the selection by one attribute and applies that order to another
Squashed from #5017 onto main.
2026-11-01 08:11:17 +07:00
bflatastic ef80709e16 Fix #4925: Randomize Opacity gives each selected object a random opacity in a range 2026-11-01 08:07:33 +07:00
bflatastic 3d8677a71a Symbols: catalog rows for deleting several symbols and for no unused symbols 2026-11-01 07:38:02 +07:00
Don Omondi 961694cba6 Fix #4918: delete nested picks safely, keep picks per document
symbol.delete {names} expands every instance of the named symbols,
round by round, before it removes any definition, so a symbol and the
one placed inside it delete alike in either order. The Symbols panel's
picks belong to the document they were made in, and a single picked
symbol is deleted only while symbol.unused still lists it.
2026-11-01 07:38:01 +07:00
Don Omondi 5b639169cd Fix #4918: Symbols panel Select All Unused
symbol.unused lists the symbols nothing places: instances in the art
(opacity masks included), graph designs, pattern tiles and brush art
count, and so do instances in a used symbol's art. The Symbols panel
menu's Select All Unused shows them selected, and Delete Symbol asks
once and deletes those still unused in one undo step
(symbol.delete {names}).
2026-11-01 07:38:01 +07:00
dotCooCoo 1e14719c16 i18n: French rows keep the no-break space before punctuation 2026-11-01 07:16:32 +07:00
dotCooCoo 7410b7233e i18n: link, font and export status messages use real plural forms instead of "(s)"
The status bar's messages for relinked, replaced, updated and embedded
images, broken links, linked files that can't be read or changed on
disk, images that can't be decoded, added and unavailable fonts, copied
CSS, downloads and exports with notes read "1 image(s)" and similar.
They now say "1 image" and "2 images", and every catalog translates
both through @msgplural rows in the language's plural forms, as the
Package status does.

- i18n::msg_n writes such a message in English and fills its
  placeholders in one pass; the status bar's translation fills them in
  one pass too, so a path or name that holds "{n}" text stays whole.
- The old "(s)" @msg rows are replaced in all 26 catalogs, with new
  rows for Replaced and Break Link.
- Sites: dialogs/missing_links.rs, dialogs/missing_fonts.rs,
  app/links.rs, panels/css_properties.rs, dialogs/find_links.rs,
  panels/links.rs, place.rs, canvas.rs, io/export.rs and
  dialogs/save_for_web.rs.
2026-11-01 07:16:32 +07:00
dotCooCoo 13628274b7 OpenType: the panel turns Stylistic and Titling Alternates on and off, and offers Proportional Lining figures
The OpenType panel gains Stylistic Alternates (salt) and Titling Alternates
(titl) checkboxes after Swash. The Figure menu lists Default Figure, Tabular
Lining, Proportional Lining, Proportional Oldstyle and Tabular Oldstyle.
Proportional Lining sets pnum and lnum and turns tnum and onum off; Tabular
Lining keeps lnum, Proportional Oldstyle keeps pnum, and Default Figure and
Tabular Oldstyle turn both off. Every catalog has rows for the three new
labels.
2026-11-01 07:16:31 +07:00
bflatastic 859b3732c1 Fix #4977: Blob Brush and Eraser show their tip's outline at the pointer 2026-11-01 07:16:29 +07:00
dotCooCoo 4a804b96bd Tabs: Escape pressed as a stop is released cancels the drag
The stop drop now checks Escape the way the indent-marker drop does, so Escape in the release frame leaves the stops as they were after a plain drag, a Ctrl-drag (Command on macOS) of all the stops, or a drag off the ruler.
2026-11-01 06:45:25 +07:00
dotCooCoo 2f8ff1a224 Tabs: Ctrl-dragging a tab stop moves all the stops together
In the Tabs panel, a stop dragged on the ruler with Ctrl held (Command on
macOS) moves every stop by the same distance, set in one text.tabs.set and
one undo step. The stops keep their order, alignment, leaders and Align On,
and the ruler draws them at their new positions during the drag.

Ctrl is read when the drag starts, as the Left Indent marker reads it. A drag
that would take the leftmost stop below 0 leaves it at 0, and one that would
take the rightmost past 100,000 pt leaves it at 100,000 pt, keeping the
spacing of the others. A Ctrl-drag released off the ruler deletes only the
dragged stop, as a plain drag does. A plain drag still moves one stop.
2026-11-01 06:45:25 +07:00
bflatastic 4211424855 i18n(pt-br): the Language menu shows English in its own name 2026-11-01 06:33:48 +07:00
bflatastic dac4dc15ad i18n(pt-br): leave the product, workspace and perspective preset names in English, as the menu-complete catalogs do 2026-11-01 06:27:24 +07:00
RicSchonfelder 9f64a13a8a i18n(pt-br): translate the rows the sibling catalogs cover
The Brazilian Portuguese catalog was marked complete under the tests, but 174 strings that the
German, French, Italian and Spanish catalogs already translate still fell back to English: smart
object and smart-filter editors, print presets and Japanese paper names, dimension lines and text,
the gutter, workspace names, swatch names and canvas messages.

Rows follow the catalog's vocabulary (dimension = cota, swatch = amostra, artboard = Mesa de
Trabalho, gutter = medianiz, line weight = espessura da linha) and are appended after the existing
entries; placeholders, ellipses and colons are unchanged. The parity doc records the new count
(6,126) with the commit it was measured on, following the rule in "How it is measured".
2026-11-01 06:27:24 +07:00
Don Omondi a425a89349 Fix #4820: the Layers panel lists a blend's spine
An open blend shows a <Spine> row below its key objects, where Release
leaves the spine. A click selects the blend (Shift/Cmd toggles it), so
Direct Selection edits the spine on the canvas; a locked blend's row
selects nothing, and the row is left out while searching or filtering.
2026-11-01 06:27:23 +07:00
bflatastic 7d8f1d4e06 Fix #4978: Area Type Options › Text Flow by rows or by columns 2026-11-01 06:11:11 +07:00
dotCooCoo 3f5c6f3b5b Fix #3826: the toolbar's Gradient chip lines up with Color and None
Filled rectangles are drawn on whole pixels, but the gradient chip is a
mesh, which was drawn at its exact position. At a fractional position or
display scale the Gradient button under the Fill/Stroke proxy sat up to
half a pixel off the Color and None buttons beside it. gradient_chip now
rounds its rect to pixels first, which also lines it up wherever else a
gradient chip sits next to a color chip.
2026-11-01 04:55:11 +07:00
dotCooCoo 49cded55da Accessibility: Tab no longer stops on a dialog's backdrop; tests check a reachable control
The backdrop behind a modal dialog took clicks with Sense::click(), which
egui makes focusable, so Tab stopped on it. It now senses clicks without
taking the keyboard focus.

The Tab tests now check that Tab reaches a known control in each region
instead of only that some widget took the focus: the title bar's three
caption buttons, a control inside each dialog, a Tools panel button and a
floating strip's Put back in the toolbar button, and the isolation bar's
back button. The dialog test also checks that Tab skips the backdrop.
2026-11-01 04:55:11 +07:00
dotCooCoo ef69c82fca Actions: Delete Selection's question deletes the asked sets by id
Each action set now has an id of its own, assigned when the set is made
(Default Actions, New Set, Begin Recording on an empty panel) and when it
is loaded from the saved preferences. The id is not saved.

The question Delete Selection asks about sets holds their ids, and
ui.actionSet.delete takes ids in place of all: OK deletes the asked sets
wherever they are now, and deletes nothing when one of them no longer
exists. Before, the question matched sets by the list of names, so with
two sets of the same name, or a new set made under the asked one's name
while the question was open, OK could delete a set it did not ask about.
2026-11-01 04:55:10 +07:00
dotCooCoo 1e8c05f675 Actions: deleting an action set closes its Set Options or Batch dialog
ui.actionSet.delete runs while a dialog is open, from the control channel or MCP. An open
Set Options or Batch dialog for a deleted set now closes, and one for a later set has its set
index lowered so that OK renames or batches the same set.
2026-11-01 04:55:10 +07:00
dotCooCoo 979273f930 Actions: Delete Action Sets checks every set's name, and Shift-click selects a range with an action selected
The Delete Selection question now carries the names of all sets as they
were when it asked (`all`). `ui.actionSet.delete` deletes nothing unless
the panel's sets still have exactly those names in that order, so a set
with a repeated name that moves into the asked index is not deleted.

Shift-click on a set's name selects the sets from the current one to it
also while an action in the current set is selected.
2026-11-01 04:55:10 +07:00
dotCooCoo 35860ef68e Actions: Delete Action Sets checks the asked sets' names before deleting
The question Delete Selection asks now passes the names of the sets it
names along with their indexes. ui.actionSet.delete deletes nothing and
returns an error when the set at an index no longer has that name, so a
set deleted or added above them while the question is open does not
make OK delete a different set. An index above the platform's usize
range is refused as "no such action set" instead of wrapping on 32-bit
builds.
2026-11-01 04:55:10 +07:00
dotCooCoo 1f5cb914fd Actions: Delete Selection deletes the selected action set
Delete Selection in the Actions panel (the bottom bar's trash and the
panel menu's new Delete) now deletes the selected action set with its
actions and keeps the other sets, after asking. A selected action is
still deleted at once. Shift-click on a set's name selects the sets from
the current one to it, and one question deletes them together. Default
Actions and the last set can be deleted; New Set still works on the
empty panel.

ui.actionSet.delete {sets?: [index]} does the deletion: an index past
the last set is an error before anything is deleted, a recording into a
deleted set stops, and a recording into a later set stays in its set.
Undo does not restore a deleted set.
2026-11-01 04:55:10 +07:00
dotCooCoo dc6440d523 Fix #2960: Recolor Artwork keeps its Preserve checkboxes between uses
Recolor Artwork opened with Preserve White and Black on and Grays off
every time, so clearing them had to be repeated on each use. OK on art
now keeps the three checkboxes in the UI state (recolor_preserve, saved
with the other remembered dialog fields), and the dialog opens with
them. Cancel leaves them as the last OK set them.
2026-11-01 04:55:09 +07:00
bflatastic cdc3a03a1d Objects on Path: one catalog row each for Pivot and Rotate, one Objects on Path parity entry 2026-11-01 04:55:09 +07:00
dotCooCoo fa21866568 Properties: an Objects on Path group shows Objects on Path Options with Pivot and Rotate
Squashed from #4985 onto main.
2026-11-01 04:53:50 +07:00
dotCooCoo a6ee76ad35 i18n: French Pivot and Rotate labels put a no-break space before the colon 2026-11-01 04:53:41 +07:00
dotCooCoo af86b2c833 Objects on Path: double-clicking the tool opens its options
Double-clicking the Objects on Path tool opens Objects on Path Tool
Options: a nine-point Pivot grid, a Rotate field, Reset (the center and
0) and Save. Save sets the tool's options, which last across tool
switches and are saved with the preferences. The tool sends them with
each attach, and object.objectsOnPath.attach without pivot or rotate
uses them, so they apply to the objects attached next; groups attached
before keep theirs.
2026-11-01 04:53:41 +07:00
bflatastic f22caa6108 Fix #4938: Dynamic symbols keep per-instance appearance linked to the symbol 2026-11-01 04:53:38 +07:00
bflatastic 9c17301c46 Fix #4937: artboards can have a background fill, included in exports and print 2026-11-01 04:13:57 +07:00
bflatastic 3146ca513b Fix #4939: Global Edit finds and edits groups like the selected one 2026-11-01 03:36:43 +07:00
bflatastic b8365d6197 Fix #4942: native Indic digits in the Digits menu 2026-11-01 03:36:40 +07:00
bflatastic 68391bdde4 Fix #4926: New Symbols from Layers 2026-11-01 02:44:16 +07:00
bflatastic 916b60898a Fix #4927: Save a Timestamped Copy 2026-11-01 02:44:16 +07:00
bflatastic 9e3f8dccec Fix #4950: Path Precision Tools: Divide into Dashes
addon.pathtools.divideDashes cuts the selected paths (or only their
direct-selected segments) into separate open paths of a dash length
measured along the curve, with an optional gap (gap pieces dropped
unless removeGaps is false) and Fit to Corners and Ends; pieces keep
the path's appearance, one undo step, at most 100000 pieces. Geometry
in vectorcraft-pathops; dialog with unit fields and Preview; tests,
sweep cases, catalog rows and docs.
2026-11-01 02:44:16 +07:00
bflatastic 69985f4998 Fix #4928: Arrange Tools: Group Overlapping Objects
addon.arrange.groupOverlapping groups the selected top-level objects
whose visual bounds overlap or touch, chains included (union-find over a
sweep along x, at most 20000 objects), only within one layer or group.
Each group takes its frontmost member's stacking place; one undo step,
all groups made in one pass over the tree. Menu item, tests, sweep case,
catalog rows and docs.
2026-11-01 02:44:15 +07:00
dotCooCoo dfd07552c8 Cursors: Caps Lock gives the drawing tools the crosshair
While Caps Lock is on, the tools whose pointer General > Use Precise
Cursors changes show the crosshair, and the saved preference does not
change. The desktop app reads the lock state on macOS, Windows and
Linux X11 and passes each change to the new view.capsLock command. A
change to view.capsLock or usePreciseCursors through app.run refreshes
the canvas pointer. The view.preciseCursors command is labeled Use
Precise Cursors, so command search finds it by the preference's name.
2026-11-01 01:59:54 +07:00