9.3 KiB
ClaudeDo UX Redesign — Microsoft To Do Style
Goal
Redesign ClaudeDo's UI for usability and visual polish, modeled after Microsoft To Do. Focus on keyboard-driven task creation, inline editing, and a cleaner visual language. All changes are within the ClaudeDo.Ui project (Views, ViewModels, Converters).
Design Decisions
- Accent color: Forest Teal
#3d9474 - Task creation: inline text field + detail pane editing (no more modal as primary path)
- Editing: auto-save on focus-lost in the detail pane
- Layout: proportional/reactive column sizing, no fixed pixel widths
- Toolbars removed — all actions via keyboard shortcuts, context menus, or inline controls
1. Inline Task Creation
Current
Bottom toolbar with + Task, Edit, Delete buttons. Clicking + Task opens a modal TaskEditorView dialog.
New
- Replace the bottom button toolbar in
TaskListViewwith an inline text field:+ Add a task... - Styled with dashed border, Forest Teal
+icon, placeholder text - Enter creates a new task with the typed title. Defaults:
Manualstatus, list'sDefaultCommitType, no tags - Escape clears the field and returns focus to the task list
- After creation, the new task is auto-selected, which loads it in the detail pane for further editing
- The modal
TaskEditorViewremains accessible via Ctrl+N for power users who want all fields at once
Implementation Notes
- Add an
InlineAddTitleobservable property andInlineAddCommandtoTaskListViewModel - The inline TextBox in
TaskListView.axamlbinds toInlineAddTitleand triggers the command on Enter viaKeyDownhandler - Task creation logic reuses existing
_taskRepo.AddAsyncpath but with minimal defaults
2. Editable Detail Pane
Current
TaskDetailView is read-only. Shows title, status badge, description, result, log path, live output, and worktree controls.
New
Split the detail pane into two zones:
Editable zone (top):
- Title — editable
TextBox(no label, large font, like To Do) - Status —
ComboBoxdropdown - Commit Type —
ComboBoxdropdown - Tags — display as clickable chips/badges with an inline "add tag"
TextBox; clickxon a chip to remove - Description — editable
TextBoxwithAcceptsReturn,TextWrapping
Read-only zone (below):
- Result (read-only TextBox, same as current)
- Log path
- Live output stream
- Worktree section (branch, state, diff stat, action buttons)
Auto-Save
- Changes save automatically when the field loses focus (
LostFocusevent) TaskDetailViewModelgets aSaveAsyncmethod that persists via_taskRepo.UpdateAsync- Tag add/remove saves immediately on action
- No Save/Cancel buttons in the detail pane
Implementation Notes
TaskDetailViewModelneeds write access: injectTaskRepository,TagRepository- Add observable properties for editable fields with
LostFocustriggering save - Add
AddTagCommand,RemoveTagCommandwith immediate persistence - Tag chips: use an
ItemsRepeaterorItemsControlwith aWrapPanellayout
3. Keyboard Shortcuts
All shortcuts handled via KeyDown on MainWindow or individual view controls.
| Action | Shortcut | Scope | Handler |
|---|---|---|---|
| Add task (inline focus) | Ctrl+N |
MainWindow | Focus inline TextBox (or open modal if Shift held) |
| Confirm inline add | Enter |
Inline TextBox | Create task |
| Cancel inline add | Escape |
Inline TextBox | Clear and defocus |
| Delete task | Delete |
Task list focused | DeleteTaskCommand |
| Edit / focus detail | Enter or F2 |
Task selected in list | Focus first editable field in detail pane |
| Toggle done | Space |
Task selected in list | Toggle status between Done and Manual |
| Run now | Ctrl+R |
Task selected | RunNowCommand |
| Navigate tasks | Up/Down |
Task list | Built-in ListBox behavior |
| Focus lists pane | Ctrl+L |
Anywhere | Focus list ListBox |
| Add new list | Ctrl+Shift+N |
Anywhere | AddListCommand |
Implementation Notes
MainWindow.axaml.csgets aKeyDownhandler that routes global shortcuts- Task-list-scoped shortcuts (Delete, Space, Enter/F2) handled in
TaskListView.axaml.cs - Inline TextBox shortcuts handled locally on the TextBox
4. Visual Overhaul
4.1 Accent Color
Primary accent: #3d9474 (Forest Teal)
Derived palette:
- Accent:
#3d9474 - Accent light (text on dark bg):
#6bb89e - Accent subtle (hover/selection bg):
rgba(61, 148, 116, 0.10) - Accent muted (selected list text):
#6bb89e
These should be defined as Avalonia SolidColorBrush resources in App.axaml or a resource dictionary for easy theming.
4.2 Circular Checkboxes
Replace the status badge + Run button in each task row with a circular checkbox on the left.
- Circle: 20px diameter, 2px border
- Border color by status:
Manual/Queued:#475569(gray)Running:#e67e22(orange), with a filled inner dotDone:#3d9474(accent green), with a checkmark SVGFailed:#ef4444(red)
- Click toggles between
Doneand previous non-done status RunningandFailedcheckboxes are not togglable (controlled by worker)
4.3 Completed Task Styling
Tasks with Done status:
- Title: strikethrough, muted color (
#5a6578) - Subtitle/tags: dimmer color (
#475569) - Row opacity:
0.6 - Checkmark SVG inside the circle
4.4 Sidebar Polish
List items:
- Colored dot (8px circle) to the left of each list name
- Dot color: cycle through a fixed palette (green, blue, amber, purple, rose) based on list index modulo palette length — no schema change needed
- Selected list: subtle accent background
rgba(61, 148, 116, 0.15), accent-colored text - Unselected: muted text color
#94a3b8 - More vertical padding (10px) and horizontal padding (12px)
- Border radius
8pxon list items
Bottom:
- Replace
+/E/-buttons with a single+ New Listtext link in accent color - Edit and Delete remain accessible via context menu and keyboard
4.5 Task List Header
Replace the static Tasks TextBlock with the selected list's name:
- Font size 16, font weight 600, color
#e2e8f0 - Bind to
MainWindowViewModel.SelectedList.Name - Falls back to "Tasks" if no list selected
4.6 Inline Add Field Styling
- Dashed border:
1px dashed #3a4560 - Border radius:
8px - Placeholder text:
+ Add a task...with+in accent color - Padding:
10px 14px - On focus: border becomes solid accent color, placeholder disappears
4.7 Remove Button Toolbars
- Remove the
StackPanel DockPanel.Dock="Bottom"from bothMainWindow.axaml(lists pane) andTaskListView.axaml(tasks pane) - Lists pane bottom: replace with
+ New Listlink - Tasks pane bottom: replace with inline add TextBox
- All removed actions (Edit, Delete) remain available via context menu and keyboard shortcuts
5. Reactive Layout
Current
Grid ColumnDefinitions="220,Auto,*,Auto,350" — fixed 220px sidebar, fixed 350px detail pane.
New
- Sidebar:
AutowithMinWidth="180"andMaxWidth="320", default content-driven - GridSplitters: remain as-is (
Autocolumns) - Tasks pane:
*(takes remaining space) - Detail pane:
*withMinWidth="280"andMaxWidth="500"
Use proportional sizing: ColumnDefinitions="1*,Auto,2*,Auto,1.5*" with min constraints on columns 0 and 4. This gives proportional resizing out of the box without needing content-driven measurement.
Additional
- Task row content adapts: title truncates with
TextTrimming="CharacterEllipsis" - Detail pane fields stretch to available width
- Status bar stretches full width (already does)
- Window
MinWidth="800"andMinHeight="500"remain as-is
6. Scope — What Does NOT Change
ClaudeDo.Worker,ClaudeDo.Data,ClaudeDo.App— no changes- Database schema — no changes
- SignalR protocol — no changes
WorkerClient— no changesListEditorView/ListEditorViewModel— modal remains for list CRUDTaskEditorView/TaskEditorViewModel— modal remains as Ctrl+N fallback- Status bar layout and functionality
- Context menu structure (items may be adjusted but menus stay)
- Task status flow (Manual | Queued -> Running -> Done | Failed)
- Worktree section in detail pane (read-only, action buttons)
7. Files to Create or Modify
Modify
MainWindow.axaml— reactive column definitions, list header binding, sidebar polish, keyboard handlerMainWindow.axaml.cs— global KeyDown routingTaskListView.axaml— remove toolbar, add inline TextBox, checkbox task template, keyboard handlersTaskListView.axaml.cs— inline add KeyDown, task KeyDown (Delete/Space/Enter)TaskDetailView.axaml— editable fields, tag chips, auto-save bindingsTaskDetailView.axaml.cs— LostFocus handlers for auto-saveTaskDetailViewModel.cs— add write capabilities, SaveAsync, tag CRUD, editable propertiesTaskListViewModel.cs— InlineAddTitle property, InlineAddCommand, toggle-done logicTaskItemViewModel.cs— add IsDone property, status-to-checkbox-state logicStatusColorConverter.cs— may need adjustment for checkbox border colors (or add new converter)App.axaml(or resource dictionary) — accent color brush resources
Possibly Create
CheckboxBorderConverter.cs— status string to checkbox border color- Color resource dictionary (if not inlining in App.axaml)