Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
d9c8de7
docs: enhance COMPONENTS.md and README.md with detailed properties, u…
Shewart Jan 14, 2026
16a1737
docs: update architecture, Blazor Hybrid, and README files to include…
Shewart Jan 14, 2026
3e677bd
docs: update ShellUINativeVersion in ARCHITECTURE.md and correct Shel…
Shewart Jan 14, 2026
9046317
fix: update ASCII logo in ShellUI Native CLI for enhanced visual clar…
Shewart Jan 14, 2026
65aca0a
refactor: restructure MAUI.Demo application by introducing MainPage, …
Shewart Jan 14, 2026
1e40ebf
feat: introduce new UI components for MAUI.Demo, including Badge, But…
Shewart Jan 22, 2026
1d6bba9
feat: enhance MainPage layout with new UI components including badges…
Shewart Jan 22, 2026
cef110e
feat: add Windows RuntimeIdentifier and integrate Fluent MauiIcons; u…
Shewart Jan 22, 2026
c89f0fd
feat: update target framework to net8.0 in ShellUI.Native.Core projec…
Shewart Jan 22, 2026
a637401
feat: update target framework to net8.0 in ShellUI.Native.CLI project…
Shewart Jan 22, 2026
8e96b0e
feat: add new UI component templates for Badge, Card, Input, Label, a…
Shewart Jan 22, 2026
5fcceee
feat: expand ComponentRegistry with new UI components including Input…
Shewart Jan 22, 2026
b5d41ae
chore: update Visual Studio version to 18.3 in solution file and refi…
Shewart Jan 22, 2026
6c27607
feat: add alert template
Shewart Jan 23, 2026
344565c
feat: add checkbox template
Shewart Jan 23, 2026
7218b10
feat: add progressbar component template
Shewart Jan 24, 2026
06bfa02
feat: add separator component template for layout division
Shewart Jan 25, 2026
b7bc72f
feat: add switch component template for toggle functionality with lab…
Shewart Jan 26, 2026
794d123
feat: expand ComponentRegistry to include new components: checkbox, s…
Shewart Jan 26, 2026
8d4007b
feat: enhance CardTemplate with compositional children support and im…
Shewart Feb 18, 2026
3b70cfc
feat: add dialog component templates including header, footer, conten…
Shewart Feb 18, 2026
db28531
feat: introduce Dropdown component templates including Dropdown, Drop…
Shewart Feb 18, 2026
2c4b14b
feat: introduce Drawer component templates including Drawer, DrawerCo…
Shewart Feb 18, 2026
7668eac
feat: introduce Popover component templates including Popover, Popove…
Shewart Feb 19, 2026
fa4e2fd
feat: introduce Sheet component templates including Sheet, SheetConte…
Shewart Feb 19, 2026
9644eca
feat: introduce DatePicker component template for date selection func…
Shewart Feb 20, 2026
fd34137
feat: add comprehensive ShellUI Native Components Roadmap detailing p…
Shewart Jun 28, 2026
fbc6bef
feat: introduce new UI components including Alert, Checkbox, DatePick…
Shewart Jun 28, 2026
9560f9d
feat: expand ComponentRegistry and introduce new form components incl…
Shewart Jun 28, 2026
39dcc17
feat: enhance MainPage with new UI components including Card, Checkbo…
Shewart Jun 28, 2026
4cf3ce7
refactor: update property declarations in UI components to use 'new' …
Shewart Jul 12, 2026
01779f8
feat: add support for Avalonia platform detection and update warnings…
Shewart Jul 12, 2026
a148a1c
chore: update .NET version to 10.0.x across CI, PR check, and release…
Shewart Jul 12, 2026
ebd2c4f
refactor: update UI component templates to include 'using Microsoft.M…
Shewart Jul 12, 2026
082e508
chore: remove ShellUI.Native.sln file and update Directory.Build.prop…
Shewart Jul 15, 2026
79fbdba
chore: update target framework to net10.0 in project files and enhanc…
Shewart Jul 15, 2026
1de266c
chore: add global.json for SDK version management and create ShellUI.…
Shewart Jul 15, 2026
015c692
test: add comprehensive unit tests for ComponentRegistry, NativePlatf…
Shewart Jul 15, 2026
21ac979
chore: remove ShellUI.Native.sln and update documentation to reflect …
Shewart Jul 15, 2026
80fe199
chore: update PackageTags in Directory.Build.props to include Avaloni…
Shewart Jul 15, 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
28 changes: 19 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,26 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
9.0.x
dotnet-version: 10.0.x

- name: Restore dependencies (src only)
run: dotnet restore src/
- name: Restore dependencies (src + tests)
run: |
dotnet restore src/ShellUI.Native.CLI/ShellUI.Native.CLI.csproj
dotnet restore tests/ShellUI.Native.Tests/ShellUI.Native.Tests.csproj

- name: Build library projects
run: dotnet build src/ --no-restore --configuration Release
run: dotnet build src/ShellUI.Native.CLI/ShellUI.Native.CLI.csproj --no-restore --configuration Release

- name: Run tests
run: dotnet test tests/ShellUI.Native.Tests/ShellUI.Native.Tests.csproj --configuration Release --no-restore --logger "trx;LogFileName=test-results.trx" --collect:"XPlat Code Coverage"

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: |
tests/**/TestResults/**

- name: Pack CLI tool
run: dotnet pack src/ShellUI.Native.CLI/ShellUI.Native.CLI.csproj --no-restore --configuration Release -o ./nupkg
Expand All @@ -45,8 +56,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
dotnet-version: 10.0.x

- name: Install MAUI workload
run: dotnet workload install maui
Expand All @@ -55,4 +65,4 @@ jobs:
run: dotnet restore examples/MAUI.Demo/MAUI.Demo.csproj

- name: Build MAUI Demo (Windows)
run: dotnet build examples/MAUI.Demo/MAUI.Demo.csproj --configuration Release --framework net8.0-windows10.0.19041.0
run: dotnet build examples/MAUI.Demo/MAUI.Demo.csproj --configuration Release --framework net10.0-windows10.0.19041.0
2 changes: 1 addition & 1 deletion .github/workflows/pr-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x

- name: Check formatting
run: dotnet format src/ --verify-no-changes --verbosity diagnostic
Expand Down
4 changes: 1 addition & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
9.0.x
dotnet-version: 10.0.x

- name: Extract version from tag
id: version
Expand Down
6 changes: 2 additions & 4 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,13 @@
<Copyright>© $([System.DateTime]::Now.Year) ShellUI. All rights reserved.</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>maui;winui;wpf;ui;components;shadcn;native;cross-platform</PackageTags>
<PackageTags>maui;avalonia;winui;ui;components;shadcn;native;cross-platform</PackageTags>
<RepositoryUrl>https://github.com/shellui-dev/shellui-native</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>

<!-- Common build settings -->
<!-- Common build settings (TargetFramework should be set per-project) -->
<PropertyGroup>
<!-- Supports .NET 8.0 and later (including .NET 9, 10, etc.) -->
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
Expand Down
60 changes: 0 additions & 60 deletions ShellUI.Native.sln

This file was deleted.

22 changes: 22 additions & 0 deletions ShellUI.Native.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Solution>
<Folder Name="/docs/">
<File Path="docs/ARCHITECTURE.md" />
<File Path="docs/BLAZOR_HYBRID.md" />
<File Path="docs/PLAN.md" />
<File Path="docs/README.md" />
</Folder>
<Folder Name="/examples/">
<File Path="examples/README.md" />
<Project Path="examples/MAUI.Demo/MAUI.Demo.csproj">
<Deploy />
</Project>
</Folder>
<Folder Name="/src/">
<Project Path="src/ShellUI.Native.CLI/ShellUI.Native.CLI.csproj" />
<Project Path="src/ShellUI.Native.Core/ShellUI.Native.Core.csproj" />
<Project Path="src/ShellUI.Native.Templates/ShellUI.Native.Templates.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="tests/ShellUI.Native.Tests/ShellUI.Native.Tests.csproj" />
</Folder>
</Solution>
77 changes: 65 additions & 12 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

## Overview

ShellUI Native follows a modular architecture designed to support multiple native platforms while maintaining a consistent developer experience and design system.
ShellUI Native follows a modular architecture designed to support multiple native platforms while maintaining a consistent developer experience and design system. It is the native counterpart to [ShellUI (Blazor)](https://shellui.dev/), inspired by [shadcn/ui](https://ui.shadcn.com/)'s copy-and-own approach.

## Key Difference from ShellUI Blazor: No Tailwind!

**ShellUI Native does NOT use Tailwind CSS.** Native platforms use XAML styles, not CSS.

| Aspect | ShellUI Blazor | ShellUI Native |
| Aspect | [ShellUI Blazor](https://shellui.dev/) | ShellUI Native |
|--------|---------------|----------------|
| Styling | Tailwind CSS | XAML Styles/ResourceDictionary |
| Rendering | HTML/CSS in browser | Native platform controls |
Expand All @@ -21,14 +21,18 @@ The design tokens (colors, spacing, typography) are **identical** to maintain vi

```
shellui-native/
├── Directory.Build.props # Centralized versioning
├── ShellUI.Native.sln
├── Directory.Build.props # Centralized versioning + package metadata
├── global.json # Pins .NET 10 SDK
├── ShellUI.Native.slnx # XML-format solution (post .NET 9)
├── src/
│ ├── ShellUI.Native.Core/ # Shared models and abstractions
│ ├── ShellUI.Native.Templates/ # Component templates
│ ├── ShellUI.Native.Templates/ # Component templates (MAUI today; per-platform planned)
│ ├── ShellUI.Native.CLI/ # Command-line tool
│ └── ShellUI.Native.MAUI/ # Reference implementation (optional)
├── samples/
│ ├── ShellUI.Native.MAUI/ # MAUI reference implementation (optional)
│ └── ShellUI.Native.Avalonia/ # Avalonia reference implementation (planned, Phase 2)
├── tests/
│ └── ShellUI.Native.Tests/ # xUnit — registry invariants, template hygiene, ProjectDetector
├── examples/
│ └── MAUI.Demo/
└── docs/
```
Expand Down Expand Up @@ -69,6 +73,13 @@ public class ButtonTemplate
}
```

**Gap today (Template System v2 target):** `Content` is a single MAUI-flavored string, and
`ComponentRegistry.GetComponentContent` has no platform parameter — it can't yet return
different code for Avalonia vs. MAUI. Adding Avalonia support requires evolving this to
something like `ButtonTemplate.Content(NativePlatform)` or per-platform static properties
(`ButtonTemplate.MauiContent` / `ButtonTemplate.AvaloniaContent`) selected by
`config.TargetPlatform`. See [PLAN.md](./PLAN.md) and [DEVELOPMENT_PLAN.md](./DEVELOPMENT_PLAN.md).

### 2. Namespace Replacement

When components are installed, the placeholder `YourProjectNamespace` is replaced with the actual project namespace detected from the .csproj file.
Expand All @@ -81,7 +92,8 @@ Components can declare dependencies on other components. The CLI automatically i

The `shellui-native.json` file tracks:

- Target platform (MAUI, WinUI, WPF)
- Target platform (MAUI, Avalonia, WinUI, or WPF — see `NativePlatform` in
[ShellUINativeConfig.cs](../src/ShellUI.Native.Core/Models/ShellUINativeConfig.cs))
- Components path
- Installed components with versions
- Theme settings
Expand All @@ -93,16 +105,29 @@ The CLI detects project types by examining the .csproj file:
| Detection | Platform |
|-----------|----------|
| `UseMaui=true` or SDK contains "Maui" | MAUI |
| `PackageReference` starting with "Avalonia", or an `App.axaml` file present | Avalonia |
| `UseWinUI=true` | WinUI 3 |
| `UseWPF=true` or SDK contains "Wpf" | WPF |
| `UseWPF=true` or SDK contains "Wpf" | WPF (detection only — see [PLAN.md](./PLAN.md)) |

Detection order matters: MAUI is checked first (via SDK/`UseMaui`), then Avalonia (via
`PackageReference`/`App.axaml`, since Avalonia has no dedicated SDK), then WinUI/WPF. See
[`ProjectDetector.cs`](../src/ShellUI.Native.CLI/Services/ProjectDetector.cs).

**Current limitation:** detection recognizes Avalonia/WinUI/WPF projects, but
[`ComponentRegistry`](../src/ShellUI.Native.Templates/ComponentRegistry.cs) only has MAUI
templates today. `shellui-native add` prints a warning and installs MAUI code regardless of
detected platform until per-platform templates exist (see "Component Templates" in Core
Concepts above, and Template System v2 in [PLAN.md](./PLAN.md)).

## Theming System

Unlike ShellUI Blazor which uses CSS variables, ShellUI Native uses platform-native theming:
Unlike [ShellUI Blazor](https://shellui.dev/) which uses CSS variables, ShellUI Native uses platform-native theming:

- **MAUI** - ResourceDictionary with Colors, Styles
- **Avalonia** - `Styles`/`ResourceDictionary` with `DynamicResource`, plus Avalonia's built-in
Fluent/Simple theme variants for light/dark switching
- **WinUI** - XAML Resources and ThemeResources
- **WPF** - ResourceDictionary with DynamicResource
- **WPF** - ResourceDictionary with DynamicResource (existing apps only, not an active target)

Design tokens are mapped from the ShellUI CSS variables to native equivalents:

Expand Down Expand Up @@ -138,12 +163,40 @@ public partial class Button : ContentView
}
```

## Component Pattern (Avalonia, planned)

Avalonia components will follow the `StyledProperty`/`TemplatedControl` pattern instead of
MAUI's `BindableProperty`/`ContentView` — the same property-driven visual-state approach, just
Avalonia's equivalent APIs:

```csharp
public partial class Button : TemplatedControl
{
public static readonly StyledProperty<ButtonVariant> VariantProperty =
AvaloniaProperty.Register<Button, ButtonVariant>(nameof(Variant), ButtonVariant.Default);

public ButtonVariant Variant
{
get => GetValue(VariantProperty);
set => SetValue(VariantProperty, value);
}

static Button()
{
VariantProperty.Changed.AddClassHandler<Button>((button, _) => button.UpdateVisualState());
}
}
```

Not implemented yet — this illustrates the target shape once Template System v2 lands and
`ShellUI.Native.Avalonia` is scaffolded.

## Versioning Strategy

All packages share a single version defined in `Directory.Build.props`:

```xml
<ShellUINativeVersion>0.1.0</ShellUINativeVersion>
<ShellUINativeVersion>0.0.1</ShellUINativeVersion>
```

Component metadata reads this version at runtime, ensuring consistency across all installed components.
8 changes: 4 additions & 4 deletions docs/BLAZOR_HYBRID.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Blazor MAUI Hybrid Guide

How to use ShellUI libraries in Blazor Hybrid applications.
How to use [ShellUI](https://shellui.dev/) libraries in Blazor Hybrid applications.

## Understanding Hybrid Architecture

Expand Down Expand Up @@ -30,7 +30,7 @@ A Blazor Hybrid app has two distinct rendering contexts:

## Which Library to Use?

### Use ShellUI (Blazor) When:
### Use [ShellUI (Blazor)](https://shellui.dev/) When:
- Building UI inside the `BlazorWebView`
- Working with Razor components
- Need Tailwind CSS styling
Expand All @@ -48,7 +48,7 @@ A Blazor Hybrid app has two distinct rendering contexts:
If your app is primarily Blazor with minimal native UI:

```bash
# Just install ShellUI Blazor
# Just install ShellUI Blazor (https://github.com/shellui-dev/shellui)
dotnet tool install -g ShellUI.CLI
cd YourHybridApp
shellui init --yes
Expand Down Expand Up @@ -132,7 +132,7 @@ YourHybridApp/

## Recommendations

1. **Start with Blazor** - Most hybrid apps are Blazor-heavy. Start with ShellUI Blazor only.
1. **Start with Blazor** - Most hybrid apps are Blazor-heavy. Start with [ShellUI Blazor](https://shellui.dev/) only.

2. **Add Native as Needed** - Only add ShellUI Native when you need truly native controls.

Expand Down
Loading
Loading