Skip to content

Final UI polish pass#33

Merged
StuartMeeks merged 31 commits into
mainfrom
feat/ui-polish
May 31, 2026
Merged

Final UI polish pass#33
StuartMeeks merged 31 commits into
mainfrom
feat/ui-polish

Conversation

@StuartMeeks

Copy link
Copy Markdown
Owner

The end-of-cycle UI polish pass (task #6). Accumulated on one branch; reviewed by codex across each round.

Highlights

Home page (WinUI Gallery-style)

  • Full-bleed hero header: theme-specific image (HomeHeroLight.png / HomeHeroDark.png) painted via a Composition mask so its lower edge fades into the page's Mica; title top-left.
  • CLI launcher is a horizontal carousel whose cards straddle the hero's bottom edge (~75% over / ~25% below), with an always-present "New CLI" tile. Cards use the Gallery's acrylic fill.
  • Centred Most used / Recent / Favourites pill selector over a left-aligned snip-card grid (categories unscoped to the switcher).

Navigation & title bar

  • CLI switcher + snip-only search (name autocomplete, CLI-name badge, choose-to-filter) moved to a centred title-bar group; pane-toggle hamburger moved to the title bar so Home is the first nav item (passthrough regions for the interactive controls).
  • Footer destinations (Shared parameters / Tags / Trash / Settings) are selectable nav items with the standard selected indicator.
  • Home resets the switcher to All and clears the search.

Tags, parameters, settings

  • Tag icons in the nav (Segoe Fluent glyphs, default tag glyph, code-point entry), managed from a Tags screen.
  • Shared parameters (global + per-CLI, reached from the CLI header) as read-only cards with a per-parameter add/edit/delete modal.
  • Settings grouped into "Appearance & behaviour" and "About"; About expander titled "Snipdeck" with version/copyright, clone-command (copy) and an issues link.
  • CLI descriptions (shown on Home cards); store schema v4.

Cards, dialogs & theming

  • Snip card: Copy hugs content, Edit/Delete grouped beside it; destructive actions use subtle red.
  • Dialogs: rounded corners + standardised rounded buttons with spacing (incl. derived dialogs); wider snip editor; scrollbar gutters.
  • Modals follow the in-app theme rather than the OS theme.

Testing

  • 209 Core unit tests pass.
  • Windows App build verified (build agent) and green in CI (ubuntu Core + windows App).
  • codex review clean.

🤖 Generated with Claude Code

StuartMeeks and others added 30 commits May 30, 2026 13:00
Tags can now have an icon glyph (Segoe Fluent Icons) shown beside them in the
left navigation, defaulting to "#". Icons are stored globally per tag name
(SnipStoreDocument.TagIcons, schema v3) and applied wherever the tag appears.
A new "Tags" entry in the pane footer (next to Shared parameters) lists every
tag with an inline-editable glyph + live preview, saved via SaveTagIcons.
New tags default to "#" automatically. Tag chips on snip cards are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ure nav

Title bar now hosts the CLI switcher and a snip-only search box with
name autocomplete scoped to the selected CLI; each suggestion carries a
CLI-name badge, and choosing one filters the list to that snip. Only the
title-bar spacer is draggable so the controls stay interactive.

Left navigation now leads with Home and Documentation entries, then a
Tags heading with an All entry and the scoped tags (managed in code-behind
so headers and dynamic tag items coexist while Core stays UI-free). Footer
actions are left-aligned. Documentation opens the GitHub readme via a new
IExternalLinkService (Core interface, WindowsExternalLinkService impl).

Reshapes ShellViewModel: SelectedTagItem drives content (null = Home,
otherwise the scoped+filtered snip list), the switcher's "All" choice is
all-CLIs scope, and selection is preserved across save refreshes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Title bar now centres the search box and CLI switcher as a group (search
on the left, switcher on its right), with the app name kept on the left.
The whole bar is the drag region; WinUI auto-excludes the interactive
controls.

The default tag glyph was "#", which renders as tofu in Segoe Fluent
Icons. Switched it to the "Tag" glyph (same as the Tags feature icon).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Entering a glyph code like "E8EC" (or "U+E8EC", "0xE8EC", "",
"&#xE8EC;") now renders as that character instead of the literal text.
A pasted glyph character is still taken as-is. The resolved character is
what gets stored, so the nav renders it directly. New GlyphInput.Resolve
helper in Core, covered by tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…r snip editor

- Snip card: Copy hugs its content; Edit/Delete grouped beside it.
- Subtle-red destructive treatment: Delete CLI button and the delete
  confirmation dialogs (new `destructive` flag on IShellInteractions.ConfirmAsync).
- Centralised dialog styling in App.xaml: rounded modal corners, rounded
  dialog buttons, and a wider gap between primary/close.
- Snip editor widened to fit its content (lifted dialog max-width); the
  "Command template" header no longer inherits the monospace font.

True drag-resize + remembered editor size deferred to TODO per decision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ar gutter

The previous round's implicit `TargetType="ContentDialog"` style never
reached the editor dialogs because they're ContentDialog *subclasses* —
an implicit style only matches the exact type. Per the WinUI guidance for
derived dialogs, add explicit styles for SnipEditorDialog / CliEditorDialog /
ParameterFillDialog based on DefaultContentDialogStyle, so they get rounded
8px corners and the standardised primary/close button styling (rounded,
8px gap).

Also:
- Destructive confirms now default to Cancel, so the default-button accent
  treatment no longer overrides the Delete button's subtle-red foreground.
- The snip and CLI editors get a right-hand gutter so the overlay scrollbar
  no longer sits on top of fields/buttons.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…cope CLI actions

- [P1] Title-bar controls were inside the SetTitleBar drag region; WinUI 3
  doesn't auto-passthrough interactive content. Register the centred
  search/switcher group as an InputNonClientPointerSource passthrough region,
  recomputed on title-bar/group size changes, so the controls receive input.
- [P2] A chosen search suggestion now constrains the list to that exact snip
  id (via a transient _focusedSnipId), instead of filtering by title text and
  showing every same-titled snip. Cleared by any other navigation.
- [P2] Edit CLI / Delete CLI / New snip are hidden in the synthetic "All"
  scope (gated on CliViewModel.HasCli), where they'd otherwise no-op.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clicking Home in the left nav now switches the CLI switcher back to "All"
and shows the Home launcher, instead of only clearing the tag while leaving
the switcher on the current CLI. Done under suppression so the scope change
doesn't bounce to the snip list first.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s) + CLI descriptions

- Home: gradient hero banner with "Next Iteration" / "Snipdeck" headings;
  landscape CLI tiles (232x172) showing each CLI's description; a segmented
  selector (Most used / Recent / Favourites, unscoped) over a card grid.
- New Cli.Description field, edited in the CLI editor and shown on Home cards;
  preserved through the icon-resave paths. Store schema bumped to v4.
- HomeViewModel gains Recent/Favourites lists, a selected-category with
  ActiveSnips, and select commands. SnipCard preview is now height-bounded so
  cards tile cleanly. Examples seed CLI gets a description.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
[P3] A submitted search could be ignored when the query text was unchanged
and the user was on a non-snip page (Settings/Trash/Tags) with a tag still
selected — both property assignments were no-ops, so no refresh ran. Set the
state under suppression and apply the shell content explicitly, so search
always lands on the (filtered) snip list. Covered by a test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ousel/selector

- Move the pane toggle (hamburger) into the title bar; Home is now the first
  nav item. Title-bar passthrough now covers the hamburger too.
- Footer destinations (Shared parameters / Tags / Trash / Settings) are now
  NavigationView FooterMenuItems, so they show the selected look (indicator
  bar + darker background); selection follows CurrentContent.
- Clicking Home also clears the search (and resets the switcher to All); the
  title-bar search box clears in sync.
- Home: full-bleed hero banner (gradient placeholder + optional Assets/HomeHero.png
  layered on top), no CLIs heading, CLI cards as a horizontal carousel that
  overlaps the banner with a New CLI tile, and a centred pill category selector
  (Most used / Recent / Favourites) with glyphs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…inements

- Shared parameters (global and per-CLI) now have a read-only card view + an
  edit modal (ParametersEditorDialog), replacing inline editing. Global is a
  footer nav destination; a CLI's set is reached from a "Shared parameters"
  button on the CLI view header. Removed the params section from the CLI editor.
  GlobalParametersViewModel split into read-only SharedParametersViewModel +
  ParametersEditorViewModel (edit modal) + ParameterDisplayViewModel (cards).
  New IShellInteractions.EditParametersAsync.
- Tags and Shared-parameters panes are left-aligned (like Trash).
- Settings grouped into "Appearance & behaviour" and "About"; the About
  expander is titled "Snipdeck" with copyright + version, and expands to a
  clone-command (copy to clipboard) and an issues link.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…avigates

- [P2] The empty-state Home now has a New CLI button — previously the only
  New CLI action lived in the carousel, which is hidden when there are no CLIs,
  stranding a fresh/empty store.
- [P2] Re-invoking the already-selected tag from a non-snip page (e.g. Settings)
  now navigates back to the snip list. New ShellViewModel.SelectTag re-applies
  the content even when the tag value is unchanged. Covered by a test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s case-insensitively

- [P3] ParametersEditorDialog (a derived ContentDialog) gets the explicit
  Snipdeck dialog style, so the shared-parameters edit modal has rounded
  corners and the standard button spacing like the other dialogs.
- [P3] The Tags editor dedupes rows case-insensitively, matching the rest of
  the shell's tag handling, so a saved icon can't miss the nav's collapsed entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
[P2] The persisted tag-icon map was keyed case-sensitively while tags are
matched case-insensitively everywhere else, so an icon saved against one
casing could miss the nav entry shown in another. Re-key the map
case-insensitively on load (collapsing stray casing duplicates, last wins)
and build it with an OrdinalIgnoreCase comparer. Covered by a test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Windows "Build solution" CI job flagged IDE0055 on a comment placed
inside the LINQ chain in TagIconsViewModel (the Linux Core build and the
Debug winbuild don't catch this formatting case). Moved the comment above
the statement. Verified with `dotnet format whitespace --verify-no-changes`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…panes

- Shared parameters (global and per-CLI) now edit one parameter at a time:
  "Add parameter" sits above the list, and each read-only card has its own
  Edit and Delete buttons, each opening a single-parameter modal. Replaced the
  all-at-once editor (ParametersEditorViewModel/Dialog) with a single-parameter
  ParameterEditorDialog and IShellInteractions.EditParameterAsync; ShellViewModel
  gains Add/Edit/Delete shared-parameter commands operating on the scope's list.
- Reverted Shared parameters, Tags and Trash to the centred Settings-style
  layout (MaxWidth 720, centred) per preference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The implicit dialog style still targeted views:ParametersEditorDialog, which
was renamed to ParameterEditorDialog when the editor became single-parameter.
A clean checkout (CI, fresh build) hits XamlCompiler WMC0110 on it. (winbuild
missed it because the agent doesn't delete removed files, so the old dialog
type lingered on the build host.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
[P2] On Home with Recent/Favourites selected, a card action (copy, favourite,
delete) goes through SaveAndRefreshAsync and rebuilt Home with a fresh
HomeViewModel defaulting to Most used — jumping the user off their category.
ApplyShellContent now carries the previous HomeViewModel.SelectedCategory onto
the rebuilt one. Covered by a test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
[P3] Deleting the viewed CLI fell back to the synthetic All-snips view, which
in the last-CLI/empty case stranded the user on an empty page with no New CLI
action. DeleteCurrentCli now goes Home after the refresh. Covered by a test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The hero image is now the full-width header background spanning the title row
and the CLI tiles row; the title/subtitle sit top-left over it, and the CLI
carousel sits below within the header over the image's lower edge, which fades
into the header background (gradient overlay — WinUI Image has no OpacityMask).
The New CLI tile is always present (so it's the empty-state call-to-action).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The hero image now resolves from a theme dictionary, so HomeHeroLight.png and
HomeHeroDark.png swap with the selected theme (high-contrast uses the dark one),
updating live when the theme changes. Title uses the theme foreground, so each
image should keep its upper-left light/contrasted. csproj packages each image
when present; README documents the two filenames.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
HomeHeroLight.png and HomeHeroDark.png (2400x984) for the Home header,
selected by theme via the hero theme dictionary.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…align snip tiles

- CLI cards are now Buttons, so they get the same hover/press animation as the
  New CLI tile (was a static Grid with only a Tapped handler).
- Hero header has a fixed height (320) so it no longer scales with the window
  and pushes the tiles away from the title; title top-left, tiles anchored to
  the header bottom.
- The image fade no longer washes white: it fades from the page background at
  0 alpha to opaque (per-theme HomeHeroFadeBrush), instead of through
  transparent-white.
- Snip tiles under Most used / Recent / Favourites are left-aligned (the
  category selector stays centred).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The fade resolved the image to SolidBackgroundFillColorBase, but the content
area below the header used a different background, leaving a hard line at the
header boundary. Give the whole Home pane that same background so the header
and the content below it are one continuous colour and the hero's faded edge
blends seamlessly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fading to a solid colour mismatched the Mica-backed content panes (Home read
as a different shade, with a line at the header edge). Paint the hero image
with a Composition mask brush whose vertical gradient fades the image's alpha
to transparent at the bottom, revealing the page's Mica behind it — so the
header and content share the same background with a seamless transition.
Theme-aware (light/dark image) and size-tracked in code-behind.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Taller hero (360) with a big gap under the title; the CLI carousel is pulled
  up (-129 = 75% of a card) so the cards straddle the hero's bottom edge —
  ~75% over the hero, ~25% spilling onto the page below (Gallery-style).
- CLI cards and the New CLI tile now use an opaque background
  (SolidBackgroundFillColorTertiary) so the hero image no longer bleeds through
  them where they overlap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…aque

Solid backgrounds removed the subtle hero blend. Use a theme-aware
CliCardBackgroundBrush at ~94% alpha (light/dark), more opaque than the
default card brush (which was too see-through over the hero) but still
slightly translucent. High-contrast stays solid (system window colour).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Match the WinUI Gallery tiles: a frosted acrylic background (blurred sample of
the hero behind, with a light tint) instead of a flat alpha — the "not too
transparent, not too solid" look, with a solid fallback when transparency is
off. Removed the now-unused custom CliCardBackgroundBrush.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ContentDialogs are separate visual roots, so they didn't inherit the in-app
theme applied via RequestedTheme on the main window content — a dialog opened
after switching to Light (on a dark OS) still showed dark. Each dialog now sets
RequestedTheme to the current in-app theme.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@StuartMeeks StuartMeeks merged commit 69c8419 into main May 31, 2026
4 checks passed
@StuartMeeks StuartMeeks deleted the feat/ui-polish branch May 31, 2026 08:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant