Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
635fd48
Implement AppSidebar and Sidebar components for enhanced navigation
Shewart Feb 10, 2026
488ea40
feat: implement AppSidebar and supporting components for enhanced nav…
Shewart Feb 10, 2026
50e0751
feat: enhance App layout with new navigation links and error handling
Shewart Feb 10, 2026
c74c881
feat: add Sidebar models and JavaScript interop for enhanced sidebar …
Shewart Feb 10, 2026
a6b0547
feat: add Dashboard page and enhance App layout with Font Awesome icons
Shewart Feb 10, 2026
8e6b3da
feat: enhance Dashboard page with new chart components for data visua…
Shewart Mar 7, 2026
cf053bc
feat: update Home page layout to use DashboardLayout for improved str…
Shewart Mar 7, 2026
e6927d0
feat: add new utility classes and Blazor error UI styles for improved…
Shewart Mar 7, 2026
2509fb5
feat: add ChartStylesTemplate for ApexCharts integration with ShellUI…
Shewart Mar 7, 2026
41c6d20
Merge main into feat/flex/sidebar
Shewart Mar 7, 2026
9d2c140
feat: enhance Dashboard and AppSidebar components for improved layout…
Shewart Mar 8, 2026
cb10594
feat: add GitHub Actions workflow for deploying ShellUI Preview to Gi…
Shewart Mar 8, 2026
e79ff68
feat: update MainLayout to enhance sidebar navigation and overall lay…
Shewart Mar 8, 2026
e1d3039
feat: update component path resolution in ComponentInstaller to suppo…
Shewart Mar 8, 2026
297095c
feat: add LayoutPath to InitService for improved component organization
Shewart Mar 8, 2026
7d70dff
feat: add LayoutPath property to ShellUIConfig for enhanced component…
Shewart Mar 8, 2026
10a7a12
feat: add documentation for new data display components including Acc…
Shewart Mar 11, 2026
123ab12
feat: add documentation for form components including Button, Checkbo…
Shewart Mar 11, 2026
c4440f9
feat: add components page and dialog documentation for ShellUI
Shewart Mar 11, 2026
8d09a6d
feat: enhance ComponentPreview and Home pages with dynamic component …
Shewart Mar 11, 2026
ce9be05
feat: update navigation links in NavigationDemo for improved routing
Shewart Mar 11, 2026
21a8b71
feat: enhance AppSidebar and add DashboardBlockCard component for imp…
Shewart Mar 11, 2026
15fc5c0
feat: add DashboardBlockPreview and DialogPreview components for enha…
Shewart Mar 11, 2026
35c4386
feat: enhance DashboardLayout with breadcrumb navigation and dynamic …
Shewart Mar 13, 2026
f371233
feat: add BlocksLayout component for full-width layout without sidebar
Shewart Mar 13, 2026
fd110b1
refactor: simplify AppSidebar component and add AppSidebarTemplate fo…
Shewart Mar 13, 2026
f1a4b24
feat: mark multiple UI templates as unavailable for future use
Shewart Mar 13, 2026
1432ca3
feat: add Blocks page with layout examples for dashboard components
Shewart Mar 13, 2026
f29959a
feat: add error handling UI to App component for improved user feedback
Shewart Mar 13, 2026
91c225d
feat: update README with new dashboard layout examples and navigation…
Shewart Mar 13, 2026
cb93983
feat: add DashboardLayout01Template for sidebar and content layout
Shewart Mar 13, 2026
06ce2ee
feat: add DashboardLayout02Template for enhanced sidebar and content …
Shewart Mar 13, 2026
632fa22
feat: register new templates for app sidebar and dashboard layouts
Shewart Mar 13, 2026
b70c49b
fix: update Progress component to use width for progress representation
Shewart Mar 13, 2026
f199bb7
refactor: clean up comments in Sidebar component for clarity
Shewart Mar 13, 2026
6a5e9d5
feat: enhance ComponentMetadata with layout block support and improve…
Shewart Mar 13, 2026
9b7d39b
chore: update .gitignore to include shellui-installation-tests and pr…
Shewart Mar 13, 2026
bbfae06
feat: enhance app.css and input.css with new utility classes and styles
Shewart Mar 13, 2026
39c9443
refactor: update DashboardLayout header to be sticky and improve comm…
Shewart Mar 15, 2026
c69abbe
feat: add Breadcrumb component documentation page
Shewart Mar 15, 2026
33f71df
refactor: update Blocks.razor to use DashboardLayout and enhance layo…
Shewart Mar 15, 2026
893ceb7
feat: add Breadcrumb item to AppSidebar navigation
Shewart Mar 16, 2026
150614f
refactor: replace AppSidebar with DashboardDemoSidebar in DashboardBl…
Shewart Mar 16, 2026
ab14e0e
feat: add DashboardDemoSidebar component for enhanced dashboard navig…
Shewart Mar 16, 2026
5158a27
refactor: update error UI styles in App.razor and adjust SidebarInset…
Shewart Mar 16, 2026
021eb51
refactor: update project structure and layout components for improved…
Shewart Jun 3, 2026
3226bd9
feat: enhance InitService to install shellui.js and update configurat…
Shewart Jun 3, 2026
d92ab38
feat: mark components as unavailable and add shellui.js template
Shewart Jun 3, 2026
886e42e
feat: update ShellUI version and add shellui-js component to registry
Shewart Jun 3, 2026
6cd56a0
feat: enhance release workflow to include ShellUI.Core packaging
Shewart Jun 3, 2026
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
60 changes: 60 additions & 0 deletions .github/workflows/preview-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Deploy ShellUI Preview to GitHub Pages (for docs embedding)
name: Deploy Preview to GitHub Pages

on:
push:
branches: [ main ]
paths:
- 'NET9/ShellUI.Preview/**'
- 'src/ShellUI.Components/**'
- '.github/workflows/preview-pages.yml'
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Publish Preview (Blazor WASM)
run: |
dotnet publish NET9/ShellUI.Preview/ShellUI.Preview.csproj \
-c Release \
-o ./preview-publish
env:
# For GH Pages: base href = /repo-name/ (set your repo name)
# Leave empty for root: https://user.github.io/repo-name/
BASE_HREF: /

- name: Setup Pages
uses: actions/configure-pages@v4

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./preview-publish/wwwroot

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
5 changes: 5 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ jobs:
if ls src/ShellUI.CLI/bin/Release/*.snupkg 1> /dev/null 2>&1; then
dotnet nuget push src/ShellUI.CLI/bin/Release/*.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
fi
dotnet nuget push src/ShellUI.Core/bin/Release/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
if ls src/ShellUI.Core/bin/Release/*.snupkg 1> /dev/null 2>&1; then
dotnet nuget push src/ShellUI.Core/bin/Release/*.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
fi
dotnet nuget push src/ShellUI.Components/bin/Release/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
if ls src/ShellUI.Components/bin/Release/*.snupkg 1> /dev/null 2>&1; then
dotnet nuget push src/ShellUI.Components/bin/Release/*.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
Expand All @@ -69,6 +73,7 @@ jobs:
prerelease: ${{ contains(github.ref, '-') }}
files: |
src/ShellUI.CLI/bin/Release/*.nupkg
src/ShellUI.Core/bin/Release/*.nupkg
src/ShellUI.Components/bin/Release/*.nupkg
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -362,4 +362,7 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd

shellui-installation-tests/
shellui-installation-tests/

# Preview publish output (testing artifacts)
preview-publish/
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<!-- Centralized ShellUI Version - Update this single file to version all components -->
<PropertyGroup>
<ShellUIVersion>0.3.0</ShellUIVersion>
<ShellUIVersionSuffix>alpha.2</ShellUIVersionSuffix>
<ShellUIVersionSuffix>alpha.3</ShellUIVersionSuffix>
</PropertyGroup>

<!-- Common properties for all ShellUI projects -->
Expand Down
17 changes: 16 additions & 1 deletion NET9/BlazorInteractiveServer/Components/App.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en" class="dark">

<head>
Expand All @@ -14,6 +14,9 @@
<!-- Material Icons -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />

<!-- Font Awesome Icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<!-- ShellUI - Tailwind CSS (compiled by standalone CLI, no Node.js!) -->
<link rel="stylesheet" href="@Assets["app.css"]" />
<link rel="stylesheet" href="@Assets["BlazorInteractiveServer.styles.css"]" />
Expand Down Expand Up @@ -50,10 +53,22 @@

<ImportMap />
<HeadOutlet @rendermode="InteractiveServer" />
<style>
/* Blazor adds .show only when an unhandled error occurs - hidden otherwise */
#blazor-error-ui { display: none !important; position: fixed; bottom: 0; left: 0; right: 0; z-index: 9999; background: hsl(var(--destructive)); color: hsl(var(--destructive-foreground)); padding: 1rem; text-align: center; box-shadow: 0 -4px 6px -1px rgb(0 0 0/0.2); }
#blazor-error-ui.show { display: block !important; }
#blazor-error-ui a { color: inherit; text-decoration: underline; }
#blazor-error-ui .dismiss { cursor: pointer; margin-left: 1rem; }
</style>
</head>

<body class="bg-background text-foreground">
<Routes @rendermode="InteractiveServer" />
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="." class="reload">Reload</a>
<span class="dismiss">×</span>
</div>
<script src="_framework/blazor.web.js"></script>
<script src="shellui.js"></script>
</body>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
<span class="font-bold text-lg">ShellUI</span>
</div>
<nav class="flex items-center space-x-6 text-sm font-medium flex-1">
<a href="#" class="transition-colors hover:text-foreground/80 text-foreground">Home</a>
<a href="#" class="transition-colors hover:text-foreground/80 text-muted-foreground">Docs</a>
<a href="#" class="transition-colors hover:text-foreground/80 text-muted-foreground">Components</a>
<a href="/" class="transition-colors hover:text-foreground/80 text-foreground">Home</a>
<a href="/dashboard" class="transition-colors hover:text-foreground/80 text-muted-foreground">Dashboard</a>
<a href="/components" class="transition-colors hover:text-foreground/80 text-muted-foreground">Components</a>
</nav>
<Button Variant="@ButtonVariant.Outline" Size="@ButtonSize.Sm">Sign In</Button>
</div>
Expand All @@ -40,15 +40,15 @@
<div class="space-y-4">
<h4 class="font-semibold text-lg">Navigation</h4>
<nav class="space-y-2">
<a href="#" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<a href="/dashboard" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<span class="material-symbols-outlined text-sm">home</span>
<span>Dashboard</span>
</a>
<a href="#" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<a href="/components" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<span class="material-symbols-outlined text-sm">folder</span>
<span>Projects</span>
<span>Components</span>
</a>
<a href="#" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<a href="/dashboard" class="flex items-center space-x-2 px-3 py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors">
<span class="material-symbols-outlined text-sm">settings</span>
<span>Settings</span>
</a>
Expand Down
20 changes: 20 additions & 0 deletions NET9/BlazorInteractiveServer/Components/Layout/BlocksLayout.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
@inherits LayoutComponentBase
@using BlazorInteractiveServer.Components.UI

@* Blocks page layout — no main sidebar, full-width. Demos are independent. *@
<div class="min-h-screen bg-background text-foreground">
<header class="sticky top-0 z-10 flex h-14 items-center gap-4 border-b border-border bg-background px-4">
<a href="/dashboard" class="text-sm text-muted-foreground hover:text-foreground transition-colors flex items-center gap-2">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="size-4">
<path d="M19 12H5M12 19l-7-7 7-7"/>
</svg>
Back to Dashboard
</a>
<span class="text-muted-foreground">|</span>
<h1 class="text-lg font-semibold">Layout Blocks</h1>
<ThemeToggle Size="sm" Variant="outline" Class="ml-auto" />
</header>
<main class="p-6">
@Body
</main>
</div>
108 changes: 108 additions & 0 deletions NET9/BlazorInteractiveServer/Components/Layout/DashboardLayout.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
@inherits LayoutComponentBase
@implements IDisposable
@using BlazorInteractiveServer.Components.UI
@using Microsoft.AspNetCore.Components.Routing
@inject NavigationManager Navigation

@* Dashboard layout — sidebar + content, no navbar/footer *@
<SidebarProvider>
<AppSidebar />
<SidebarInset>
@* Shared header: trigger, breadcrumbs, theme toggle — sticky so expand/collapse stays accessible on scroll *@
<header class="sticky top-0 z-10 flex h-16 shrink-0 items-center gap-2 border-b border-border bg-background">
<div class="flex min-w-0 flex-1 items-center gap-2 px-4">
<SidebarTrigger Class="-ml-1 shrink-0" />
<Separator Orientation="vertical" Class="mr-2 h-4 shrink-0" />
@if (HeaderContent != null)
{
@HeaderContent
}
else
{
<div class="flex min-w-0 flex-1 items-center overflow-x-auto">
<Breadcrumb Class="flex flex-1 min-w-0 items-center">
@foreach (var item in _breadcrumbItems)
{
<BreadcrumbItem Href="@(item.IsLast ? null : item.Href)" IsLast="@item.IsLast">@item.Label</BreadcrumbItem>
}
</Breadcrumb>
</div>
}
</div>
<div class="ml-auto px-4">
<ThemeToggle Size="sm" Variant="outline" />
</div>
</header>

@* Page content *@
<div class="flex flex-1 flex-col gap-4 p-4 pt-0">
@Body
</div>
</SidebarInset>
</SidebarProvider>

@code {
/// <summary>
/// Optional header content (breadcrumbs, page title, etc.)
/// Pages can set this via a cascading parameter or just leave it empty.
/// </summary>
[Parameter] public RenderFragment? HeaderContent { get; set; }

private List<BreadcrumbItemData> _breadcrumbItems = new();

protected override void OnInitialized()
{
BuildBreadcrumb();
Navigation.LocationChanged += OnLocationChanged;
}

private void OnLocationChanged(object? sender, LocationChangedEventArgs e)
{
BuildBreadcrumb();
InvokeAsync(StateHasChanged);
}

public void Dispose() => Navigation.LocationChanged -= OnLocationChanged;

private void BuildBreadcrumb()
{
var uri = new Uri(Navigation.Uri);
var path = uri.AbsolutePath.TrimEnd('/');
var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries);

_breadcrumbItems.Clear();
if (segments.Length == 0 || (segments.Length == 1 && segments[0] == ""))
{
_breadcrumbItems.Add(new BreadcrumbItemData { Label = "Home", Href = "/", IsLast = true });
return;
}

var href = "";
for (var i = 0; i < segments.Length; i++)
{
href += "/" + segments[i];
var label = TitleCase(segments[i]);
if (i == 0 && segments[i].Equals("components", StringComparison.OrdinalIgnoreCase))
label = "Components";
_breadcrumbItems.Add(new BreadcrumbItemData
{
Label = label,
Href = href,
IsLast = i == segments.Length - 1
});
}
}

private static string TitleCase(string s)
{
if (string.IsNullOrEmpty(s)) return s;
return char.ToUpperInvariant(s[0]) + s[1..].ToLowerInvariant();
}

private class BreadcrumbItemData
{
public string Label { get; set; } = "";
public string Href { get; set; } = "";
public bool IsLast { get; set; }
}
}
Loading
Loading