Commit Graph
7152 Commits
Author SHA1 Message Date
dotCooCoo d0834e6834 Transparency: a layer on top gives its topmost object as the opacity mask
Make Opacity Mask took the topmost target as the mask. When that target was
a layer (a targeted layer above the art, or `ids` ending in a layer id), the
whole layer was removed from the layer tree and became the mask art. A layer
on top now stands for its visible, unlocked art, as a layer below the mask
already does: its topmost object is the mask and the rest of its art is
masked with the art below. A top layer with no such art is refused and the
document is left unchanged.
2026-11-01 08:32:54 +07:00
FredAppsandClaude Opus 5.5 b0294122e8 ci: leave print.yml unchanged
print.yml still runs its own jobs, and CLAUDE.md (CI workflows) keeps additions out of such files.
The cache churn it causes goes to craft-common-actions instead. This PR is now the xtask change only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 08:32:53 +07:00
FredApps 123e770e41 ci(xtask): i18n report selects the test run's targets too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

The test run builds --lib --bins --tests; a binary target's dependencies (the desktop app's
eframe features) could still resolve differently under --lib alone. Match the selection
exactly, and drop --quiet so a rebuild would show in the log.
2026-11-01 08:32:53 +07:00
FredAppsandClaude Opus 5.5 2f26d4012b ci: i18n report without a rebuild; PR print runs stop saving caches
- xtask ci: the i18n report selects the whole workspace as the test stage did. With
  `-p vectorcraft-ui-egui` alone cargo resolved features differently and recompiled for about
  3.5 minutes. `cargo xtask i18n-report` on its own still builds only that crate.
- print.yml: only main saves the desktop-print cache. Each PR saved its own 1.3 GB cache that
  only that PR can read (6.3 GB across five PRs), pushing the repository past its 10 GB limit
  and evicting caches main's gate restores.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 08:32:53 +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
BFlat 6d3d5ad1a2 Merge pull request #5017 from storytold/feat/sort-objects-4917
Fix #4917: Sort Objects sorts the selection by one attribute and applies that order to another
2026-11-01 08:25:50 +07:00
BFlat 9a8a885498 Merge pull request #5016 from storytold/feat/randomize-opacity-4925
Fix #4925: Randomize Opacity gives each selected object a random opacity in a range
2026-11-01 08:25:34 +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
BFlat 5a9a14fdbd Merge pull request #4975 from VladimirCeric/serbian-croatian
Languages: Serbian (Cyrillic, Latin) and Croatian, with their quote marks
2026-11-01 07:57:43 +07:00
BFlat 6ca5656c31 Merge pull request #5007 from mockydevs/feat/symbols-select-unused-4918
Fix #4918: Symbols panel Select All Unused
2026-11-01 07:57:26 +07:00
bflatastic 7d0c0b589e docs: type-parity keeps one status line and one revision row for the Serbian and Croatian languages after the rebase 2026-11-01 07:38:03 +07:00
VladimirCericandClaude Opus 5.5 13dd4f9086 Languages: keep other apps' names out of the comments and docs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011wCJ9DkszhZKxYL3LgcSfZ
2026-11-01 07:38:03 +07:00
VladimirCericandClaude Opus 5.5 d440b6d32b Languages: cite the quote sources (Pravopis ISBN, CLDR links)
From the CodeRabbit review: the Serbian and Croatian quote marks name
their sources with the Pravopis's ISBN and links to CLDR's sr and hr
data, in the code and in docs/type-parity.md; the quotes test says what
it checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011wCJ9DkszhZKxYL3LgcSfZ
2026-11-01 07:38:03 +07:00
VladimirCericandClaude Opus 5.5 c492d524c5 Languages: Serbian (Cyrillic, Latin) and Croatian, with their quote marks
Document Setup and Character › Language list Serbian: Cyrillic (sr-Cyrl),
Serbian: Latin (sr-Latn) and Croatian (hr). Text tagged Serbian is shaped
in it (#4940, #4959), so fonts draw their Serbian forms, the italic б,
г, д, п, т. Serbian quotes follow the Pravopis (Matica srpska 2010,
т. 168) and CLDR: „…” and ’…’; Croatian per CLDR: „…“ and ‚…‘.
Illustrator lists Croatian but not Serbian.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011wCJ9DkszhZKxYL3LgcSfZ
2026-11-01 07:38:03 +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
BFlat 1c0ca5a26b Merge pull request #5002 from dotCooCoo/fix/status-messages-plural-counts
i18n: link, font and export status messages use real plural forms instead of "(s)"
2026-11-01 07:37:27 +07:00
BFlat 0335900ea7 Merge pull request #5006 from dotCooCoo/feat/opentype-panel-alternates
OpenType: the panel turns Stylistic and Titling Alternates on and off, and offers Proportional Lining figures
2026-11-01 07:37:10 +07:00
BFlat c460be8505 Merge pull request #5008 from dotCooCoo/feat/place-word-doc
Place: Word 97-2003 .doc files place as area type with their formatting
2026-11-01 07:36:58 +07:00
BFlat a42fc050ca Merge pull request #5009 from storytold/feat/brush-tip-cursor-4977
Fix #4977: Blob Brush and Eraser show their tip's outline at the pointer
2026-11-01 07:36:41 +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
dotCooCoo 8805fa8214 Place: Word .doc text with a broken surrogate pair is refused, and fields without a result warn
A 16-bit piece holding half of a UTF-16 surrogate pair was placed with
U+FFFD in its place; the document is now refused. A pair split between
two pieces is decoded as one character.

A field with no result (no separator, never ended, or nested past 64)
is left out with its own warning, and the warning about fields placed
as their results is given only for fields that have one.
2026-11-01 07:16:30 +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 5fdccdf602 Place: Word 97-2003 .doc files place as area type with their formatting
File > Place reads a Word 97-2003 document (a compound file named .doc,
or one that holds a WordDocument stream) and sets its main text as area
type, as it does for .rtf and .docx files. The text comes from the
piece table, in 16-bit Unicode or compressed 8-bit pieces. Formatting
is resolved from the style sheet's default font, the paragraph style,
the character style and the direct character and paragraph properties,
and keeps the same properties the .docx reader maps.

Table cells are separated by tabs and each row is a paragraph, and a
field places as its result. Hidden and deleted text, pictures, headers,
footers, notes, comments and text boxes are left out, and the reply's
warnings name each kind of content left out or changed once. Word 6.0
and Word 95 documents, encrypted documents and documents last saved
with fast save are refused, and so are structures that lie outside
their streams.

The compound file is read with the cfb crate (MIT), which adds one
package to Cargo.lock.
2026-11-01 07:16:29 +07:00
BFlat 433ddb593d Merge pull request #4997 from dotCooCoo/feat/tabs-ctrl-drag-moves-following
Tabs: Ctrl-dragging a tab stop moves all the stops together
2026-11-01 06:48:58 +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
BFlat b4d4d6a419 Merge pull request #4996 from RicSchonfelder/i18n/pt-br-extra-rows
i18n(pt-br): translate the rows the sibling catalogs cover
2026-11-01 06:45:00 +07:00
BFlat 6e5b8b130b Merge pull request #5000 from mockydevs/fix/blend-spine-layers-4820
Fix #4820: the Layers panel lists a blend's spine
2026-11-01 06:44:45 +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
BFlat ab90f50cbd Merge pull request #4994 from dotCooCoo/fix/eps-gradient-keeps-spot-ink
EPS export: gradients of spot colors keep their spot inks
2026-11-01 06:26:38 +07:00
BFlat a19cd5135e Merge pull request #5005 from storytold/feat/area-type-flow-4978
Fix #4978: Area Type Options › Text Flow by rows or by columns
2026-11-01 06:26:23 +07:00
BFlat 1c7744359d Merge pull request #5004 from storytold/feat/pen-ctrl-edit-4980
Fix #4980: Pen with Cmd/Ctrl drags the path, not hidden bounding-box handles
2026-11-01 06:26:08 +07:00
BFlat a7861010a4 Merge pull request #5003 from storytold/fix/artboard-fill-test-linux
Tests: artboard fill in EPS and print matches the red by hue on every platform
2026-11-01 06:25:53 +07:00
dotCooCoo 1840b9a582 EPS export: gradients of spot colors keep their spot inks
EPS export wrote every gradient with a spot color stop in process
colors. A gradient of tints of one spot color and paper white is now
written in that ink's Separation space, at Level 2 and 3. At Level 3, a
gradient that mixes a spot color with CMYK or gray colors, or two spot
colors, is written in a DeviceN space of the process inks its stops use
and the spot inks, each spot ink with the CMYK equivalent its Separation
space has. An off-center midpoint is a stop with the inks halfway
between its two stops. Paper white is an exact white, whether or not
the stop is linked to a process swatch.

These gradients are still written in process colors, each with its own
warning: a mix with other inks at Level 2; a mix with RGB or Lab colors
in an RGB export (a CMYK export converts those stops to CMYK first); a
DeviceN space that would need more than 32 colorants or a spot ink named
Cyan, Magenta, Yellow, Black, All or None; and a Perceptual gradient.
The old warning for every spot gradient has been removed.

The header lists two or more spot colors with each %%+ line right after
the comment it continues: %%DocumentCustomColors and %%CMYKCustomColor
were interleaved, so a DSC reader took the second ink's name as part of
the first ink's %%CMYKCustomColor.
2026-11-01 06:11:12 +07:00
bflatastic 7d8f1d4e06 Fix #4978: Area Type Options › Text Flow by rows or by columns 2026-11-01 06:11:11 +07:00
bflatastic 8704c15c6d Fix #4980: Pen with Cmd/Ctrl drags the path, not hidden bounding-box handles
Cmd/Ctrl held with the Pen lends the last-used selection tool (Direct
Selection until one is chosen), which already moved anchors, straight
segments and curves of the path being drawn, one undo step each, and
handed the path back to the Pen.

With the Selection tool used last, the lent tool hit-tested the
bounding box even though the canvas hides it while anchors are selected
on their own, as the end anchor of a path being drawn is. Over the
path it showed a resize pointer, and the drag scaled the path by a
handle nobody could see: a flat path did nothing at all.

The Selection tool's handles now take the pointer only while the box is
shown (View > Show Bounding Box, no anchors selected on their own), so
the lent Selection tool moves the path being drawn.

Tests: select::tests::hidden_box_handles_take_no_press_while_anchors_are_selected,
tests::draw2::pen_cmd_drag_edits_anchors_and_segments_and_goes_on_drawing.
2026-11-01 06:11:09 +07:00
bflatastic ffc9b71a2b Tests: artboard fill in EPS and PostScript print matches the red by hue, not one platform's CMYK values 2026-11-01 06:11:07 +07:00
Dylan M. Taylor d26dd933a7 packaging(flatpak): add OCI image build and GHCR publishing helper (#4987) 2026-10-31 18:53:15 -04:00
BFlat 0fac297ee7 Merge pull request #4998 from storytold/fix/linux-tablet-4967
Fix #4967: a drawing tablet's pen draws on a Wayland session by default
2026-11-01 05:49:01 +07:00
bflatastic 51dcb94661 Fix #4967: a drawing tablet's pen draws on a Wayland session by default
On a Wayland session Linux Display Server's default, Automatic, opened
the window on native Wayland. winit 0.30 doesn't bind the Wayland tablet
protocol, and KWin (since Plasma 6.3) and Mutter turn no tablet input
into pointer input, so the pen moved only the compositor's cursor and
the app got no motion or presses. Only X11 (XWayland) When a Pen Is
Attached, which users had to find and choose, sent the window through
XWayland, where the pen works as a mouse with its pressure.

Automatic now opens the window through XWayland when a pen is attached
as the app starts, as PhotoCraft does by default.
VECTORCRAFT_NATIVE_WAYLAND=1 keeps the window on Wayland, like
PhotoCraft's PHOTOCRAFT_NATIVE_WAYLAND. The X11 choice is unchanged.
2026-11-01 05:32:30 +07:00
BFlat 9a4989cf03 Merge pull request #4965 from dotCooCoo/fix/pdf-gradient-keeps-spot-ink
PDF export: a gradient that mixes a spot color with process colors keeps the spot ink
2026-11-01 05:31:12 +07:00
BFlat 5db1212698 Merge pull request #4966 from dotCooCoo/fix/issue-3826
Fix #3826: the toolbar's Gradient chip lines up with Color and None
2026-11-01 05:30:57 +07:00