fix(ui): align island header separators via shared header height

This commit is contained in:
mika kuns
2026-10-01 16:07:05 +02:00
parent a76788a5b9
commit 34c71bbe02
4 changed files with 93 additions and 84 deletions
@@ -12,10 +12,12 @@
<DockPanel> <DockPanel>
<!-- ── Header (sticky top): id · title · trash/skull · gear — task detail only ── --> <!-- ── Header (sticky top): id · title · trash/skull · gear — task detail only ── -->
<Border DockPanel.Dock="Top" Classes="island-header" <Grid DockPanel.Dock="Top" IsVisible="{Binding IsTaskDetailVisible}">
IsVisible="{Binding IsTaskDetailVisible}"> <Grid.RowDefinitions><RowDefinition Height="Auto" SharedSizeGroup="IslandHeader"/></Grid.RowDefinitions>
<detail:TaskHeaderBar/> <Border Classes="island-header">
</Border> <detail:TaskHeaderBar/>
</Border>
</Grid>
<!-- ── Body: task details (normal), notes editor (notes mode), or prep log (prep mode) ── --> <!-- ── Body: task details (normal), notes editor (notes mode), or prep log (prep mode) ── -->
<Grid> <Grid>
@@ -183,27 +183,30 @@
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
<!-- ── Header ── --> <!-- ── Header ── -->
<Border DockPanel.Dock="Top" Classes="island-header"> <Grid DockPanel.Dock="Top">
<StackPanel Spacing="4"> <Grid.RowDefinitions><RowDefinition Height="Auto" SharedSizeGroup="IslandHeader"/></Grid.RowDefinitions>
<TextBlock Classes="heading" Text="{loc:Tr lists.heading}"/> <Border Classes="island-header">
<StackPanel Spacing="4">
<!-- Search row --> <TextBlock Classes="heading" Text="{loc:Tr lists.heading}"/>
<Border Classes="search-wrap" Margin="0,8,0,12">
<Grid ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center"> <!-- Search row -->
<PathIcon Grid.Column="0" Width="14" Height="14" <Border Classes="search-wrap" Margin="0,8,0,12">
Data="{StaticResource Icon.Search}" <Grid ColumnDefinitions="Auto,*,Auto" VerticalAlignment="Center">
Foreground="{DynamicResource TextFaintBrush}" <PathIcon Grid.Column="0" Width="14" Height="14"
Margin="2,0,0,0"/> Data="{StaticResource Icon.Search}"
<TextBox Grid.Column="1" x:Name="SearchBox" Classes="search-inner" Foreground="{DynamicResource TextFaintBrush}"
PlaceholderText="{loc:Tr lists.searchPlaceholder}" Margin="2,0,0,0"/>
Text="{Binding SearchText, Mode=TwoWay}"/> <TextBox Grid.Column="1" x:Name="SearchBox" Classes="search-inner"
<Border Grid.Column="2" Classes="kbd" Margin="0,0,2,0"> PlaceholderText="{loc:Tr lists.searchPlaceholder}"
<TextBlock Text="{loc:Tr lists.searchKbd}"/> Text="{Binding SearchText, Mode=TwoWay}"/>
</Border> <Border Grid.Column="2" Classes="kbd" Margin="0,0,2,0">
</Grid> <TextBlock Text="{loc:Tr lists.searchKbd}"/>
</Border> </Border>
</StackPanel> </Grid>
</Border> </Border>
</StackPanel>
</Border>
</Grid>
<!-- ── No-repo banner — visible until any User list has a linked working dir; no <!-- ── No-repo banner — visible until any User list has a linked working dir; no
dismiss, no persisted state, comes back if the last repo link is removed. ── --> dismiss, no persisted state, comes back if the last repo link is removed. ── -->
@@ -10,64 +10,67 @@
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
<!-- Header --> <!-- Header -->
<Border DockPanel.Dock="Top" Classes="island-header"> <Grid DockPanel.Dock="Top">
<Grid ColumnDefinitions="*,Auto"> <Grid.RowDefinitions><RowDefinition Height="Auto" SharedSizeGroup="IslandHeader"/></Grid.RowDefinitions>
<StackPanel Grid.Column="0" Spacing="4"> <Border Classes="island-header">
<TextBlock Classes="eyebrow" Text="{Binding HeaderEyebrow}"/> <Grid ColumnDefinitions="*,Auto">
<TextBlock Classes="display" <StackPanel Grid.Column="0" Spacing="4">
Text="{Binding HeaderTitle}" <TextBlock Classes="eyebrow" Text="{Binding HeaderEyebrow}"/>
TextTrimming="CharacterEllipsis"/> <TextBlock Classes="display"
<TextBlock Classes="meta" Text="{Binding HeaderTitle}"
Foreground="{DynamicResource TextMuteBrush}" TextTrimming="CharacterEllipsis"/>
Text="{Binding Subtitle}" <TextBlock Classes="meta"
TextTrimming="CharacterEllipsis"/> Foreground="{DynamicResource TextMuteBrush}"
<ctl:OperationIndicator Status="{Binding PlanningOperation}"/> Text="{Binding Subtitle}"
</StackPanel> TextTrimming="CharacterEllipsis"/>
<ctl:OperationIndicator Status="{Binding PlanningOperation}"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4" </StackPanel>
VerticalAlignment="Top">
<Border Classes="kbd" VerticalAlignment="Center" Margin="0,0,6,0" <StackPanel Grid.Column="1" Orientation="Horizontal" Spacing="4"
IsVisible="{Binding HasStatusPill}"> VerticalAlignment="Top">
<TextBlock Text="{Binding StatusPill}"/> <Border Classes="kbd" VerticalAlignment="Center" Margin="0,0,6,0"
</Border> IsVisible="{Binding HasStatusPill}">
<Button Classes="icon-btn" Classes.active="{Binding IsShowingCompleted}" <TextBlock Text="{Binding StatusPill}"/>
IsVisible="{Binding !IsNotesList}" </Border>
Command="{Binding ToggleShowCompletedCommand}" <Button Classes="icon-btn" Classes.active="{Binding IsShowingCompleted}"
ToolTip.Tip="{loc:Tr tasks.showCompletedTip}"> IsVisible="{Binding !IsNotesList}"
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Eye}"/> Command="{Binding ToggleShowCompletedCommand}"
</Button> ToolTip.Tip="{loc:Tr tasks.showCompletedTip}">
<Button Classes="icon-btn" IsVisible="{Binding IsLetClaudeVisible}" <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Eye}"/>
Command="{Binding LetClaudeHandleCommand}" ToolTip.Tip="{loc:Tr tasks.letClaudeTip}"> </Button>
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.AgentSuggested}"/> <Button Classes="icon-btn" IsVisible="{Binding IsLetClaudeVisible}"
</Button> Command="{Binding LetClaudeHandleCommand}" ToolTip.Tip="{loc:Tr tasks.letClaudeTip}">
<Button Classes="icon-btn" IsVisible="{Binding IsMergeReviewsVisible}" <PathIcon Width="15" Height="15" Data="{StaticResource Icon.AgentSuggested}"/>
Command="{Binding MergeReviewsCommand}" ToolTip.Tip="{loc:Tr tasks.mergeReviewsTip}"> </Button>
<!-- Icon.GitBranch is line-art: stroke-rendered, PathIcon would fill the lines away --> <Button Classes="icon-btn" IsVisible="{Binding IsMergeReviewsVisible}"
<Viewbox Width="16" Height="16"> Command="{Binding MergeReviewsCommand}" ToolTip.Tip="{loc:Tr tasks.mergeReviewsTip}">
<Path Classes="icon-stroke" Data="{StaticResource Icon.GitBranch}"/> <!-- Icon.GitBranch is line-art: stroke-rendered, PathIcon would fill the lines away -->
</Viewbox> <Viewbox Width="16" Height="16">
</Button> <Path Classes="icon-stroke" Data="{StaticResource Icon.GitBranch}"/>
<Button Classes="icon-btn" IsVisible="{Binding IsQuickClaudeVisible}" </Viewbox>
Command="{Binding OpenQuickClaudeSessionCommand}" ToolTip.Tip="{loc:Tr tasks.quickClaudeTip}"> </Button>
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.ArrowOut}"/> <Button Classes="icon-btn" IsVisible="{Binding IsQuickClaudeVisible}"
</Button> Command="{Binding OpenQuickClaudeSessionCommand}" ToolTip.Tip="{loc:Tr tasks.quickClaudeTip}">
<Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}" <PathIcon Width="15" Height="15" Data="{StaticResource Icon.ArrowOut}"/>
Command="{Binding ClearDayCommand}" ToolTip.Tip="{loc:Tr tasks.clearDayTip}"> </Button>
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/> <Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}"
</Button> Command="{Binding ClearDayCommand}" ToolTip.Tip="{loc:Tr tasks.clearDayTip}">
<Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}" <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Broom}"/>
Command="{Binding ShowPrepLogCommand}" ToolTip.Tip="{loc:Tr tasks.planMyDayTip}"> </Button>
<Viewbox Width="18" Height="18"> <Button Classes="icon-btn" IsVisible="{Binding IsMyDayList}"
<Path Classes="icon-stroke" Data="{StaticResource Icon.PlanDay}"/> Command="{Binding ShowPrepLogCommand}" ToolTip.Tip="{loc:Tr tasks.planMyDayTip}">
</Viewbox> <Viewbox Width="18" Height="18">
</Button> <Path Classes="icon-stroke" Data="{StaticResource Icon.PlanDay}"/>
<Button Classes="icon-btn" IsVisible="{Binding !IsNotesList}" </Viewbox>
Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="{loc:Tr tasks.listSettingsTip}"> </Button>
<PathIcon Width="15" Height="15" Data="{StaticResource Icon.Settings}"/> <Button Classes="icon-btn" IsVisible="{Binding !IsNotesList}"
</Button> Command="{Binding OpenListSettingsCommand}" ToolTip.Tip="{loc:Tr tasks.listSettingsTip}">
</StackPanel> <PathIcon Width="15" Height="15" Data="{StaticResource Icon.Settings}"/>
</Grid> </Button>
</Border> </StackPanel>
</Grid>
</Border>
</Grid>
<!-- Add-task row --> <!-- Add-task row -->
<Border DockPanel.Dock="Top" Classes="add-task" Margin="16,14,16,8" <Border DockPanel.Dock="Top" Classes="add-task" Margin="16,14,16,8"
+2 -1
View File
@@ -142,7 +142,8 @@
</Border> </Border>
<!-- Three islands (user-resizable) --> <!-- Three islands (user-resizable) -->
<Grid Grid.Row="1" Margin="7"> <!-- Shared-size scope: the island headers share one height so their separators line up -->
<Grid Grid.Row="1" Margin="7" Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="260" MinWidth="200"/> <ColumnDefinition Width="260" MinWidth="200"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>