diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index dad63ad..039ef55 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -18,8 +18,7 @@ jobs:
with:
global-json-file: global.json
- # ShellIcons.Blazor multi-targets net8.0 + net9.0, so both runtimes must
- # be available on the CI runner even though the SDK is pinned to net10.
+ # ShellIcons.Blazor targets net8.0 + net9.0, so the tests need both runtimes.
- name: Install net8 + net9 runtimes
uses: actions/setup-dotnet@v4
with:
@@ -38,10 +37,7 @@ jobs:
- name: Test
run: dotnet test ShellIcons.slnx --configuration Release --no-build --verbosity normal
- # Smoke pack — proves the packable project produces a valid .nupkg on
- # every commit, so the release workflow can't be blindsided by a packaging
- # bug. Packs the specific project (not the solution) to skip non-packable
- # ones cleanly — packing the solution warns for every IsPackable=false project.
+ # The project, 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
env:
@@ -49,3 +45,25 @@ jobs:
- name: List produced packages
run: ls -la nupkgs/
+
+ # Windows builds every MAUI target (Android, iOS, Mac Catalyst, Windows); ubuntu lacks the workloads.
+ maui:
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ global-json-file: global.json
+
+ - name: Install MAUI workload
+ run: dotnet workload install maui
+
+ - name: Build (all platform targets)
+ run: dotnet build ShellIcons.Maui.slnx --configuration Release
+ env:
+ ContinuousIntegrationBuild: true
+
+ - name: Test
+ run: dotnet test tests/ShellIcons.Maui.Tests --configuration Release --no-build --verbosity normal
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index e55bb6c..a15a49a 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -29,23 +29,18 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
- dotnet-version: |
- 9.0.x
- 10.0.x
+ global-json-file: global.json
+ # Keep in step with the ShellDocs.* package versions in ShellIcons.Docs.csproj.
- name: Install ShellDocs.CLI
- run: dotnet tool install -g ShellDocs.CLI --prerelease
-
- - name: Restore
- run: dotnet restore ShellIcons.slnx
+ run: dotnet tool install -g ShellDocs.CLI --version 0.1.7-alpha
+ # Prerenders every content/ page to static HTML; CNAME ships from wwwroot/.
- name: Build docs (static)
working-directory: docs/ShellIcons.Docs
- run: shelldocs build --output ../../publish --spa-fallback
-
- - name: Set custom domain (CNAME)
- run: echo "shellicons.shellui.dev" > publish/CNAME
+ run: shelldocs build --output ../../publish --spa-fallback --site-url https://shellicons.shellui.dev
+ # Jekyll would drop the _framework/ and _content/ folders.
- name: Disable Jekyll
run: touch publish/.nojekyll
diff --git a/.gitignore b/.gitignore
index 9070dda..8ec03cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,10 @@ x86/
## NuGet packages
*.nupkg
*.snupkg
+nupkgs/
+
+## Static docs build (shelldocs build --output publish)
+publish/
## IDE
.vs/
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..9541f92
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,31 @@
+# Changelog
+
+All notable changes to the ShellIcons packages. `ShellIcons.Blazor` is published on NuGet; `ShellIcons.Maui` is in preview and not published yet.
+
+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]
+
+### Added
+
+- **Blazor: `{Name}Icon` components** — ``, ``, … 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 (``), an `IconName` dispatcher (``), and `IconCatalog` with tags, categories, alias-aware `TryParse` and `Search`. Builds for Android, iOS, Mac Catalyst and Windows.
+- Build diagnostics for custom icons that can't be converted for MAUI: `SHELLICONS002` (unsupported SVG such as `` 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.
+
+### Changed
+
+- `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.
+
+### Fixed
+
+- The README's click-handler example for `additionalAttributes` used the key `"@onclick"`; the working key is `"onclick"`.
+- MAUI: Lucide 0.475.0's `save-off.svg` contains a stray shape outside the viewBox. Browsers clip it; on MAUI it's dropped so it can't draw beside the icon.
+
+## [0.1.0-alpha] — 2026-08-22
+
+First release of `ShellIcons.Blazor`: all 1,555 icons from Lucide 0.475.0 as typed components, the `` dispatcher, `IconCore` with `Size`, `StrokeWidth`, `AbsoluteStroke`, `Class` and `Title`, and a drop-in path for custom icons.
diff --git a/README.md b/README.md
index 0c8758c..95b31a4 100644
--- a/README.md
+++ b/README.md
@@ -7,27 +7,24 @@ Lucide-derived SVG icons for **Blazor**, **Avalonia**, and **.NET MAUI**.
- Native rendering per target: inline `