100 Commits
Author SHA1 Message Date
David Mann eb3b17b765 Merge pull request #10730 from Lcoding15/fix/typing-records-one-step
Actions: typed text records as one step; Batch says which files failed (#10113, #10682)
2026-11-07 12:16:19 +01:00
David Mann eaba29cbd5 Merge pull request #11862 from yoriswind/codex/eyedropper-layer-mask-11752
Sample the targeted layer mask with the Eyedropper
2026-11-07 12:11:57 +01:00
David Mann 1cc2e08acd Merge pull request #11865 from yoriswind/codex/note-show-on-new-11792
Show notes after creating one with the Note tool
2026-11-07 12:11:36 +01:00
David Mann 8548ed57a1 Merge pull request #11851 from DuBearte/fix/11771-count-delete-group-first
fix(engine): deleting the current count group makes the first group current (#11771)
2026-11-07 12:11:15 +01:00
David Mann 83eaf7c0bc Merge pull request #11847 from hnoerenberg/fix/pressure-size-default-off-11809
fix(paint): Pressure for Size starts off, as the reference does
2026-11-07 12:10:48 +01:00
David Mann 99f70bfe9b Merge pull request #11841 from DuBearte/fix/11788-note-delete-key
fix(ui): Delete with a note selected asks to delete the note, not the layer (#11788)
2026-11-07 12:09:36 +01:00
David Mann 9ba029129e Merge pull request #11540 from TrevorBrown-dev/feat/move-options-bar-distribute-gear-11381
feat(move): options bar gets Distribute buttons, the ... icon panel and the gear menu (#11381)
2026-11-07 11:57:35 +01:00
David Mann 7f7badcdc4 Merge pull request #11692 from RickiNano/fix/magnetic-lasso-right-click-11689
Magnetic Lasso: a right-click while drawing opens no menu (#11689)
2026-11-07 11:57:00 +01:00
David Mann 339adcb7bc Merge pull request #11322 from Saloouu/fix/toolbar-groups-survive-restart
Toolbar slots and tool keys keep their last tool across launches (#3569)
2026-11-07 11:55:58 +01:00
David Mann f68e227026 Merge pull request #11780 from davidmann4/i18n-fallback-no-coverage-tests
i18n: no test fails on a missing translation (#11778)
2026-11-07 02:20:37 +01:00
0eb6ba9dea #10730: keep the filter-preview comment the main merge cut; check both Batch outputs
The merge of main into #10730 dropped the first line of the comment above the
filter-preview check in confirm_generic_command; it is back. The Batch test now
compares out/b.png with the hand-typed reference as well as out/a.png, so a
replay that stops after the first file fails it (review on #10730).

Co-Authored-By: Lcoding15 <Lcoding15@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 01:40:56 +01:00
David Mann 048ae79779 Merge pull request #11672 from RickiNano/fix/11368-marquee-moves-outline-after-move
Marquee and Lasso: a drag after moving pixels moves only the outline (#11368)
2026-11-07 01:12:58 +01:00
David Mann 0f286b57a9 Merge pull request #11252 from NaufalDzz/fix-transform-several-selection-rules
fix(transform): refuse the Background among several layers and apply the box on a selection change
2026-11-07 01:12:41 +01:00
David Mann 927c63d394 Merge pull request #11022 from Hamza0101/fix/crop-overlay-and-fill-defaults
Crop: Always Show Overlay by default, Fill resets on another open document, and an untouched frame shows only itself (#10894, #10930)
2026-11-07 01:11:21 +01:00
David Mann 65cdc3159c Merge remote-tracking branch 'origin/main' into pr-10730 2026-11-07 01:09:59 +01:00
David MannandClaude Opus 5.5 b826eb3650 i18n: no test fails on a missing translation (#11778)
Remove the Azerbaijani menu coverage test (red on main), the crop Fill
label coverage test and the has() loop in the pen path Esc test. A
missing string falls back to English; cargo xtask i18n-coverage lists
the gaps. docs/contributing.md now says tests never require a string to
be translated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:30:56 +01:00
David Mann 8df2b7a2e2 Merge pull request #11738 from davidmann4/fix/az-contextual-task-bar
i18n: translate Contextual Task Bar in the Azerbaijani catalog (#11737)
2026-11-07 00:20:21 +01:00
David MannandClaude Opus 5.5 ee8a4caa03 i18n: translate Contextual Task Bar in the Azerbaijani catalog (#11737)
The Window menu item from #11669 and the Azerbaijani catalog landed
together, so azerbaijani_covers_every_menu_label_and_path fails on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 23:32:50 +01:00
David Mann 9922871a4e Merge pull request #11148 from vangel76/perf/paint-procedural-texture-cache
perf(paint): cache procedural brush textures between strokes
2026-11-06 23:20:44 +01:00
David Mann ad55badcb8 Merge pull request #11146 from vangel76/perf/paint-retouch-smudge-selection
perf(paint): Smudge start-up and selection sampling without per-pixel work
2026-11-06 23:20:17 +01:00
David Mann 6b0f7762e1 Merge pull request #11671 from davidmann4/integration-batch-20
Integration batch 20: 7 i18n PRs (Thai, Hebrew, Urdu, Tamil, Azerbaijani, Romanian, Korean)
2026-11-06 22:49:42 +01:00
David Mann fd890eaca4 Merge pull request #11669 from davidmann4/feat/crop-task-bar-10890
Crop: Contextual Task Bar under the crop frame, as a reusable task-bar widget (#10890)
2026-11-06 22:49:21 +01:00
David Mann 7ecfccbd64 Merge pull request #11643 from davidmann4/integration-batch-19
Integration batch 19: epic PRs (WIP)
2026-11-06 22:48:55 +01:00
David Mann bd84401dcf Merge remote-tracking branch 'origin/main' into integration-batch-20 2026-11-06 21:46:47 +01:00
David MannandClaude Opus 5.5 e339ecead2 Batch fix-up: keep one path.toShape entry after merging #11005's 0b66e8f00c
#11005's new head adds path.toShape to the vector-path list next to
path.stroke; the batch's 95c7a5d17e had added it next to path.set. Both
merged cleanly into a duplicate or-pattern; keep the contributor's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:44:32 +01:00
David Mann 47f4f1ce23 Merge PR #11005's new head 0b66e8f00c (path.toShape vector-path fix) 2026-11-06 21:44:23 +01:00
David MannandClaude Opus 5.5 46d6307cba Crop task bar: Done fits the cropped document
The bar draws inside the canvas pass, whose write-back of its own camera
dropped the fit that commit_crop asks for, so Done kept the old zoom. The
stored view now wins when the bar changed it, as a view menu row's does.
done_fits_the_cropped_document starts at 50 % and fails without the fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:17:51 +01:00
David Mann ce88165362 Merge remote-tracking branch 'origin/main' into fix/crop-task-bar-fit-11669 2026-11-06 21:00:22 +01:00
David MannandClaude Opus 5.5 0b3b3e470b direction tests: ignore the env override, check glyphs only with craft-fonts
Unit tests no longer read PHOTOCRAFT_UI_DIRECTION (cached per process, so a
developer's shell could flip the Hebrew/Urdu and shell assertions). The
Hebrew/Urdu test checks glyphs only when craft-fonts carries a face for the
script (the eager provider draws it in the first frame, as in CI with
CRAFT_FONTS_REQUIRED); without it the harness allows tofu and only the
mirroring is checked, instead of panicking on a host without the fonts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 20:52:58 +01:00
David MannandClaude Opus 5.5 e078c560ec Address CodeRabbit review: task bar tile, inspect and ui.set merge
- Draw the Crop task bar only on the active document's tile: a click into
  another tile activates its document mid-pass, and the tile drawn after it
  put the new frame's bar on itself for that frame.
- ui.inspect reports the bar hidden (and no rect) as soon as it can't show,
  not only after the next draw.
- ui.set merges panels.task_bar field by field: {"at": [x, y]} keeps a pin,
  {"pinned": true} keeps a dragged place; unknown nested fields are refused.
- Tests for each (each fails with its fix reverted), plus the task bar's
  preset dropdown picking 1 : 1 in sync with the options bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:41:21 +01:00
David MannandClaude Opus 5.5 5d5519dcac Regenerate docs/scorecard.md after merging main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:41:20 +01:00
95c7a5d17e Batch fix-up: path.toShape (#11005) takes a document vector path, not a file
The automation registry check reads a `path` param as a host filesystem
path unless the command is listed as taking a document vector path, as
path.set is. #11005's new path.toShape takes an inline vector path, so it
joins that list; CI failed registry_filesystem_path_params_are_classified.

Co-Authored-By: DingusMcRinkyDinky <DingusMcRinkyDinky@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:39:16 +01:00
David MannandClaude Opus 5.5 d7e66606ad Address CodeRabbit review: Turkic I text, type-ahead language change, RTL coverage
- zoom field: a menu's I key drops İ/ı text whatever the UI language (the keyboard layout is
  not the interface language).
- dropdown type-ahead: one entry per list tagged with its language, cleared on any frame in
  another language, so a prefix never carries over a quick switch and back.
- Hebrew and Urdu: live shell test selects each catalog, checks mirroring and glyphs.
- Azerbaijani restart test resets the drawing language before the restarted shell loads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:27:11 +01:00
David MannandClaude Opus 5.5 da7690e937 Camera Raw localization test: allow tofu only for Tamil until craft-fonts ships it
The pinned central font manifest has no Tamil face (storytold/craft-fonts#63 adds one) and the
Linux runner has none installed, so the strict missing-glyph policy panicked on the Tamil
labels. Tamil keeps every label and state check; a guard fails once the manifest ships Taml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:27:10 +01:00
David Mann d1d913e7e6 Merge remote-tracking branch 'origin/main' into feat/crop-task-bar-10890 2026-11-06 19:24:17 +01:00
David Mann 670fa8b5f1 Merge remote-tracking branch 'origin/main' into integration-batch-20
# Conflicts:
#	crates/ui-egui/src/prefs/prefs_ui/fields.rs
2026-11-06 19:01:38 +01:00
David MannandClaude Opus 5.5 af0ae88bad Batch: drop #9876 (New Guide unit dropdown) from the batch
The reference application's New Guide dialog has Orientation, Position
(a text field that takes typed units such as "2 cm") and Color, but no
unit dropdown; measured on 2026-11-06. Typed units already work on main,
so the PR only adds something the reference lacks.

This reverts merge 22e03d0bcb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:54:34 +01:00
812b25fa10 Batch fix-up: CodeRabbit findings on #11249, #11541 and #9862
- #11249: a recorded Blend If Set that also carries real layer effects (a
  Lefx with more than the scale) stays the recorded step instead of playing
  and saving back without the effects.
- #11541: the toolbar "..." flyout owns Escape, so Escape with it open no
  longer deselects or leaves full screen; a failed Edit Toolbar from a left
  click on "..." reports its error in the status bar like the flyout row.
- #9862: the click-on-another-layer check uses the commit's targets (the
  link group as it is now), so a layer linked after the box opened is not
  "another layer".

Each has a test that fails without the fix.

Co-Authored-By: NaufalDzz <NaufalDzz@users.noreply.github.com>
Co-Authored-By: TrevorBrown-dev <TrevorBrown-dev@users.noreply.github.com>
Co-Authored-By: Higgs32584 <Higgs32584@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:35:38 +01:00
156cab0d6f Integration: translate the strings main added since the Thai, Tamil and Azerbaijani catalogs (#10241, #10359, #10555)
Main gained the Crop tool's "Background (default)" / "Transparent (default)"
Fill labels and the Pen tool's refused-draft messages after these catalogs were
written, and two tests require them in every catalog:
the_fill_labels_are_translated_where_the_old_label_was (az, th, ta) and
esc_ends_a_refused_draft_and_return_keeps_it (th, ta). Built from each
catalog's own terms for Background, Transparent, Default and Work Path.

Co-authored-by: Thanawatttt <89511939+Thanawatttt@users.noreply.github.com>
Co-authored-by: NewsBaba <346041388+newsbaba24x7@users.noreply.github.com>
Co-authored-by: Tamer Albayrak <56173603+Taxperia@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:52:08 +01:00
David Mann 7919429708 Merge remote-tracking branch 'origin/main' into feat/crop-task-bar-10890 2026-11-06 17:50:28 +01:00
David MannandClaude Opus 5.5 c7b5373ba8 Crop: Contextual Task Bar under the crop frame, as a reusable task-bar widget (#10890)
The Crop tool gets the reference application's contextual task bar: a small floating
bar centred 11 pt under the crop frame with a grip, the preset dropdown (the options
bar's own, so both stay in sync), Straighten, a ⋯ menu (Hide bar, Reset bar position,
Pin bar position) and, while a crop is pending, Cancel and Done. It follows the frame,
stays inside the canvas, and stays put once dragged or pinned. Window › Contextual Task
Bar (after Tools, as in the reference) shows and hides it.

The bar itself is a reusable widget (widgets/task_bar.rs): position rule, grip, ⋯ menu
and the hide/pin/place state in Panels (kept with the panel layout across restarts,
read by ui.inspect › taskBar, set by ui.set {panels}). A context supplies only its
controls and where ⋯ goes; the Crop contents are tools/crop_task_bar.rs. Generative
Expand stays out until #41.

Also: Lucide pin and rotate-ccw icons, six new strings in all 27 catalogues, parity
661/661 (FLOOR raised), control-protocol docs. Three tests about the options bar's
Ratio dropdown now hide the task bar, which shows the same dropdown.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:50:20 +01:00
0b775dab11 Integration: keep the Korean rows, drop the session notes (#8185)
docs/korean-translation-validation.md records one agent session's checks
against a base from October (a "root task", a correction ZIP, other apps'
string tables); it says nothing a reader of docs/ can use. The 344 rows #8185
adds on top of main's ko.tsv stay (the merge kept main's wording for the 14
keys where both differ and dropped the 3368 rows main already has).

Co-authored-by: AKY <85772856+arksky1@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:33:07 +01:00
f236f0f6a4 Integration: Thai test compiles; Tamil catalog rows, plurals and attribution (#10241, #10359)
#10241: `th.0.plural(5)` calls a function-pointer field with method syntax
(E0599), so the ui-egui test target did not build; call it as `(th.0.plural)(5)`
(CodeRabbit). Add the ATTRIBUTION.md row for th.tsv and Thai to the licence
header (review ask).

#10359, from the review asks on the PR: two rows used spaces instead of a TAB
(Layer Mask Display Options..., Proportional Lining) and two had an empty
fourth column; "Scratch: {size}" translated the placeholder, so it rendered
literally; "Zoom In (hold, drag to scrub)" was split into a second "Zoom In"
key; "Print Settings..." lost its trailing ellipsis to a space. Tamil counts
take one|other, so the 28 two-form @plural rows now use plural_one_other; the
entry moves to the end of the registry. Adds the ATTRIBUTION.md, licence and
docs/localization.md rows, and tamil_tags_plurals_and_placeholders, which fails
on the old plural rule and placeholder.

Co-authored-by: Thanawatttt <89511939+Thanawatttt@users.noreply.github.com>
Co-authored-by: NewsBaba <346041388+newsbaba24x7@users.noreply.github.com>
Co-authored-by: Tanish Manku <13985398+tanish2k09@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:32:39 +01:00
David Mann b5acb4c622 Merge origin/main into integration-batch-19 2026-11-06 17:32:14 +01:00
David Mann b837027c41 Merge pull request #7064 from davidmann4/fix/rotated-view-drag-previews
Rotated view: Type box and Move marquee previews follow the document axes (#7063)
2026-11-06 17:29:48 +01:00
David Mann af99f69602 Merge pull request #7719 from davidmann4/fix/cas-background-selection
Content-Aware Scale works on the Background with a selection (#7717)
2026-11-06 17:28:41 +01:00
David MannandClaude Opus 5.5 757e0e1eae Integration: LANGUAGES holds all 34 languages after the merges
Each language PR set the array length for main plus its own entry; with six new
languages merged together the registry has 34 entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:27:02 +01:00
David Mann 1e82972ee1 Merge pull request #9667 from davidmann4/fix/system-tools-full-path
Windows: run explorer.exe and reg.exe by full path (#9666)
2026-11-06 17:26:45 +01:00
David Mann 8b70147d06 Merge pull request #9244 from davidmann4/fix/flip-angle-gradient-sweep
Image Rotation: a flip reverses an Angle gradient fill's sweep (#9243)
2026-11-06 17:26:13 +01:00
David Mann 3768e84b67 Merge pull request #9480 from davidmann4/fix/remove-enable-animations
Interface: remove the Enable animations preference (#9479)
2026-11-06 17:25:38 +01:00
David Mann 89235b39ac Merge pull request #10501 from davidmann4/fix/10328-review-followup
Review follow-up to #10328: Liquify saved twirl, copied type brings its styles, restored tests (#10500)
2026-11-06 17:25:11 +01:00
David Mann 16348db38b Merge pull request #9138 from davidmann4/fix/9137-control-click-coord-range
ui.click / ui.move reject coordinates beyond the screen range (#9137)
2026-11-06 17:24:27 +01:00
David Mann fff0db9850 Merge pull request #9309 from davidmann4/fix/match-rotation-crop-turn
Match Rotation leaves a pending crop's turn out (#9308)
2026-11-06 17:23:58 +01:00
David Mann 3fe08580ae Merge PR #8185: Add Korean support
# Conflicts:
#	crates/ui-egui/src/i18n/ko.tsv
2026-11-06 17:23:35 +01:00
David Mann 90f6d9aab6 Merge pull request #9300 from davidmann4/fix/trim-subquantum-alpha
Image: Trim (Transparent Pixels) ignores alpha that rounds to 0 at the document's depth (#9299)
2026-11-06 17:23:32 +01:00
David Mann cc5044d5b4 Merge PR #10241: i18n: add Thai UI catalog
# Conflicts:
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/LICENSE-translations.txt
2026-11-06 17:23:08 +01:00
David Mann c9e48117dd Merge PR #10555: i18n: add Azerbaijani UI language
# Conflicts:
#	crates/ui-egui/src/i18n/LICENSE-translations.txt
#	docs/localization.md
2026-11-06 17:23:00 +01:00
David Mann bcf818cca4 Merge PR #10547: i18n: add Romanian (ro) UI translation
# Conflicts:
#	ATTRIBUTION.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/LICENSE-translations.txt
#	docs/localization.md
2026-11-06 17:22:40 +01:00
David Mann 50d7ff9722 Merge PR #10361: i18n: add Urdu (ur) UI translation
# Conflicts:
#	ATTRIBUTION.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/LICENSE-translations.txt
#	crates/ui-egui/src/text/direction/tests.rs
#	docs/localization.md
2026-11-06 17:22:15 +01:00
David Mann 10608c2966 Merge PR #10365: i18n: add Hebrew (he) UI translation 2026-11-06 17:21:26 +01:00
David Mann f0e1e2a4b8 Merge PR #10359: i18n(ui-egui): add Tamil (ta) translation 2026-11-06 17:21:25 +01:00
8cdb452ef3 transform: keep a refused transform-controls press out of the Move tool (#11252)
With the Background among the selected layers, a press on a Move-tool
transform handle showed the locked-layer alert but was still forwarded
to the Move tool as Down (and, for a click, the tap and Up), so
Auto-Select could change the layer selection. begin_transform_controls_at
now returns ControlsPress (Missed / Started / Refused); the canvas press
and click paths and the ui.pointer path drop a Refused press. Tests drive
real canvas frames (click and drag) and ui.pointer, with an unselected
layer under the handle.

Co-Authored-By: NaufalDzz <NaufalDzz@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:09:44 +01:00
David MannandClaude Opus 5.5 e3ea244040 Integration batch 20: start the i18n batch
Empty commit so the draft batch PR can be opened before any candidate
PR is reviewed and merged on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 17:01:57 +01:00
David Mann 39330f8f07 Merge PR #11648: i18n and Layers empty-area menu follow-ups to integration batch 18 (#11494, #11503, #11455, #11500) 2026-11-06 16:54:26 +01:00
David Mann 8df0c8ba54 Merge origin/main into fix/crop-overlay-and-fill-defaults
# Conflicts:
#	crates/ui-egui/src/tools/crop_ui.rs
2026-11-06 16:25:10 +01:00
David Mann 2740c5d58f Merge main into fix-transform-several-selection-rules (main c101cbfb7e) 2026-11-06 16:24:54 +01:00
David Mann 5a6cd8c6bf Merge pr-11249-fixup: review fixes for #11249 (Gradient Fill Make export and extra layer props) 2026-11-06 15:59:28 +01:00
9d6cdca3fc Actions: a Gradient Fill Make exports with stops, keeps extra layer props (#11249)
Two CodeRabbit findings on #11249:
- A layer.newFillLayer.gradient step with from, to and stops plays the
  stops, but the ATN export refused it. from/to are now left out beside
  stops.
- A recorded Make whose Usng also held a name, opacity, mode or clipping
  loaded as the plain command, which plays none of them and saved back
  without them. It now stays the recorded step.

Each has a test that fails without the fix.

Co-Authored-By: NaufalDzz <90562913+NaufalDzz@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:58:57 +01:00
David Mann 244bd2c011 Merge PR #11541: Right-click on the toolbar's "…" button opens a flyout with one row, Edit Toolbar… (#11378) 2026-11-06 15:57:07 +01:00
David Mann eb83e5cc22 Merge PR #11092: Add Group filter to Layers panel (#10883) 2026-11-06 15:57:07 +01:00
32ca273fe6 PR #11092: the Artboard filter control test expects the error to list group
Co-Authored-By: Nurana100 <Nurana100@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:49:53 +01:00
David Mann eaddba69bd Merge PR #11249: Actions: load and save Blend If and Gradient Fill layers (#10771) 2026-11-06 15:36:23 +01:00
0217be25b4 Batch fix-up: #10438's zoomed-out nudge test expects "Nudge"
Main's #11383 renamed an arrow-key run's History step to "Nudge", as the reference
application names it; #10438's new zoomed-out test still expected "Move".

Co-Authored-By: hectorviov <hectorviov@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:10:15 +01:00
92de311b2b Actions: keep more Blend If and Gradient Fill forms exact (#11249)
Review fix-ups on #11249 after merging main:
- A midpoint outside 5..95 %, transparency stops out of range or out of
  order, and a Gradient Fill Set without transparency stops stay
  reference-application steps instead of playing clamped or keeping the
  layer's own transparency.
- An inverted Blend If range stays a reference-application step; the
  command rejects it at play.
- The Layer Style dialog's OK records `Lefx` = {Scl} beside Blend If on a
  layer without effects (measured). That Set is still the dialog's one
  step and saves back with the `Lefx` it was recorded with.

Co-Authored-By: NaufalDzz <90562913+NaufalDzz@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:07:32 +01:00
David Mann 72645904c7 Merge remote-tracking branch 'origin/main' into pr-11249
# Conflicts:
#	crates/engine/src/cmd/atn_cmds/steps_make.rs
#	crates/engine/src/cmd/atn_cmds/tests.rs
#	docs/atn.md
2026-11-06 14:55:00 +01:00
David Mann 0b765b2fbe Merge PR #11005: Pen: Make Shape turns the path into a shape layer (#10934) 2026-11-06 14:53:39 +01:00
David Mann 22e03d0bcb Merge PR #9876: New Guide: add a position unit selector for pixels, millimeters and inches 2026-11-06 14:53:38 +01:00
David Mann fdaa33c386 Merge PR #9456: feat(ui): Path mode for the Shape tools (part of #9453) 2026-11-06 14:53:37 +01:00
David Mann 6deb79ad1f Merge PR #10559: Select and Mask: resize the brush with Alt+right-drag 2026-11-06 14:53:29 +01:00
David Mann 7d10325213 Merge PR #10438: Move tool: an arrow nudge is one screen pixel, as in Photoshop (#9511) 2026-11-06 14:53:28 +01:00
2a9426cfe2 Merge origin/main into #11092 (Group filter) and fit it to main's filter row
Main added Effect, Attribute, Color, Smart Object and Artboard to the Layers
panel filter. Group is now the last type in the list, and works like Artboard:
`Filter::with_selection` fills the listed rows once per frame from
`group::listed`, so the panel, the deselect-on-apply step (#10879) and the
control channel all see the same rows; `shows_in`/`group_ids` and the
layers.rs change are gone. This also removes the duplicate `mod group;` and
`mod tests;` lines (E0428) and the rustfmt issues from the review.

- `group::listed` walks the tree with a stack instead of recursion and
  returns `LayerId`s.
- `Filter::show_all` is documented: Group keeps each group open or closed.
- Tests go through `Filter::of_app` and `panel_rows`, as the panel does,
  plus a deselect-on-apply case and a document without groups.
- control-protocol.md: `group` added to main's `layerFilter` entry.

Co-Authored-By: Nurana100 <Nurana100@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:42:50 +01:00
David MannandClaude Opus 5.5 4f124949b5 Address CodeRabbit review: convert type style colours with the type; keep Basic Paragraph on Duplicate to New
Converting a document (layer copy to another mode/profile, Image > Mode,
Convert to Profile with or without dither, Duotone inks) converted run colours
but not the colours set by character/paragraph styles and Basic Paragraph, so
converted runs showed a false local override and stopped following later
style edits. Duplicate Layer > New Document dropped the source's Basic
Paragraph, giving inheriting type false overrides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:20:31 +01:00
David Mann 1c754c72f5 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	crates/ui-egui/src/tools/crop_mode/tests.rs
2026-11-06 14:04:32 +01:00
David Mann a9de7ebee8 Merge remote-tracking branch 'origin/main' into HEAD 2026-11-06 14:03:38 +01:00
David Mann 8b0dd7129b Merge PR #9862: fix(transform): a click on another layer's pixels commits the box; the next click picks it (#11100, #8208) 2026-11-06 13:28:18 +01:00
David Mann 7904eee761 Merge pull request #11563 from davidmann4/integration-batch-18
Integration batch 18: 23 epic PRs (toolbar, move, selection, artboard, menus)
2026-11-06 12:42:38 +01:00
David MannandClaude Opus 5.5 64ac44bcfc Batch 18: edit.transform's stepName is a History step name, not a file path
The new `"stepName":"Transform Path"` parameter made the registry probe in
registry_filesystem_path_params_are_classified count edit.transform as a
command that takes a host filesystem path. Add it to the vector-path list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 10:24:16 +01:00
David Mann ec5eb1e2d0 Merge commit 'refs/fixprs/main' into HEAD 2026-11-06 10:21:59 +01:00
David Mann 519d29c536 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	docs/scorecard.md
2026-11-06 10:10:32 +01:00
David Mann 7271c8cca7 Merge pull request #3634 from davidmann4/feat/history-snapshot-options
History Options: Automatically Create First Snapshot, New Snapshot When Saving, Show New Snapshot Dialog by Default (#2966)
2026-11-06 10:07:19 +01:00
David MannandClaude Opus 5.5 99b93f82da Batch 18 (CodeRabbit nitpicks): crop test checks the active layer's covered pixels; Esc test goes through the shortcut handler
- #11458: the straight-crop rows also check that the active layer's pixels
  inside the old canvas are the plain crop's, so a fill that recolours them
  fails.
- #11295: the Esc case sends the key through shortcuts::handle instead of
  calling cancel directly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 04:04:26 +01:00
David MannandClaude Opus 5.5 2fcb4d699e Batch 18 (CodeRabbit): a zero nudge must leave History exactly as it was
The test accepted an added Nudge step; layer.translate records nothing for
a zero offset, so require unchanged entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 03:31:27 +01:00
David Mann a259993118 Merge pull request #9204 from davidmann4/fix/crop-doc-switch-view-turn
Crop: switching documents leaves the old document's view turned (#9202)
2026-11-06 03:22:25 +01:00
David Mann a46e6e0e4a Merge pull request #9286 from davidmann4/fix/crop-history-jump
Crop: History jumps wait for a pending crop (#9285)
2026-11-06 03:20:56 +01:00
David Mann bab0e5c2e2 Merge pull request #9278 from davidmann4/fix/crop-straighten-snap
Crop: a Straighten line inside the frame no longer snaps like a frame move (#9277)
2026-11-06 03:20:43 +01:00
David Mann dee552a817 Merge pull request #9284 from davidmann4/fix/crop-click-snap
Crop: a click on the frame or a handle never snaps it (#9283)
2026-11-06 03:20:20 +01:00
David Mann 5d10956221 Merge pull request #9261 from davidmann4/fix/image-size-resolution-range
Image Size: refuse a resolution outside 1..30000 ppi instead of clamping it (#9260)
2026-11-06 03:16:20 +01:00
David Mann 7122a21fec Merge pull request #9670 from davidmann4/fix/svg-markup-check
SVG: a DTD entity can't hide nesting from the depth check (#9669)
2026-11-06 03:15:57 +01:00
David Mann 03f9f53b13 Merge pull request #9213 from davidmann4/fix/crop-hidden-resample-budget
Crop W x H budgets the hidden pixels it resamples (#9212)
2026-11-06 03:15:14 +01:00
David Mann b81932c64a Merge pull request #9224 from davidmann4/fix/crop-drag-tool-switch
Crop: a tool switch during a frame drag ends the drag (#9223)
2026-11-06 03:14:21 +01:00