Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Test
run: dotnet test ShellIcons.slnx --configuration Release --no-build --verbosity normal

# The project, not the solution: packing the solution warns for every non-packable project.
# The projects, not the solution: packing the solution warns for every non-packable project.
- name: Smoke pack
run: |
dotnet pack src/ShellIcons.Blazor/ShellIcons.Blazor.csproj --configuration Release --no-build --output nupkgs
Expand Down Expand Up @@ -69,3 +69,8 @@ jobs:

- name: Test
run: dotnet test tests/ShellIcons.Maui.Tests --configuration Release --no-build --verbosity normal

- name: Smoke pack
run: dotnet pack src/ShellIcons.Maui/ShellIcons.Maui.csproj --configuration Release --no-build --output nupkgs
env:
ContinuousIntegrationBuild: true
28 changes: 22 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,15 @@ on:

jobs:
release:
runs-on: ubuntu-latest
# Windows: ShellIcons.Maui needs the MAUI workload for its Android, iOS, Mac Catalyst and Windows targets.
runs-on: windows-latest
environment: release
permissions:
contents: write # for creating the GitHub Release
id-token: write # required for Trusted Publishing OIDC exchange
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -39,19 +43,31 @@ jobs:
8.0.x
9.0.x

- name: Install MAUI workload
run: dotnet workload install maui

- name: Restore
run: dotnet restore ShellIcons.slnx
run: |
dotnet restore ShellIcons.slnx
dotnet restore ShellIcons.Maui.slnx

- name: Build
run: dotnet build ShellIcons.slnx --configuration Release --no-restore
run: |
dotnet build ShellIcons.slnx --configuration Release --no-restore
dotnet build ShellIcons.Maui.slnx --configuration Release --no-restore
env:
ContinuousIntegrationBuild: true

- name: Test
run: dotnet test ShellIcons.slnx --configuration Release --no-build --verbosity normal
run: |
dotnet test ShellIcons.slnx --configuration Release --no-build --verbosity normal
dotnet test tests/ShellIcons.Maui.Tests --configuration Release --no-build --verbosity normal

- name: Pack
run: dotnet pack src/ShellIcons.Blazor/ShellIcons.Blazor.csproj --configuration Release --no-build --output nupkgs
run: |
for project in ShellIcons.Blazor ShellIcons.Maui ShellIcons.Avalonia; do
dotnet pack "src/$project/$project.csproj" --configuration Release --no-build --output nupkgs
done
env:
ContinuousIntegrationBuild: true

Expand Down Expand Up @@ -85,7 +101,7 @@ jobs:
if: github.event_name == 'push' || inputs.dry_run == false
run: |
version=$(grep -oE '<Version>[^<]+' Directory.Build.props | head -1 | sed 's/<Version>//')
for pkg in ShellIcons.Blazor; do
for pkg in ShellIcons.Blazor ShellIcons.Maui ShellIcons.Avalonia; do
lower=$(echo "$pkg" | tr '[:upper:]' '[:lower:]')
existing=$(curl -sf "https://api.nuget.org/v3-flatcontainer/${lower}/index.json" 2>/dev/null | grep -oE '"[^"]*"' | tr -d '"' || echo "")
if echo "$existing" | grep -Fxq "$version"; then
Expand Down
15 changes: 11 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
# Changelog

All notable changes to the ShellIcons packages. `ShellIcons.Blazor` is published on NuGet; `ShellIcons.Maui` and `ShellIcons.Avalonia` are in preview and not published yet.
All notable changes to the ShellIcons packages: `ShellIcons.Blazor`, `ShellIcons.Maui` and `ShellIcons.Avalonia` (the last two in preview).

Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows [SemVer](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.2.0-alpha] — 2026-10-22

First release of `ShellIcons.Maui` and `ShellIcons.Avalonia` on NuGet, next to `ShellIcons.Blazor`. All three share one version and carry the ShellIcons mark as their package icon.

### Added

- **Blazor: `{Name}Icon` components** — `<ChevronRightIcon />`, `<ZapIcon />`, … in the root `ShellIcons` namespace. A single `@using ShellIcons` now works next to UI kits whose component names match Lucide icons (`Badge`, `Table`, `Router`, …), which previously failed with RZ9985. This is the recommended form for markup. Lucide's `shell` icon is the one exception, since `ShellIcon` is the dispatcher; use `Icon.Shell()` (build info `SHELLICONS003`).
- **Blazor: `Icon.*` factory** — `Icon.ChevronRight()` returns a `RenderFragment`, for icons as values: component parameters and lists built in C#. Unused icons are still trimmed.
- **Blazor: clear error for `@onclick` on an icon.** On a component, Razor passes `@onclick="…"` as a plain string, which broke rendering in the browser with a cryptic error. It now throws an `InvalidOperationException` that explains the forms that work.
- **`ShellIcons.Maui` (preview, not yet on NuGet)** — the same catalog as native MAUI `Path` shapes: typed controls (`<icons:ChevronRight />`), an `IconName` dispatcher (`<icons:Icon Name="Search" />`), and `IconCatalog` with tags, categories, alias-aware `TryParse` and `Search`. Builds for Android, iOS, Mac Catalyst and Windows.
- **`ShellIcons.Avalonia` (preview, not yet on NuGet)** — the same catalog for Avalonia 12 (`net8.0`): typed controls (`<icons:ChevronRight />`), a dispatcher (`<icons:Icon Kind="Search" />`) and the same `IconName` / `IconCatalog` API as the MAUI package. Icons inherit `Foreground`, so they take the color of the surrounding text.
- **`ShellIcons.Maui` (preview)** — the same catalog as native MAUI `Path` shapes: typed controls (`<icons:ChevronRight />`), an `IconName` dispatcher (`<icons:Icon Name="Search" />`), and `IconCatalog` with tags, categories, alias-aware `TryParse` and `Search`. Builds for Android, iOS, Mac Catalyst and Windows.
- **`ShellIcons.Avalonia` (preview)** — the same catalog for Avalonia 12 (`net8.0`): typed controls (`<icons:ChevronRight />`), a dispatcher (`<icons:Icon Kind="Search" />`) and the same `IconName` / `IconCatalog` API as the MAUI package. Icons inherit `Foreground`, so they take the color of the surrounding text.
- Build diagnostics for custom icons that can't be converted for MAUI or Avalonia: `SHELLICONS002` (unsupported SVG such as `<g>` or `transform`), `SHELLICONS004` (name not usable as an enum member), `SHELLICONS005` (shape outside the viewBox, dropped).
- Docs site at [shellicons.shellui.dev](https://shellicons.shellui.dev) (deployed from `main`), with a searchable icon browser and a MAUI section.
- Docs site at [shellicons.shellui.dev](https://shellicons.shellui.dev) (deployed from `main`), with a searchable icon browser, MAUI and Avalonia sections, and docs for AI agents (`/llms.txt`).

### Changed

- Each package ships its own readme on NuGet, in plain Markdown so nuget.org renders it; the root `README.md` is for GitHub.
- The release workflow runs on Windows with the MAUI workload and publishes all three packages.

- `Icon.*` calls with no arguments reuse a cached fragment instead of allocating on every render. `ShellIcons.Blazor.dll` is about a third smaller than the first factory version, even with the new `{Name}Icon` components.
- Components in `ShellIcons.Icons` are no longer `sealed`.
- The build no longer references `Microsoft.SourceLink.GitHub`, whose `Microsoft.Build.Tasks.Git 8.0.0` dependency has a known vulnerability (NU1902). Source Link now comes from the .NET SDK; packages still link to the exact commit.
Expand Down
5 changes: 3 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

<!-- Version. Bump here before tagging a release. See RELEASING.md. -->
<PropertyGroup>
<Version>0.1.0-alpha</Version>
<Version>0.2.0-alpha</Version>
</PropertyGroup>

<PropertyGroup>
Expand Down Expand Up @@ -41,7 +41,8 @@
</PropertyGroup>

<ItemGroup Condition="'$(IsPackable)' == 'true'">
<None Include="$(MSBuildThisFileDirectory)README.md" Pack="true" PackagePath="\" />
<!-- Each package ships its own readme; the root README.md is for GitHub. -->
<None Include="$(MSBuildProjectDirectory)/README.md" Pack="true" PackagePath="\" />
<None Include="$(MSBuildThisFileDirectory)NOTICE.md" Pack="true" PackagePath="\" />
<None Include="$(MSBuildThisFileDirectory)assets/icon.png" Pack="true" PackagePath="\" Visible="false" />
</ItemGroup>
Expand Down
Loading
Loading