223 Commits
Author SHA1 Message Date
ruchirguitar 5bb21cdddf Add hyphenation for eleven Indian languages
Squashed from #5946 onto main.
2026-11-07 05:15:17 +07:00
dotCooCoo 0c5ad8e242 .ai save: objects next to type keep their own transparency
The reader gives an Xy right after a compound path or a text object to
that object. The writer now writes XR before the Xy of type, images and
guides, so type next to type, a compound path before type, image or
guide, and type before an image or guide keep their own opacity, blend
mode and knockout shape flag.

- Type keeps its Isolate Blending and Knockout Group state in a state
  block after its text object, as its outlines did on their group.
- The reader no longer gives a layer the Xy before its last text object.
- The ASCII85 end marker of the text document stays on one line.
- The warning and docs/file-format-parity.md also list area type in an
  open frame, type on an open path whose ends meet, type of only white
  space and threads of type on a path as written as outlines.
- README.md, ROADMAP.md, docs/gaps.md, docs/roadmap.md and
  docs/target-app-parity.md describe the editing copy a saved .ai holds.
- clip_path's doc comment is back on clip_path.
- import_fuzz reaches threaded area type and vertical type.
2026-11-07 05:15:16 +07:00
FractalEncrypt 10724077bc docs: the shape-tool status lines name no other branch's change
The roadmap's status line and revision history now record the shape tools'
centre-point move and corner rotate (#5477), and the parity status line no
longer names the Transform tab-order fix, which is its own pull request.
2026-11-07 05:15:05 +07:00
FractalEncrypt cd88b15912 Shape tools: review follow-ups (Shift, handle boundary, cursor order, feedback)
- The Selection tool takes a Shift-press on a selected object's centre point
  too: a Shift-drag moves the selection held to 45° steps, and a Shift-click
  there takes the object out of the selection, as a Shift-press on the object
  does.
- One rotate zone for the Selection tool and the shape tools
  (`select::rotate_zone`): a press on a bounding-box handle is not a turn, so
  the shape tools' zone matches the Selection tool's classification exactly.
- The shape tools' hover cursor follows the press order (corner and pie widgets,
  then the centre point, then the rotate zone), and a move of the selection
  shows the Selection tool's feedback: SelectionCopy with Alt, ArrowHollow while
  it snaps.
- Engine-level tests for the whole gesture (`crates/engine/src/tests/shapetools.rs`):
  repeated previews and one undo step, Alt copy, Escape then release, a turn
  about the centre, the corner widget still rounding, and an unfilled shape
  moved by the Selection tool.
- docs: evidence in target-app-parity.md's Shapes bullet and the M2 milestone,
  and the Move cursor's entry names the copy and snap cursors.
2026-11-07 05:15:03 +07:00
FractalEncrypt 5ecf7e7dc0 Transform fields: the W/H link stays a tab stop, after the fields
A review found the link lost its keyboard focus when it stopped being a tab
stop. It is focusable again, and the Control bar now keeps the link's place
between W and H but makes the button after the H field, so Tab still goes from
W straight to H and finds the link after it (as the Transform and Properties
panels already draw it). Tests: Shift+Tab goes back one field too, and a click
on the Control bar's link still toggles the preference.

The Blob Brush Tool Options test that expected two Tabs between the Roundness
field and the tip preview now expects one, as every field does. Docs: the Tab
entry in target-app-parity.md, both revision histories and the M1 milestone.
2026-11-07 05:15:01 +07:00
ruchirguitar 70f798b71d i18n: add Hindi interface and message catalog 2026-11-06 12:40:10 +07:00
Alex c2ef67b505 Effect dialogs: the colour swatch in the progress docs (#5365)
Roadmap, target-app-parity (revision row, status line, evidence bullet and the UI chrome
area row) and ui-parity (revision row and a checklist row) record the swatch beside a hex
colour field, its Color Picker and the test that covers both.
2026-11-06 02:34:17 +07:00
Alex 9e2e0e0f69 Pencil: a new stroke with Keep selected off leaves nothing selected (#5752)
Drawing a new Pencil or Paintbrush stroke kept the earlier selection: the engine's
`insert_look` selects the new path only when `keepSelected` is on, and with it off left the
selection as it was. Illustrator starts such a stroke by dropping the selection, and the new
stroke is not selected with Keep selected off, so the command now clears the selection after
inserting a new path.

What stays as before: with Keep selected on a stroke selects only the path it draws (the
earlier selection is replaced); a stroke that continues or redraws a selected path with Keep
selected off deselects that path and keeps the rest of the selection. The Blob Brush keeps its
own Keep selected and Merge only with selection options.

`path.freehand`'s documentation, the engine test
`pencil_with_keep_selected_off_leaves_nothing_selected` and the Tool Options test
`the_new_path_is_selected_only_with_keep_selected_on` cover the three cases. Docs: roadmap,
target-app-parity and ui-parity carry the change.
2026-11-05 23:42:01 +07:00
FractalEncrypt e0ad7ccf16 Preserve raster coverage of thin curved strokes
Squashed from #3273 onto main.
2026-11-05 20:00:21 +07:00
FractalEncrypt 884a330fae Keep Group Selection drags on the selected outlined component
Squashed from #3272 onto main.
2026-11-05 20:00:12 +07:00
KnottyDyes c9588457b9 Export: raster output defaults to the document resolution 2026-11-05 19:02:23 +07:00
Alex 82251c8e8b Layers: a layer that does not print shows its name italic (#5739)
Layer Options › Print off means the layer's art does not print. The Layers panel now paints
that layer's name italic, as Illustrator shows non-printing layers, and the ghost of a row
being dragged keeps the italic. A printing layer's name stays upright, and ticking Print
again restores it.

Row names are painted rather than widgets, so the italics come from a layout job's text
format (egui slants the glyphs itself; no italic face is needed).

Tests: panels::layers::tests::a_layer_that_does_not_print_has_its_name_italic covers Print
off, Print on again, and a plain printing layer; the layers suite (64 tests) passes.
Docs: roadmap, target-app-parity and ui-parity carry the change.
2026-11-05 19:02:23 +07:00
Alex 347b7e46bc Panels: a floating palette keeps out of the way of dialogs and menus
Floating panels are OS windows of their own, and craft-ui keeps a palette above the
app's other windows while it is active. A modal dialog or an open menu is drawn in
the main window, so a floating panel covered it: the Colour Picker's OK button and
fields, Recolor Artwork, and the menu bar's drop-downs (#5238, defect 1).

While a modal dialog or a menu of the in-window menu bar is open the docking renderer
hides each palette window, and when neither is open each palette shows again at its
palette level: topmost while the app is active, behind other applications' windows
while it is not, as craft-ui leaves a palette it creates. Hiding rather than lowering
covers both: a lowered window can be clicked back to the front, and craft-ui varies
the level through the viewport builder, which egui applies when the window opens and
not to one already on screen, so the commands go explicitly to the windows there are.

The menu bar tells the docking renderer whether one of its top-level menus is open,
the same state its hover switching uses; egui's own "any popup open" misses the
in-window menu bar.

Measured on Windows with the app focused and panels floating: before, a palette was at
the front of the z-order and topmost over the main window with the Colour Picker open;
after, the main window is in front and the palette is hidden until the dialog or menu
closes.

Tests: a_modal_lowers_the_native_palette_windows and
a_menu_of_the_menu_bar_lowers_the_palette_windows check the commands sent, and
a_palette_window_keeps_out_of_the_way_of_the_main_windows_dialog_and_menus the level
and visibility table. The wheel test
`wheel_over_a_floating_character_font_field_changes_the_font` fails on this machine
without this change too (font-order dependent), so it is not part of it.
2026-11-05 18:11:00 +07:00
ruchirguitarandClaude Opus 5.5 7dc66d660a Fix #5526: select images by link status
Selection Tools add-on: addon.select.byLinkStatus selects the image
objects and placed documents whose link is linked, embedded, missing or
modified (one status or several), as links.list reports it. Optional ids
limit the search, add adds to the selection, and zoom runs the existing
Zoom to Selection in the desktop app. Objects that are hidden, locked, on
a template layer or outside the isolated group are left out and returned
with the reason. Only the selection changes.

Select Linked / Embedded / Missing / Modified are in Object > Plug-ins >
Selection Tools and the Links panel menu. Each is off when no image has
that status, and Shift adds to the selection. Select by Link Status...
lists the images with name, status and format, with a name search, a
status filter, checkboxes with All / None and Zoom to Selection. The
status bar says what was selected and how many were left out, with
plural rows in every catalog.

Tests: engine (statuses, ids, add, zoom, skip reasons, bad params),
command sweep, and UI (message, list filtering, menu items, Links panel
menu, headless dialog frame). Docs: mcp, target-app-parity, ui-parity,
roadmap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 14:12:10 +07:00
Alex ad7cd71c39 Find Font: Replace With Font lists family and style rows
Choosing a replacement meant picking the family from one drop-down and its style
from another, and only then seeing what the style would be. Replace With Font now
lists rows of a family and one of its styles - the family's closest style first,
then each style it has - and one click sets both. A search above the list filters
the rows by family and style, as the Character panel's font menu searches.

Each list scrolls on its own: the document's fonts and the replacement rows keep
separate scroll states and scrollbars, and the replacement list is ten rows tall
at most, no taller than the rows it lists.

Review: the rows are rebuilt after a replacement, the search clears when the
dialog closes, and a double-click respects the same guard as the Change buttons;
the type-parity checklist has its status line and revision row.

Closes #4972.
2026-11-05 04:47:33 +07:00
ruchirguitarandClaude Opus 5.5 471cf3b81b Select by Artboards dialog: double-click a row to fit its artboard (#5549)
A double-click makes the row's artboard active and fits it in the
window (view.goToArtboard, as the Artboards panel does), keeping the
dialog open and the artboards chosen before it. Parity docs record the
Selection Tools add-on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 22:57:59 +07:00
FractalEncryptandDevin 985ef69cb7 New Document: units belong to the chosen preset, not the whole tab
Choosing units in Preset Details restyled every preset card in the Recent
and Saved tabs, so switching between inches and millimetres rewrote all the
user's templates at once. The pane's options apply to the selected preset
(helpx, "Create and save custom document presets"), so only the chosen card
follows the chosen units now; the others keep the units their document or
preset was made in, and clicking one brings its units back. The built-in
category tabs still show the chosen units (#2078).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-11-04 21:38:01 +07:00
dotCooCoo a3aae55ceb Docs: list PDF spot gradients written as images in process colors
PDF export writes a dithered gradient fill with spot stops, and a
Perceptual spot gradient with RGB or Lab stops other than white or more
than 4,096 stops on its curve, as an image in process colors. Add these
cases to the M3 roadmap rows and the color area's remaining work, and
correct the evidence line that said every Perceptual spot gradient
becomes an image.
2026-11-04 19:19:07 +07:00
dotCooCoo b72c822f1d Add font-aware OpenType stylistic sets menu 2026-11-04 14:08:30 +07:00
dotCooCoo dfc25c85e4 Type: move right-to-left characters with Touch Type 2026-11-03 23:57:53 +07:00
dotCooCoo bbbce4318f Add Enclosing Lasso as an optional tool
Squashed from #5362 onto main.
2026-11-03 23:30:06 +07:00
dotCooCoo 2b63bf1b67 Type: keep composition spacing along the line when characters rotate 2026-11-03 21:38:02 +07:00
dotCooCoo 0a9d65175a Docs: record Find Font replacement sources 2026-11-03 21:09:53 +07:00
dotCooCoo 4db6e7b448 Paint: use the document color model for new gradient defaults 2026-11-03 20:18:34 +07:00
dotCooCoo 2a95625b99 Type: step font families with the mouse wheel
Apply wheel steps over the closed family fields in Character, Properties and Control, preserving event order and one undo step per effective notch. Document the supported controls and the application choices. Fixes #5253.
2026-11-03 16:03:40 +07:00
dotCooCoo 2b6cbfda5d Update SVG, type, recoloring, and symbol feature records 2026-11-03 16:03:40 +07:00
dotCooCoo 012ac29d15 Window: Tile with one document open leaves the documents under their tabs
Squashed from #5256 onto main.
2026-11-03 16:03:40 +07:00
dotCooCoo 6bf2941f28 Docs: .ai guides are no longer listed as lost
#5057 opens ruler guides and guide objects from a .ai's editing data and
closed #779. The File formats row of docs/target-app-parity.md, the known
failures in docs/file-format-parity.md, G9 in docs/gaps.md and
docs/roadmap.md still listed guides as lost.
2026-11-02 12:03:55 +07:00
dotCooCoo f66b583b5b Tests: mixed spot gradients export as DeviceN shadings when radial or in a Lab ink
- A radial gradient from a spot swatch to a CMYK color is written as a
  DeviceN shading (ShadingType 3) of Yellow and the spot ink.
- A Lab spot color used as a flat fill and in a mixed gradient is
  written as one Separation space with the Lab alternate, which the
  DeviceN space names under /Colorants.
- docs/roadmap.md lists the gradients that still export without the
  spot ink: mixed spot/process gradients in SVG and PDF gradients with
  RGB or Lab stops. docs/target-app-parity.md also notes that a
  Perceptual gradient is written to PDF as an image.
2026-11-01 04:55:11 +07:00
aiongg ffad6cc20e docs: tidy wording 2026-10-31 04:25:47 +00:00
aiongg 8ae1f7dae6 docs: tidy agent, contributor and asset docs 2026-10-31 04:17:23 +00:00
Don Omondi de703fe722 M5: opaque knockout fills draw once in hard-edge and supersampled raster export
A knockout element with one opaque Normal solid fill (a path or
compound, no mask, effects or isolation) is drawn once under
AntiAlias::None, including the internal hard-edge frame of Art
Optimized supersampled exports, instead of being erased and added back
through per-element backdrop layers. Analytical antialiasing keeps the
existing compositor and rounding.

Exact-pixel tests compare against the general knockout path for paths
and compound holes across precision, supersampling, translucent parents
and copied backdrops, and check that the backdrop rasters are skipped;
translucent fills keep their knockout compositing.

# Conflicts:
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-10-31 06:28:42 +07:00
Don Omondi d4745fe046 fix(eps): a layer's state after its last blend stays the layer's
#4757 gives a blend the Xy written after its record. When the blend is a
layer's last object, the layer's own state block (Xy, Xd, 7 () XW, LB)
went to the blend instead, and the layer stayed opaque. The blend's state
is now tentative like a mesh's (#4748): its own 6 () XW confirms it, the
layer's LB gives it to the layer and the blend keeps what it had.

Also records the .ai/EPS audit fixes under G9, the File formats row and M4.
2026-10-31 05:11:04 +07:00
Don Omondi 7591e35345 docs: record the .ai/EPS import fixes from a user's file audit
Adds the evidence and revision rows that target-app-parity.md and
roadmap.md expect for the .ai/EPS import changes of 2026-10-30 (#4708,
#4664, #4723, #4742, #4658, #4727, #4738, #4744, #4748, #4743). Scores
and estimates unchanged.
2026-10-31 03:34:43 +07:00
Taha-Mahmoodi e2828bc064 Dialogs: keep dialog open on invalid Enter commit and prevent lock nesting in numeric widget 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 5da8c8e495 Numeric: clamp committed values in point units, schedule rejection highlight repaint, and update roadmap/area evidence 2026-10-30 16:55:55 +07:00
bflatastic c0bd20b6a2 Docs: cut the progress docs' status lines back to their latest change
Merges kept prepending each side's whole summary as "previously: …", so
target-app-parity.md's status line had grown to 66 MB (839 copies of its
Target clause), gaps.md's and ui-parity.md's to over 1 MB. Each status
line now names its latest change only, as the progress-docs standard has
it; the revision histories keep the earlier ones.
2026-10-30 01:46:33 +07:00
bflatastic 5165b6eb1d Pathfinder: live compound shapes (Make, Shape Mode, Release, Expand Compound Shape)
Squashed from #4621 onto main.
2026-10-30 00:15:58 +07:00
dotCooCoo 6f7a6b3e67 Docs: clarify initial Space sizing and record Flare history 2026-10-29 20:48:00 +07:00
dotCooCoo c479d2eeaf Flare: rotate rays by drag distance instead of event count 2026-10-29 20:47:57 +07:00
dotCooCoo dfa9f883c0 Fix Drop Shadow Darkness in source color space 2026-10-29 14:36:41 +07:00
dotCooCoo c1c07efc95 Blob Brush: keep the first Shift axis without moving earlier points
Squashed from #4525 onto main.
2026-10-29 14:36:32 +07:00
dotCooCoo b9f9099d91 Flare: preview options and restore defaults with Alt or Option
Squashed from #4446 onto main.
2026-10-29 14:35:57 +07:00
Don Omondi 88cf3c817c Docs: record EPS Save in status lines and revision histories
CodeRabbit follow-up for #4293. Add 2026-10-26 revision-history rows and
status-line updates for EPS Save and Save As in file-format-parity, gaps
(G9), roadmap and target-app-parity; move the completed EPS Save note in
roadmap's M4 row out of "Left:". Save-back is recorded as done; G9 import
fidelity and Illustrator editing-data writing (#868) are unchanged. Scores
and estimates unchanged. Docs only.
2026-10-29 13:00:48 +07:00
Don Omondi c6070f633e Support original-format EPS Save and Save As 2026-10-29 13:00:47 +07:00
Dylan M. Taylor 7a3b62b3b9 Docs: point the review disposition at the renumbered §8.10; drop Windows 7 from the change headers 2026-10-28 18:36:04 -04:00
Dylan M. Taylor cc3ca69d50 Remove the experimental Windows 7 build
Drop the unsupported Windows 7 x64 portable build and everything that existed only for it:
the windows7 workflow, packaging script and docs/windows7.md; the windows7 feature and the
win7-target cfgs (plain cfg(windows) now); the Windows 7 print transport
(printing/windows7.rs); the glow renderer path; and vendor/windows-link, the patched crate
only that build used. NOTICE, README and the living docs no longer describe it; dated
change-history rows are left as they were.
2026-10-28 17:57:17 -04:00
aiongg e724228e25 docs: update source paths for the moved files 2026-10-26 22:01:25 +00:00
Taha-Mahmoodi 0a241a7fdd Brushes: Window › Brush Libraries opens brush libraries whose brushes click or drag into the document's Brushes
Squashed from #4020 onto main.
2026-10-26 15:17:30 +07:00
Taha-Mahmoodi 5b91057dca Repeat: a selected Grid Repeat has on-canvas handles for its rows, columns and spacing
With the Selection tool, a single selected grid repeat shows a handle below the grid (rows), one right of it (columns), one past its bottom-right corner (both) and sliders between its first two columns and rows (horizontal and vertical spacing), as the public Set grid repeat options page describes. Each drag previews object.repeat.options and commits as one Repeat Options undo step; Escape cancels, and a drag that ends where it began leaves no step. Bounding-box handles keep priority where they overlap, and the controls hide with the edges or the bounding box. Before, a drag there scaled the source or started a marquee.

Part of #2691.
2026-10-26 13:44:06 +07:00