372 Commits
Author SHA1 Message Date
ruchirguitarandCursor e342a1ce0c M2.1: merge main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 11:43:22 +05:30
ruchirguitar e0aade5229 Merge remote-tracking branch 'origin/main' into SidePanelCollapseArrow
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/ui-parity.md
2026-11-09 10:00:54 +05:30
ruchirguitarandCursor 3deac491ca M2.1: merge current main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 09:03:17 +05:30
BFlat 2fe33b1fc6 Merge pull request #5355 from dotCooCoo/feat/help-bar-visibility
UI: show or hide the Help Bar independently
2026-11-09 08:02:10 +08:00
BFlat ab0cadc924 Merge pull request #6113 from ruchirguitar/fix/5949-hover-numeric-wheel
Numeric fields: step on wheel hover without taking focus
2026-11-09 07:57:18 +08:00
dotCooCoo e2beb714b0 Merge main into feat/help-bar-visibility 2026-11-08 14:56:29 -08:00
ruchirguitarandCursor 46cc28b299 M2.1: merge current main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 04:09:05 +05:30
ruchirguitar 7185ef4844 Merge remote-tracking branch 'origin/main' into SidePanelCollapseArrow
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/ui-parity.md
2026-11-09 03:31:09 +05:30
dotCooCoo 623f7449bc Type: the Escape return target is also cleared when another document or window becomes active
Switching documents, or windows of a document, deactivates the Type tool, which clears the tool its double-click came from, so Escape after a later edit goes to the Selection tool. The field's comment and the two checklist rows now say so.
2026-11-08 13:45:14 -08:00
ruchirguitar 84c2e61a82 Merge origin/main into fix/5949-hover-numeric-wheel
Keep hover wheel stepping and the canvas zoom-glide regression together with current main.
2026-11-09 03:09:19 +05:30
dotCooCoo 48fdfeffd8 Type: docs say Escape returns to the tool whose double-click chose the Type tool
Only a double-click on type from another tool records the tool Escape and
Cmd+Enter return to, and the Type tool keeps it until another tool is
chosen. Choosing the Type tool from the toolbar records none, so Escape
goes to the Selection tool. The type and UI checklists and the doc
comments on prev_tool, end_editing and claims_key now say so.

docs/type-parity.md held four copies of the point, area and path type
row, three of them with older Escape wording. They are one row again,
with the Type Orientation sentence that only one copy had.
2026-11-08 13:17:38 -08:00
ruchirguitar 2c80836bd5 M2.1: merge main and preserve path-deletion evidence (#3380) 2026-11-09 01:47:48 +05:30
Alex d8d3f43642 Text styles: double-click opens Character Style Options in a scrolling window
Two problems in the Character Styles panel and its options dialog.

Opening the options took the panel menu's item, which is easy to miss; a double-click on a style's
row did nothing beyond applying the style a second time. A double-click on a user character style's
row now opens its Character Style Options (`ui.charStyleOptions`), as the menu item does. A single
click still applies the style, the second click of the double-click does not apply it again (the
Normal style's included), and with Shift, Cmd/Ctrl or Alt held the double-click only follows the
click rules. The built-in Normal style opens no dialog. Double-clicking a paragraph style's row similarly opens
its options, which are the rename dialog the Paragraph Styles panel menu opens (`ui.paramDialog`
running `paraStyle.rename`): paragraph styles have no full options window yet.

The dialog then grew with its content: the General section lists every attribute of the style, so
the window covered the screen and its buttons could sit below it. The content now scrolls both ways
inside a window at most 420 points tall (less on a short screen) and never wider than the points
left beside the section list, with one scroll offset per section. The dialog keeps a fixed width of
720 points, enough for the widest section's controls, in every section. The content's height is the
space the footer leaves, measured from the footer drawn last frame, so a large interface scale's
taller footer is reserved too and OK and Cancel stay visible. The section list stays outside the
scroll area, so scrolling a long section never moves the navigation; the section is read after the
list handles a click, so a newly picked section gets its own scroll offset in the same frame.

Tests:
`panels::text_styles::tests::double_clicking_a_character_style_row_opens_its_options` selects text,
double-clicks a character style's row and checks the dialog opens with the style's name, one apply
ran from the first click and the second click applied nothing; a paragraph style's row opens none.
`double_clicking_the_normal_style_opens_no_options` checks the Normal style opens none and is
applied once.
`dialogs::char_style_options::tests::the_sections_scroll_in_a_window_shorter_than_the_general_list`
draws the dialog on a 900 by 560 point screen and checks OK and Cancel stay on it, the dialog keeps
its 720-point width in two sections, and the General list is taller than its scroll area.
`every_section_and_the_buttons_fit_the_smallest_window` checks the app's minimum 800 by 500 point
window in all five sections: every section label, OK and Cancel are on the screen.
`a_scrolled_section_keeps_its_offset_after_switching_away_and_back` scrolls General, clicks Basic
Character Formats and then General again, and checks General''s content returns to the same place:
the section is read after the list handles the click, so no other section stores its offset.
`every_section_and_the_buttons_fit_the_smallest_window_at_twice_the_scale` checks the same in the
400 by 250 points the minimum window holds at 2x UI scale, before and after a wheel scrolls the
content.
Docs: type-parity (a panel row and the revision history), ui-parity (a panel row and the revision
history), target-app-parity (two evidence bullets and the revision history) and roadmap (the
revision history), with the status lines updated.
2026-11-09 02:03:07 +07:00
Sven Lafebre 91a0ba4231 Pen: Copy and Cut take the anchors a Cmd-lent Direct Selection picked (#6123)
With the Pen or Curvature tool, Copy and Cut ignore the anchor selection,
so that the last anchor the Pen leaves selected doesn't make Copy take just
that anchor (#2122). Anchors picked with the Direct Selection that Cmd/Ctrl
lends those tools were ignored too, and the whole path was copied.

The session now remembers the selection the lent tool leaves when it gives
the tool back. While that is still the selection, Copy and Cut take the
picked anchors and segments, as with Direct Selection chosen.
2026-11-09 02:03:05 +07:00
Sven Lafebre e15965199f Fix #5188: the docs say how other corners are added after the first pick 2026-11-09 02:03:04 +07:00
dotCooCoo a9cd473a75 Merge main into feat/help-bar-visibility 2026-11-08 09:57:25 -08:00
dotCooCoo 41d3ac15e0 Type: docs say Escape returns to the tool active before type editing began 2026-11-09 00:34:51 +07:00
dotCooCoo bf4a9d00ab Type: docs say Escape returns to the tool that double-clicked into the type
Escape and Cmd+Enter (Ctrl+Enter on Windows and Linux) end text editing
and switch back to the tool that double-clicked into the type, or to the
Selection tool when there was none (`TypeTool::end_editing`). The
evidence lines in docs/type-parity.md, docs/ui-parity.md and
docs/target-app-parity.md, and the doc comments on `prev_tool` and
`claims_key`, said they always switch to the Selection tool.
2026-11-09 00:34:50 +07:00
dotCooCoo 657a99b629 Actions: Load Actions… reads action sets saved as .aia files
Squashed from #6149 onto main.
2026-11-09 00:28:25 +07:00
dotCooCoo 434c032f9e Symbols: Direct Selection sets the solid fill and stroke of one object in a dynamic instance
Squashed from #5962 onto main.
2026-11-09 00:26:11 +07:00
dotCooCoo 671e833913 Merge main into feat/help-bar-visibility 2026-11-08 09:10:51 -08:00
bflatastic 5de9fc2954 Docs: drop the header lines and rows the older PRs repeated 2026-11-08 23:51:57 +07:00
bflatastic 08f03e606d Docs: one status line in the roadmap and UI parity docs, with #5313's entry 2026-11-08 23:51:51 +07:00
dotCooCoo 3405620151 Docs: update marquee feature status and revision history 2026-11-08 23:51:23 +07:00
dotCooCoo 6d87514055 Selection: show marquee rules and offer enclosed and directional modes 2026-11-08 23:51:12 +07:00
ruchirguitar 3984874728 M2.1: avoid discarded path copies during deletion (#3380) 2026-11-08 19:35:48 +05:30
ruchirguitar 655a16fa67 #5925: add collapse arrows to floating panels and rail flyouts 2026-11-08 17:02:29 +05:30
ruchirguitar 2dc6991cf3 M2.1: retain gradient placement when deletion splits paths (#3380) 2026-11-08 03:51:00 +05:30
ruchirguitar c232919dd3 M2.1: clarify deletion evidence and function documentation (#3380) 2026-11-08 02:02:31 +05:30
ruchirguitar 349bdfa867 5949: step numeric fields on wheel hover 2026-11-07 19:57:54 +05:30
ruchirguitar e6a899857f M2.1: split disconnected path pieces after deletion (#3380) 2026-11-07 15:20:14 +05:30
dotCooCoo 0bc150c51e UI: save the Help Bar setting to preference files that lack it
A preferences file from before the Help Bar setting gets `help_bar` from
`status_bar` when it is read. A save that changed only the status bar
left `help_bar` out of the file, so the next start hid the Help Bar with
the status bar. A save now writes `help_bar` whenever the file lacks it,
and keeps a value another window saved.

Docs: the UI evidence list, the UI checklist and the M14 row record
Window > Help Bar.
2026-11-07 00:18:45 -08: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 1c345d8e6a Shape tools: drawing another shape from the selected one's centre moves it
A press on the centre point of the selected shape now moves the selection, as
asked (#5477), so the Constrain Angle test's repeated draws from the same point
moved the polygon drawn before them. It deselects first: nothing selected, the
press draws.
2026-11-07 05:15:03 +07:00
FractalEncrypt adbcb3a224 Shape tools: the selection moves from its centre point and turns outside a corner
A shape just drawn keeps its bounding box with the Rectangle, Rounded Rectangle,
Ellipse, Polygon and Star tools, but its centre point (Attributes › Show Center)
did nothing and the box's handles only drew: a press anywhere started a new
shape, and with the Selection tool a press on the centre of an unfilled shape
started a marquee.

- The Selection tool now takes a press on a selected object's centre point as
  the start of a move (held by that point, so it snaps and Alt copies), as
  Direct Selection has since #4891. A click there still makes the object the
  key object of a multi-selection.
- The shape tools take it too, and take a press in the rotate zone just outside
  a bounding-box corner (the Selection tool's own zone and cursor) as the start
  of a rotation about the box's centre. Live Corners widgets keep the corners
  themselves, so a press on a corner still rounds it; every other press still
  draws a new shape. Escape cancels, as for the Selection tool's drags.

`hit_center` moves from direct.rs to select.rs, shared by the three tools.
2026-11-07 05:15:02 +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
SofiaAFigueredoandClaude Sonnet 5.5 3d31b623a4 UI: centre the Home screen and use the accent for the Discord button (#4684)
Part of #4684 (unify the UI with PhotoCraft). The Home screen's welcome,
New / Open buttons and Community block are centred, as PhotoCraft's
Home screen is, and the large Discord button takes the theme's accent
instead of Discord's own colour. Preset cards, Recent Files and the
wording are unchanged.

Still open from #4684: shortcut hints on the Home buttons, PhotoCraft's
PRO and STUDIO themes, the Preferences layout and the title bar.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0113uEh3VQ6et4zDMZ9cqzkf
2026-11-07 05:15:00 +07:00
Don Omondi 4333c58033 Opening a slow file shows a progress window with Cancel and Continue in Background (#5930)
A file that takes longer than 0.4 s to open shows a modal progress window
with its name, a moving bar (reading reports no steps), how many more
files wait, Cancel (file.cancelOpen: the file doesn't open) and Continue
in Background (file.openInBackground). It never opens over another dialog
or progress window.
2026-11-07 00:17:17 +07:00
Don Omondi fc099e849c Direct Selection: with Snap to Grid, a dragged straight segment lands its anchors on the grid (#3835)
A straight segment dragged with Direct Selection or Group Selection snapped the
point it was pressed at to a grid intersection, leaving both of its anchors off
the grid. With Snap to Grid or Snap to Pixel on, the box round the moved anchors
now lands an edge on a gridline on each axis, as a moved object's does; Shift
keeps the move on its line. A dragged anchor still lands on an intersection.
2026-11-07 00:17:16 +07:00
Don Omondi f482c9c243 Drop Shadow: a swatch beside Color opens the Color Picker (#5364)
Squashed from #5918 onto main.
2026-11-06 23:03:56 +07:00
Don Omondi f7135db6e9 Drop Shadow and Outer Glow: spinner arrows step Opacity, the offsets, Blur and Darkness (#5367, #5368) 2026-11-06 17:09:24 +07:00
Don Omondi 74b5966bbd Stroke Weight Up and Down: Cmd/Ctrl+Alt+. and , step the selected strokes' weight (#5797) 2026-11-06 16:19:37 +07:00
Don Omondi 00b09002cf Layers: Rename opens the selected layer, group or object's name field (#5324) 2026-11-06 15:14:20 +07:00
Don Omondi ae3490d3ba Properties: Edit Artboards shows a Transform section above the artboard options (#5219)
With the Artboard tool, the Properties panel now starts with a Transform
section: the reference point shared with the Transform panel and the
Control bar, the active artboard's X and Y (of that point), W and H with
the Constrain Width and Height Proportions link, its preset and
orientation, and Move and Scale Artwork with Artboard. The Artboards
section follows with the name, Artboard Options and Fill. A new W or H
now keeps the reference point in place, as in the Transform panel.
2026-11-06 08:34:46 +07:00
Don Omondi e1439bfe33 Scrubby labels: the Control bar's Stroke: and Opacity: links scrub their fields (#4088)
The Control bar's Stroke: and Opacity: and the Properties panel's Stroke
are links to their panels, so a drag on them did nothing while every
other field label scrubbed its field. A drag on such a link now scrubs
the field after it (same steps and modifiers, one undo step, Escape
cancels); a click still opens the panel, and the link's text is not
selected by the drag.
2026-11-06 08:11:10 +07:00
Don Omondi 283c0d12bb Effects: an image's Inner Glow follows its visible pixels, not its frame (#5308)
Inner Glow clipped to the art's outline and bled in from outside it; for a
placed image that outline is the frame, so a PNG with transparent areas
glowed along the frame's edge, over pixels that don't show. For an image the
glow is now cast by its pixels' alpha (everything around them, blurred, or
the pixels themselves with Center) and kept to where the image shows, as
much as it shows.
2026-11-06 07:25:10 +07:00
Don Omondi 1f7f341c21 Properties: Quick Actions has Repeat Options for a selected repeat (#5181)
One selected radial, grid or mirror repeat (or one object of its source
art in isolation mode) shows a Repeat Options button in the Properties
panel's Quick Actions. It runs Object › Repeat › Options, opening the
Repeat Options dialog with the repeat's current values.
2026-11-06 07:23:39 +07:00
Don Omondi dfe628e906 Blend spine: Shift-click picks several spine points, which drag together (#5285)
Direct Selection kept only one picked point of a blend's spine. Shift-click
now adds a point of the same spine or takes it away, and dragging any picked
point moves them all. object.blend.spine.moveAnchor takes `with`, the other
points to move by as much, with the key objects on them, in one undo step.
2026-11-06 07:23:19 +07:00
Don Omondi 483de72dbb Direct Selection: Cmd/Ctrl held lends the Selection tool and shows its bounding box (#3901)
Squashed from #5851 onto main.
2026-11-06 05:33:00 +07:00
Don Omondi b976de560d Join tool: scrubbing the ends of two crossing paths trims them and joins the paths at the crossing (#5844)
The Join tool drew a segment between the open ends of two crossing paths
instead of trimming what overhangs the crossing. path.joinScrub now looks for
two crossing open subpaths whose overhanging ends the scrub runs over, cuts
both at the crossing and joins the kept parts there with a corner, in one undo
step. Without a crossing the endpoint join is unchanged.
2026-11-06 05:32:24 +07:00