From 9991f1fc1f76a4d9d789818407f3c120a4030659 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Wed, 30 Sep 2026 08:29:46 +0200 Subject: [PATCH] feat(ui): coloured dots for icon-less lists, guide line under chevron Lists without an icon show a dot in a stable identity colour (same palette/hash as Mission Control tiles); "Dot" is the new picker default. --- src/ClaudeDo.Ui/Design/IslandStyles.axaml | 3 +++ .../ViewModels/Islands/ListNavItemViewModel.cs | 11 ++++++++++- .../ViewModels/MissionControl/ConPtyPaneViewModel.cs | 3 ++- .../ViewModels/Modals/ListSettingsModalViewModel.cs | 4 ++-- src/ClaudeDo.Ui/Views/Islands/ListsIslandView.axaml | 10 ++++++---- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/ClaudeDo.Ui/Design/IslandStyles.axaml b/src/ClaudeDo.Ui/Design/IslandStyles.axaml index f5a375ee..4ce6d031 100644 --- a/src/ClaudeDo.Ui/Design/IslandStyles.axaml +++ b/src/ClaudeDo.Ui/Design/IslandStyles.axaml @@ -54,6 +54,9 @@ The old stroke version filled into a solid slab. --> F0 M3 5 H21 V19 H3 Z M5 7 H19 V12 H5 Z M5 14 H19 V17 H5 Z M11 7.6 H13 V9.4 H15 L12 12 L9 9.4 H11 Z + + M12 7a5 5 0 1 0 0 10a5 5 0 1 0 0-10z + M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/ListNavItemViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/ListNavItemViewModel.cs index 87245e08..e0d20517 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/ListNavItemViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/ListNavItemViewModel.cs @@ -1,4 +1,5 @@ using ClaudeDo.Data.Models; +using ClaudeDo.Ui.ViewModels.MissionControl; using CommunityToolkit.Mvvm.ComponentModel; namespace ClaudeDo.Ui.ViewModels.Islands; @@ -30,7 +31,15 @@ public sealed partial class ListNavItemViewModel : ViewModelBase // DropHintAbove/Below, which mark an insertion point for list reordering. [ObservableProperty] private bool _isTaskDropTarget; // Settable (not init) so a list-settings icon change refreshes the row in place. - [ObservableProperty] private string? _iconKey; + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsDot))] + private string? _iconKey; + + /// No icon picked — the row shows a coloured dot instead of a glyph. + public bool IsDot => IconKey is null or ListsIslandViewModel.ListIcon; + + /// Identity colour of the dot, stable per list id across restarts. + public string DotColorKey => $"Identity{ConPtyPaneViewModel.StableIndex(Id, 6) + 1}"; // The sidebar folder this row sits in (ListEntity.FolderId); null = top level. [ObservableProperty] private string? _folderId; } diff --git a/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs b/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs index 768936a7..e66d8b11 100644 --- a/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/MissionControl/ConPtyPaneViewModel.cs @@ -30,7 +30,8 @@ public sealed partial class ConPtyPaneViewModel : ViewModelBase, IDisposable // FNV-1a, not string.GetHashCode: the latter is randomized per process, so the same task would // change colour on every app start. - private static int StableIndex(string value, int buckets) + /// Process-stable bucket for ; also colours the sidebar list dots. + internal static int StableIndex(string value, int buckets) { uint hash = 2166136261; foreach (var c in value) diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs index cea6a3fe..aa409720 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs @@ -111,7 +111,7 @@ public sealed partial class ListSettingsModalViewModel : ViewModelBase public ObservableCollection CommitTypeOptions { get; } = new(CommitTypeRegistry.Types); - public const string DefaultIcon = "Text"; + public const string DefaultIcon = "Dot"; /// Default icon for folders, kept apart from so lists never look like folders. public const string DefaultFolderIcon = "Folder"; @@ -123,7 +123,7 @@ public sealed partial class ListSettingsModalViewModel : ViewModelBase public static readonly string[] IconOptions = [ // general - "Folder", "Star", "Sun", "Calendar", "Clock", "Inbox", "Mail", "Text", "Search", "Grid", + "Dot", "Folder", "Star", "Sun", "Calendar", "Clock", "Inbox", "Mail", "Text", "Search", "Grid", // dev "Code", "Terminal", "Database", "Server", "Chip", "Bolt", "Wand", "Flask", "Shield", // status / flow diff --git a/src/ClaudeDo.Ui/Views/Islands/ListsIslandView.axaml b/src/ClaudeDo.Ui/Views/Islands/ListsIslandView.axaml index 181ce0a1..5185315e 100644 --- a/src/ClaudeDo.Ui/Views/Islands/ListsIslandView.axaml +++ b/src/ClaudeDo.Ui/Views/Islands/ListsIslandView.axaml @@ -73,9 +73,12 @@ + - + -