feat(i18n): localize Avalonia view strings via loc:Tr markup

Extract ~165 hardcoded UI strings across islands, modals, planning and
shell views into en.json; replace with {loc:Tr} bindings.
This commit is contained in:
mika kuns
2026-06-03 12:05:08 +02:00
parent 070f5de1b1
commit 086c6f6c45
23 changed files with 573 additions and 259 deletions

View File

@@ -8,6 +8,299 @@
"tabGeneral": "General", "tabGeneral": "General",
"tabWorktrees": "Worktrees", "tabWorktrees": "Worktrees",
"tabFiles": "Files", "tabFiles": "Files",
"tabPrime": "Prime Claude" "tabPrime": "Prime Claude",
"general": {
"defaultInstructions": "Default instructions",
"defaultInstructionsPlaceholder": "Baseline instructions applied to every task",
"model": "Model",
"maxTurns": "Max turns",
"permission": "Permission",
"maxParallelExecutions": "Max parallel executions",
"maxParallelExecutionsHint": "How many queued tasks the worker runs at once.",
"reportExcludedPaths": "Report: excluded paths (one per line)",
"standupWeekday": "Standup weekday",
"weekdaySunday": "Sunday",
"weekdayMonday": "Monday",
"weekdayTuesday": "Tuesday",
"weekdayWednesday": "Wednesday",
"weekdayThursday": "Thursday",
"weekdayFriday": "Friday",
"weekdaySaturday": "Saturday"
},
"worktrees": {
"strategy": "Strategy",
"centralWorktreeRoot": "Central worktree root",
"autoCleanup": "Auto-cleanup finished worktrees after",
"days": "days",
"cleanupFinished": "Cleanup finished worktrees",
"forceRemoveAll": "Force-remove all worktrees",
"confirmRemoveAll": "Remove ALL worktrees? Uncommitted work will be lost.",
"removeAll": "Remove All"
},
"files": {
"agentsSection": "AGENTS",
"agentsHint": "Restore bundled default agents. Existing files are not overwritten.",
"restoreDefaultAgents": "Restore default agents",
"promptsSection": "PROMPTS",
"systemPrompt": "System",
"planningPrompt": "Planning",
"agentPrompt": "Agent",
"openInEditor": "Open in editor"
},
"prime": {
"description": "Prime your Claude usage window by firing a single non-interactive ping on the days you choose, at a chosen time. Only runs while ClaudeDo is open. If the app starts within 30 minutes of the target time, the ping fires immediately.",
"addSchedule": "+ Add schedule",
"dayMo": "Mo",
"dayTu": "Tu",
"dayWe": "We",
"dayTh": "Th",
"dayFr": "Fr",
"daySa": "Sa",
"daySu": "Su"
}
},
"tasks": {
"sortTip": "Sort",
"showCompletedTip": "Show completed",
"listSettingsTip": "List settings",
"addPlaceholder": "Add a task…",
"enterKey": "ENTER",
"notesPinnedRow": "Notes (daily notes)",
"overdue": "OVERDUE",
"tasks": "TASKS",
"clearCompletedTip": "Clear all completed",
"ctxSendToQueue": "Send to queue",
"ctxRemoveFromQueue": "Remove from queue",
"ctxCancelExecution": "Cancel execution",
"ctxMarkAs": "Mark as",
"ctxMarkDone": "Done",
"ctxMarkCancelled": "Cancelled",
"ctxRunInteractively": "Run interactively",
"ctxOpenPlanningSession": "Open planning Session",
"ctxResumePlanningSession": "Resume planning Session",
"ctxDiscardPlanningSession": "Discard planning session",
"ctxQueueSubtasks": "Queue subtasks sequentially",
"ctxScheduleFor": "Schedule for...",
"ctxClearSchedule": "Clear schedule",
"badgeDraft": "DRAFT",
"badgePlanned": "PLANNED",
"approve": "Approve",
"approveTip": "Approve — mark Done",
"reject": "Reject",
"rejectTip": "Reject with feedback and re-run",
"park": "Park",
"parkTip": "Send back to Idle for manual editing",
"cancel": "Cancel",
"cancelTip": "Cancel this task",
"removeFromQueueTip": "Remove from queue",
"scheduleTitle": "Schedule task",
"scheduleWhen": "WHEN",
"scheduleConfirm": "Schedule",
"rejectRerunTitle": "Reject & re-run",
"feedbackLabel": "FEEDBACK FOR THE AGENT",
"feedbackPlaceholder": "What should the agent fix?",
"rerun": "Re-run"
},
"lists": {
"heading": "Lists",
"searchPlaceholder": "Search tasks…",
"searchKbd": "Ctrl K",
"settingsTip": "Settings",
"smartListsLabel": "SMART LISTS",
"myListsLabel": "MY LISTS",
"contextSettings": "Settings...",
"contextWorktrees": "Worktrees…",
"contextOpenExplorer": "Open in Explorer",
"contextOpenTerminal": "Open in Terminal",
"newList": "New list",
"addReposTip": "Add repos as lists"
},
"details": {
"deleteTaskTip": "Delete task",
"closeTip": "Close",
"copyTaskIdTip": "Copy task ID",
"starTip": "Star",
"agentSettingsTip": "Agent settings",
"agentSettingsHeading": "Agent settings (overrides)",
"modelLabel": "Model",
"systemPromptLabel": "System prompt (appended)",
"agentFileLabel": "Agent file",
"mergeLabel": "MERGE",
"mergeTargetLabel": "Merge target",
"reviewCombinedDiff": "Review combined diff",
"mergeAllSubtasks": "Merge all subtasks",
"stepsLabel": "STEPS",
"addStepPlaceholder": "Add a step...",
"detailsLabel": "DETAILS",
"copyDescriptionTip": "Copy description to clipboard",
"toggleEditPreviewTip": "Toggle edit/preview",
"previewBtn": "Preview",
"editBtn": "Edit",
"descriptionPlaceholder": "Add task details (markdown supported)..."
},
"agent": {
"stopTip": "Stop agent",
"sendToQueue": "Send to queue",
"sendToQueueTip": "Queue this task for the worker to pick up",
"removeFromQueue": "Remove from queue",
"removeFromQueueTip": "Take this task back out of the queue",
"worktreeLabel": "WORKTREE",
"copyPathTip": "Copy path",
"diffLabel": "DIFF",
"openDiff": "Open diff",
"worktreeBtn": "Worktree",
"openWorktreeTip": "Open worktree in file explorer",
"continue": "Continue",
"continueTip": "Resume the last session and keep going",
"resetAndRetry": "Reset & retry",
"resetAndRetryTip": "Discard the worktree and re-queue the task to run from scratch"
},
"notes": {
"today": "Today",
"add": "Add",
"newNotePlaceholder": "New note…",
"save": "Save",
"delete": "Delete"
},
"session": {
"chipLive": "LIVE",
"chipDone": "DONE",
"chipFailed": "FAILED"
},
"modals": {
"about": {
"title": "ABOUT",
"version": "Version",
"data": "Data",
"logs": "Logs",
"config": "Config",
"open": "Open"
},
"workerConnection": {
"title": "WORKER NOT REACHABLE",
"body": "ClaudeDo can't reach the background worker. It is normally started automatically at logon. You can start it now, or reinstall if the problem persists.",
"dismiss": "Dismiss",
"rerunInstaller": "Rerun Installer",
"startWorker": "Start Worker"
},
"listSettings": {
"title": "LIST SETTINGS",
"deleteList": "Delete list",
"sectionGeneral": "GENERAL",
"name": "Name",
"workingDirectory": "Working directory",
"workingDirectoryPlaceholder": "(none)",
"browse": "Browse...",
"defaultCommitType": "Default commit type",
"sectionAgent": "AGENT",
"resetAgentSettings": "Reset agent settings",
"model": "Model",
"systemPrompt": "System prompt (appended)",
"agentFile": "Agent file"
},
"merge": {
"title": "MERGE WORKTREE",
"windowTitle": "Merge worktree",
"cancel": "Cancel",
"merge": "Merge",
"targetBranch": "Target branch",
"removeWorktree": "Remove worktree after merge",
"commitMessage": "Commit message",
"conflictedFiles": "Conflicted files:"
},
"diff": {
"title": "DIFF",
"windowTitle": "Diff",
"merge": "Merge…"
},
"worktree": {
"title": "Worktree"
},
"worktreesOverview": {
"refresh": "Refresh",
"cleanupFinished": "Cleanup finished",
"columnTask": "TASK",
"columnState": "STATE",
"columnDiff": "DIFF",
"columnAge": "AGE",
"phantom": "phantom",
"phantomTooltip": "Directory missing on disk",
"ctxShowDiff": "Show diff",
"ctxOpenInExplorer": "Open in Explorer",
"ctxJumpToTask": "Jump to task",
"ctxMerge": "Merge…",
"ctxDiscard": "Discard",
"ctxKeep": "Keep",
"ctxCopyBranch": "Copy branch",
"ctxCopyPath": "Copy path",
"ctxForceRemove": "Force remove"
},
"repoImport": {
"title": "ADD REPOS AS LISTS",
"windowTitle": "Add repos as lists",
"cancel": "Cancel",
"searchPlaceholder": "Search repos…",
"addFolder": "Add folder…",
"forgetFolders": "Forget folders",
"alreadyAdded": "(already added)"
},
"unfinishedPlanning": {
"title": "UNFINISHED PLANNING SESSION",
"windowTitle": "Unfinished planning session",
"discard": "Discard",
"finalize": "Finalize",
"resume": "Resume",
"draftTasksSuffix": " draft task(s) waiting to be finalized."
},
"weeklyReport": {
"title": "WEEKLY REPORT",
"windowTitle": "Weekly Report",
"from": "From",
"to": "To",
"generate": "Generate",
"regenerate": "Regenerate",
"emptyStateHint": "No report for this range yet. Click “Generate”."
}
},
"planning": {
"conflict": {
"windowTitle": "Merge conflict",
"modalTitle": "MERGE CONFLICT",
"openInVsCode": "Open all in VS Code",
"resolved": "I've resolved — continue",
"abort": "Abort this merge"
},
"diff": {
"windowTitle": "Planning — Combined diff",
"modalTitle": "PLANNING — COMBINED DIFF",
"previewCombined": "Preview combined",
"loading": "Loading…"
}
},
"controls": {
"datePicker": {
"today": "Today",
"tomorrow": "Tomorrow",
"nextMon": "Next Mon",
"clear": "Clear",
"time": "Time",
"done": "Done"
}
},
"shell": {
"menu": {
"help": "Help",
"checkForUpdates": "Check for updates",
"restartWorker": "Restart worker",
"worktrees": "Worktrees…",
"weeklyReport": "Weekly Report…",
"about": "About…",
"addRepos": "Add repos as lists…"
},
"update": {
"available": "Update available: v",
"updateNow": "Update now",
"dismiss": "Dismiss"
}
} }
} }

View File

@@ -1,5 +1,6 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Controls.ThemedDatePicker" x:Class="ClaudeDo.Ui.Views.Controls.ThemedDatePicker"
x:Name="Root"> x:Name="Root">
@@ -125,10 +126,10 @@
MinWidth="300"> MinWidth="300">
<StackPanel Spacing="10"> <StackPanel Spacing="10">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<Button Classes="quick" Content="Today" Click="OnTodayClick"/> <Button Classes="quick" Content="{loc:Tr controls.datePicker.today}" Click="OnTodayClick"/>
<Button Classes="quick" Content="Tomorrow" Click="OnTomorrowClick"/> <Button Classes="quick" Content="{loc:Tr controls.datePicker.tomorrow}" Click="OnTomorrowClick"/>
<Button Classes="quick" Content="Next Mon" Click="OnNextMondayClick"/> <Button Classes="quick" Content="{loc:Tr controls.datePicker.nextMon}" Click="OnNextMondayClick"/>
<Button Classes="quick" Content="Clear" Click="OnClearClick"/> <Button Classes="quick" Content="{loc:Tr controls.datePicker.clear}" Click="OnClearClick"/>
</StackPanel> </StackPanel>
<Grid ColumnDefinitions="Auto,*,Auto" Margin="0,2,0,0"> <Grid ColumnDefinitions="Auto,*,Auto" Margin="0,2,0,0">
@@ -146,14 +147,14 @@
<Grid x:Name="TimeRow" <Grid x:Name="TimeRow"
ColumnDefinitions="Auto,*,Auto" ColumnDefinitions="Auto,*,Auto"
Margin="0,4,0,0"> Margin="0,4,0,0">
<TextBlock Grid.Column="0" Text="Time" <TextBlock Grid.Column="0" Text="{loc:Tr controls.datePicker.time}"
VerticalAlignment="Center" VerticalAlignment="Center"
Foreground="{DynamicResource TextDimBrush}" Foreground="{DynamicResource TextDimBrush}"
Margin="0,0,8,0"/> Margin="0,0,8,0"/>
<TextBox Grid.Column="1" x:Name="TimeInput" <TextBox Grid.Column="1" x:Name="TimeInput"
PlaceholderText="HH:mm" MaxLength="5" PlaceholderText="HH:mm" MaxLength="5"
Text="{Binding #Root.TimeText, Mode=TwoWay}"/> Text="{Binding #Root.TimeText, Mode=TwoWay}"/>
<Button Grid.Column="2" Content="Done" <Button Grid.Column="2" Content="{loc:Tr controls.datePicker.done}"
Click="OnDoneClick" Click="OnDoneClick"
Margin="8,0,0,0"/> Margin="8,0,0,0"/>
</Grid> </Grid>

View File

@@ -1,6 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.AgentStripView" x:Class="ClaudeDo.Ui.Views.Islands.AgentStripView"
x:DataType="vm:DetailsIslandViewModel"> x:DataType="vm:DetailsIslandViewModel">
<Border Classes="agent-strip" <Border Classes="agent-strip"
@@ -34,7 +35,7 @@
Classes="icon-btn" Classes="icon-btn"
Command="{Binding StopCommand}" Command="{Binding StopCommand}"
IsVisible="{Binding IsRunning}" IsVisible="{Binding IsRunning}"
ToolTip.Tip="Stop agent" ToolTip.Tip="{loc:Tr agent.stopTip}"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.X}" Width="12" Height="12" <PathIcon Data="{StaticResource Icon.X}" Width="12" Height="12"
Foreground="{DynamicResource BloodBrush}"/> Foreground="{DynamicResource BloodBrush}"/>
@@ -42,19 +43,19 @@
<!-- Send to queue — only when idle --> <!-- Send to queue — only when idle -->
<Button Grid.Column="3" <Button Grid.Column="3"
Classes="btn accent" Classes="btn accent"
Content="Send to queue" Content="{loc:Tr agent.sendToQueue}"
Command="{Binding EnqueueCommand}" Command="{Binding EnqueueCommand}"
IsVisible="{Binding IsIdle}" IsVisible="{Binding IsIdle}"
ToolTip.Tip="Queue this task for the worker to pick up" ToolTip.Tip="{loc:Tr agent.sendToQueueTip}"
VerticalAlignment="Center" VerticalAlignment="Center"
Padding="10,4"/> Padding="10,4"/>
<!-- Remove from queue — only when queued --> <!-- Remove from queue — only when queued -->
<Button Grid.Column="3" <Button Grid.Column="3"
Classes="btn" Classes="btn"
Content="Remove from queue" Content="{loc:Tr agent.removeFromQueue}"
Command="{Binding DequeueCommand}" Command="{Binding DequeueCommand}"
IsVisible="{Binding IsQueued}" IsVisible="{Binding IsQueued}"
ToolTip.Tip="Take this task back out of the queue" ToolTip.Tip="{loc:Tr agent.removeFromQueueTip}"
VerticalAlignment="Center" VerticalAlignment="Center"
Padding="10,4"/> Padding="10,4"/>
</Grid> </Grid>
@@ -64,7 +65,7 @@
IsVisible="{Binding WorktreePath, Converter={x:Static ObjectConverters.IsNotNull}}"> IsVisible="{Binding WorktreePath, Converter={x:Static ObjectConverters.IsNotNull}}">
<TextBlock Grid.Column="0" <TextBlock Grid.Column="0"
Classes="eyebrow" Classes="eyebrow"
Text="WORKTREE" Text="{loc:Tr agent.worktreeLabel}"
Foreground="{DynamicResource TextFaintBrush}" Foreground="{DynamicResource TextFaintBrush}"
LetterSpacing="1.2" LetterSpacing="1.2"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -76,7 +77,7 @@
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<Button Grid.Column="2" <Button Grid.Column="2"
Classes="icon-btn" Classes="icon-btn"
ToolTip.Tip="Copy path" ToolTip.Tip="{loc:Tr agent.copyPathTip}"
Click="OnCopyWorktreePathClick" Click="OnCopyWorktreePathClick"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/> <PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/>
@@ -105,7 +106,7 @@
<Grid ColumnDefinitions="Auto,Auto,Auto,*"> <Grid ColumnDefinitions="Auto,Auto,Auto,*">
<TextBlock Grid.Column="0" <TextBlock Grid.Column="0"
Classes="eyebrow" Classes="eyebrow"
Text="DIFF" Text="{loc:Tr agent.diffLabel}"
Foreground="{DynamicResource TextFaintBrush}" Foreground="{DynamicResource TextFaintBrush}"
LetterSpacing="1.2" LetterSpacing="1.2"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -136,27 +137,27 @@
<!-- Action buttons --> <!-- Action buttons -->
<StackPanel Orientation="Horizontal" Spacing="6" Margin="0,4,0,0"> <StackPanel Orientation="Horizontal" Spacing="6" Margin="0,4,0,0">
<Button Classes="btn" Content="Open diff" Command="{Binding OpenDiffCommand}"/> <Button Classes="btn" Content="{loc:Tr agent.openDiff}" Command="{Binding OpenDiffCommand}"/>
<Button Classes="btn" Command="{Binding OpenWorktreeCommand}" <Button Classes="btn" Command="{Binding OpenWorktreeCommand}"
ToolTip.Tip="Open worktree in file explorer"> ToolTip.Tip="{loc:Tr agent.openWorktreeTip}">
<StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Spacing="6" VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.ArrowOut}" <PathIcon Data="{StaticResource Icon.ArrowOut}"
Width="11" Height="11" Width="11" Height="11"
Foreground="{DynamicResource TextDimBrush}"/> Foreground="{DynamicResource TextDimBrush}"/>
<TextBlock Text="Worktree" VerticalAlignment="Center"/> <TextBlock Text="{loc:Tr agent.worktreeBtn}" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button Classes="btn accent" <Button Classes="btn accent"
Content="Continue" Content="{loc:Tr agent.continue}"
Command="{Binding ContinueCommand}" Command="{Binding ContinueCommand}"
IsVisible="{Binding ShowContinue}" IsVisible="{Binding ShowContinue}"
ToolTip.Tip="Resume the last session and keep going" ToolTip.Tip="{loc:Tr agent.continueTip}"
Padding="10,4"/> Padding="10,4"/>
<Button Classes="btn" <Button Classes="btn"
Content="Reset &amp; retry" Content="{loc:Tr agent.resetAndRetry}"
Command="{Binding ResetAndRetryCommand}" Command="{Binding ResetAndRetryCommand}"
IsVisible="{Binding ShowResetAndRetry}" IsVisible="{Binding ShowResetAndRetry}"
ToolTip.Tip="Discard the worktree and re-queue the task to run from scratch" ToolTip.Tip="{loc:Tr agent.resetAndRetryTip}"
Padding="10,4"/> Padding="10,4"/>
</StackPanel> </StackPanel>

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:islands="using:ClaudeDo.Ui.Views.Islands" xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.DetailsIslandView" x:Class="ClaudeDo.Ui.Views.Islands.DetailsIslandView"
x:DataType="vm:DetailsIslandViewModel"> x:DataType="vm:DetailsIslandViewModel">
<DockPanel> <DockPanel>
@@ -15,7 +16,7 @@
<Grid ColumnDefinitions="Auto,*,Auto"> <Grid ColumnDefinitions="Auto,*,Auto">
<Button Grid.Column="0" Classes="icon-btn" <Button Grid.Column="0" Classes="icon-btn"
Command="{Binding DeleteTaskCommand}" Command="{Binding DeleteTaskCommand}"
ToolTip.Tip="Delete task" ToolTip.Tip="{loc:Tr details.deleteTaskTip}"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Trash}" Width="14" Height="14" <PathIcon Data="{StaticResource Icon.Trash}" Width="14" Height="14"
Foreground="{DynamicResource BloodBrush}"/> Foreground="{DynamicResource BloodBrush}"/>
@@ -27,7 +28,7 @@
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<Button Grid.Column="2" Classes="icon-btn" <Button Grid.Column="2" Classes="icon-btn"
Command="{Binding CloseDetailsCommand}" Command="{Binding CloseDetailsCommand}"
ToolTip.Tip="Close" ToolTip.Tip="{loc:Tr details.closeTip}"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.X}" Width="14" Height="14"/> <PathIcon Data="{StaticResource Icon.X}" Width="14" Height="14"/>
</Button> </Button>
@@ -52,7 +53,7 @@
Text="{Binding TaskIdBadge}" Text="{Binding TaskIdBadge}"
Margin="0,0,0,4" Margin="0,0,0,4"
Cursor="Hand" Cursor="Hand"
ToolTip.Tip="Copy task ID" ToolTip.Tip="{loc:Tr details.copyTaskIdTip}"
Tapped="OnTaskIdTapped"/> Tapped="OnTaskIdTapped"/>
<TextBox Text="{Binding EditableTitle, Mode=TwoWay}" <TextBox Text="{Binding EditableTitle, Mode=TwoWay}"
FontSize="{StaticResource FontSizeTaskTitle}" FontWeight="Medium" FontSize="{StaticResource FontSizeTaskTitle}" FontWeight="Medium"
@@ -67,14 +68,14 @@
Classes="icon-btn star-btn" Classes="icon-btn star-btn"
Classes.on="{Binding Task.IsStarred}" Classes.on="{Binding Task.IsStarred}"
Command="{Binding ToggleStarCommand}" Command="{Binding ToggleStarCommand}"
ToolTip.Tip="Star" ToolTip.Tip="{loc:Tr details.starTip}"
VerticalAlignment="Top" VerticalAlignment="Top"
Margin="6,0,0,0"> Margin="6,0,0,0">
<PathIcon Data="{StaticResource Icon.Star}" Width="14" Height="14"/> <PathIcon Data="{StaticResource Icon.Star}" Width="14" Height="14"/>
</Button> </Button>
<Button Grid.Column="3" Classes="icon-btn" <Button Grid.Column="3" Classes="icon-btn"
ToolTip.Tip="Agent settings" ToolTip.Tip="{loc:Tr details.agentSettingsTip}"
IsEnabled="{Binding IsAgentSectionEnabled}" IsEnabled="{Binding IsAgentSectionEnabled}"
VerticalAlignment="Top" VerticalAlignment="Top"
Margin="6,0,0,0"> Margin="6,0,0,0">
@@ -82,10 +83,10 @@
<Button.Flyout> <Button.Flyout>
<Flyout Placement="BottomEdgeAlignedRight" ShowMode="Standard"> <Flyout Placement="BottomEdgeAlignedRight" ShowMode="Standard">
<StackPanel Width="340" Spacing="10" Margin="4"> <StackPanel Width="340" Spacing="10" Margin="4">
<TextBlock Text="Agent settings (overrides)" FontWeight="SemiBold"/> <TextBlock Text="{loc:Tr details.agentSettingsHeading}" FontWeight="SemiBold"/>
<StackPanel Spacing="2"> <StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="Model"/> <TextBlock Classes="field-label" Text="{loc:Tr details.modelLabel}"/>
<ComboBox ItemsSource="{Binding TaskModelOptions}" <ComboBox ItemsSource="{Binding TaskModelOptions}"
SelectedItem="{Binding TaskModelSelection, Mode=TwoWay}" SelectedItem="{Binding TaskModelSelection, Mode=TwoWay}"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
@@ -95,14 +96,14 @@
</StackPanel> </StackPanel>
<StackPanel Spacing="2"> <StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="System prompt (appended)"/> <TextBlock Classes="field-label" Text="{loc:Tr details.systemPromptLabel}"/>
<TextBox Text="{Binding TaskSystemPrompt, Mode=TwoWay}" <TextBox Text="{Binding TaskSystemPrompt, Mode=TwoWay}"
AcceptsReturn="True" TextWrapping="Wrap" MinHeight="70" AcceptsReturn="True" TextWrapping="Wrap" MinHeight="70"
PlaceholderText="{Binding EffectiveSystemPromptHint}"/> PlaceholderText="{Binding EffectiveSystemPromptHint}"/>
</StackPanel> </StackPanel>
<StackPanel Spacing="2"> <StackPanel Spacing="2">
<TextBlock Classes="field-label" Text="Agent file"/> <TextBlock Classes="field-label" Text="{loc:Tr details.agentFileLabel}"/>
<ComboBox ItemsSource="{Binding TaskAgentOptions}" <ComboBox ItemsSource="{Binding TaskAgentOptions}"
SelectedItem="{Binding TaskSelectedAgent, Mode=TwoWay}" SelectedItem="{Binding TaskSelectedAgent, Mode=TwoWay}"
HorizontalAlignment="Stretch"> HorizontalAlignment="Stretch">
@@ -136,17 +137,17 @@
<Border Classes="section-divider" <Border Classes="section-divider"
IsVisible="{Binding Task.IsPlanningParent}"> IsVisible="{Binding Task.IsPlanningParent}">
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<TextBlock Classes="section-label" Text="MERGE" Margin="0,0,0,2"/> <TextBlock Classes="section-label" Text="{loc:Tr details.mergeLabel}" Margin="0,0,0,2"/>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Merge target"/> <TextBlock Classes="field-label" Text="{loc:Tr details.mergeTargetLabel}"/>
<ComboBox ItemsSource="{Binding MergeTargetBranches}" <ComboBox ItemsSource="{Binding MergeTargetBranches}"
SelectedItem="{Binding SelectedMergeTarget, Mode=TwoWay}" SelectedItem="{Binding SelectedMergeTarget, Mode=TwoWay}"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="Review combined diff" <Button Classes="btn" Content="{loc:Tr details.reviewCombinedDiff}"
Command="{Binding ReviewCombinedDiffCommand}"/> Command="{Binding ReviewCombinedDiffCommand}"/>
<Button Classes="btn" Content="Merge all subtasks" <Button Classes="btn" Content="{loc:Tr details.mergeAllSubtasks}"
IsEnabled="{Binding CanMergeAll}" IsEnabled="{Binding CanMergeAll}"
Command="{Binding MergeAllCommand}" Command="{Binding MergeAllCommand}"
ToolTip.Tip="{Binding MergeAllDisabledReason}"/> ToolTip.Tip="{Binding MergeAllDisabledReason}"/>
@@ -161,9 +162,9 @@
<!-- Steps section --> <!-- Steps section -->
<Border Classes="section-divider"> <Border Classes="section-divider">
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="section-label" Text="STEPS" Margin="0,0,0,2"/> <TextBlock Classes="section-label" Text="{loc:Tr details.stepsLabel}" Margin="0,0,0,2"/>
<TextBox Text="{Binding NewSubtaskTitle, Mode=TwoWay}" <TextBox Text="{Binding NewSubtaskTitle, Mode=TwoWay}"
PlaceholderText="Add a step..." PlaceholderText="{loc:Tr details.addStepPlaceholder}"
Padding="8" Padding="8"
Background="{DynamicResource Surface2Brush}" Background="{DynamicResource Surface2Brush}"
BorderBrush="{DynamicResource LineBrush}" BorderBrush="{DynamicResource LineBrush}"
@@ -240,14 +241,14 @@
<TextBlock Classes="meta" <TextBlock Classes="meta"
Text="▸" Text="▸"
IsVisible="{Binding !IsDescriptionExpanded}"/> IsVisible="{Binding !IsDescriptionExpanded}"/>
<TextBlock Classes="section-label" Text="DETAILS"/> <TextBlock Classes="section-label" Text="{loc:Tr details.detailsLabel}"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button Grid.Column="2" <Button Grid.Column="2"
Classes="icon-btn" Classes="icon-btn"
Padding="6,2" Padding="6,2"
Margin="0,0,4,0" Margin="0,0,4,0"
ToolTip.Tip="Copy description to clipboard" ToolTip.Tip="{loc:Tr details.copyDescriptionTip}"
IsVisible="{Binding IsDescriptionExpanded}" IsVisible="{Binding IsDescriptionExpanded}"
Click="OnCopyDescriptionClick"> Click="OnCopyDescriptionClick">
<PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/> <PathIcon Data="{StaticResource Icon.Copy}" Width="11" Height="11"/>
@@ -256,17 +257,17 @@
Classes="btn" Classes="btn"
Command="{Binding ToggleEditDescriptionCommand}" Command="{Binding ToggleEditDescriptionCommand}"
Padding="8,3" Padding="8,3"
ToolTip.Tip="Toggle edit/preview" ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}"
IsVisible="{Binding IsDescriptionEditorVisible}"> IsVisible="{Binding IsDescriptionEditorVisible}">
<TextBlock Text="Preview"/> <TextBlock Text="{loc:Tr details.previewBtn}"/>
</Button> </Button>
<Button Grid.Column="3" <Button Grid.Column="3"
Classes="btn" Classes="btn"
Command="{Binding ToggleEditDescriptionCommand}" Command="{Binding ToggleEditDescriptionCommand}"
Padding="8,3" Padding="8,3"
ToolTip.Tip="Toggle edit/preview" ToolTip.Tip="{loc:Tr details.toggleEditPreviewTip}"
IsVisible="{Binding IsDescriptionPreviewVisible}"> IsVisible="{Binding IsDescriptionPreviewVisible}">
<TextBlock Text="Edit"/> <TextBlock Text="{loc:Tr details.editBtn}"/>
</Button> </Button>
</Grid> </Grid>
@@ -275,7 +276,7 @@
TextWrapping="Wrap" TextWrapping="Wrap"
MinHeight="80" MinHeight="80"
MaxHeight="320" MaxHeight="320"
PlaceholderText="Add task details (markdown supported)..." PlaceholderText="{loc:Tr details.descriptionPlaceholder}"
Padding="8" Padding="8"
FontFamily="{DynamicResource MonoFont}" FontFamily="{DynamicResource MonoFont}"
FontSize="{StaticResource FontSizeBody}" FontSize="{StaticResource FontSizeBody}"

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:converters="using:ClaudeDo.Ui.Converters" xmlns:converters="using:ClaudeDo.Ui.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.ListsIslandView" x:Class="ClaudeDo.Ui.Views.Islands.ListsIslandView"
x:DataType="vm:ListsIslandViewModel"> x:DataType="vm:ListsIslandViewModel">
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
@@ -9,7 +10,7 @@
<!-- ── Header ── --> <!-- ── Header ── -->
<Border DockPanel.Dock="Top" Classes="island-header"> <Border DockPanel.Dock="Top" Classes="island-header">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="heading" Text="Lists"/> <TextBlock Classes="heading" Text="{loc:Tr lists.heading}"/>
<!-- Search row --> <!-- Search row -->
<Border Classes="search-wrap" Margin="0,8,0,12"> <Border Classes="search-wrap" Margin="0,8,0,12">
@@ -19,10 +20,10 @@
Foreground="{DynamicResource TextFaintBrush}" Foreground="{DynamicResource TextFaintBrush}"
Margin="2,0,0,0"/> Margin="2,0,0,0"/>
<TextBox Grid.Column="1" x:Name="SearchBox" Classes="search-inner" <TextBox Grid.Column="1" x:Name="SearchBox" Classes="search-inner"
PlaceholderText="Search tasks…" PlaceholderText="{loc:Tr lists.searchPlaceholder}"
Text="{Binding SearchText, Mode=TwoWay}"/> Text="{Binding SearchText, Mode=TwoWay}"/>
<Border Grid.Column="2" Classes="kbd" Margin="0,0,2,0"> <Border Grid.Column="2" Classes="kbd" Margin="0,0,2,0">
<TextBlock Text="Ctrl K"/> <TextBlock Text="{loc:Tr lists.searchKbd}"/>
</Border> </Border>
</Grid> </Grid>
</Border> </Border>
@@ -57,7 +58,7 @@
<!-- More button --> <!-- More button -->
<Button Grid.Column="2" Classes="icon-btn" VerticalAlignment="Center" <Button Grid.Column="2" Classes="icon-btn" VerticalAlignment="Center"
Command="{Binding OpenSettingsCommand}" Command="{Binding OpenSettingsCommand}"
ToolTip.Tip="Settings"> ToolTip.Tip="{loc:Tr lists.settingsTip}">
<PathIcon Data="{StaticResource Icon.MoreHorizontal}" <PathIcon Data="{StaticResource Icon.MoreHorizontal}"
Width="14" Height="14" Width="14" Height="14"
Foreground="{DynamicResource TextMuteBrush}"/> Foreground="{DynamicResource TextMuteBrush}"/>
@@ -70,7 +71,7 @@
<StackPanel Margin="6,0,6,4"> <StackPanel Margin="6,0,6,4">
<!-- SMART LISTS section --> <!-- SMART LISTS section -->
<TextBlock Classes="section-label" Text="SMART LISTS" Margin="10,10,10,4"/> <TextBlock Classes="section-label" Text="{loc:Tr lists.smartListsLabel}" Margin="10,10,10,4"/>
<ItemsControl ItemsSource="{Binding SmartLists}"> <ItemsControl ItemsSource="{Binding SmartLists}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ListNavItemViewModel"> <DataTemplate DataType="vm:ListNavItemViewModel">
@@ -109,7 +110,7 @@
</ItemsControl> </ItemsControl>
<!-- MY LISTS section --> <!-- MY LISTS section -->
<TextBlock Classes="section-label" Text="MY LISTS" Margin="10,10,10,4"/> <TextBlock Classes="section-label" Text="{loc:Tr lists.myListsLabel}" Margin="10,10,10,4"/>
<ItemsControl ItemsSource="{Binding UserLists}"> <ItemsControl ItemsSource="{Binding UserLists}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:ListNavItemViewModel"> <DataTemplate DataType="vm:ListNavItemViewModel">
@@ -127,18 +128,18 @@
DragDrop.Drop="OnListDrop"> DragDrop.Drop="OnListDrop">
<Border.ContextMenu> <Border.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="Settings..." <MenuItem Header="{loc:Tr lists.contextSettings}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenListSettingsCommand}" Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenListSettingsCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Worktrees" <MenuItem Header="{loc:Tr lists.contextWorktrees}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenWorktreesOverviewCommand}" Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenWorktreesOverviewCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<Separator IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/> <Separator IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"/>
<MenuItem Header="Open in Explorer" <MenuItem Header="{loc:Tr lists.contextOpenExplorer}"
IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInExplorerCommand}" Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInExplorerCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Open in Terminal" <MenuItem Header="{loc:Tr lists.contextOpenTerminal}"
IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInTerminalCommand}" Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInTerminalCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
@@ -191,14 +192,14 @@
Foreground="{DynamicResource TextMuteBrush}" Foreground="{DynamicResource TextMuteBrush}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<TextBlock Classes="body" <TextBlock Classes="body"
Text="New list" Text="{loc:Tr lists.newList}"
Foreground="{DynamicResource TextMuteBrush}" Foreground="{DynamicResource TextMuteBrush}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button Grid.Column="1" Classes="icon-btn" Margin="6,0,0,0" <Button Grid.Column="1" Classes="icon-btn" Margin="6,0,0,0"
Command="{Binding OpenRepoImportCommand}" Command="{Binding OpenRepoImportCommand}"
ToolTip.Tip="Add repos as lists"> ToolTip.Tip="{loc:Tr lists.addReposTip}">
<PathIcon Data="{StaticResource Icon.Folder}" <PathIcon Data="{StaticResource Icon.Folder}"
Width="14" Height="14" Width="14" Height="14"
Foreground="{DynamicResource TextMuteBrush}"/> Foreground="{DynamicResource TextMuteBrush}"/>

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.NotesEditorView" x:Class="ClaudeDo.Ui.Views.Islands.NotesEditorView"
x:DataType="vm:NotesEditorViewModel"> x:DataType="vm:NotesEditorViewModel">
<DockPanel Margin="16"> <DockPanel Margin="16">
@@ -9,14 +10,14 @@
<Button Classes="btn" Content="&#x2039;" Command="{Binding PrevDayCommand}"/> <Button Classes="btn" Content="&#x2039;" Command="{Binding PrevDayCommand}"/>
<ctl:ThemedDatePicker SelectedDate="{Binding CurrentDate, Mode=TwoWay}"/> <ctl:ThemedDatePicker SelectedDate="{Binding CurrentDate, Mode=TwoWay}"/>
<Button Classes="btn" Content="&#x203A;" Command="{Binding NextDayCommand}"/> <Button Classes="btn" Content="&#x203A;" Command="{Binding NextDayCommand}"/>
<Button Classes="btn" Content="Today" Command="{Binding TodayCommand}"/> <Button Classes="btn" Content="{loc:Tr notes.today}" Command="{Binding TodayCommand}"/>
<TextBlock Classes="meta" VerticalAlignment="Center" Text="{Binding CurrentDayLabel}"/> <TextBlock Classes="meta" VerticalAlignment="Center" Text="{Binding CurrentDayLabel}"/>
</StackPanel> </StackPanel>
<DockPanel DockPanel.Dock="Top" Margin="0,12,0,8"> <DockPanel DockPanel.Dock="Top" Margin="0,12,0,8">
<Button DockPanel.Dock="Right" Classes="btn" Content="Add" Margin="8,0,0,0" <Button DockPanel.Dock="Right" Classes="btn" Content="{loc:Tr notes.add}" Margin="8,0,0,0"
Command="{Binding AddBulletCommand}"/> Command="{Binding AddBulletCommand}"/>
<TextBox PlaceholderText="New note&#x2026;" Text="{Binding NewBulletText}"> <TextBox PlaceholderText="{loc:Tr notes.newNotePlaceholder}" Text="{Binding NewBulletText}">
<TextBox.KeyBindings> <TextBox.KeyBindings>
<KeyBinding Gesture="Enter" Command="{Binding AddBulletCommand}"/> <KeyBinding Gesture="Enter" Command="{Binding AddBulletCommand}"/>
</TextBox.KeyBindings> </TextBox.KeyBindings>
@@ -29,8 +30,8 @@
<DataTemplate x:DataType="vm:NoteBulletViewModel"> <DataTemplate x:DataType="vm:NoteBulletViewModel">
<Grid ColumnDefinitions="*,Auto,Auto" Margin="0,2" ColumnSpacing="6"> <Grid ColumnDefinitions="*,Auto,Auto" Margin="0,2" ColumnSpacing="6">
<TextBox Grid.Column="0" Text="{Binding Text}"/> <TextBox Grid.Column="0" Text="{Binding Text}"/>
<Button Grid.Column="1" Classes="btn" Content="Save" Command="{Binding SaveCommand}"/> <Button Grid.Column="1" Classes="btn" Content="{loc:Tr notes.save}" Command="{Binding SaveCommand}"/>
<Button Grid.Column="2" Classes="btn" Content="Delete" Command="{Binding DeleteCommand}"/> <Button Grid.Column="2" Classes="btn" Content="{loc:Tr notes.delete}" Command="{Binding DeleteCommand}"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>

View File

@@ -1,6 +1,7 @@
<UserControl xmlns="https://github.com/avaloniaui" <UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.SessionTerminalView" x:Class="ClaudeDo.Ui.Views.Islands.SessionTerminalView"
x:DataType="vm:DetailsIslandViewModel"> x:DataType="vm:DetailsIslandViewModel">
<Border Classes="terminal" Margin="18,8,18,0"> <Border Classes="terminal" Margin="18,8,18,0">
@@ -24,7 +25,7 @@
Margin="0,0,8,0" VerticalAlignment="Center"> Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center"/> <Ellipse VerticalAlignment="Center"/>
<TextBlock Text="LIVE" VerticalAlignment="Center"/> <TextBlock Text="{loc:Tr session.chipLive}" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- DONE chip --> <!-- DONE chip -->
@@ -33,7 +34,7 @@
Margin="0,0,8,0" VerticalAlignment="Center"> Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center" Fill="{DynamicResource MossBrush}"/> <Ellipse VerticalAlignment="Center" Fill="{DynamicResource MossBrush}"/>
<TextBlock Text="DONE" VerticalAlignment="Center" <TextBlock Text="{loc:Tr session.chipDone}" VerticalAlignment="Center"
Foreground="{DynamicResource MossBrush}"/> Foreground="{DynamicResource MossBrush}"/>
</StackPanel> </StackPanel>
</Border> </Border>
@@ -43,7 +44,7 @@
Margin="0,0,8,0" VerticalAlignment="Center"> Margin="0,0,8,0" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" Spacing="5" VerticalAlignment="Center">
<Ellipse VerticalAlignment="Center" Fill="{DynamicResource BloodBrush}"/> <Ellipse VerticalAlignment="Center" Fill="{DynamicResource BloodBrush}"/>
<TextBlock Text="FAILED" VerticalAlignment="Center" <TextBlock Text="{loc:Tr session.chipFailed}" VerticalAlignment="Center"
Foreground="{DynamicResource BloodBrush}"/> Foreground="{DynamicResource BloodBrush}"/>
</StackPanel> </StackPanel>
</Border> </Border>

View File

@@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.TaskRowView" x:Class="ClaudeDo.Ui.Views.Islands.TaskRowView"
x:DataType="vm:TaskRowViewModel"> x:DataType="vm:TaskRowViewModel">
<Grid> <Grid>
@@ -32,38 +33,38 @@
Classes.done="{Binding Done}"> Classes.done="{Binding Done}">
<Border.ContextMenu> <Border.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="Send to queue" <MenuItem Header="{loc:Tr tasks.ctxSendToQueue}"
IsVisible="{Binding CanSendToQueue}" IsVisible="{Binding CanSendToQueue}"
Click="OnSendToQueueClick"/> Click="OnSendToQueueClick"/>
<MenuItem Header="Remove from queue" <MenuItem Header="{loc:Tr tasks.ctxRemoveFromQueue}"
IsVisible="{Binding CanRemoveFromQueue}" IsVisible="{Binding CanRemoveFromQueue}"
Click="OnRemoveFromQueueClick"/> Click="OnRemoveFromQueueClick"/>
<MenuItem Header="Cancel execution" <MenuItem Header="{loc:Tr tasks.ctxCancelExecution}"
IsVisible="{Binding IsRunning}" IsVisible="{Binding IsRunning}"
Click="OnCancelExecutionClick"/> Click="OnCancelExecutionClick"/>
<Separator/> <Separator/>
<MenuItem Header="Mark as"> <MenuItem Header="{loc:Tr tasks.ctxMarkAs}">
<MenuItem Header="Done" Tag="Done" Click="OnSetStatusClick"/> <MenuItem Header="{loc:Tr tasks.ctxMarkDone}" Tag="Done" Click="OnSetStatusClick"/>
<MenuItem Header="Cancelled" Tag="Cancelled" Click="OnSetStatusClick"/> <MenuItem Header="{loc:Tr tasks.ctxMarkCancelled}" Tag="Cancelled" Click="OnSetStatusClick"/>
</MenuItem> </MenuItem>
<Separator/> <Separator/>
<MenuItem Header="Run interactively" <MenuItem Header="{loc:Tr tasks.ctxRunInteractively}"
Click="OnRunInteractivelyClick"/> Click="OnRunInteractivelyClick"/>
<MenuItem Header="Open planning Session" <MenuItem Header="{loc:Tr tasks.ctxOpenPlanningSession}"
Click="OnOpenPlanningSessionClick" Click="OnOpenPlanningSessionClick"
IsVisible="{Binding CanOpenPlanningSession}"/> IsVisible="{Binding CanOpenPlanningSession}"/>
<MenuItem Header="Resume planning Session" <MenuItem Header="{loc:Tr tasks.ctxResumePlanningSession}"
Click="OnResumePlanningSessionClick" Click="OnResumePlanningSessionClick"
IsVisible="{Binding CanResumeOrDiscardPlanning}"/> IsVisible="{Binding CanResumeOrDiscardPlanning}"/>
<MenuItem Header="Discard planning session" <MenuItem Header="{loc:Tr tasks.ctxDiscardPlanningSession}"
Click="OnDiscardPlanningSessionClick" Click="OnDiscardPlanningSessionClick"
IsVisible="{Binding CanResumeOrDiscardPlanning}"/> IsVisible="{Binding CanResumeOrDiscardPlanning}"/>
<MenuItem Header="Queue subtasks sequentially" <MenuItem Header="{loc:Tr tasks.ctxQueueSubtasks}"
Click="OnQueuePlanningSubtasksClick" Click="OnQueuePlanningSubtasksClick"
IsVisible="{Binding CanQueuePlan}"/> IsVisible="{Binding CanQueuePlan}"/>
<Separator/> <Separator/>
<MenuItem Header="Schedule for..." Click="OnScheduleForClick"/> <MenuItem Header="{loc:Tr tasks.ctxScheduleFor}" Click="OnScheduleForClick"/>
<MenuItem Header="Clear schedule" <MenuItem Header="{loc:Tr tasks.ctxClearSchedule}"
IsVisible="{Binding HasSchedule}" IsVisible="{Binding HasSchedule}"
Click="OnClearScheduleClick"/> Click="OnClearScheduleClick"/>
</ContextMenu> </ContextMenu>
@@ -111,10 +112,10 @@
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4" <StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4"
VerticalAlignment="Center" Margin="4,0,0,0"> VerticalAlignment="Center" Margin="4,0,0,0">
<Border Classes="badge draft" IsVisible="{Binding IsDraft}"> <Border Classes="badge draft" IsVisible="{Binding IsDraft}">
<TextBlock Text="DRAFT"/> <TextBlock Text="{loc:Tr tasks.badgeDraft}"/>
</Border> </Border>
<Border Classes="badge planned" IsVisible="{Binding IsPlanned}"> <Border Classes="badge planned" IsVisible="{Binding IsPlanned}">
<TextBlock Text="PLANNED"/> <TextBlock Text="{loc:Tr tasks.badgePlanned}"/>
</Border> </Border>
<Border Classes="badge" <Border Classes="badge"
Classes.planning="{Binding IsPlanActive}" Classes.planning="{Binding IsPlanActive}"
@@ -141,24 +142,24 @@
<!-- Review actions (visible when WaitingForReview) --> <!-- Review actions (visible when WaitingForReview) -->
<StackPanel Orientation="Horizontal" Spacing="4" <StackPanel Orientation="Horizontal" Spacing="4"
IsVisible="{Binding IsWaitingForReview}"> IsVisible="{Binding IsWaitingForReview}">
<Button Classes="btn" Content="Approve" MinWidth="0" Padding="8,2" <Button Classes="btn" Content="{loc:Tr tasks.approve}" MinWidth="0" Padding="8,2"
ToolTip.Tip="Approve — mark Done" ToolTip.Tip="{loc:Tr tasks.approveTip}"
Click="OnApproveReviewClick"/> Click="OnApproveReviewClick"/>
<Button Classes="btn" Content="Reject" MinWidth="0" Padding="8,2" <Button Classes="btn" Content="{loc:Tr tasks.reject}" MinWidth="0" Padding="8,2"
ToolTip.Tip="Reject with feedback and re-run" ToolTip.Tip="{loc:Tr tasks.rejectTip}"
Click="OnRejectReviewClick"/> Click="OnRejectReviewClick"/>
<Button Classes="btn" Content="Park" MinWidth="0" Padding="8,2" <Button Classes="btn" Content="{loc:Tr tasks.park}" MinWidth="0" Padding="8,2"
ToolTip.Tip="Send back to Idle for manual editing" ToolTip.Tip="{loc:Tr tasks.parkTip}"
Click="OnParkReviewClick"/> Click="OnParkReviewClick"/>
<Button Classes="btn" Content="Cancel" MinWidth="0" Padding="8,2" <Button Classes="btn" Content="{loc:Tr tasks.cancel}" MinWidth="0" Padding="8,2"
ToolTip.Tip="Cancel this task" ToolTip.Tip="{loc:Tr tasks.cancelTip}"
Click="OnCancelReviewClick"/> Click="OnCancelReviewClick"/>
</StackPanel> </StackPanel>
<!-- Dequeue button (visible when row is Queued, or planning parent has queued subtasks) --> <!-- Dequeue button (visible when row is Queued, or planning parent has queued subtasks) -->
<Button Classes="icon-btn dequeue-btn" <Button Classes="icon-btn dequeue-btn"
IsVisible="{Binding CanRemoveFromQueue}" IsVisible="{Binding CanRemoveFromQueue}"
ToolTip.Tip="Remove from queue" ToolTip.Tip="{loc:Tr tasks.removeFromQueueTip}"
Command="{Binding $parent[ItemsControl].((vm:TasksIslandViewModel)DataContext).RemoveFromQueueCommand}" Command="{Binding $parent[ItemsControl].((vm:TasksIslandViewModel)DataContext).RemoveFromQueueCommand}"
CommandParameter="{Binding}"> CommandParameter="{Binding}">
<PathIcon Width="10" Height="10" Data="{StaticResource Icon.X}"/> <PathIcon Width="10" Height="10" Data="{StaticResource Icon.X}"/>
@@ -226,10 +227,10 @@
BorderThickness="1" CornerRadius="10" BorderThickness="1" CornerRadius="10"
Padding="16" Width="300"> Padding="16" Width="300">
<StackPanel Spacing="12"> <StackPanel Spacing="12">
<TextBlock Classes="title" Text="Schedule task"/> <TextBlock Classes="title" Text="{loc:Tr tasks.scheduleTitle}"/>
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="eyebrow" Text="WHEN" <TextBlock Classes="eyebrow" Text="{loc:Tr tasks.scheduleWhen}"
Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/> Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/>
<ctl:ThemedDatePicker x:Name="ScheduleDate" ShowTime="True" <ctl:ThemedDatePicker x:Name="ScheduleDate" ShowTime="True"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
@@ -237,8 +238,8 @@
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" Margin="0,4,0,0"> HorizontalAlignment="Right" Margin="0,4,0,0">
<Button Classes="btn" Content="Cancel" Click="OnScheduleCancelClick" MinWidth="76"/> <Button Classes="btn" Content="{loc:Tr tasks.cancel}" Click="OnScheduleCancelClick" MinWidth="76"/>
<Button Content="Schedule" Classes="accent" Click="OnScheduleSetClick" MinWidth="76"/> <Button Content="{loc:Tr tasks.scheduleConfirm}" Classes="accent" Click="OnScheduleSetClick" MinWidth="76"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Border> </Border>
@@ -258,18 +259,18 @@
BorderThickness="1" CornerRadius="10" BorderThickness="1" CornerRadius="10"
Padding="16" Width="320"> Padding="16" Width="320">
<StackPanel Spacing="12"> <StackPanel Spacing="12">
<TextBlock Classes="title" Text="Reject &amp; re-run"/> <TextBlock Classes="title" Text="{loc:Tr tasks.rejectRerunTitle}"/>
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="eyebrow" Text="FEEDBACK FOR THE AGENT" <TextBlock Classes="eyebrow" Text="{loc:Tr tasks.feedbackLabel}"
Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/> Foreground="{DynamicResource TextDimBrush}" Opacity="0.6"/>
<TextBox x:Name="RejectFeedback" <TextBox x:Name="RejectFeedback"
AcceptsReturn="True" TextWrapping="Wrap" AcceptsReturn="True" TextWrapping="Wrap"
MinHeight="80" PlaceholderText="What should the agent fix?"/> MinHeight="80" PlaceholderText="{loc:Tr tasks.feedbackPlaceholder}"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" Margin="0,4,0,0"> HorizontalAlignment="Right" Margin="0,4,0,0">
<Button Classes="btn" Content="Cancel" Click="OnRejectCancelClick" MinWidth="76"/> <Button Classes="btn" Content="{loc:Tr tasks.cancel}" Click="OnRejectCancelClick" MinWidth="76"/>
<Button Content="Re-run" Classes="accent" Click="OnRejectConfirmClick" MinWidth="76"/> <Button Content="{loc:Tr tasks.rerun}" Classes="accent" Click="OnRejectConfirmClick" MinWidth="76"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Border> </Border>

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Islands"
xmlns:islands="using:ClaudeDo.Ui.Views.Islands" xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
xmlns:converters="using:Avalonia.Data.Converters" xmlns:converters="using:Avalonia.Data.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Islands.TasksIslandView" x:Class="ClaudeDo.Ui.Views.Islands.TasksIslandView"
x:DataType="vm:TasksIslandViewModel"> x:DataType="vm:TasksIslandViewModel">
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
@@ -27,15 +28,15 @@
IsVisible="{Binding HasStatusPill}"> IsVisible="{Binding HasStatusPill}">
<TextBlock Text="{Binding StatusPill}"/> <TextBlock Text="{Binding StatusPill}"/>
</Border> </Border>
<Button Classes="icon-btn" Command="{Binding SortCommand}" ToolTip.Tip="Sort"> <Button Classes="icon-btn" Command="{Binding SortCommand}" ToolTip.Tip="{loc:Tr tasks.sortTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Sort}"/> <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Sort}"/>
</Button> </Button>
<Button Classes="icon-btn" Classes.active="{Binding IsShowingCompleted}" <Button Classes="icon-btn" Classes.active="{Binding IsShowingCompleted}"
Command="{Binding ToggleShowCompletedCommand}" Command="{Binding ToggleShowCompletedCommand}"
ToolTip.Tip="Show completed"> ToolTip.Tip="{loc:Tr tasks.showCompletedTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Eye}"/> <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Eye}"/>
</Button> </Button>
<Button Classes="icon-btn" Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="List settings"> <Button Classes="icon-btn" Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="{loc:Tr tasks.listSettingsTip}">
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Settings}"/> <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Settings}"/>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -50,7 +51,7 @@
Foreground="{DynamicResource TextFaintBrush}"/> Foreground="{DynamicResource TextFaintBrush}"/>
</Border> </Border>
<TextBox Grid.Column="1" x:Name="AddTaskBox" Classes="add-task-input" <TextBox Grid.Column="1" x:Name="AddTaskBox" Classes="add-task-input"
PlaceholderText="Add a task…" PlaceholderText="{loc:Tr tasks.addPlaceholder}"
Text="{Binding NewTaskTitle, Mode=TwoWay}" Text="{Binding NewTaskTitle, Mode=TwoWay}"
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="12,0,0,0"> Margin="12,0,0,0">
@@ -60,7 +61,7 @@
</TextBox> </TextBox>
<Border Grid.Column="2" Classes="kbd kbd-enter" VerticalAlignment="Center" <Border Grid.Column="2" Classes="kbd kbd-enter" VerticalAlignment="Center"
IsVisible="{Binding #AddTaskBox.IsFocused}"> IsVisible="{Binding #AddTaskBox.IsFocused}">
<TextBlock Text="ENTER"/> <TextBlock Text="{loc:Tr tasks.enterKey}"/>
</Border> </Border>
</Grid> </Grid>
</Border> </Border>
@@ -71,7 +72,7 @@
Margin="16,0,16,8" Margin="16,0,16,8"
IsVisible="{Binding ShowNotesRow}" IsVisible="{Binding ShowNotesRow}"
Command="{Binding OpenNotesCommand}" Command="{Binding OpenNotesCommand}"
Content="Notes (daily notes)"/> Content="{loc:Tr tasks.notesPinnedRow}"/>
<!-- Task list --> <!-- Task list -->
<ScrollViewer> <ScrollViewer>
@@ -80,7 +81,7 @@
<!-- OVERDUE --> <!-- OVERDUE -->
<StackPanel IsVisible="{Binding HasOverdue}"> <StackPanel IsVisible="{Binding HasOverdue}">
<TextBlock Classes="eyebrow section-label overdue" <TextBlock Classes="eyebrow section-label overdue"
Text="OVERDUE" Margin="14,14,14,6"/> Text="{loc:Tr tasks.overdue}" Margin="14,14,14,6"/>
<ItemsControl ItemsSource="{Binding OverdueItems}"> <ItemsControl ItemsSource="{Binding OverdueItems}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:TaskRowViewModel"> <DataTemplate DataType="vm:TaskRowViewModel">
@@ -104,7 +105,7 @@
<!-- TASKS --> <!-- TASKS -->
<StackPanel IsVisible="{Binding HasOpen}"> <StackPanel IsVisible="{Binding HasOpen}">
<TextBlock Classes="eyebrow section-label" <TextBlock Classes="eyebrow section-label"
Text="TASKS" Margin="14,14,14,6" Text="{loc:Tr tasks.tasks}" Margin="14,14,14,6"
IsVisible="{Binding ShowOpenLabel}"/> IsVisible="{Binding ShowOpenLabel}"/>
<ItemsControl ItemsSource="{Binding OpenItems}"> <ItemsControl ItemsSource="{Binding OpenItems}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
@@ -139,7 +140,7 @@
Text="{Binding CompletedHeader}" VerticalAlignment="Center"/> Text="{Binding CompletedHeader}" VerticalAlignment="Center"/>
<Button Grid.Column="1" Classes="icon-btn" <Button Grid.Column="1" Classes="icon-btn"
Command="{Binding ClearCompletedCommand}" Command="{Binding ClearCompletedCommand}"
ToolTip.Tip="Clear all completed" ToolTip.Tip="{loc:Tr tasks.clearCompletedTip}"
VerticalAlignment="Center"> VerticalAlignment="Center">
<PathIcon Data="{StaticResource Icon.Trash}" Width="13" Height="13" <PathIcon Data="{StaticResource Icon.Trash}" Width="13" Height="13"
Foreground="{DynamicResource BloodBrush}"/> Foreground="{DynamicResource BloodBrush}"/>

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels" xmlns:vm="using:ClaudeDo.Ui.ViewModels"
xmlns:islands="using:ClaudeDo.Ui.Views.Islands" xmlns:islands="using:ClaudeDo.Ui.Views.Islands"
xmlns:converters="using:ClaudeDo.Ui.Converters" xmlns:converters="using:ClaudeDo.Ui.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.MainWindow" x:Class="ClaudeDo.Ui.Views.MainWindow"
x:DataType="vm:IslandsShellViewModel" x:DataType="vm:IslandsShellViewModel"
Title="ClaudeDo" Title="ClaudeDo"
@@ -56,18 +57,18 @@
<Menu Margin="12,0,0,0" <Menu Margin="12,0,0,0"
Background="Transparent" Background="Transparent"
VerticalAlignment="Center"> VerticalAlignment="Center">
<MenuItem Header="Help" <MenuItem Header="{loc:Tr shell.menu.help}"
FontSize="{StaticResource FontSizeMono}" FontSize="{StaticResource FontSizeMono}"
Foreground="{DynamicResource TextDimBrush}"> Foreground="{DynamicResource TextDimBrush}">
<MenuItem Header="Check for updates" <MenuItem Header="{loc:Tr shell.menu.checkForUpdates}"
Command="{Binding CheckForUpdatesCommand}"/> Command="{Binding CheckForUpdatesCommand}"/>
<MenuItem Header="Restart worker" <MenuItem Header="{loc:Tr shell.menu.restartWorker}"
Command="{Binding RestartWorkerCommand}"/> Command="{Binding RestartWorkerCommand}"/>
<MenuItem Header="Worktrees" <MenuItem Header="{loc:Tr shell.menu.worktrees}"
Command="{Binding OpenWorktreesOverviewGlobalCommand}"/> Command="{Binding OpenWorktreesOverviewGlobalCommand}"/>
<MenuItem Header="Weekly Report" Command="{Binding OpenWeeklyReportCommand}"/> <MenuItem Header="{loc:Tr shell.menu.weeklyReport}" Command="{Binding OpenWeeklyReportCommand}"/>
<MenuItem Header="About" Command="{Binding OpenAboutCommand}"/> <MenuItem Header="{loc:Tr shell.menu.about}" Command="{Binding OpenAboutCommand}"/>
<MenuItem Header="Add repos as lists…" Command="{Binding OpenRepoImportCommand}"/> <MenuItem Header="{loc:Tr shell.menu.addRepos}" Command="{Binding OpenRepoImportCommand}"/>
</MenuItem> </MenuItem>
</Menu> </Menu>
</StackPanel> </StackPanel>
@@ -104,7 +105,7 @@
<TextBlock Grid.Column="0" <TextBlock Grid.Column="0"
Classes="body" Classes="body"
VerticalAlignment="Center"> VerticalAlignment="Center">
<Run Text="Update available: v"/> <Run Text="{loc:Tr shell.update.available}"/>
<Run Text="{Binding UpdateCheck.CurrentVersion}"/> <Run Text="{Binding UpdateCheck.CurrentVersion}"/>
<Run Text=" → v"/> <Run Text=" → v"/>
<Run Text="{Binding UpdateBannerLatestVersion}"/> <Run Text="{Binding UpdateBannerLatestVersion}"/>
@@ -112,11 +113,11 @@
<Button Grid.Column="1" <Button Grid.Column="1"
Classes="btn" Classes="btn"
Margin="0,0,8,0" Margin="0,0,8,0"
Content="Update now" Content="{loc:Tr shell.update.updateNow}"
Command="{Binding UpdateNowCommand}"/> Command="{Binding UpdateNowCommand}"/>
<Button Grid.Column="2" <Button Grid.Column="2"
Classes="btn" Classes="btn"
Content="Dismiss" Content="{loc:Tr shell.update.dismiss}"
Command="{Binding DismissBannerCommand}"/> Command="{Binding DismissBannerCommand}"/>
</Grid> </Grid>
</Border> </Border>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.AboutModalView" x:Class="ClaudeDo.Ui.Views.Modals.AboutModalView"
x:DataType="vm:AboutModalViewModel" x:DataType="vm:AboutModalViewModel"
Title="About ClaudeDo" Title="{loc:Tr modals.about.title}"
Width="620" Height="280" Width="620" Height="280"
WindowDecorations="None" WindowDecorations="None"
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
@@ -14,21 +15,21 @@
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="ABOUT" CloseCommand="{Binding CloseCommand}"> <ctl:ModalShell Title="{loc:Tr modals.about.title}" CloseCommand="{Binding CloseCommand}">
<!-- Body --> <!-- Body -->
<ScrollViewer Padding="20,16" HorizontalScrollBarVisibility="Disabled"> <ScrollViewer Padding="20,16" HorizontalScrollBarVisibility="Disabled">
<Grid RowDefinitions="Auto,Auto,Auto,Auto" ColumnDefinitions="90,*,Auto" RowSpacing="10" ColumnSpacing="8"> <Grid RowDefinitions="Auto,Auto,Auto,Auto" ColumnDefinitions="90,*,Auto" RowSpacing="10" ColumnSpacing="8">
<TextBlock Classes="meta" Grid.Row="0" Grid.Column="0" Text="Version" VerticalAlignment="Center"/> <TextBlock Classes="meta" Grid.Row="0" Grid.Column="0" Text="{loc:Tr modals.about.version}" VerticalAlignment="Center"/>
<TextBlock Classes="meta" Grid.Row="0" Grid.Column="1" Text="{Binding AppVersion}" VerticalAlignment="Center"/> <TextBlock Classes="meta" Grid.Row="0" Grid.Column="1" Text="{Binding AppVersion}" VerticalAlignment="Center"/>
<TextBlock Classes="meta" Grid.Row="1" Grid.Column="0" Text="Data" VerticalAlignment="Center"/> <TextBlock Classes="meta" Grid.Row="1" Grid.Column="0" Text="{loc:Tr modals.about.data}" VerticalAlignment="Center"/>
<TextBlock Classes="path-mono" Grid.Row="1" Grid.Column="1" Text="{Binding DataFolderPath}" VerticalAlignment="Center"/> <TextBlock Classes="path-mono" Grid.Row="1" Grid.Column="1" Text="{Binding DataFolderPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="1" Grid.Column="2" Content="Open" Command="{Binding OpenPathCommand}" CommandParameter="{Binding DataFolderPath}"/> <Button Classes="btn" Grid.Row="1" Grid.Column="2" Content="{loc:Tr modals.about.open}" Command="{Binding OpenPathCommand}" CommandParameter="{Binding DataFolderPath}"/>
<TextBlock Classes="meta" Grid.Row="2" Grid.Column="0" Text="Logs" VerticalAlignment="Center"/> <TextBlock Classes="meta" Grid.Row="2" Grid.Column="0" Text="{loc:Tr modals.about.logs}" VerticalAlignment="Center"/>
<TextBlock Classes="path-mono" Grid.Row="2" Grid.Column="1" Text="{Binding LogsFolderPath}" VerticalAlignment="Center"/> <TextBlock Classes="path-mono" Grid.Row="2" Grid.Column="1" Text="{Binding LogsFolderPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="2" Grid.Column="2" Content="Open" Command="{Binding OpenPathCommand}" CommandParameter="{Binding LogsFolderPath}"/> <Button Classes="btn" Grid.Row="2" Grid.Column="2" Content="{loc:Tr modals.about.open}" Command="{Binding OpenPathCommand}" CommandParameter="{Binding LogsFolderPath}"/>
<TextBlock Classes="meta" Grid.Row="3" Grid.Column="0" Text="Config" VerticalAlignment="Center"/> <TextBlock Classes="meta" Grid.Row="3" Grid.Column="0" Text="{loc:Tr modals.about.config}" VerticalAlignment="Center"/>
<TextBlock Classes="path-mono" Grid.Row="3" Grid.Column="1" Text="{Binding WorkerConfigPath}" VerticalAlignment="Center"/> <TextBlock Classes="path-mono" Grid.Row="3" Grid.Column="1" Text="{Binding WorkerConfigPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="3" Grid.Column="2" Content="Open" Command="{Binding OpenPathCommand}" CommandParameter="{Binding WorkerConfigPath}"/> <Button Classes="btn" Grid.Row="3" Grid.Column="2" Content="{loc:Tr modals.about.open}" Command="{Binding OpenPathCommand}" CommandParameter="{Binding WorkerConfigPath}"/>
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.DiffModalView" x:Class="ClaudeDo.Ui.Views.Modals.DiffModalView"
x:DataType="vm:DiffModalViewModel" x:DataType="vm:DiffModalViewModel"
Title="Diff" Title="{loc:Tr modals.diff.windowTitle}"
Width="1200" Height="800" MinWidth="700" MinHeight="450" Width="1200" Height="800" MinWidth="700" MinHeight="450"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -48,11 +49,11 @@
</Style> </Style>
</Window.Styles> </Window.Styles>
<ctl:ModalShell Title="DIFF" CloseCommand="{Binding CloseCommand}"> <ctl:ModalShell Title="{loc:Tr modals.diff.title}" CloseCommand="{Binding CloseCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" VerticalAlignment="Center"> HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Classes="btn" Content="Merge" Command="{Binding MergeCommand}"/> <Button Classes="btn" Content="{loc:Tr modals.diff.merge}" Command="{Binding MergeCommand}"/>
</StackPanel> </StackPanel>
</ctl:ModalShell.Footer> </ctl:ModalShell.Footer>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.ListSettingsModalView" x:Class="ClaudeDo.Ui.Views.Modals.ListSettingsModalView"
x:DataType="vm:ListSettingsModalViewModel" x:DataType="vm:ListSettingsModalViewModel"
Title="List settings" Title="{loc:Tr modals.listSettings.title}"
Width="520" Height="720" Width="520" Height="720"
CanResize="True" CanResize="True"
MinWidth="460" MinHeight="520" MinWidth="460" MinHeight="520"
@@ -19,14 +20,14 @@
<KeyBinding Gesture="Enter" Command="{Binding SaveCommand}"/> <KeyBinding Gesture="Enter" Command="{Binding SaveCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="LIST SETTINGS" CloseCommand="{Binding CancelCommand}"> <ctl:ModalShell Title="{loc:Tr modals.listSettings.title}" CloseCommand="{Binding CancelCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<Grid ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center"> <Grid ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
<Button Grid.Column="0" Content="Delete list" Classes="danger" <Button Grid.Column="0" Content="{loc:Tr modals.listSettings.deleteList}" Classes="danger"
Command="{Binding DeleteCommand}" MinWidth="90"/> Command="{Binding DeleteCommand}" MinWidth="90"/>
<StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="8"> <StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="Cancel" Command="{Binding CancelCommand}" MinWidth="90"/> <Button Classes="btn" Content="{loc:Tr settings.cancel}" Command="{Binding CancelCommand}" MinWidth="90"/>
<Button Content="Save" Classes="primary" Command="{Binding SaveCommand}" MinWidth="90"/> <Button Content="{loc:Tr settings.save}" Classes="primary" Command="{Binding SaveCommand}" MinWidth="90"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</ctl:ModalShell.Footer> </ctl:ModalShell.Footer>
@@ -37,24 +38,24 @@
<!-- GENERAL --> <!-- GENERAL -->
<StackPanel Spacing="0"> <StackPanel Spacing="0">
<TextBlock Classes="section-label" Text="GENERAL"/> <TextBlock Classes="section-label" Text="{loc:Tr modals.listSettings.sectionGeneral}"/>
<Border Classes="section"> <Border Classes="section">
<StackPanel Spacing="12"> <StackPanel Spacing="12">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Name"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.name}"/>
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> <TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Working directory"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.workingDirectory}"/>
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<TextBox Grid.Column="0" Text="{Binding WorkingDir}" PlaceholderText="(none)" /> <TextBox Grid.Column="0" Text="{Binding WorkingDir}" PlaceholderText="{loc:Tr modals.listSettings.workingDirectoryPlaceholder}" />
<Button Classes="btn" Grid.Column="1" Content="Browse..." Margin="8,0,0,0" Click="BrowseClicked" /> <Button Classes="btn" Grid.Column="1" Content="{loc:Tr modals.listSettings.browse}" Margin="8,0,0,0" Click="BrowseClicked" />
</Grid> </Grid>
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Default commit type"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.defaultCommitType}"/>
<ComboBox ItemsSource="{Binding CommitTypeOptions}" <ComboBox ItemsSource="{Binding CommitTypeOptions}"
SelectedItem="{Binding DefaultCommitType, Mode=TwoWay}" SelectedItem="{Binding DefaultCommitType, Mode=TwoWay}"
HorizontalAlignment="Left" MinWidth="160" /> HorizontalAlignment="Left" MinWidth="160" />
@@ -66,28 +67,28 @@
<!-- AGENT --> <!-- AGENT -->
<StackPanel Spacing="0"> <StackPanel Spacing="0">
<Grid ColumnDefinitions="*,Auto" Margin="4,0,0,6"> <Grid ColumnDefinitions="*,Auto" Margin="4,0,0,6">
<TextBlock Classes="section-label" Text="AGENT" Margin="0"/> <TextBlock Classes="section-label" Text="{loc:Tr modals.listSettings.sectionAgent}" Margin="0"/>
<Button Classes="btn" Grid.Column="1" Content="Reset agent settings" <Button Classes="btn" Grid.Column="1" Content="{loc:Tr modals.listSettings.resetAgentSettings}"
Command="{Binding ResetAgentSettingsCommand}" /> Command="{Binding ResetAgentSettingsCommand}" />
</Grid> </Grid>
<Border Classes="section"> <Border Classes="section">
<StackPanel Spacing="12"> <StackPanel Spacing="12">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Model"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.model}"/>
<ComboBox ItemsSource="{Binding ModelOptions}" <ComboBox ItemsSource="{Binding ModelOptions}"
SelectedItem="{Binding SelectedModel, Mode=TwoWay}" SelectedItem="{Binding SelectedModel, Mode=TwoWay}"
HorizontalAlignment="Left" MinWidth="160" /> HorizontalAlignment="Left" MinWidth="160" />
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="System prompt (appended)"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.systemPrompt}"/>
<TextBox Text="{Binding SystemPrompt, Mode=TwoWay}" <TextBox Text="{Binding SystemPrompt, Mode=TwoWay}"
AcceptsReturn="True" TextWrapping="Wrap" AcceptsReturn="True" TextWrapping="Wrap"
MinHeight="80" /> MinHeight="80" />
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Agent file"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.listSettings.agentFile}"/>
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<ComboBox Grid.Column="0" <ComboBox Grid.Column="0"
ItemsSource="{Binding Agents}" ItemsSource="{Binding Agents}"
@@ -102,7 +103,7 @@
</DataTemplate> </DataTemplate>
</ComboBox.ItemTemplate> </ComboBox.ItemTemplate>
</ComboBox> </ComboBox>
<Button Classes="btn" Grid.Column="1" Content="Browse..." <Button Classes="btn" Grid.Column="1" Content="{loc:Tr modals.listSettings.browse}"
Margin="8,0,0,0" Click="BrowseAgentClicked" /> Margin="8,0,0,0" Click="BrowseAgentClicked" />
</Grid> </Grid>
<TextBlock Classes="path-mono" Text="{Binding SelectedAgent.Path}" <TextBlock Classes="path-mono" Text="{Binding SelectedAgent.Path}"

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.MergeModalView" x:Class="ClaudeDo.Ui.Views.Modals.MergeModalView"
x:DataType="vm:MergeModalViewModel" x:DataType="vm:MergeModalViewModel"
Title="Merge worktree" Title="{loc:Tr modals.merge.windowTitle}"
Width="560" Height="460" MinWidth="460" MinHeight="360" Width="560" Height="460" MinWidth="460" MinHeight="360"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -17,12 +18,12 @@
<KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="MERGE WORKTREE" CloseCommand="{Binding CancelCommand}"> <ctl:ModalShell Title="{loc:Tr modals.merge.title}" CloseCommand="{Binding CancelCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" VerticalAlignment="Center"> HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Classes="btn" Content="Cancel" Command="{Binding CancelCommand}" MinWidth="90"/> <Button Classes="btn" Content="{loc:Tr modals.merge.cancel}" Command="{Binding CancelCommand}" MinWidth="90"/>
<Button Content="Merge" Classes="primary" <Button Content="{loc:Tr modals.merge.merge}" Classes="primary"
Command="{Binding SubmitCommand}" Command="{Binding SubmitCommand}"
IsDefault="True" MinWidth="90"/> IsDefault="True" MinWidth="90"/>
</StackPanel> </StackPanel>
@@ -35,19 +36,19 @@
<TextBlock Classes="title" Text="{Binding TaskTitle, StringFormat='Merging: {0}'}" /> <TextBlock Classes="title" Text="{Binding TaskTitle, StringFormat='Merging: {0}'}" />
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Target branch"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.merge.targetBranch}"/>
<ComboBox ItemsSource="{Binding Branches}" <ComboBox ItemsSource="{Binding Branches}"
SelectedItem="{Binding SelectedBranch}" SelectedItem="{Binding SelectedBranch}"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
IsEnabled="{Binding !IsBusy}" /> IsEnabled="{Binding !IsBusy}" />
</StackPanel> </StackPanel>
<CheckBox Content="Remove worktree after merge" <CheckBox Content="{loc:Tr modals.merge.removeWorktree}"
IsChecked="{Binding RemoveWorktree}" IsChecked="{Binding RemoveWorktree}"
IsEnabled="{Binding !IsBusy}" /> IsEnabled="{Binding !IsBusy}" />
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Commit message"/> <TextBlock Classes="field-label" Text="{loc:Tr modals.merge.commitMessage}"/>
<TextBox Text="{Binding CommitMessage}" <TextBox Text="{Binding CommitMessage}"
AcceptsReturn="True" AcceptsReturn="True"
TextWrapping="Wrap" TextWrapping="Wrap"
@@ -63,7 +64,7 @@
<Border Classes="danger-box" <Border Classes="danger-box"
IsVisible="{Binding HasConflict}"> IsVisible="{Binding HasConflict}">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="title" Text="Conflicted files:" /> <TextBlock Classes="title" Text="{loc:Tr modals.merge.conflictedFiles}" />
<ItemsControl ItemsSource="{Binding ConflictFiles}"> <ItemsControl ItemsSource="{Binding ConflictFiles}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate> <DataTemplate>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.RepoImportModalView" x:Class="ClaudeDo.Ui.Views.Modals.RepoImportModalView"
x:DataType="vm:RepoImportModalViewModel" x:DataType="vm:RepoImportModalViewModel"
Title="Add repos as lists" Title="{loc:Tr modals.repoImport.windowTitle}"
Width="560" Height="480" MinWidth="420" MinHeight="320" Width="560" Height="480" MinWidth="420" MinHeight="320"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -16,11 +17,11 @@
<KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="ADD REPOS AS LISTS" CloseCommand="{Binding CancelCommand}"> <ctl:ModalShell Title="{loc:Tr modals.repoImport.title}" CloseCommand="{Binding CancelCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Right" <StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Right"
VerticalAlignment="Center"> VerticalAlignment="Center">
<Button Classes="btn" Content="Cancel" Command="{Binding CancelCommand}" MinWidth="90"/> <Button Classes="btn" Content="{loc:Tr modals.repoImport.cancel}" Command="{Binding CancelCommand}" MinWidth="90"/>
<Button Content="{Binding CreateButtonText}" Command="{Binding CreateCommand}" <Button Content="{Binding CreateButtonText}" Command="{Binding CreateCommand}"
IsEnabled="{Binding CanCreate}" MinWidth="120" Classes="primary"/> IsEnabled="{Binding CanCreate}" MinWidth="120" Classes="primary"/>
</StackPanel> </StackPanel>
@@ -31,10 +32,10 @@
<!-- Toolbar: search + folder actions --> <!-- Toolbar: search + folder actions -->
<StackPanel DockPanel.Dock="Top" Spacing="8" Margin="20,12,20,6"> <StackPanel DockPanel.Dock="Top" Spacing="8" Margin="20,12,20,6">
<TextBox Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" <TextBox Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PlaceholderText="Search repos…"/> PlaceholderText="{loc:Tr modals.repoImport.searchPlaceholder}"/>
<Grid ColumnDefinitions="Auto,*,Auto"> <Grid ColumnDefinitions="Auto,*,Auto">
<Button Classes="btn" Grid.Column="0" Content="Add folder" Click="AddFolderClicked"/> <Button Classes="btn" Grid.Column="0" Content="{loc:Tr modals.repoImport.addFolder}" Click="AddFolderClicked"/>
<Button Classes="btn" Grid.Column="2" Content="Forget folders" <Button Classes="btn" Grid.Column="2" Content="{loc:Tr modals.repoImport.forgetFolders}"
Command="{Binding ForgetFoldersCommand}" Command="{Binding ForgetFoldersCommand}"
IsVisible="{Binding HasFolders}"/> IsVisible="{Binding HasFolders}"/>
</Grid> </Grid>
@@ -55,7 +56,7 @@
VerticalAlignment="Center" Margin="4,0,0,0"/> VerticalAlignment="Center" Margin="4,0,0,0"/>
<TextBlock Classes="path-mono" Grid.Column="2" Text="{Binding FullPath}" <TextBlock Classes="path-mono" Grid.Column="2" Text="{Binding FullPath}"
VerticalAlignment="Center" Margin="8,0,0,0"/> VerticalAlignment="Center" Margin="8,0,0,0"/>
<TextBlock Classes="meta" Grid.Column="3" Text="(already added)" <TextBlock Classes="meta" Grid.Column="3" Text="{loc:Tr modals.repoImport.alreadyAdded}"
VerticalAlignment="Center" Margin="8,0,0,0" VerticalAlignment="Center" Margin="8,0,0,0"
IsVisible="{Binding AlreadyAdded}"/> IsVisible="{Binding AlreadyAdded}"/>
</Grid> </Grid>

View File

@@ -7,7 +7,7 @@
xmlns:locm="using:ClaudeDo.Localization" xmlns:locm="using:ClaudeDo.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.SettingsModalView" x:Class="ClaudeDo.Ui.Views.Modals.SettingsModalView"
x:DataType="vm:SettingsModalViewModel" x:DataType="vm:SettingsModalViewModel"
Title="Settings" Title="{loc:Tr settings.title}"
Width="580" Height="760" MinWidth="480" MinHeight="520" Width="580" Height="760" MinWidth="480" MinHeight="520"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -21,12 +21,12 @@
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="SETTINGS" CloseCommand="{Binding CancelCommand}"> <ctl:ModalShell Title="{loc:Tr settings.title}" CloseCommand="{Binding CancelCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" VerticalAlignment="Center"> HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Classes="btn" Content="Cancel" Command="{Binding CancelCommand}" MinWidth="90"/> <Button Classes="btn" Content="{loc:Tr settings.cancel}" Command="{Binding CancelCommand}" MinWidth="90"/>
<Button Content="Save" Classes="primary" <Button Content="{loc:Tr settings.save}" Classes="primary"
Command="{Binding SaveCommand}" Command="{Binding SaveCommand}"
IsEnabled="{Binding !IsBusy}" MinWidth="90"/> IsEnabled="{Binding !IsBusy}" MinWidth="90"/>
</StackPanel> </StackPanel>
@@ -44,7 +44,7 @@
<TabControl Padding="20,16" TabStripPlacement="Top"> <TabControl Padding="20,16" TabStripPlacement="Top">
<TabItem Header="General"> <TabItem Header="{loc:Tr settings.tabGeneral}">
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="12" Margin="0,8,0,0"> <StackPanel Spacing="12" Margin="0,8,0,0">
<StackPanel Spacing="4"> <StackPanel Spacing="4">
@@ -60,101 +60,101 @@
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Default instructions"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.defaultInstructions}"/>
<TextBox AcceptsReturn="True" TextWrapping="Wrap" Height="110" <TextBox AcceptsReturn="True" TextWrapping="Wrap" Height="110"
PlaceholderText="Baseline instructions applied to every task" PlaceholderText="{loc:Tr settings.general.defaultInstructionsPlaceholder}"
Text="{Binding General.DefaultClaudeInstructions, Mode=TwoWay}"/> Text="{Binding General.DefaultClaudeInstructions, Mode=TwoWay}"/>
</StackPanel> </StackPanel>
<Grid ColumnDefinitions="*,12,*,12,*"> <Grid ColumnDefinitions="*,12,*,12,*">
<StackPanel Grid.Column="0" Spacing="4"> <StackPanel Grid.Column="0" Spacing="4">
<TextBlock Classes="field-label" Text="Model"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.model}"/>
<ComboBox ItemsSource="{Binding General.Models}" <ComboBox ItemsSource="{Binding General.Models}"
SelectedItem="{Binding General.DefaultModel, Mode=TwoWay}" SelectedItem="{Binding General.DefaultModel, Mode=TwoWay}"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="2" Spacing="4"> <StackPanel Grid.Column="2" Spacing="4">
<TextBlock Classes="field-label" Text="Max turns"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.maxTurns}"/>
<NumericUpDown Value="{Binding General.DefaultMaxTurns, Mode=TwoWay}" <NumericUpDown Value="{Binding General.DefaultMaxTurns, Mode=TwoWay}"
Minimum="1" Maximum="200" Increment="1" FormatString="0"/> Minimum="1" Maximum="200" Increment="1" FormatString="0"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="4" Spacing="4"> <StackPanel Grid.Column="4" Spacing="4">
<TextBlock Classes="field-label" Text="Permission"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.permission}"/>
<ComboBox ItemsSource="{Binding General.PermissionModes}" <ComboBox ItemsSource="{Binding General.PermissionModes}"
SelectedItem="{Binding General.DefaultPermissionMode, Mode=TwoWay}" SelectedItem="{Binding General.DefaultPermissionMode, Mode=TwoWay}"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Max parallel executions"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.maxParallelExecutions}"/>
<NumericUpDown Value="{Binding General.MaxParallelExecutions, Mode=TwoWay}" <NumericUpDown Value="{Binding General.MaxParallelExecutions, Mode=TwoWay}"
Minimum="1" Maximum="20" Increment="1" FormatString="0" Minimum="1" Maximum="20" Increment="1" FormatString="0"
HorizontalAlignment="Left" Width="140"/> HorizontalAlignment="Left" Width="140"/>
<TextBlock Text="How many queued tasks the worker runs at once." <TextBlock Text="{loc:Tr settings.general.maxParallelExecutionsHint}"
Opacity="0.6" FontSize="12"/> Opacity="0.6" FontSize="12"/>
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Report: excluded paths (one per line)"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.reportExcludedPaths}"/>
<TextBox AcceptsReturn="True" MinHeight="60" Text="{Binding General.ReportExcludedPaths, Mode=TwoWay}"/> <TextBox AcceptsReturn="True" MinHeight="60" Text="{Binding General.ReportExcludedPaths, Mode=TwoWay}"/>
</StackPanel> </StackPanel>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
<TextBlock Classes="field-label" Text="Standup weekday"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.general.standupWeekday}"/>
<ComboBox SelectedIndex="{Binding General.StandupWeekday, Mode=TwoWay}" HorizontalAlignment="Left"> <ComboBox SelectedIndex="{Binding General.StandupWeekday, Mode=TwoWay}" HorizontalAlignment="Left">
<ComboBoxItem>Sunday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdaySunday}"/>
<ComboBoxItem>Monday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdayMonday}"/>
<ComboBoxItem>Tuesday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdayTuesday}"/>
<ComboBoxItem>Wednesday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdayWednesday}"/>
<ComboBoxItem>Thursday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdayThursday}"/>
<ComboBoxItem>Friday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdayFriday}"/>
<ComboBoxItem>Saturday</ComboBoxItem> <ComboBoxItem Content="{loc:Tr settings.general.weekdaySaturday}"/>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
<TabItem Header="Worktrees"> <TabItem Header="{loc:Tr settings.tabWorktrees}">
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="12" Margin="0,8,0,0"> <StackPanel Spacing="12" Margin="0,8,0,0">
<Grid ColumnDefinitions="*,12,2*"> <Grid ColumnDefinitions="*,12,2*">
<StackPanel Grid.Column="0" Spacing="4"> <StackPanel Grid.Column="0" Spacing="4">
<TextBlock Classes="field-label" Text="Strategy"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.worktrees.strategy}"/>
<ComboBox ItemsSource="{Binding Worktrees.WorktreeStrategies}" <ComboBox ItemsSource="{Binding Worktrees.WorktreeStrategies}"
SelectedItem="{Binding Worktrees.WorktreeStrategy, Mode=TwoWay}" SelectedItem="{Binding Worktrees.WorktreeStrategy, Mode=TwoWay}"
HorizontalAlignment="Stretch"/> HorizontalAlignment="Stretch"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="2" Spacing="4"> <StackPanel Grid.Column="2" Spacing="4">
<TextBlock Classes="field-label" Text="Central worktree root"/> <TextBlock Classes="field-label" Text="{loc:Tr settings.worktrees.centralWorktreeRoot}"/>
<TextBox Text="{Binding Worktrees.CentralWorktreeRoot, Mode=TwoWay}" <TextBox Text="{Binding Worktrees.CentralWorktreeRoot, Mode=TwoWay}"
PlaceholderText="e.g. C:\worktrees"/> PlaceholderText="e.g. C:\worktrees"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<CheckBox IsChecked="{Binding Worktrees.WorktreeAutoCleanupEnabled, Mode=TwoWay}" <CheckBox IsChecked="{Binding Worktrees.WorktreeAutoCleanupEnabled, Mode=TwoWay}"
Content="Auto-cleanup finished worktrees after" Content="{loc:Tr settings.worktrees.autoCleanup}"
VerticalAlignment="Center"/> VerticalAlignment="Center"/>
<NumericUpDown Value="{Binding Worktrees.WorktreeAutoCleanupDays, Mode=TwoWay}" <NumericUpDown Value="{Binding Worktrees.WorktreeAutoCleanupDays, Mode=TwoWay}"
Width="130" Minimum="1" Maximum="365" Increment="1" FormatString="0" Width="130" Minimum="1" Maximum="365" Increment="1" FormatString="0"
IsEnabled="{Binding Worktrees.WorktreeAutoCleanupEnabled}"/> IsEnabled="{Binding Worktrees.WorktreeAutoCleanupEnabled}"/>
<TextBlock Classes="body" Text="days" VerticalAlignment="Center"/> <TextBlock Classes="body" Text="{loc:Tr settings.worktrees.days}" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
<Border BorderBrush="{DynamicResource LineBrush}" BorderThickness="0,1,0,0" Margin="0,4,0,0"/> <Border BorderBrush="{DynamicResource LineBrush}" BorderThickness="0,1,0,0" Margin="0,4,0,0"/>
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<Button Classes="btn" Content="Cleanup finished worktrees" <Button Classes="btn" Content="{loc:Tr settings.worktrees.cleanupFinished}"
Command="{Binding Worktrees.CleanupWorktreesCommand}" Command="{Binding Worktrees.CleanupWorktreesCommand}"
HorizontalAlignment="Left"/> HorizontalAlignment="Left"/>
<StackPanel> <StackPanel>
<Button Content="Force-remove all worktrees" Classes="danger" <Button Content="{loc:Tr settings.worktrees.forceRemoveAll}" Classes="danger"
Command="{Binding Worktrees.RequestResetConfirmCommand}" Command="{Binding Worktrees.RequestResetConfirmCommand}"
HorizontalAlignment="Left" HorizontalAlignment="Left"
IsVisible="{Binding !Worktrees.ShowResetConfirm}"/> IsVisible="{Binding !Worktrees.ShowResetConfirm}"/>
<Border Classes="danger-box" <Border Classes="danger-box"
IsVisible="{Binding Worktrees.ShowResetConfirm}"> IsVisible="{Binding Worktrees.ShowResetConfirm}">
<StackPanel Spacing="8"> <StackPanel Spacing="8">
<TextBlock Text="Remove ALL worktrees? Uncommitted work will be lost." <TextBlock Text="{loc:Tr settings.worktrees.confirmRemoveAll}"
Foreground="{DynamicResource TextBrush}" TextWrapping="Wrap"/> Foreground="{DynamicResource TextBrush}" TextWrapping="Wrap"/>
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="Cancel" Command="{Binding Worktrees.CancelResetConfirmCommand}"/> <Button Classes="btn" Content="{loc:Tr settings.cancel}" Command="{Binding Worktrees.CancelResetConfirmCommand}"/>
<Button Content="Remove All" Classes="danger" <Button Content="{loc:Tr settings.worktrees.removeAll}" Classes="danger"
Command="{Binding Worktrees.ConfirmResetAllCommand}"/> Command="{Binding Worktrees.ConfirmResetAllCommand}"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
@@ -167,32 +167,32 @@
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
<TabItem Header="Files"> <TabItem Header="{loc:Tr settings.tabFiles}">
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="12" Margin="0,8,0,0"> <StackPanel Spacing="12" Margin="0,8,0,0">
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="section-label" Text="AGENTS"/> <TextBlock Classes="section-label" Text="{loc:Tr settings.files.agentsSection}"/>
<TextBlock Classes="meta" Text="Restore bundled default agents. Existing files are not overwritten." <TextBlock Classes="meta" Text="{loc:Tr settings.files.agentsHint}"
TextWrapping="Wrap"/> TextWrapping="Wrap"/>
<Button Classes="btn" Content="Restore default agents" <Button Classes="btn" Content="{loc:Tr settings.files.restoreDefaultAgents}"
Command="{Binding Files.RestoreDefaultAgentsCommand}" Command="{Binding Files.RestoreDefaultAgentsCommand}"
IsEnabled="{Binding !Files.IsBusy}" IsEnabled="{Binding !Files.IsBusy}"
HorizontalAlignment="Left"/> HorizontalAlignment="Left"/>
</StackPanel> </StackPanel>
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<TextBlock Classes="section-label" Text="PROMPTS"/> <TextBlock Classes="section-label" Text="{loc:Tr settings.files.promptsSection}"/>
<Grid RowDefinitions="Auto,Auto,Auto" ColumnDefinitions="90,*,Auto" RowSpacing="8"> <Grid RowDefinitions="Auto,Auto,Auto" ColumnDefinitions="90,*,Auto" RowSpacing="8">
<TextBlock Grid.Row="0" Grid.Column="0" Classes="field-label" Text="System" VerticalAlignment="Center"/> <TextBlock Grid.Row="0" Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.files.systemPrompt}" VerticalAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Classes="path-mono" Text="{Binding Files.SystemPromptPath}" VerticalAlignment="Center"/> <TextBlock Grid.Row="0" Grid.Column="1" Classes="path-mono" Text="{Binding Files.SystemPromptPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="0" Grid.Column="2" Content="Open in editor" <Button Classes="btn" Grid.Row="0" Grid.Column="2" Content="{loc:Tr settings.files.openInEditor}"
Command="{Binding Files.OpenPromptCommand}" CommandParameter="System"/> Command="{Binding Files.OpenPromptCommand}" CommandParameter="System"/>
<TextBlock Grid.Row="1" Grid.Column="0" Classes="field-label" Text="Planning" VerticalAlignment="Center"/> <TextBlock Grid.Row="1" Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.files.planningPrompt}" VerticalAlignment="Center"/>
<TextBlock Grid.Row="1" Grid.Column="1" Classes="path-mono" Text="{Binding Files.PlanningPromptPath}" VerticalAlignment="Center"/> <TextBlock Grid.Row="1" Grid.Column="1" Classes="path-mono" Text="{Binding Files.PlanningPromptPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="1" Grid.Column="2" Content="Open in editor" <Button Classes="btn" Grid.Row="1" Grid.Column="2" Content="{loc:Tr settings.files.openInEditor}"
Command="{Binding Files.OpenPromptCommand}" CommandParameter="Planning"/> Command="{Binding Files.OpenPromptCommand}" CommandParameter="Planning"/>
<TextBlock Grid.Row="2" Grid.Column="0" Classes="field-label" Text="Agent" VerticalAlignment="Center"/> <TextBlock Grid.Row="2" Grid.Column="0" Classes="field-label" Text="{loc:Tr settings.files.agentPrompt}" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Grid.Column="1" Classes="path-mono" Text="{Binding Files.AgentPromptPath}" VerticalAlignment="Center"/> <TextBlock Grid.Row="2" Grid.Column="1" Classes="path-mono" Text="{Binding Files.AgentPromptPath}" VerticalAlignment="Center"/>
<Button Classes="btn" Grid.Row="2" Grid.Column="2" Content="Open in editor" <Button Classes="btn" Grid.Row="2" Grid.Column="2" Content="{loc:Tr settings.files.openInEditor}"
Command="{Binding Files.OpenPromptCommand}" CommandParameter="Agent"/> Command="{Binding Files.OpenPromptCommand}" CommandParameter="Agent"/>
</Grid> </Grid>
</StackPanel> </StackPanel>
@@ -202,11 +202,11 @@
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>
<TabItem Header="Prime Claude"> <TabItem Header="{loc:Tr settings.tabPrime}">
<ScrollViewer> <ScrollViewer>
<StackPanel Spacing="12" Margin="0,8,0,0"> <StackPanel Spacing="12" Margin="0,8,0,0">
<TextBlock Classes="meta" TextWrapping="Wrap" <TextBlock Classes="meta" TextWrapping="Wrap"
Text="Prime your Claude usage window by firing a single non-interactive ping on the days you choose, at a chosen time. Only runs while ClaudeDo is open. If the app starts within 30 minutes of the target time, the ping fires immediately."/> Text="{loc:Tr settings.prime.description}"/>
<ItemsControl ItemsSource="{Binding Prime.Rows}"> <ItemsControl ItemsSource="{Binding Prime.Rows}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="settings:PrimeScheduleRowViewModel"> <DataTemplate x:DataType="settings:PrimeScheduleRowViewModel">
@@ -216,13 +216,13 @@
<Grid ColumnDefinitions="Auto,*,Auto,Auto,Auto" ColumnSpacing="8"> <Grid ColumnDefinitions="Auto,*,Auto,Auto,Auto" ColumnSpacing="8">
<CheckBox Grid.Column="0" IsChecked="{Binding Enabled, Mode=TwoWay}" VerticalAlignment="Center"/> <CheckBox Grid.Column="0" IsChecked="{Binding Enabled, Mode=TwoWay}" VerticalAlignment="Center"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4" VerticalAlignment="Center"> <StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4" VerticalAlignment="Center">
<ToggleButton Classes="day-toggle" Content="Mo" IsChecked="{Binding Monday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.dayMo}" IsChecked="{Binding Monday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="Tu" IsChecked="{Binding Tuesday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.dayTu}" IsChecked="{Binding Tuesday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="We" IsChecked="{Binding Wednesday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.dayWe}" IsChecked="{Binding Wednesday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="Th" IsChecked="{Binding Thursday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.dayTh}" IsChecked="{Binding Thursday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="Fr" IsChecked="{Binding Friday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.dayFr}" IsChecked="{Binding Friday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="Sa" IsChecked="{Binding Saturday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.daySa}" IsChecked="{Binding Saturday, Mode=TwoWay}"/>
<ToggleButton Classes="day-toggle" Content="Su" IsChecked="{Binding Sunday, Mode=TwoWay}"/> <ToggleButton Classes="day-toggle" Content="{loc:Tr settings.prime.daySu}" IsChecked="{Binding Sunday, Mode=TwoWay}"/>
</StackPanel> </StackPanel>
<TimePicker Grid.Column="2" <TimePicker Grid.Column="2"
SelectedTime="{Binding TimeOfDay, Mode=TwoWay}" SelectedTime="{Binding TimeOfDay, Mode=TwoWay}"
@@ -238,7 +238,7 @@
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
<Button Classes="btn" Content="+ Add schedule" Command="{Binding Prime.AddScheduleCommand}" HorizontalAlignment="Left"/> <Button Classes="btn" Content="{loc:Tr settings.prime.addSchedule}" Command="{Binding Prime.AddScheduleCommand}" HorizontalAlignment="Left"/>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</TabItem> </TabItem>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="clr-namespace:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.UnfinishedPlanningModalView" x:Class="ClaudeDo.Ui.Views.Modals.UnfinishedPlanningModalView"
x:DataType="vm:UnfinishedPlanningModalViewModel" x:DataType="vm:UnfinishedPlanningModalViewModel"
Title="Unfinished planning session" Title="{loc:Tr modals.unfinishedPlanning.windowTitle}"
Width="440" Height="200" Width="440" Height="200"
CanResize="False" CanResize="False"
WindowDecorations="None" WindowDecorations="None"
@@ -16,13 +17,13 @@
<KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="UNFINISHED PLANNING SESSION" CloseCommand="{Binding CancelCommand}"> <ctl:ModalShell Title="{loc:Tr modals.unfinishedPlanning.title}" CloseCommand="{Binding CancelCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" VerticalAlignment="Center"> HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Classes="btn" Content="Discard" Command="{Binding DiscardCommand}" MinWidth="80"/> <Button Classes="btn" Content="{loc:Tr modals.unfinishedPlanning.discard}" Command="{Binding DiscardCommand}" MinWidth="80"/>
<Button Classes="btn" Content="Finalize" Command="{Binding FinalizeNowCommand}" MinWidth="80"/> <Button Classes="btn" Content="{loc:Tr modals.unfinishedPlanning.finalize}" Command="{Binding FinalizeNowCommand}" MinWidth="80"/>
<Button Content="Resume" Command="{Binding ResumeCommand}" Classes="primary" MinWidth="80"/> <Button Content="{loc:Tr modals.unfinishedPlanning.resume}" Command="{Binding ResumeCommand}" Classes="primary" MinWidth="80"/>
</StackPanel> </StackPanel>
</ctl:ModalShell.Footer> </ctl:ModalShell.Footer>
@@ -32,7 +33,7 @@
TextTrimming="CharacterEllipsis"/> TextTrimming="CharacterEllipsis"/>
<TextBlock Classes="body"> <TextBlock Classes="body">
<Run Text="{Binding DraftCount}"/> <Run Text="{Binding DraftCount}"/>
<Run Text=" draft task(s) waiting to be finalized."/> <Run Text="{loc:Tr modals.unfinishedPlanning.draftTasksSuffix}"/>
</TextBlock> </TextBlock>
</StackPanel> </StackPanel>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.WeeklyReportModalView" x:Class="ClaudeDo.Ui.Views.Modals.WeeklyReportModalView"
x:DataType="vm:WeeklyReportModalViewModel" x:DataType="vm:WeeklyReportModalViewModel"
Title="Weekly Report" Title="{loc:Tr modals.weeklyReport.windowTitle}"
Width="820" Height="640" Width="820" Height="640"
WindowDecorations="None" WindowDecorations="None"
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
@@ -14,16 +15,16 @@
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="WEEKLY REPORT" CloseCommand="{Binding CloseCommand}"> <ctl:ModalShell Title="{loc:Tr modals.weeklyReport.title}" CloseCommand="{Binding CloseCommand}">
<DockPanel Margin="20,16"> <DockPanel Margin="20,16">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="8"> <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="8">
<TextBlock Classes="meta" Text="From" VerticalAlignment="Center"/> <TextBlock Classes="meta" Text="{loc:Tr modals.weeklyReport.from}" VerticalAlignment="Center"/>
<ctl:ThemedDatePicker SelectedDate="{Binding StartDate}"/> <ctl:ThemedDatePicker SelectedDate="{Binding StartDate}"/>
<TextBlock Classes="meta" Text="To" VerticalAlignment="Center"/> <TextBlock Classes="meta" Text="{loc:Tr modals.weeklyReport.to}" VerticalAlignment="Center"/>
<ctl:ThemedDatePicker SelectedDate="{Binding EndDate}"/> <ctl:ThemedDatePicker SelectedDate="{Binding EndDate}"/>
<Button Classes="btn" Content="Generate" Command="{Binding GenerateCommand}" <Button Classes="btn" Content="{loc:Tr modals.weeklyReport.generate}" Command="{Binding GenerateCommand}"
IsVisible="{Binding EmptyStateVisible}"/> IsVisible="{Binding EmptyStateVisible}"/>
<Button Classes="btn" Content="Regenerate" Command="{Binding GenerateCommand}" <Button Classes="btn" Content="{loc:Tr modals.weeklyReport.regenerate}" Command="{Binding GenerateCommand}"
IsVisible="{Binding HasReport}"/> IsVisible="{Binding HasReport}"/>
</StackPanel> </StackPanel>
@@ -31,7 +32,7 @@
Text="{Binding StatusMessage}"/> Text="{Binding StatusMessage}"/>
<TextBlock DockPanel.Dock="Top" Classes="meta" Margin="0,16" <TextBlock DockPanel.Dock="Top" Classes="meta" Margin="0,16"
Text='No report for this range yet. Click &#x201C;Generate&#x201D;.' Text="{loc:Tr modals.weeklyReport.emptyStateHint}"
IsVisible="{Binding EmptyStateVisible}"/> IsVisible="{Binding EmptyStateVisible}"/>
<ScrollViewer IsVisible="{Binding HasReport}"> <ScrollViewer IsVisible="{Binding HasReport}">

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.WorkerConnectionModalView" x:Class="ClaudeDo.Ui.Views.Modals.WorkerConnectionModalView"
x:DataType="vm:WorkerConnectionModalViewModel" x:DataType="vm:WorkerConnectionModalViewModel"
Title="Worker not reachable" Title="{loc:Tr modals.workerConnection.title}"
Width="520" Height="240" Width="520" Height="240"
WindowDecorations="None" WindowDecorations="None"
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
@@ -14,15 +15,15 @@
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="WORKER NOT REACHABLE" CloseCommand="{Binding CloseCommand}"> <ctl:ModalShell Title="{loc:Tr modals.workerConnection.title}" CloseCommand="{Binding CloseCommand}">
<Grid RowDefinitions="*,Auto" Margin="20,16"> <Grid RowDefinitions="*,Auto" Margin="20,16">
<TextBlock Grid.Row="0" Classes="meta" TextWrapping="Wrap" <TextBlock Grid.Row="0" Classes="meta" TextWrapping="Wrap"
Text="ClaudeDo can't reach the background worker. It is normally started automatically at logon. You can start it now, or reinstall if the problem persists."/> Text="{loc:Tr modals.workerConnection.body}"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="8" <StackPanel Grid.Row="1" Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" Margin="0,16,0,0"> HorizontalAlignment="Right" Margin="0,16,0,0">
<Button Classes="btn" Content="Dismiss" Command="{Binding CloseCommand}"/> <Button Classes="btn" Content="{loc:Tr modals.workerConnection.dismiss}" Command="{Binding CloseCommand}"/>
<Button Classes="btn" Content="Rerun Installer" Command="{Binding RerunInstallerCommand}"/> <Button Classes="btn" Content="{loc:Tr modals.workerConnection.rerunInstaller}" Command="{Binding RerunInstallerCommand}"/>
<Button Classes="btn primary" Content="Start Worker" Command="{Binding StartWorkerCommand}"/> <Button Classes="btn primary" Content="{loc:Tr modals.workerConnection.startWorker}" Command="{Binding StartWorkerCommand}"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</ctl:ModalShell> </ctl:ModalShell>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:converters="using:ClaudeDo.Ui.Converters" xmlns:converters="using:ClaudeDo.Ui.Converters"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.WorktreeModalView" x:Class="ClaudeDo.Ui.Views.Modals.WorktreeModalView"
x:DataType="vm:WorktreeModalViewModel" x:DataType="vm:WorktreeModalViewModel"
Title="Worktree" Title="{loc:Tr modals.worktree.title}"
Width="1100" Height="720" Width="1100" Height="720"
MinWidth="640" MinHeight="400" MinWidth="640" MinHeight="400"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"
@@ -33,7 +34,7 @@
PointerMoved="OnTitleBarMoved" PointerMoved="OnTitleBarMoved"
PointerReleased="OnTitleBarReleased"> PointerReleased="OnTitleBarReleased">
<Grid ColumnDefinitions="*,Auto" Margin="14,0"> <Grid ColumnDefinitions="*,Auto" Margin="14,0">
<TextBlock Grid.Column="0" Text="Worktree" VerticalAlignment="Center" <TextBlock Grid.Column="0" Text="{loc:Tr modals.worktree.title}" VerticalAlignment="Center"
FontFamily="{DynamicResource MonoFont}" FontSize="{StaticResource FontSizeBody}" FontFamily="{DynamicResource MonoFont}" FontSize="{StaticResource FontSizeBody}"
Foreground="{DynamicResource TextMuteBrush}"/> Foreground="{DynamicResource TextMuteBrush}"/>
<Button Grid.Column="1" Classes="icon-btn" Content="✕" <Button Grid.Column="1" Classes="icon-btn" Content="✕"

View File

@@ -3,6 +3,7 @@
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
xmlns:converters="using:ClaudeDo.Ui.Converters" xmlns:converters="using:ClaudeDo.Ui.Converters"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Modals.WorktreesOverviewModalView" x:Class="ClaudeDo.Ui.Views.Modals.WorktreesOverviewModalView"
x:DataType="vm:WorktreesOverviewModalViewModel" x:DataType="vm:WorktreesOverviewModalViewModel"
Title="{Binding Title}" Title="{Binding Title}"
@@ -22,38 +23,38 @@
Tapped="OnRowTapped"> Tapped="OnRowTapped">
<Border.ContextMenu> <Border.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="Show diff" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxShowDiff}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).ShowDiffCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).ShowDiffCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Open in Explorer" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxOpenInExplorer}"
IsEnabled="{Binding PathExistsOnDisk}" IsEnabled="{Binding PathExistsOnDisk}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).OpenInExplorerCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).OpenInExplorerCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Jump to task" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxJumpToTask}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).JumpToTaskCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).JumpToTaskCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<Separator/> <Separator/>
<MenuItem Header="Merge" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxMerge}"
IsEnabled="{Binding IsActive}" IsEnabled="{Binding IsActive}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).MergeCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).MergeCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Discard" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxDiscard}"
IsEnabled="{Binding IsActive}" IsEnabled="{Binding IsActive}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).DiscardCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).DiscardCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Keep" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxKeep}"
IsEnabled="{Binding IsActive}" IsEnabled="{Binding IsActive}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).KeepCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).KeepCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<Separator/> <Separator/>
<MenuItem Header="Copy branch" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxCopyBranch}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).CopyBranchCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).CopyBranchCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<MenuItem Header="Copy path" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxCopyPath}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).CopyPathCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).CopyPathCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
<Separator/> <Separator/>
<MenuItem Header="Force remove" <MenuItem Header="{loc:Tr modals.worktreesOverview.ctxForceRemove}"
Foreground="{DynamicResource StatusErrorBrush}" Foreground="{DynamicResource StatusErrorBrush}"
Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).ForceRemoveCommand}" Command="{Binding $parent[Window].((vm:WorktreesOverviewModalViewModel)DataContext).ForceRemoveCommand}"
CommandParameter="{Binding}"/> CommandParameter="{Binding}"/>
@@ -66,9 +67,9 @@
<TextBlock Classes="meta" Text="{Binding TaskStatus}"/> <TextBlock Classes="meta" Text="{Binding TaskStatus}"/>
<TextBlock Classes="meta" Text="•" <TextBlock Classes="meta" Text="•"
IsVisible="{Binding !PathExistsOnDisk}"/> IsVisible="{Binding !PathExistsOnDisk}"/>
<TextBlock Classes="meta" Text="phantom" Foreground="{DynamicResource StatusErrorBrush}" <TextBlock Classes="meta" Text="{loc:Tr modals.worktreesOverview.phantom}" Foreground="{DynamicResource StatusErrorBrush}"
IsVisible="{Binding !PathExistsOnDisk}" IsVisible="{Binding !PathExistsOnDisk}"
ToolTip.Tip="Directory missing on disk"/> ToolTip.Tip="{loc:Tr modals.worktreesOverview.phantomTooltip}"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<Border Grid.Column="1" CornerRadius="3" Padding="6,2" VerticalAlignment="Center" <Border Grid.Column="1" CornerRadius="3" Padding="6,2" VerticalAlignment="Center"
@@ -95,8 +96,8 @@
BorderThickness="0,0,0,1" BorderThickness="0,0,0,1"
Padding="12,8"> Padding="12,8">
<StackPanel Orientation="Horizontal" Spacing="8"> <StackPanel Orientation="Horizontal" Spacing="8">
<Button Classes="btn" Content="Refresh" Command="{Binding RefreshCommand}" IsEnabled="{Binding !IsBusy}"/> <Button Classes="btn" Content="{loc:Tr modals.worktreesOverview.refresh}" Command="{Binding RefreshCommand}" IsEnabled="{Binding !IsBusy}"/>
<Button Classes="btn" Content="Cleanup finished" Command="{Binding CleanupFinishedCommand}" IsEnabled="{Binding !IsBusy}"/> <Button Classes="btn" Content="{loc:Tr modals.worktreesOverview.cleanupFinished}" Command="{Binding CleanupFinishedCommand}" IsEnabled="{Binding !IsBusy}"/>
<TextBlock Text="{Binding StatusMessage}" VerticalAlignment="Center" Margin="12,0,0,0" <TextBlock Text="{Binding StatusMessage}" VerticalAlignment="Center" Margin="12,0,0,0"
Foreground="{DynamicResource TextDimBrush}"/> Foreground="{DynamicResource TextDimBrush}"/>
</StackPanel> </StackPanel>
@@ -107,10 +108,10 @@
<StackPanel> <StackPanel>
<!-- Column headers --> <!-- Column headers -->
<Grid ColumnDefinitions="*,90,80,80" Margin="12,0,12,4"> <Grid ColumnDefinitions="*,90,80,80" Margin="12,0,12,4">
<TextBlock Grid.Column="0" Classes="eyebrow" Text="TASK"/> <TextBlock Grid.Column="0" Classes="eyebrow" Text="{loc:Tr modals.worktreesOverview.columnTask}"/>
<TextBlock Grid.Column="1" Classes="eyebrow" Text="STATE"/> <TextBlock Grid.Column="1" Classes="eyebrow" Text="{loc:Tr modals.worktreesOverview.columnState}"/>
<TextBlock Grid.Column="2" Classes="eyebrow" Text="DIFF"/> <TextBlock Grid.Column="2" Classes="eyebrow" Text="{loc:Tr modals.worktreesOverview.columnDiff}"/>
<TextBlock Grid.Column="3" Classes="eyebrow" Text="AGE"/> <TextBlock Grid.Column="3" Classes="eyebrow" Text="{loc:Tr modals.worktreesOverview.columnAge}"/>
</Grid> </Grid>
<Border Height="1" Background="{DynamicResource LineBrush}" Margin="0,0,0,8"/> <Border Height="1" Background="{DynamicResource LineBrush}" Margin="0,0,0,8"/>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Planning" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Planning"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:DataType="vm:ConflictResolutionViewModel" x:DataType="vm:ConflictResolutionViewModel"
x:Class="ClaudeDo.Ui.Views.Planning.ConflictResolutionView" x:Class="ClaudeDo.Ui.Views.Planning.ConflictResolutionView"
Title="Merge conflict" Title="{loc:Tr planning.conflict.windowTitle}"
Width="560" SizeToContent="Height" MinWidth="460" Width="560" SizeToContent="Height" MinWidth="460"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -17,13 +18,13 @@
<KeyBinding Gesture="Escape" Command="{Binding AbortCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding AbortCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="MERGE CONFLICT" CloseCommand="{Binding AbortCommand}"> <ctl:ModalShell Title="{loc:Tr planning.conflict.modalTitle}" CloseCommand="{Binding AbortCommand}">
<ctl:ModalShell.Footer> <ctl:ModalShell.Footer>
<StackPanel Orientation="Horizontal" Spacing="8" <StackPanel Orientation="Horizontal" Spacing="8"
HorizontalAlignment="Right" VerticalAlignment="Center"> HorizontalAlignment="Right" VerticalAlignment="Center">
<Button Classes="btn" Content="Open all in VS Code" Command="{Binding OpenInVsCodeCommand}"/> <Button Classes="btn" Content="{loc:Tr planning.conflict.openInVsCode}" Command="{Binding OpenInVsCodeCommand}"/>
<Button Classes="btn" Content="I've resolved — continue" Command="{Binding ContinueCommand}"/> <Button Classes="btn" Content="{loc:Tr planning.conflict.resolved}" Command="{Binding ContinueCommand}"/>
<Button Classes="btn" Content="Abort this merge" Command="{Binding AbortCommand}"/> <Button Classes="btn" Content="{loc:Tr planning.conflict.abort}" Command="{Binding AbortCommand}"/>
</StackPanel> </StackPanel>
</ctl:ModalShell.Footer> </ctl:ModalShell.Footer>

View File

@@ -2,9 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Planning" xmlns:vm="using:ClaudeDo.Ui.ViewModels.Planning"
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
xmlns:loc="using:ClaudeDo.Ui.Localization"
x:Class="ClaudeDo.Ui.Views.Planning.PlanningDiffView" x:Class="ClaudeDo.Ui.Views.Planning.PlanningDiffView"
x:DataType="vm:PlanningDiffViewModel" x:DataType="vm:PlanningDiffViewModel"
Title="Planning — Combined diff" Title="{loc:Tr planning.diff.windowTitle}"
Width="1100" Height="700" MinWidth="700" MinHeight="450" Width="1100" Height="700" MinWidth="700" MinHeight="450"
CanResize="True" CanResize="True"
WindowDecorations="BorderOnly" WindowDecorations="BorderOnly"
@@ -17,7 +18,7 @@
<KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/> <KeyBinding Gesture="Escape" Command="{Binding CloseCommand}"/>
</Window.KeyBindings> </Window.KeyBindings>
<ctl:ModalShell Title="PLANNING — COMBINED DIFF" CloseCommand="{Binding CloseCommand}"> <ctl:ModalShell Title="{loc:Tr planning.diff.modalTitle}" CloseCommand="{Binding CloseCommand}">
<!-- Toolbar row --> <!-- Toolbar row -->
<DockPanel> <DockPanel>
@@ -25,12 +26,12 @@
Orientation="Horizontal" Orientation="Horizontal"
Spacing="8" Spacing="8"
Margin="8,6"> Margin="8,6">
<ToggleButton Content="Preview combined" IsChecked="{Binding IsCombinedMode}"/> <ToggleButton Content="{loc:Tr planning.diff.previewCombined}" IsChecked="{Binding IsCombinedMode}"/>
<TextBlock Text="{Binding CombinedWarning}" <TextBlock Text="{Binding CombinedWarning}"
Foreground="{DynamicResource BloodBrush}" Foreground="{DynamicResource BloodBrush}"
VerticalAlignment="Center" VerticalAlignment="Center"
IsVisible="{Binding CombinedWarning, Converter={x:Static ObjectConverters.IsNotNull}}"/> IsVisible="{Binding CombinedWarning, Converter={x:Static ObjectConverters.IsNotNull}}"/>
<TextBlock Text="Loading" <TextBlock Text="{loc:Tr planning.diff.loading}"
VerticalAlignment="Center" VerticalAlignment="Center"
IsVisible="{Binding IsLoadingCombined}"/> IsVisible="{Binding IsLoadingCombined}"/>
</StackPanel> </StackPanel>