Merge mode had no exit: Escape was gated on branch_create_focused (false
in merge mode) and the painted 取消 hint was inert. Now:
- Escape is mode-based (branch_picker_open && mode != List → List), so it
steps both create AND merge sub-modes back to the branch list
- new GitPanelHit::BranchPickerCancel: in merge mode a click anywhere but a
branch row (incl. the 取消 hint) returns to the list
The 新建分支 / 合并分支 footer buttons were visual-only; this makes them
functional (TS GitPanelBranchPicker list/create/merge state machine):
- GitBranchPickerMode { List, Create, Merge } drives the dropdown body
- 新建分支 → inline name input (paint_menu_input) + Create button; typing
routes to branch_create_draft, Enter/Submit runs CreateBranch
(create_and_switch_branch); Escape returns to the list
- 合并分支 → merge mode listing non-current branches; a row merges it
- paint↔hit-test lockstep via shared branch_footer_rects / branch_create_rects
+ a backend-free label_px width heuristic
- input_active() now counts the branch-create field so shortcuts don't leak
All labels resolve through op-i18n (createAction/mergeAction/createPlaceholder
/createSubmit/cancel — present in all 15 locales).
The AI chat model-picker search captured typed chars but Delete (native
+ web), and on web also nudge/duplicate/reorder via input_active, still
reached the canvas and mutated/deleted the selection. Add the
chat_model_picker_open guard to native apply_delete and to web
apply_delete / input_active / apply_escape so the search field owns the
keyboard while open. Regression tests cover delete/backspace/nudge/
duplicate/reorder under an open picker.
Also clears the workspace clippy/fmt gate: allow should_implement_trait
on BuiltinAgentPresetKey::from_str (one call site, matches existing
op-ai-skills convention) and cargo fmt --all.
- op-i18n: align all 14 non-EN locales to the EN key set across both the
main and git chrome tables — translate ~1050 untranslated values, add
missing keys (dialog.dropToOpen, text.weight.extralight/extrabold,
git.empty.openNotARepo, git.empty.cloneComingSoon), drop the zh_cn
stray and the orphan git.commit.amendLabel; brand/protocol/placeholder
tokens kept English. English reference tables unchanged.
- agent-settings: resolve stash-pop conflict (kept draft-API side:
begin/save/cancel_builtin_agent_draft), remove the now-dead
empty_builtin_agent_draft_index helper.
- silence clippy::too_many_arguments on the 8-arg paint helpers in
agent_settings_{acp,builtin,images}.rs (matches existing convention).
Canvas / layout:
- Guard flex flow-children from free-drag and add a 4px drag threshold,
so a first click no longer materializes x/y on a flow child and
collapses the auto-layout frame.
Property panel:
- Gap/justify radios disable the gap input on space-between/around;
compact gap rows with vertically-centered input text.
- Padding-mode gear popover hover; the pin is anchor-scoped so it no
longer leaks into the next selection.
- Font-weight dropdown: full 100-900 numeric options + row hover.
- Stroke hex seeds the displayed swatch colour (not #000000); stroke
width now persists on commit.
Desktop:
- Traffic-light inset now applies on launch (casement windowDidBecomeKey).
- File-drop overlay; git commit caret blink.
Refactor:
- Split property_dispatch / git_panel / property-panel tests under the
800-line cap; reorganise panel tests by topic.
Canvas / layout:
- Guard flex flow-children from free-drag and add a 4px drag threshold,
so a first click no longer materializes x/y on a flow child and
collapses the auto-layout frame.
Property panel:
- Gap/justify radios disable the gap input on space-between/around;
compact gap rows with vertically-centered input text.
- Padding-mode gear popover hover; the pin is anchor-scoped so it no
longer leaks into the next selection.
- Font-weight dropdown: full 100-900 numeric options + row hover.
- Stroke hex seeds the displayed swatch colour (not #000000); stroke
width now persists on commit.
Desktop:
- Traffic-light inset now applies on launch (casement windowDidBecomeKey).
- File-drop overlay; git commit caret blink.
Refactor:
- Split property_dispatch / git_panel / property-panel tests under the
800-line cap; reorganise panel tests by topic.