Final UI polish pass#33
Merged
Merged
Conversation
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", "", "") 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>
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.
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)
HomeHeroLight.png/HomeHeroDark.png) painted via a Composition mask so its lower edge fades into the page's Mica; title top-left.Navigation & title bar
Tags, parameters, settings
Cards, dialogs & theming
Testing
🤖 Generated with Claude Code