feat/phase-3-shell: NavigationView shell + read-only browse#6
Merged
Conversation
Core view models in Snipdeck.Core/ViewModels/:
- ShellViewModel owns the shell's cross-cutting state (CLI switcher choices,
search text, selected tag with an "All" sentinel, current content VM).
- HomeViewModel builds CLI cards and a most-used Snips list (top 6 by
UsageCount, then LastUsedAt desc, hidden when nothing's been used).
- CliViewModel exposes the filtered Snip list, favourites bubbled to the
top.
- SettingsViewModel stub backs the About expander.
- CliCardViewModel, SnipCardViewModel, CliChoice support types.
Core services:
- SnipFilter: pure case-insensitive search (title + template + tags) + tag
filter + trash exclusion + DistinctTagsFor.
- IdenticonService: Jdenticon-net seeded off Cli.Id so renaming a CLI
doesn't change its icon.
App-side WinUI:
- ShellPage hosts the NavigationView: pane header (AutoSuggestBox +
CliChoice ComboBox), pane body tag list (sentinel "All" + per-CLI tags),
pane footer Settings button, content area driven by a
ShellContentTemplateSelector keyed on view-model type.
- Identicon UserControl (DP-driven, lazy BitmapImage from PNG bytes).
- CliCard (identicon + name + snip count).
- SnipCard (title, monospace template preview, tag chips, favourite star,
Copy/Edit/Delete buttons disabled with "Phase 4/5" tooltips).
- Settings page stub via SettingsCard/SettingsExpander with About as the
last expander; version falls back to assembly InformationalVersion until
NBGV lands in Phase 6.
- MainWindow now hosts the ShellPage in its content row.
Converters: BoolToVisibilityConverter, CountToVisibilityConverter.
Tests cover SnipFilter, IdenticonService, ShellViewModel state transitions,
HomeViewModel construction. 88 passing (up from 63).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rtial on WinRT-interface types x:Bind in a DataTemplate resolves bindings via the bound DataContext instance, so SettingsViewModel.AppName / TaglineDisplay can't be static — CS0176 in the generated code. Switch them back to instance properties with a narrow #pragma to silence CA1822 (they're cheap and only live while Settings is open). CsWinRT1028 wants types that implement WinRT interfaces (IValueConverter, DataTemplateSelector) marked partial so its source generator can emit the marshalling glue. Add 'partial' to BoolToVisibilityConverter, CountToVisibilityConverter, and ShellContentTemplateSelector. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
StuartMeeks
added a commit
that referenced
this pull request
May 29, 2026
feat/phase-4-authoring: authoring + parameter-fill flyout (stacked on #6)
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 3 of the build plan. Read-only browsing of the seeded data, no authoring yet.
What's in
ShellViewModel+ supporting VMs (HomeViewModel,CliViewModel,SettingsViewModel,CliCardViewModel,SnipCardViewModel,CliChoice) — all inSnipdeck.Core/ViewModels/. Discipline preserved: zero WinUI types in Core."All"sentinel for filter-off — selecting it clears the tag predicate.Cli.Id. Deterministic.ShellPagein its content row; Mica + custom title bar carry over from Phase 2.Stub treatments (so the UI doesn't lie about what works)
SettingsCards describing what they'll do. About is the lastSettingsExpanderand shows app name, version (fromInformationalVersionuntil Phase 6 wires Nerdbank.GitVersioning), and copyright (fromDirectory.Build.props).MainWindowctor — live theme switching lands in Phase 6.Tests
88 Core unit tests passing (up from 63). New coverage:
SnipFilterTests— search, tag, trash, combined AND filter, whitespace, ordering of distinct tags.IdenticonServiceTests— PNG signature, determinism, distinct seeds, size validation.ShellViewModelTests— initial state, CLI switching, tag rebuild, search re-filter, OpenSettings flow.HomeViewModelTests— card sorting + count, search filtering, most-used ordering/exclusions, empty document.Stacked PRs
Master is gated. This PR is the first of four stacked:
feat/phase-3-shell←masterfeat/phase-4-authoring←feat/phase-3-shellfeat/phase-5-platform←feat/phase-4-authoringfeat/phase-6-release←feat/phase-5-platformAfter you merge this, the next PR's base will need updating to
masterand a rebase. Each subsequent merge does the same.What CI doesn't verify (please eyeball on Windows)
🤖 Generated with Claude Code