diff --git a/.gitattributes b/.gitattributes
index ef82812..efdba87 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,64 +1,2 @@
-###############################################################################
-# Set default behavior to automatically normalize line endings.
-###############################################################################
* text=auto
*.sh text eol=lf
-
-###############################################################################
-# Set default behavior for command prompt diff.
-#
-# This is need for earlier builds of msysgit that does not have it on by
-# default for csharp files.
-# Note: This is only used by command line
-###############################################################################
-#*.cs diff=csharp
-
-###############################################################################
-# Set the merge driver for project and solution files
-#
-# Merging from the command prompt will add diff markers to the files if there
-# are conflicts (Merging from VS is not affected by the settings below, in VS
-# the diff markers are never inserted). Diff markers may cause the following
-# file extensions to fail to load in VS. An alternative would be to treat
-# these files as binary and thus will always conflict and require user
-# intervention with every merge. To do so, just uncomment the entries below
-###############################################################################
-#*.sln merge=binary
-#*.csproj merge=binary
-#*.vbproj merge=binary
-#*.vcxproj merge=binary
-#*.vcproj merge=binary
-#*.dbproj merge=binary
-#*.fsproj merge=binary
-#*.lsproj merge=binary
-#*.wixproj merge=binary
-#*.modelproj merge=binary
-#*.sqlproj merge=binary
-#*.wwaproj merge=binary
-
-###############################################################################
-# behavior for image files
-#
-# image files are treated as binary by default.
-###############################################################################
-#*.jpg binary
-#*.png binary
-#*.gif binary
-
-###############################################################################
-# diff behavior for common document formats
-#
-# Convert binary document formats to text before diffing them. This feature
-# is only available from the command line. Turn it on by uncommenting the
-# entries below.
-###############################################################################
-#*.doc diff=astextplain
-#*.DOC diff=astextplain
-#*.docx diff=astextplain
-#*.DOCX diff=astextplain
-#*.dot diff=astextplain
-#*.DOT diff=astextplain
-#*.pdf diff=astextplain
-#*.PDF diff=astextplain
-#*.rtf diff=astextplain
-#*.RTF diff=astextplain
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index aa22b9d..e69de29 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +0,0 @@
-# These are supported funding model platforms
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 22f45cd..05e5d09 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,22 +30,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore ShellUI.slnx
- # Generates src/ShellUI.Components/wwwroot/shellui-all.css fresh on every run.
- # File is gitignored — the Windows + Linux Tailwind CLI binaries produce
- # byte-different output, so drift-checking a committed file failed spuriously.
- # Instead we regenerate and validate content properties.
+ # Regenerated every run: it's gitignored because Windows and Linux Tailwind builds differ byte for byte.
- name: Build precompiled CSS bundle
- # Invoke via `bash` (not `./script.sh`) so we don't rely on the file's
- # executable bit. Windows contributors can edit and commit without
- # remembering `git update-index --chmod=+x`.
+ # Run through bash so the executable bit doesn't matter.
run: |
set -euxo pipefail
bash scripts/rebuild-precompiled-css.sh
BUNDLE=src/ShellUI.Components/wwwroot/shellui-all.css
test -f "$BUNDLE" || (echo "ERROR: bundle was not produced"; exit 1)
- # Content assertions using grep -F (fixed-string, no regex escaping headaches).
- # These catch classes of bugs we've actually shipped before — worth the paranoia.
grep -Fq -- '--background' "$BUNDLE" || (echo "ERROR: theme vars not in bundle"; exit 1)
grep -Fq '.bg-background' "$BUNDLE" || (echo "ERROR: core utility rule missing"; exit 1)
grep -Fq 'hover\:bg-accent' "$BUNDLE" || (echo "ERROR: hover: modifier rules missing"; exit 1)
@@ -53,8 +46,7 @@ jobs:
grep -Fq 'px-2\.5' "$BUNDLE" || (echo "ERROR: Badge padding class px-2.5 missing (variant .cs helpers not scanned?)"; exit 1)
grep -Fq 'border-transparent' "$BUNDLE" || (echo "ERROR: border-transparent missing (variant .cs helpers not scanned?)"; exit 1)
- # Size guard — keep the threshold above the current component bundle,
- # but below runaway output (for example, an unminified full Tailwind base).
+ # Above the current bundle, below an accidental full Tailwind build.
size=$(wc -c < "$BUNDLE")
echo "precompiled bundle size: ${size} bytes"
if [ "$size" -gt 150000 ]; then
@@ -68,8 +60,7 @@ jobs:
- name: Run tests
run: dotnet test ShellUI.slnx --no-restore --no-build --configuration Release --verbosity normal
- # End-to-end build of a scaffolded project — catches anything the in-process
- # TemplateCompileTests miss (missing usings, dependency resolution).
+ # Builds a scaffolded project; catches what TemplateCompileTests can't.
- name: Smoke-test CLI scaffolding
shell: bash
run: |
@@ -84,8 +75,6 @@ jobs:
cd SmokeApp
shellui init --tailwind standalone --yes
- # Assert init produced a working host: App.razor patched with render mode,
- # theme bootstrap, and shellui.js script tag.
grep -q 'HeadOutlet @rendermode="InteractiveServer"' Components/App.razor || (echo "init did not patch HeadOutlet @rendermode"; exit 1)
grep -q 'Routes @rendermode="InteractiveServer"' Components/App.razor || (echo "init did not patch Routes @rendermode"; exit 1)
grep -q 'ShellUI theme bootstrap' Components/App.razor || (echo "init did not inject theme bootstrap"; exit 1)
@@ -95,32 +84,22 @@ jobs:
exit 1
fi
- # Assert input.css has the full theme, not just @import "tailwindcss";
grep -q '@theme inline' wwwroot/input.css || (echo "init did not write full theme to input.css"; exit 1)
grep -q ':root' wwwroot/input.css || (echo "init did not write :root variables to input.css"; exit 1)
grep -q '\.dark' wwwroot/input.css || (echo "init did not write .dark variables to input.css"; exit 1)
shellui add chart pie-chart dashboard-02 data-table --force
- # NuGet dependencies (Blazor-ApexCharts, System.Linq.Dynamic.Core) should
- # now be added automatically by `shellui add`. Assert they appear in the
- # project file so a regression in the auto-install fails loudly here.
grep -q 'Blazor-ApexCharts' SmokeApp.csproj || (echo "shellui add chart did not add Blazor-ApexCharts NuGet dep"; exit 1)
grep -q 'System.Linq.Dynamic.Core' SmokeApp.csproj || (echo "shellui add data-table did not add System.Linq.Dynamic.Core NuGet dep"; exit 1)
- # And the DataTable models file must land at Components/UI/Models/, not be missing.
test -f Components/UI/Models/DataTableModels.cs || (echo "shellui add data-table did not install data-table-models"; exit 1)
- # chart-styles ships the CSS for the custom tooltip + ApexCharts chrome.
- # Without it, hovering a chart shows invisible white-on-white text.
+ # Without charts.css, chart tooltips render white on white.
test -f wwwroot/css/charts.css || (echo "shellui add chart did not install chart-styles CSS"; exit 1)
grep -q '/, not the root.
+ # A dynamic import of shellui-sidebar.js 404s once compiled into a consumer's RCL.
grep -q 'ShellUI.initSidebar' Components/UI/SidebarProvider.razor || (echo "SidebarProvider did not call ShellUI.initSidebar"; exit 1)
if grep -Fq 'shellui-sidebar.js' Components/UI/SidebarProvider.razor; then
echo "SidebarProvider still dynamically imports shellui-sidebar.js"
@@ -134,8 +113,6 @@ jobs:
dotnet build -c Debug
- # init --dashboard wires the layout: Routes default, stock MainLayout/NavMenu removed,
- # error bar moved to App.razor, sidebar links built from the app's pages.
cd "$TMPDIR/app"
dotnet new blazor -o DashApp --no-restore
cd DashApp
@@ -147,8 +124,7 @@ jobs:
grep -q '"/counter"' Components/UI/AppSidebar.razor || (echo "AppSidebar links were not built from the pages"; exit 1)
dotnet build -c Debug
- # Every direct target must install and compile together; this catches missing
- # dependencies and template compile errors that per-template tests can't see.
+ # Catches missing dependencies that per-template tests can't see.
ALL=$(python3 - "$GITHUB_WORKSPACE" <<'PY'
import os, re, sys
root = sys.argv[1]
@@ -168,12 +144,7 @@ jobs:
dotnet build -c Debug
done
- # Pure-NuGet install path — `dotnet add package ShellUI.Components` without
- # the CLI. Uses a one-off NuGet.config that whitelists ONLY the local feed,
- # so a missing local package can't silently fall back to nuget.org and pull
- # an older version (which would mask whether the current PR's package is
- # correct). $GITHUB_WORKSPACE is absolute — relative paths from inside the
- # temp consumer dir would resolve to the wrong root.
+ # Package-only install from a local-only feed, so nuget.org can't mask a broken package.
- name: NuGet-only install — verify safelist ships
shell: bash
run: |
@@ -182,8 +153,6 @@ jobs:
test -d "$LOCAL_FEED" || (echo "local feed not found at $LOCAL_FEED — did the pack step run?"; exit 1)
ls "$LOCAL_FEED"/*.nupkg | head -3
- # DIAGNOSTIC: dump what's actually inside the fresh nupkg. The precompiled
- # bundle must ship as a static web asset for consumers to `` it.
echo "---nupkg contents (looking for shellui-all.css):---"
unzip -l "$LOCAL_FEED"/ShellUI.Components*.nupkg | grep -E 'shellui-all|staticwebassets/' | head -10 || echo " (no matches — bundle not in nupkg!)"
echo "---source wwwroot check:---"
@@ -194,8 +163,6 @@ jobs:
dotnet new blazor -o NuGetSmoke --no-restore
cd NuGetSmoke
- # Pin restore to only the local feed; nuget.org explicitly disabled so a
- # broken local feed can't be papered over by a public-published older version.
cat > NuGet.config <
@@ -206,19 +173,12 @@ jobs:
EOF
- # Evict every cached ShellUI.Components from ~/.nuget/packages before restore.
- # The runner-level cache is restored from actions/cache and may contain a
- # stale copy of the current version from an earlier CI run (before we added
- # the precompiled bundle, .cs scan, etc.). NuGet prefers cached over local
- # feeds when version matches, so a stale cache silently masks the fresh
- # nupkg. Wildcard covers any version — future-proof.
+ # A cached copy of the same version would shadow the fresh nupkg.
rm -rf ~/.nuget/packages/shellui.components
dotnet add package ShellUI.Components --prerelease
- # The safelist gets copied into wwwroot/ during the consumer's build by
- # the package's build/ShellUI.Components.targets — auto-imported by NuGet.
- # Need to actually build the project, not just restore, for the Copy to run.
+ # The package's .targets copies the safelist during build, so restore alone isn't enough.
dotnet build -c Debug
SAFELIST="wwwroot/shellui-classes.txt"
@@ -229,16 +189,10 @@ jobs:
exit 1
)
- # Sanity: the safelist contains real Tailwind classes
grep -q 'bg-background' "$SAFELIST" || (echo "safelist appears malformed — missing core Tailwind class 'bg-background'"; exit 1)
wc -l "$SAFELIST"
- # In .NET 10, MapStaticAssets() doesn't physically copy static web assets
- # from referenced packages into the consumer's bin/ during `dotnet build`
- # — it uses a manifest and reads from the extracted NuGet cache at runtime.
- # So the correct assertion is "does the file exist in the extracted package
- # cache after restore", which proves it'll be served at
- # `_content/ShellUI.Components/shellui-all.css` in the running app.
+ # .NET 10 serves package assets from the NuGet cache, not bin/, so check the extracted package.
BUNDLE="$(find ~/.nuget/packages/shellui.components -name 'shellui-all.css' -type f | head -1)"
if [ -z "$BUNDLE" ]; then
echo "ERROR: shellui-all.css not in consumer's extracted NuGet cache — the pure-NuGet install path is broken."
@@ -250,8 +204,6 @@ jobs:
BUNDLE_SIZE=$(wc -c < "$BUNDLE")
echo "bundle size: $BUNDLE_SIZE bytes"
- # Spot-check a handful of representative rules using fixed-string grep
- # (no regex escaping headaches). These catch classes of bugs we've hit.
grep -Fq -- '--background' "$BUNDLE" || (echo "ERROR: bundle missing --background theme var"; exit 1)
grep -Fq '.bg-background' "$BUNDLE" || (echo "ERROR: bundle missing .bg-background utility"; exit 1)
grep -Fq 'hover\:bg-accent' "$BUNDLE" || (echo "ERROR: bundle missing hover:bg-accent modifier rule"; exit 1)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index fa558cb..e1644d9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -53,15 +53,14 @@ jobs:
- name: Restore dependencies
run: dotnet restore ShellUI.slnx
- # Generate the precompiled CSS bundle before build so releases always ship
- # a fresh one. File is gitignored — regenerated on every CI/release run.
+ # shellui-all.css is gitignored, so every release regenerates it.
- name: Build precompiled CSS bundle
run: |
set -euxo pipefail
bash scripts/rebuild-precompiled-css.sh
BUNDLE=src/ShellUI.Components/wwwroot/shellui-all.css
test -f "$BUNDLE" || (echo "ERROR: bundle was not produced"; exit 1)
- # Content sanity — same assertions ci.yml runs.
+ # Same checks as ci.yml.
grep -q -- '--background:' "$BUNDLE" || (echo "ERROR: theme vars missing"; exit 1)
grep -q '\.bg-background' "$BUNDLE" || (echo "ERROR: utilities missing"; exit 1)
echo "release bundle size: $(wc -c < "$BUNDLE") bytes"
@@ -75,9 +74,7 @@ jobs:
- name: Pack NuGet packages
run: dotnet pack ShellUI.slnx --no-build --configuration Release -p:ContinuousIntegrationBuild=true
- # ShellUI.Core and ShellUI.Templates are internal-only — they have no public API
- # surface that consumers reference. Only the CLI tool and the Components runtime
- # library are pushed to NuGet.
+ # Core and Templates are internal; only the CLI and Components are published.
- name: Publish to NuGet
run: |
dotnet nuget push src/ShellUI.CLI/bin/Release/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
diff --git a/.gitignore b/.gitignore
index db285ba..3cdd1a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -366,8 +366,5 @@ shellui-installation-tests/
# Preview publish output (testing artifacts)
preview-publish/
-# Generated Tailwind bundle — regenerated in CI, not committed.
-# Windows and Linux Tailwind CLI produce byte-different output; committing
-# would cause spurious drift-check failures. Local devs: run
-# `bash scripts/rebuild-precompiled-css.sh` before running Path A tests.
+# Regenerated in CI; run scripts/rebuild-precompiled-css.sh locally.
src/ShellUI.Components/wwwroot/shellui-all.css
diff --git a/Directory.Build.props b/Directory.Build.props
index 9a0221f..9699b1c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,12 +1,11 @@
-
+
0.4.0alpha.1
-
$(ShellUIVersion)$(ShellUIVersion)-$(ShellUIVersionSuffix)
@@ -15,7 +14,6 @@
$(Version)
-
ShellUIShellUI
diff --git a/NET10/BlazorInteractiveServer/BlazorInteractiveServer.csproj b/NET10/BlazorInteractiveServer/BlazorInteractiveServer.csproj
index 4e61c5e..13d9939 100644
--- a/NET10/BlazorInteractiveServer/BlazorInteractiveServer.csproj
+++ b/NET10/BlazorInteractiveServer/BlazorInteractiveServer.csproj
@@ -12,11 +12,6 @@
-
-
-
diff --git a/NET10/BlazorInteractiveServer/Components/App.razor b/NET10/BlazorInteractiveServer/Components/App.razor
index 7246aae..0df9e21 100644
--- a/NET10/BlazorInteractiveServer/Components/App.razor
+++ b/NET10/BlazorInteractiveServer/Components/App.razor
@@ -6,29 +6,23 @@
-
-
-
-
-