diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dddd695..6820743 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,6 +103,7 @@ jobs: --mainExe Snipdeck.App.exe ` --packTitle "${{ env.PACK_TITLE }}" ` --packAuthors "${{ env.PACK_AUTHORS }}" ` + --icon src/Snipdeck.App/Assets/Snipdeck.ico ` --channel $channel ` --outputDir Releases diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f23a20..93ba988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- **Snipdeck branding.** The app now ships with its own icon — a faceted green + chevron — replacing the default .NET exe icon, the generated identicon in the + system tray, and the blank window icon. The icon appears on the executable, + taskbar, Start menu, Alt-Tab, window title bar (beside the app name), system + tray and the Velopack installer. The README carries the new tile logo, and the + source SVGs live in `designs/`. + +### Changed +- The "Next Iteration" eyebrow on the Home hero now uses the primary text + colour (white in Dark theme) instead of the muted secondary grey. + ## [0.1.0] - 2026-06-01 ### Added diff --git a/README.md b/README.md index 015b956..28180e9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +

+ Snipdeck +

+ # Snipdeck A native Windows desktop app for managing parameterised CLI command snippets diff --git a/designs/snipdeck-icon.svg b/designs/snipdeck-icon.svg new file mode 100644 index 0000000..91c2b4e --- /dev/null +++ b/designs/snipdeck-icon.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/designs/snipdeck-tile.svg b/designs/snipdeck-tile.svg new file mode 100644 index 0000000..71d88f4 --- /dev/null +++ b/designs/snipdeck-tile.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Snipdeck.App/Assets/README.md b/src/Snipdeck.App/Assets/README.md index adf89aa..f746dee 100644 --- a/src/Snipdeck.App/Assets/README.md +++ b/src/Snipdeck.App/Assets/README.md @@ -1,5 +1,31 @@ # Assets +## App icon + +`Snipdeck.ico` is the multi-size app icon (16/20/24/32/48/64/128/256, the 256 +entry PNG-compressed), rendered from `designs/snipdeck-icon.svg`. It is embedded +in the exe (``), set on the window (`AppWindow.SetIcon` + +`SetTaskbarIcon`), used by the tray icon and passed to `vpk pack --icon` for +the installer. + +`TitleBarGlyph.png` is the same glyph at natural aspect, 64 px tall, shown at +16 logical px in the custom title bar (`rsvg-convert -h 64 +designs/snipdeck-icon.svg -o TitleBarGlyph.png`). + +To regenerate after the SVG changes (the glyph is 430×507, so each render is +height-fitted and centred on a square page): + +```sh +for s in 16 20 24 32 48 64 128 256; do + left=$(awk "BEGIN{printf \"%.2f\", ($s-430/507*$s)/2}") + rsvg-convert -h $s --page-width $s --page-height $s --left $left --top 0 \ + designs/snipdeck-icon.svg -o glyph-$s.png +done +icotool -c -o src/Snipdeck.App/Assets/Snipdeck.ico \ + glyph-16.png glyph-20.png glyph-24.png glyph-32.png glyph-48.png \ + glyph-64.png glyph-128.png -r glyph-256.png +``` + ## Home hero images (theme-specific) The Home page hero banner uses a theme-specific image: diff --git a/src/Snipdeck.App/Assets/Snipdeck.ico b/src/Snipdeck.App/Assets/Snipdeck.ico new file mode 100644 index 0000000..8d54cd5 Binary files /dev/null and b/src/Snipdeck.App/Assets/Snipdeck.ico differ diff --git a/src/Snipdeck.App/Assets/TitleBarGlyph.png b/src/Snipdeck.App/Assets/TitleBarGlyph.png new file mode 100644 index 0000000..d4cdb9d Binary files /dev/null and b/src/Snipdeck.App/Assets/TitleBarGlyph.png differ diff --git a/src/Snipdeck.App/MainWindow.xaml b/src/Snipdeck.App/MainWindow.xaml index db4e861..6bb6411 100644 --- a/src/Snipdeck.App/MainWindow.xaml +++ b/src/Snipdeck.App/MainWindow.xaml @@ -39,6 +39,10 @@ ToolTipService.ToolTip="Toggle navigation"> + WriteTrayIconFileAsync() - { - var pngBytes = IdenticonService.GeneratePng(_iconSeed, size: _trayIconPixels); - var icoBytes = WrapPngAsIco(pngBytes, _trayIconPixels, _trayIconPixels); - _ = Directory.CreateDirectory(_paths.AppDataDirectory); - var path = Path.Combine(_paths.AppDataDirectory, _trayIconFileName); - await File.WriteAllBytesAsync(path, icoBytes); - return path; - } - - // Modern Windows accepts a PNG embedded inside an ICO container — - // just a 6-byte ICONDIR header plus a 16-byte ICONDIRENTRY pointing - // at the PNG bytes. Format ref: ICONDIR / ICONDIRENTRY on MSDN. - private static byte[] WrapPngAsIco(byte[] png, int width, int height) - { - const int headerSize = 6; - const int entrySize = 16; - const int dataOffset = headerSize + entrySize; - - var ico = new byte[dataOffset + png.Length]; - var span = ico.AsSpan(); - - // ICONDIR: reserved(0), type(1 = icon), count(1) - BinaryPrimitives.WriteUInt16LittleEndian(span[2..4], 1); - BinaryPrimitives.WriteUInt16LittleEndian(span[4..6], 1); - - // ICONDIRENTRY: width/height bytes are 0 for >=256, otherwise the literal size. - ico[6] = width >= 256 ? (byte)0 : (byte)width; - ico[7] = height >= 256 ? (byte)0 : (byte)height; - // ico[8] colorCount = 0 (>= 8bpp), ico[9] reserved = 0 — already zero. - BinaryPrimitives.WriteUInt16LittleEndian(span[10..12], 1); // planes - BinaryPrimitives.WriteUInt16LittleEndian(span[12..14], 32); // bits per pixel - BinaryPrimitives.WriteUInt32LittleEndian(span[14..18], (uint)png.Length); - BinaryPrimitives.WriteUInt32LittleEndian(span[18..22], dataOffset); - - Buffer.BlockCopy(png, 0, ico, dataOffset, png.Length); - return ico; - } - private sealed partial class RelayCommand(Action execute) : System.Windows.Input.ICommand { #pragma warning disable CS0067 // 'CanExecuteChanged' is never used — relay never changes. diff --git a/src/Snipdeck.App/Snipdeck.App.csproj b/src/Snipdeck.App/Snipdeck.App.csproj index e678005..d5348aa 100644 --- a/src/Snipdeck.App/Snipdeck.App.csproj +++ b/src/Snipdeck.App/Snipdeck.App.csproj @@ -22,6 +22,10 @@ true + + Assets\Snipdeck.ico @@ -39,6 +43,11 @@ + + + + + diff --git a/src/Snipdeck.App/Views/ShellPage.xaml b/src/Snipdeck.App/Views/ShellPage.xaml index d5e9268..9e2c507 100644 --- a/src/Snipdeck.App/Views/ShellPage.xaml +++ b/src/Snipdeck.App/Views/ShellPage.xaml @@ -75,7 +75,7 @@ + Foreground="{ThemeResource TextFillColorPrimaryBrush}" />