Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Conclave.App/MainWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@
Icon="/Assets/icon.png"
Width="1320" Height="820" MinWidth="640" MinHeight="480"
Background="{Binding Tokens.Bg}">
<!-- macOS app menu: replaces Avalonia's default "About Avalonia" item with our
own Conclave-branded modal. On Windows/Linux this attached menu is unused
(no menu bar is rendered). -->
<NativeMenu.Menu>
<NativeMenu>
<NativeMenuItem Header="About Conclave" Click="OnAboutMenuClick" />
</NativeMenu>
</NativeMenu.Menu>
<Panel>
<!-- Five-column layout: sidebar · splitter · main · splitter · right.
Sidebar and right widths are pixel-sized and user-resizable via the
Expand Down Expand Up @@ -64,6 +72,7 @@
<shell:NewSessionModal />
<shell:NewFusionProjectModal />
<shell:PreferencesModal />
<shell:AboutModal />
<shell:Toast />
</Panel>
</Window>
2 changes: 2 additions & 0 deletions src/Conclave.App/MainWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,6 @@ private void ApplyResponsiveLayout(double windowWidth, bool hasActiveSession)
}

private bool RightColIsZero() => RightCol.Width.Value == 0;

private void OnAboutMenuClick(object? sender, System.EventArgs e) => _shell?.OpenAbout();
}
31 changes: 31 additions & 0 deletions src/Conclave.App/ViewModels/ShellVm.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Reflection;
using Conclave.App.Claude;
using Conclave.App.Design;
using Conclave.App.Sessions;
Expand Down Expand Up @@ -119,6 +120,36 @@ public bool IsPreferencesOpen
public void OpenPreferences() => IsPreferencesOpen = true;
public void ClosePreferences() => IsPreferencesOpen = false;

// --- About ---

private bool _isAboutOpen;
public bool IsAboutOpen
{
get => _isAboutOpen;
set => Set(ref _isAboutOpen, value);
}

public void OpenAbout() => IsAboutOpen = true;
public void CloseAbout() => IsAboutOpen = false;

// Reads the assembly's InformationalVersion (stamped by `dotnet publish -p:Version=...`)
// and trims the trailing `+commit` build metadata SourceLink appends. Falls back to the
// numeric assembly version, then a dev sentinel.
public string AppVersion
{
get
{
var asm = typeof(ShellVm).Assembly;
var info = asm.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
if (!string.IsNullOrEmpty(info))
{
var plus = info.IndexOf('+');
return plus >= 0 ? info[..plus] : info;
}
return asm.GetName().Version?.ToString() ?? "0.0.0-dev";
}
}

public bool AutoCleanupEnabled
{
get => SettingsKeys.ReadAutoCleanupEnabled(Manager.Db);
Expand Down
57 changes: 57 additions & 0 deletions src/Conclave.App/Views/Shell/AboutModal.axaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Conclave.App.ViewModels"
x:Class="Conclave.App.Views.Shell.AboutModal"
x:DataType="vm:ShellVm">
<Panel IsVisible="{Binding IsAboutOpen}" IsHitTestVisible="{Binding IsAboutOpen}"
KeyDown="OnModalKeyDown"
Focusable="True">
<Border Background="#A6000000" PointerPressed="OnBackdropPressed" />

<Border Width="420"
VerticalAlignment="Center" HorizontalAlignment="Center"
Background="{Binding Tokens.Bg}"
BorderBrush="{Binding Tokens.BorderHi}" BorderThickness="1"
CornerRadius="{Binding Tokens.RadLgCorner}"
Padding="32,28">
<Border.Effect>
<DropShadowEffect BlurRadius="60" OffsetY="20" Opacity="0.5" Color="Black" />
</Border.Effect>

<StackPanel Spacing="10" HorizontalAlignment="Center">
<Image Source="avares://Conclave.App/Assets/icon.png"
Width="72" Height="72"
HorizontalAlignment="Center" Margin="0,0,0,4" />

<TextBlock Text="Conclave" FontSize="22" FontWeight="SemiBold"
Foreground="{Binding Tokens.Text}"
HorizontalAlignment="Center" />

<TextBlock Text="{Binding AppVersion, StringFormat='Version {0}'}"
FontSize="11.5" Foreground="{Binding Tokens.TextDim}"
FontFamily="ui-monospace,SFMono-Regular,Menlo,monospace"
HorizontalAlignment="Center" />

<TextBlock Text="A desktop home for your Claude Code sessions — many at once, each in its own git worktree."
FontSize="12" Foreground="{Binding Tokens.TextDim}"
TextWrapping="Wrap" TextAlignment="Center"
Margin="8,8,8,0" />

<TextBlock Text="github.com/Cellcote/Conclave"
FontSize="11" Foreground="{Binding Tokens.TextMute}"
FontFamily="ui-monospace,SFMono-Regular,Menlo,monospace"
HorizontalAlignment="Center" Margin="0,8,0,0" />

<TextBlock Text="MIT License · © 2026 Rik Schreurs"
Comment on lines +44 to +45
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Repo URL is not clickable

The repo URL is rendered as a plain TextBlock, so users can't click it to open a browser. Avalonia supports HyperlinkButton or you can handle a PointerPressed event with Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }). As-is, displaying a URL that does nothing on click may be confusing.

FontSize="11" Foreground="{Binding Tokens.TextMute}"
HorizontalAlignment="Center" />

<Button Content="Done" Click="OnDone"
Background="{Binding Tokens.Text}" BorderThickness="0"
CornerRadius="{Binding Tokens.RadSmCorner}" Padding="18,5"
Foreground="{Binding Tokens.Bg}" FontSize="12" FontWeight="SemiBold"
HorizontalAlignment="Center" Margin="0,16,0,0" />
</StackPanel>
</Border>
</Panel>
</UserControl>
34 changes: 34 additions & 0 deletions src/Conclave.App/Views/Shell/AboutModal.axaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Conclave.App.ViewModels;

namespace Conclave.App.Views.Shell;

public partial class AboutModal : UserControl
{
public AboutModal() => InitializeComponent();

private void OnBackdropPressed(object? sender, PointerPressedEventArgs e)
{
if (DataContext is ShellVm shell) shell.CloseAbout();
}

private void OnDone(object? sender, RoutedEventArgs e)
{
if (DataContext is ShellVm shell) shell.CloseAbout();
}

private void OnModalKeyDown(object? sender, KeyEventArgs e)
{
if (DataContext is not ShellVm shell || !shell.IsAboutOpen) return;
if (e.Key == Key.Escape)
{
shell.CloseAbout();
e.Handled = true;
}
}

private void InitializeComponent() => AvaloniaXamlLoader.Load(this);
}
Loading