Commit Graph
5748 Commits
Author SHA1 Message Date
dotCooCoo e93b672b3b Keyboard Shortcuts: panel menu commands with typed optional params can take a shortcut
An undoable command without a menu path or a default key was listed only
when every field of its params doc ended with `?`. A typed optional field
such as `on?: bool`, `ids?: [id…]` or `artboard?: index=0` counted as
required, so Fractional Widths, System Layout, Align to Pixel Grid, Embed
Image, Update Links, Delete Slices, Switch Orientation, Distribute Spacing
for artboards, Target Contents, Invert and other panel menu commands that
act on the selection could not be given a shortcut.

`runs_without_params` now reads the params doc with
`names_a_required_field`, the parser the editor already uses for menu
commands. The commands the new rule would list that set nothing, fail or
only give data back when a key runs them with no params (the panel
setters such as Fill and Character, the exports and saves without a path,
the undo group's begin and end, Create Dimension) join `NEEDS_A_PARAM`,
so they stay out of the list until the user gives one a key. New Symbol
joins it too, since the Symbols panel runs it through Symbol Options.

docs/mcp.md describes the rule and the full `NEEDS_A_PARAM` list.
2026-11-13 20:24:04 -08:00
dotCooCoo 1fbbb0a4e7 SVG export: shadows in a masked group show in readers that bound it by its shapes
Some SVG readers draw a masked group only inside the bounding box of its
shapes. A drop shadow, glow, blur or feather inside the group paints past
those shapes, so these readers left it out, while others drew it.

A masked group now starts with a rectangle over the mask's region,
unpainted (fill="none") and hidden (visibility="hidden"), when what it
holds has a visible raster effect: on a member at any depth, on a fill or
stroke, in a symbol's art, or in the art a blend or other live object is
written as. The rectangle widens the group's bounding box without drawing
anything, and import leaves it out. The masked groups of a knockout group
get the same rectangle when an element inside them has such an effect.
Other masked art, brushed strokes included, is written as before, and so
is an object whose own effects are written outside its mask.

Tests: a_masked_group_spans_its_region_when_its_art_paints_past_its_shapes
and a_knockout_group_spans_its_masks_when_an_element_paints_past_its_shapes
in crates/svg/tests/it/blend_export.rs.
2026-11-13 20:23:15 -08:00
ruchirguitar 05aef1f2c2 Merge remote-tracking branch 'origin/main' into pr-6613 2026-11-14 09:52:17 +05:30
dotCooCoo 90b053f480 i18n: Italian translates the messages no catalog had a row for
The untranslated report listed 167 status and error messages with no
row in any complete-message catalog, and 13 more that other catalogs
translate but Italian did not, so with the interface in Italian these
messages showed in English.

- it.tsv gains 114 `@msg` rows for the listed messages: image export
  and encoding errors, color profiles, color books and swatch exchange
  files, binary DXF and DWG import, 3D and Revolve limits, and script,
  zip and file errors.
- it.tsv gains 12 `@msg` rows for the Banner Hems and Grommets errors,
  three parameter checks and the failed recovery save.
- The rows sit in two commented blocks after the existing message rows.
- The 53 listed messages that open #7211, #7378 and #7405 translate
  (composite fonts, SVG filters, read roots and graph designs), and the
  justification order error that open #7116 translates, are left out,
  so no row is added twice.
- Placeholders, parameter names, command ids and literal values stay as
  the English writes them. The translations use the catalog's existing
  terms.
- docs/localization-parity.md and docs/target-app-parity.md give the
  Italian counts: 3,560 `@msg` and 48 `@msgplural` rows, 54 messages
  still listed.
2026-11-13 20:21:20 -08:00
dotCooCoo fb9d7208d5 Merge main into fix/ko-message-rows 2026-11-13 20:20:23 -08:00
dotCooCoo ea2391cbee Merge main into fix/hu-message-rows 2026-11-13 20:19:51 -08:00
dotCooCoo 6027126a1f Merge main into feat/trace-preset-defaults 2026-11-13 20:19:30 -08:00
dotCooCoo 155c2f722b Place: Placement Options clip a DCS image inside its file's clipping path
When links.update or links.relink re-read a DCS file and Placement
Options also clipped the image (Fill with Clip, or an aspect change
that overflows), the placement rectangle replaced the file's clipping
path, so plate art outside that path showed and printed.

The file's clip group now stays around the image and the placement's
clip goes in a clip group around it. The clip group holding just the
file's group takes that clip, as one holding just an image does today,
else a new one does, so later updates reuse the same two groups. A
file that loses its clipping path leaves its group as a plain group
inside the placement's clip. The same applies in symbols, graph
designs, patterns and opacity masks.
2026-11-13 20:18:35 -08:00
ruchirguitar 0ff98d0380 feat(layers): implement row context menu and actions
- Add right-click context menu on layer, group, and object rows:
  - Options... / Layer Options... / Options for Selection...
  - Duplicate <name> / Duplicate Selection
  - Delete <name> / Delete Selection
  - Lock Others / Unlock All Layers
  - Hide Others / Show All Layers
  - Locate Object
  - Collect for Export
- Select unselected row on right-click; preserve multiselection if already highlighted
- Dispatch actions via registered engine commands with Undo/Redo tracking
- Add headless egui tests covering selection, dispatch, and state integrity
- Update gaps and ui-parity documentation for G12
2026-11-14 09:47:46 +05:30
dotCooCoo f61c55876a Merge main into fix/ja-message-rows 2026-11-13 20:16:38 -08:00
dotCooCoo 5375b6e446 .ai save: images with a Warp count against the envelope limit
Opening an .ai file compares at most 256 envelopes and embedded images
with a Warp with their drawn art, from one budget. Saving the editing
data counted only envelopes, so a file with more than 256 of them in all
was saved with images past the budget written live and no warning, and
it opened with those images as their drawn look.

- The writer's budget now counts every image written with its Warp as
  well as every envelope, in the order they are written. An image past
  it is saved as its drawn look with a warning, and an envelope past it
  as its distorted art, as before.
- An image whose pixels can't be read is written as its gray outline,
  which the reader does not check, so it takes no part of the budget
  and keeps the warning about its pixels.
- The envelope warning names the shared budget.
2026-11-13 20:15:26 -08:00
dotCooCoo 9b2e21f6ca Live Paint: Merge keeps the visibility, opacity and blending of the parts it carries
Merge copied a face's or edge's appearance to the part it rebuilds in its
place, but not its visibility, opacity or blending mode. A half-transparent
face drawn by its stroke became opaque, and a hidden edge was shown again.
2026-11-13 20:14:37 -08:00
ruchirguitar 6f6746bd72 #6613: reconcile Gujarati catalog and complete current interface coverage 2026-11-14 09:44:24 +05:30
dotCooCoo d06870e414 Docs: DXF export of a non-circular ellipse is listed as a native ELLIPSE
The DXF SPLINE line in docs/target-app-parity.md said a non-circular
ellipse keeps the existing fallback. crates/cad/src/scene.rs writes a
closed four-cubic ellipse, or a circle scaled out of proportion, as a
native ELLIPSE in R13 and later, unless its minor-to-major ratio is
below 1e-6, and only R12 keeps the fallback. The line now says so.
2026-11-13 20:13:42 -08:00
dotCooCoo 00de304ab0 Live Shapes: saved object.setLiveShape steps with a negative radius or out-of-range sides replay again
Since #7294, object.setLiveShape refuses a negative `radius` and a
`sides` that is not a whole number from 3 to 1000. Session::replay
applied the same checks, so a journal entry or action step recorded
before that change with such a value stopped with a parameter error.

On replay, a negative radius now counts as 0, which is how it drew
before. A whole side count below 3 or above 1000 is brought into that
range, and a fractional or negative one is ignored. Direct calls still
refuse these values.
2026-11-13 20:12:05 -08:00
dotCooCoo ec31808bf2 i18n: Spanish translates 114 messages that no catalog had a row for
The untranslated report lists 167 status and error messages that none
of the 23 complete-message catalogs translates. Spanish now has an @msg
row for 114 of them: the errors of the image encoders, color profiles,
swatch exchange files and color books, 3D and Revolve, path operations,
DXF import, the script engine and the parameter checks. Open #7211 and
#7378 add Spanish rows for 51 of the others, and 2 stay in English.

The rows keep their placeholders, backticked names, accepted values
(smallThumb, RGB, CMYK, Lab, Gray) and limits as the English writes
them. A test checks the Spanish shown for messages of each group.
2026-11-13 20:09:43 -08:00
dotCooCoo d47cbe5f77 3D: colored-light faces keep unplaced gradients fitted to the face
The color cover of a composed face grew past the underlay's seam, and a
source gradient without a placement fitted itself to that larger
rectangle. The face now pins such a gradient to its bounds grown by
1 pt, as before the cover grew. docs/three-d.md states the measured
limits of the 1:1 comparison.
2026-11-13 20:06:12 -08:00
dotCooCoo 85e0d59bfa Brushes: Scale Proportionately art grows with the stroke weight
An Art brush set to Scale Proportionately drew its art at the same size
on every stroke weight: the art was scaled across only by how much the
path stretched it along and by the brush's Width. Stretch to Fit Stroke
Length and Stretch Between Guides already multiply by the stroke weight.
Proportional art now does too, so a 3 pt stroke draws it three times as
wide as a 1 pt stroke, still as long as the path. The same applies to
each run with Overlap on and to a Width that follows the pen.

Existing Scale Proportionately art brush strokes at weights other than
1 pt draw scaled by the stroke weight. Strokes at 1 pt draw as before.
2026-11-13 20:00:01 -08:00
dotCooCoo 1a01d591f3 Shapes: addon.shapes params text parses, and configure keeps omitted values
The ranges in the addon.shapes params text are in parentheses, so each
description reads as a params object. The configure description and
docs/mcp.md say that an omitted or null value keeps each shape's setting;
the defaults apply to the drawing commands only.
2026-11-13 19:56:50 -08:00
dotCooCoo 7c40cd2df2 Plug-ins: unlinking a gradient stop's spot swatch also clears its plates
A filter or importer that changes a gradient paint unlinks each stop from
its swatch and resets its tint, but left the stop's process plates. The
PDF and EPS writers read plates only with a spot swatch, so the stop kept
a plates array with no ink, saved with the document and compared in later
edits. Unlinking now clears the plates too, in fills and strokes; a paint
returned unchanged keeps its link, tint and plates.

The plate clamping test now checks the decoded output, before admission.
2026-11-13 19:56:38 -08:00
dotCooCoo 621f9b6287 Control bar: a bar too narrow for Document Setup still shows Preferences
With nothing selected, the Preferences button was drawn only after
Document Setup, so a bar with 90 to 111 points left showed neither,
although Preferences is 90 points wide and fits. The two buttons now
check the room left for each of them on their own.
2026-11-13 19:51:02 -08:00
dotCooCoo e9ae8b9661 Merge main into fix/ai-calligraphic-samples 2026-11-13 19:50:31 -08:00
dotCooCoo f643cddec4 Dimension tool: a reflected aligned dimension has its line on the reflected side
An unlinked aligned dimension that was reflected on its own kept its
offset, which is measured along the left normal of a to b. A reflection
turns that normal to the other side, so a line 30 pt above two level
points stayed 30 pt above them after a flip top to bottom instead of
going below them. The offset now changes sign when the transform
reverses orientation, as a reflection or a scale by a negative factor
does. Other transforms leave it as before, and linked, horizontal and
vertical dimensions keep their own rules.

Docs: docs/dimensions.md.
2026-11-13 19:48:30 -08:00
dotCooCoo 8f905c56be Merge main into fix/type-dialogs-story-wide 2026-11-13 19:45:37 -08:00
dotCooCoo 4819fdbc0a Type: Justification, OpenType, text styles and Convert to Text change every frame of a selected story
With the Selection tool, the Justification dialog, the OpenType panel, a
Character or Paragraph Styles row (Alt-click and Clear Overrides
included) and Type > Bullets and Numbering > Convert to Text now change
every frame of each selected threaded story, locked and hidden frames
included, in one undo step. Before, they changed only the selected
frames.

- The Justification dialog keeps the frames of the stories selected when
  it opened for its preview and OK.
- The OpenType panel's Figure menu shows Mixed and its checkboxes show a
  dash when the characters differ; a click on a dash turns the feature
  on everywhere.
- The style panels highlight a style only when all of the text has it,
  and show "+" when any of it overrides the style.
- Convert to Text takes the same stories as Apply Bullets and Apply
  Numbers.
2026-11-13 19:45:29 -08:00
dotCooCoo 9ab8b6ce16 i18n: German translates the messages no catalog had a row for
The untranslated report listed 167 status and error messages with no
row in any complete-message catalog, and 11 more that other catalogs
translate but German did not, so with the interface in German these
messages showed in English.

- de.tsv gains 116 `@msg` rows for the listed messages: image export
  and encoding errors, color profiles, color books and swatch exchange
  files, binary DXF and DWG import, 3D and Revolve limits, and script,
  zip and file errors. They sit in one commented block after the
  existing message rows.
- de.tsv gains 10 `@msg` rows for the Banner Hems and Grommets errors
  and the failed recovery save.
- The 51 listed messages that open #7211 and #7378 translate (composite
  fonts and SVG filters), and the justification order error that open
  #7116 translates, are left out, so no row is added twice.
- Placeholders, parameter names, command ids and literal values stay as
  the English writes them. The translations use the catalog's existing
  terms and typography.
- docs/localization-parity.md and docs/target-app-parity.md give the
  German counts: 3,563 `@msg` and 48 `@msgplural` rows, 52 messages
  still listed.
2026-11-13 19:42:45 -08:00
dotCooCoo ce3445d106 Live Paint: a Cmd double-click or triple-click with the Bucket paints nothing
With Cmd (Ctrl) held, the Bucket's presses go to the selection tool Cmd
lends, but the double-click and triple-click that follow reached the
Bucket and painted. They now paint nothing, as with Alt.
2026-11-13 19:38:18 -08:00
dotCooCoo 63e9fe5acb Merge main into fix/fr-message-rows 2026-11-13 19:33:21 -08:00
dotCooCoo 7602a7a57a Merge main into fix/ai-warped-image-pieces-cropped
# Conflicts:
#	crates/eps/src/ai_editing/writer.rs
2026-11-13 19:31:11 -08:00
dotCooCoo 3d40ba6c8e Type: COLR glyphs with repeating or reflecting gradients draw as vector art
A COLRv1 linear or radial gradient whose color line repeats or reflects
made the whole glyph an image. Such a gradient now reads into a vector
gradient with the same spread. The COLR specification repeats the
interval from the first color stop to the last, so one run of the stops
spans the gradient's vector:
https://learn.microsoft.com/en-us/typography/opentype/spec/colr

A repeating or reflecting radial gradient that starts at a circle stays
an image, and so does a repeating or reflecting gradient with a stop
whose palette index is outside the palette. A color line with an extend
value the specification does not define now pads, as the specification
says, instead of making the glyph an image.
2026-11-13 19:30:58 -08:00
dotCooCoo 0d06c5b9bd Merge main into fix/control-bar-narrow-fill-stroke 2026-11-13 19:29:37 -08:00
dotCooCoo adc1826c81 Contextual Task Bar: a blank canvas offers Draw (Pencil) and Place Image
With a selection tool in use and no artwork in the document (layers and
guides only), the bar shows Draw (Pencil), which switches to the Pencil
tool, and Place Image, which picks files for the Place dialog, as the
help page lists for a new document:
https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/contextual-task-bar-overview.html

VectorCraft's own rules: the bar sits under the active artboard, or
under the canvas's center when the artboard is out of view, and leaves
out the Fill, Stroke, Recolor Artwork and Lock controls. Other tools, a
selection and a document with artwork keep their bars as before.
2026-11-13 19:27:51 -08:00
dotCooCoo 7e660eb9a7 Control bar: a bar too narrow for Opacity still shows Graphic Style
When the Opacity link and its field had no room, the Control bar also
skipped the Graphic Style check, so the narrower Style link and its chip
were left out even when they fit. The bar now leaves out only the
Opacity part and checks the room for Style on its own.
2026-11-13 19:27:13 -08:00
dotCooCoo 77686c9d17 Merge main into fix/web-open-keeps-both-link-lines 2026-11-13 19:24:46 -08:00
dotCooCoo 497796decc Merge main into fix/more-int-param-wrong-type 2026-11-13 19:24:36 -08:00
dotCooCoo c0b9eed99f Links: a web open with missing and modified links shows both lines
On the web, a document that opened with linked files it can't read and
linked files that changed on disk showed only the line about the changed
files when Update Links doesn't ask. The status bar now shows the line
about the unreadable files and lists the line about the changed files as
the first note in its hover, ahead of the open's notes. With Ask When
Modified the update question opens and the line about the unreadable
files stays, as before.
2026-11-13 19:24:07 -08:00
dotCooCoo eb9976a825 Merge main into fix/graph-label-paint-recolor 2026-11-13 19:22:11 -08:00
dotCooCoo 94db0b1ebd .ai export: a masked image copy whose mask is left out keeps all of its pixels
A copy of an image written whole already was cut to the painted bounds of
its opacity mask even when the mask was then left out, nested too deep or
past the object limit, so the file read back with a cropped image and no
mask. The copy is now cut to its mask only when the mask is written, and
otherwise written whole.

The progress-doc line now gives the measured total for the warped test
image's pieces: about 7 times the image's samples, not twice.
2026-11-13 19:20:35 -08:00
dotCooCoo 9644811965 Merge main into feat/live-paint-bucket-multi-click 2026-11-13 19:18:43 -08:00
dotCooCoo 76c1cd8a96 Merge main into fix/live-paint-expand-drawn-stroke 2026-11-13 19:18:14 -08:00
dotCooCoo 1f6332c0a4 Live Paint: Expand keeps the faces and edges that draw
Expand kept a face only when its topmost fill had paint, and an edge only
when its topmost stroke had paint and a weight. A face or edge drawn by a
lower row under an unpainted top row was removed, and one whose only
painted row was hidden was kept as a visible path.

Expand now keeps a face or edge when it is shown, its opacity is above 0,
and any fill or stroke row is shown, has paint and an opacity above 0 (a
stroke also a weight above 0), with all of its rows. The rows are checked
with the new Appearance::has_drawn_fill and has_drawn_stroke.

Merge carried a face's topmost fill paint by the same topmost-row test.
It now carries every row of each face that draws by this rule, and of
each edge, pins their unplaced gradients to the old outline as
repaint_from does, and leaves the strokes' pen pressure, tilt, bearing
and rotation behind, since the rebuilt parts are other paths.

Docs: livePaint.expand params text, docs/mcp.md, and a line in
docs/target-app-parity.md, which also drops a repeated Live Paint
Selection marquee line.
2026-11-13 19:17:21 -08:00
dotCooCoo 88012ed92b Merge main into fix/i18n-literal-brace-messages 2026-11-13 19:15:55 -08:00
dotCooCoo 46584e4495 Merge main into fix/3d-export-builds-once 2026-11-13 19:14:40 -08:00
Dylan M. Taylor 1e4e3534f5 Merge pull request #7398 from storytold/feat/craft-libs-migration
Migrate CAD (DXF), EPS/PostScript, and SVG to craft-libs (#778)
2026-11-13 22:14:10 -05:00
dotCooCoo ee780e672d Merge main into fix/nl-message-rows 2026-11-13 19:12:48 -08:00
dotCooCoo cc1875e3c0 Merge main into fix/actions-load-reports-unknown-commands 2026-11-13 19:11:08 -08:00
dotCooCoo bc2caaaa37 Live Paint: a triple-click matches the first fill of a face clicked again
A triple-click whose clicks land on a face, another face, then the first
face again matched the fill the first click gave that face. It now
matches the fill the face had before the first click that painted it, as
the tool's doc comment and docs/mcp.md say.

- With Space held for the view tools, the Live Paint Bucket outlines no
  face or edge, as a press there paints nothing.
- A scoped livePaint.fill or livePaint.strokeEdge where every face or
  edge reached already has the paint records no undo step; a test covers
  it, and one where only some faces need the paint.
- An MCP test drives the bucket through ui.pointer with mods.space.
- The tool's doc comment and the progress line state the rule.
2026-11-13 19:10:40 -08:00
dotCooCoo 485636acf8 Merge main into fix/zh-hant-message-rows 2026-11-13 19:09:36 -08:00
dotCooCoo f383ce1475 Merge main into fix/knockout-groups-flat-masks 2026-11-13 19:09:32 -08:00
dotCooCoo 49a3c3d718 Merge main into feat/ai-art-brush-options 2026-11-13 19:09:26 -08:00