Skip to content

Stage J7-b: draggable workspace columns, a details drawer and a command bar - #122

Merged
uyujkk merged 4 commits into
mainfrom
claude/ui-j7b-workspace
Nov 10, 2026
Merged

uyujkk merged 4 commits into
mainfrom
claude/ui-j7b-workspace

Conversation

@uyujkk

@uyujkk uyujkk commented Nov 10, 2026

Copy link
Copy Markdown
Owner

Summary

Stage J7-b: the Mod workspace's appearance and usage flow, after #120 moved it into its own page (docs/development/UI-Fluent-Design-Plan.md, "Mod 工作区(J7)", and the 「工作台新布局」 design canvas).

Before → after

  • 084ed5b Column widths:
    • Before: fixed by the window width.
    • After: a splitter between characters and Mods and another between Mods and details. You drag them, or use the arrow keys on a focused splitter. The widths are saved in beta-shell.json and restored on the next start (decision 9 of the Fluent plan).
    • Limits: characters 200–360 px, details 320–560 px, and the Mod list never under 280 px. The rule is in RepositoryWorkspacePolicy, with unit tests.
    • This is a small splitter control rather than the toolkit GridSplitter, so the limits apply during the drag.
  • 850acda Details on narrow windows:
    • Before: a modal dialog from the Details button.
    • After: a drawer over the Mod list, at most 420 px wide, matching the design canvas. It opens from Details or by tapping a Mod, and closes with its close button, Esc, the presets view, or the window becoming wide enough. Focus returns to Details.
    • ModDetailsDialog is removed.
  • 80db98e Commands:
    • Before: three buttons that dropped to their own row under 720 px.
    • After: a CommandBar beside the title. Under 720 px the commands and view buttons become icons with tooltips, and at 670×530 the toolbar takes two rows instead of three.
    • Automation ids are unchanged.
  • 88f2f70 States:
    • Delete buttons (Mod, slot, preset) use J8's danger style. Their confirmations and what they delete are unchanged.
    • Loading: besides the status line, a progress bar on the toolbar's lower edge appears after 300 ms without moving the page.
    • Scan errors: besides the status line, an error bar with Retry, which closes on the next successful scan.
  • New strings: the two splitter names, in zh-CN, en-US and ru-RU.

Deploy, remove, copy ownership (#107), rename migration (#108), the delete safety checks (#105, #109), preset restore, state slot saving and the logic behind IWorkspaceHost are untouched. The only window files changed are MainWindow.Configuration.cs (loading and saving the two widths) and MainWindow.Localization.cs (command labels).

Selection speed (median of 6, two runs each)

Action Before After
Select character 72 / 66 ms 71 / 71 ms
Select Mod 31 / 33 ms 32 / 35 ms

The app's own work on a character switch is about 7 ms in both builds. The rest is waiting for display frames, plus about 42 ms for the UI Automation check itself. Skipping each part of the switch (details reset, details fill, status text) didn't change the frame times, so that code is unchanged.

Not done from the Fluent plan's workspace section (possible next step):

  • flat panes instead of the three cards;
  • a segmented view switch;
  • character search with Ctrl+F;
  • F6 between panes, plus Delete, Enter and Ctrl+I;
  • covers as an ItemsView;
  • a dashed outline while dragging files in;
  • removing the status card;
  • SelectorBar instead of TabView;
  • a preview height that adapts;
  • slot controls as settings cards.

Test plan

  • scripts\test-all.ps1: Release build 0 warnings, Core coverage 94.0% line / 88.2% branch

  • UI tests 58/58 on the same build. Two new ones:

    • drag the character column, restart, and check the width;
    • open and close the drawer every way, including by widening the window.

    The page round-trip tests still pass. The new tests wait for the settings file like Wait for the saved repository choice in the dashboard switch test #121.

  • Code-style check

  • 84 screenshots (zh/en/ru × 1400×900, 1000×800, maximized and 670×530 × light/dark; preview, shortcut, slot and preset views, plus the drawer). No new Russian clipping beyond the existing ellipses on long character names.

  • Full package with the real mouse, no errors logged:

    • 24 character and Mod selections;
    • remove and redeploy of a Mod;
    • the preset restore preview, opened and cancelled;
    • a rename;
    • a 52 px column drag;
    • the drawer opened and closed 6 times;
    • 48 page switches.

🤖 Generated with Claude Code

uyujkk and others added 4 commits November 10, 2026 11:30
Before -> after:
- Column widths: fixed by window width (characters 176-220 px, details 30 %
  of the page) -> a splitter between characters and Mods and one between
  Mods and details. Drag either, or focus it and use the arrow keys; the
  widths are kept in beta-shell.json (WorkspaceCharacterWidth,
  WorkspaceDetailWidth) and restored on the next start.
- Bounds (RepositoryWorkspacePolicy.Layout, unit tested): characters
  200-360 px, details 320-560 px, and the Mod list never under 280 px; a
  window too narrow for them falls back to the default layout as before.
- The splitters take the old 12 px column gap, show an accent line on hover
  and focus, and have names and tooltips (new strings in zh-CN, en-US, ru-RU).

A UI test drags the character column, restarts and checks the width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before -> after:
- Narrow windows (no room for three columns): the details pane opened in a
  modal dialog from the Details button -> it opens as a drawer over the Mod
  list (the design canvas's half-screen board), at most 420 px wide, with an
  in-app acrylic surface, the system shadow, a title and a close button.
- Opening: the Details button as before, and now also tapping a Mod.
- Closing: the close button, Esc, switching to the presets view, or a window
  that becomes wide enough for the inline pane. Focus returns to the Details
  button.
- The preview body scrolls inside the drawer; the deploy action stays pinned.
  ModDetailsDialog is removed.

A UI test opens and closes the drawer in all those ways.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before -> after:
- Refresh, Import and Run launcher: three secondary buttons, which went to a
  row of their own below 720 px -> a CommandBar beside the title (refresh as
  an icon with a tooltip, the others with labels); below 720 px all three
  become icons with tooltips and stay beside the title.
- View buttons (Files, Covers, Presets, Details, collapse): below 720 px
  they drop their labels and keep their tooltips.
- At 670x530 the toolbar takes two rows instead of three, which leaves the
  lists and the details drawer more height.
The automation ids (RefreshButton, ImportZipButton, RunLauncherButton) are
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h Retry

Before -> after:
- Delete Mod (list header), Delete slot and Delete preset: secondary buttons
  -> J8's DangerButtonStyle (red text and soft red fill); their confirmations
  and what they delete are unchanged.
- A repository scan or a long action: only the status line said so -> also
  an indeterminate progress bar on the toolbar's lower edge, shown after
  300 ms so quick scans do not flash it, and without moving the page.
- A failed scan: a status line only -> also an error bar under the toolbar
  with Retry (the same refresh as the Refresh button); the next successful
  scan closes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@uyujkk
uyujkk merged commit b436e4e into main Nov 10, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant