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
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 Native Version - Update this single file to version all components -->
<PropertyGroup>
<ShellUINativeVersion>0.1.0</ShellUINativeVersion>
<ShellUINativeVersionSuffix>alpha.1</ShellUINativeVersionSuffix>
<ShellUINativeVersionSuffix>alpha.2</ShellUINativeVersionSuffix>
</PropertyGroup>

<!-- Common properties for all ShellUI Native projects -->
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ All packages share a single version defined in `Directory.Build.props`:

```xml
<ShellUINativeVersion>0.1.0</ShellUINativeVersion>
<ShellUINativeVersionSuffix>alpha.1</ShellUINativeVersionSuffix>
<ShellUINativeVersionSuffix>alpha.2</ShellUINativeVersionSuffix>
```

The build stamps it into the assemblies, and component metadata reads it from there at runtime,
Expand Down
4 changes: 2 additions & 2 deletions docs/COMPONENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ your background so the splash-to-app transition doesn't flash the template's pur

## Avalonia

Every component on this page has an Avalonia version, installed by the same CLI commands. The
Avalonia templates are not on NuGet yet: they ship with the next release.
Every component on this page has an Avalonia version, installed by the same CLI commands
(since `0.1.0-alpha.2`).

Overlays use Avalonia's `Popup` in the window's overlay layer: the content stays in the logical
tree (theme, DataContext and `FindParentOfType` work as declared), dropdowns and popovers get
Expand Down
12 changes: 6 additions & 6 deletions docs/COMPONENTS_ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

Prioritized list of components to create for ShellUI Native, aligned with [ShellUI Components](https://github.com/shellui/shell-ui) patterns. All components should follow **compositional patterns** using Dependencies (parent + sub-components) instead of monolithic ChildContent.

Last revised: **2026-10-07** (first prerelease, `0.1.0-alpha.1`).
Last revised: **2026-10-11** (second prerelease, `0.1.0-alpha.2`).

**Status at a glance:** P0–P6 ✅ done · P7 partly done · shipped as `0.1.0-alpha.1` (58 families, 89 CLI targets) · **Avalonia (Phase 2): every component ported, not released yet**.
**Status at a glance:** P0–P6 ✅ done · P7 done except chart · `0.1.0-alpha.2`: 63 families, 94 CLI targets, each for MAUI and Avalonia.

---

Expand Down Expand Up @@ -289,9 +289,9 @@ public static T? FindParentOfType<T>(this Element element) where T : Element
[RELEASE_NOTES.md](./RELEASE_NOTES.md)): P0–P5, P6 context-menu / carousel / stepper, and the
P7 items marked ✅ above — 58 families, 89 CLI targets, MAUI only.

**Next — Phase 2 (Avalonia).** Port in the same order as MAUI (P0 → P1 first), reusing the
component APIs, tokens and sizing contract. MAUI is far ahead, so new MAUI components wait
until Avalonia has P0 + P1.
**Shipped in `0.1.0-alpha.2`:** Phase 2 (an Avalonia version of every component), then
resizable, navbar, sidebar, date-range-picker and file-upload on both platforms — 63 families,
94 CLI targets. From here on a component lands on both platforms together.

**Backlog after that:** chart (P7); and the ShellUI Blazor targets not yet ported (button-group,
**Backlog:** chart (P7); and the ShellUI Blazor targets not yet ported (button-group,
input-group, command / command-palette, menubar, navigation-menu, data-table, …).
33 changes: 26 additions & 7 deletions docs/DEVELOPMENT_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Living document tracking **branches**, **phases**, and **feature implementations
ShellUI Native. Companion to [PLAN.md](./PLAN.md) (long-term strategy) and
[COMPONENTS_ROADMAP.md](./COMPONENTS_ROADMAP.md) (prioritized component backlog).

Last revised: **2026-10-07** (Phase 1e merged; `0.1.0-alpha.1` release prep).
Last revised: **2026-10-11** (Phase 2 merged; `0.1.0-alpha.2` release prep).

---

Expand All @@ -16,9 +16,9 @@ Short-lived sub-branches (`feat/<phase>/<slice>`) cut off the phase branch and m
into it, not directly into `main`.

```
main ← Phase 1a (2026-07-05), 1b (PR #2), 1c + 1d (PR #3), 1e (PR #4), brand mark (PR #5) merged
└─ chore/release-v0.1.0-alpha.1 ← first prerelease (active)
└─ feat/avalonia-implementation ← Phase 2 (next) — Avalonia templates + reference impl
main ← Phase 1 (PRs #1–#5), release 0.1.0-alpha.1 (PR #6), Phase 2 Avalonia (PRs #7–#13),
layout, navigation and pickers on both platforms (PR #14) merged
└─ chore/release-v0.1.0-alpha.2 ← second prerelease, the first with Avalonia (active)
└─ feat/winui ← Phase 3 (conditional)
```

Expand All @@ -35,8 +35,8 @@ main ← Phase 1a (2026-07-05), 1b (PR #2), 1c + 1d (PR #3), 1e (PR #4), brand

| Branch | Base | Status | Purpose |
|--------|------|--------|---------|
| `main` | — | Phase 1a–1e, release `0.1.0-alpha.1`, Phase 2 merged: every component has an Avalonia version | 92 registry entries (89 CLI targets, 58 families), each with MAUI and Avalonia content |
| `feat/p6-layout-navigation` | `main` | **Active** | resizable, navbar, sidebar (finishes P6), date-range-picker and file-upload (P7), each for MAUI and Avalonia |
| `main` | — | Phase 1, release `0.1.0-alpha.1`, Phase 2 and PR #14 merged | 97 registry entries (94 CLI targets, 63 families), each with MAUI and Avalonia content |
| `chore/release-v0.1.0-alpha.2` | `main` | **Active** | Second prerelease: the first with Avalonia, plus five new components |

---

Expand Down Expand Up @@ -434,7 +434,26 @@ After merge: tag `v0.1.0-alpha.1` on `main` and push the tag.

---

## Phase 2 — Avalonia (active; one branch per tier, `feat/avalonia-p7-remaining` now)
## Release `0.1.0-alpha.2` — `chore/release-v0.1.0-alpha.2` (**active**)

Second NuGet prerelease of `ShellUI.Native.CLI`: the first with Avalonia templates, plus
resizable, navbar, sidebar, date-range-picker and file-upload on both platforms.

- [x] `Directory.Build.props` → `0.1.0` + `alpha.2`
- [x] [RELEASE_NOTES.md](./RELEASE_NOTES.md) section, with the upgrade note for `calendar`
- [x] Install docs cover Avalonia (README, QUICKSTART, the CLI package README)
- [x] README version badge is static, set by `prepare-release.ps1` (the live NuGet badge
sometimes failed to load on GitHub)
- [x] The packed tool, installed from the `.nupkg`, outside the repo: `init` and all 94 CLI
targets added together in a fresh Avalonia app and in a fresh `dotnet new maui` app (Windows
target), each building with 0 warnings; `update calendar` fixes a project that has the
alpha.1 Calendar

After merge: tag `v0.1.0-alpha.2` on `main` and push the tag.

---

## Phase 2 — Avalonia (**merged**, PRs #7–#14; released in `0.1.0-alpha.2`)

Cross-desktop (Windows + macOS + Linux) from one XAML codebase.

Expand Down
12 changes: 6 additions & 6 deletions docs/PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ ShellUI Native brings the same beautiful, accessible, and customizable component
### Phase 1: MAUI (Primary Focus)
- **Target:** .NET MAUI (iOS, Android, Windows, macOS) on .NET 10
- **Components:** 50+ native controls
- **Status:** First prerelease `0.1.0-alpha.1` — 58 component families (89 CLI targets),
P0–P5 complete, P6 partly; remaining work tracked in
- **Status:** Released since `0.1.0-alpha.1`; `0.1.0-alpha.2` has 63 component families
(94 CLI targets), P0–P6 complete; remaining work tracked in
[COMPONENTS_ROADMAP.md](./COMPONENTS_ROADMAP.md).

### Phase 2: Avalonia UI
- **Target:** Windows, macOS, Linux (desktop-first; mobile/WASM heads are stretch goals)
- **Components:** 50+ controls, mirrored 1:1 with the MAUI set once that set stabilizes
- **Status:** Planned — starts after MAUI hits P0+P1 parity and Template System v2 lands.
Supersedes the former WPF phase.
- **Status:** Released in `0.1.0-alpha.2` — every component has an Avalonia version; checked
on Windows. Supersedes the former WPF phase.
- **Why now and not later:** the template/pattern work only needs to be proven once (on MAUI);
porting to Avalonia is mechanical translation of the same component contracts, and doing it
before the template system calcifies around MAUI-only assumptions is cheaper than retrofitting
Expand Down Expand Up @@ -147,7 +147,7 @@ dotnet tool install -g ShellUI.Native.CLI --prerelease
```bash
shellui-native init # Initialize project (creates shellui-native.json)
shellui-native add # Add components (copies to Components/UI/)
shellui-native list # List available components (89 targets)
shellui-native list # List available components (94 targets)
shellui-native remove # Remove components
shellui-native update # Update components to latest version
```
Expand All @@ -162,7 +162,7 @@ shellui-native update # Update components to latest version
"installedComponents": [
{
"name": "button",
"version": "0.1.0-alpha.1",
"version": "0.1.0-alpha.2",
"platform": "MAUI",
"installedAt": "2026-01-11T...",
"isCustomized": false
Expand Down
22 changes: 18 additions & 4 deletions docs/QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Get started with ShellUI Native in under 5 minutes.
## Prerequisites

- .NET 10.0 SDK (see [global.json](../global.json))
- A .NET MAUI project (`dotnet new maui`); Avalonia support is the next phase (see [DEVELOPMENT_PLAN.md](./DEVELOPMENT_PLAN.md))
- A .NET MAUI project (`dotnet new maui`) or an Avalonia 12 project (`dotnet new avalonia.app`)

## Installation

Expand Down Expand Up @@ -36,8 +36,8 @@ This will:
- Create `shellui-native.json` configuration
- Generate theme resources (MAUI)

> Templates exist for MAUI only so far. In an Avalonia, WinUI or WPF project, `init` skips the
> `Shell.cs` utility and `add` reports that the component has no template for that platform.
> Templates exist for MAUI and Avalonia. In a WinUI or WPF project, `init` skips the `Shell.cs`
> utility and `add` reports that the component has no template for that platform.

### 4. Add Components

Expand All @@ -54,7 +54,7 @@ shellui-native add button,input,card

### 5. Load the Theme

Publish the theme tokens before the first page loads, in `App.xaml.cs`:
Publish the theme tokens before the first page loads. In a MAUI app, in `App.xaml.cs`:

```csharp
public App()
Expand All @@ -64,6 +64,16 @@ public App()
}
```

In an Avalonia app, in `App.axaml.cs`:

```csharp
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
Components.UI.ShellTheme.EnsureInitialized();
}
```

Components also do this on first use, but calling it early lets your own
`{DynamicResource ShellUI*}` references resolve on the first page. See
[COMPONENTS.md § Theming](./COMPONENTS.md#theming) for switching and customizing the theme.
Expand All @@ -83,6 +93,10 @@ Components also do this on first use, but calling it early lets your own
</ContentPage>
```

In Avalonia the namespace is `xmlns:ui="using:YourProject.Components.UI"`; the components have
the same names and properties. See [COMPONENTS.md § Avalonia](./COMPONENTS.md#avalonia) for the
few differences.

## Common Commands

| Command | Description |
Expand Down
12 changes: 6 additions & 6 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@

<p align="center">
One design system, every platform.<br/>
Copy-and-own native components for .NET MAUI, inspired by <a href="https://ui.shadcn.com/">shadcn/ui</a>.
Copy-and-own native components for .NET MAUI and Avalonia, inspired by <a href="https://ui.shadcn.com/">shadcn/ui</a>.
</p>

<p align="center">
<a href="https://www.nuget.org/packages/ShellUI.Native.CLI"><img src="https://img.shields.io/nuget/vpre/ShellUI.Native.CLI?style=flat-square&logo=nuget&label=CLI&color=004880" alt="ShellUI.Native.CLI on NuGet"></a>
<a href="https://www.nuget.org/packages/ShellUI.Native.CLI"><img src="https://img.shields.io/badge/CLI-v0.1.0--alpha.2-004880?style=flat-square&logo=nuget" alt="ShellUI.Native.CLI v0.1.0-alpha.2 on NuGet"></a>
<a href="../LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="MIT license"></a>
</p>

Expand All @@ -39,7 +39,7 @@ Unlike [ShellUI Blazor](https://shellui.dev/), **ShellUI Native does not use Tai
# Install the CLI tool (prerelease)
dotnet tool install -g ShellUI.Native.CLI --prerelease

# Initialize in your MAUI project
# Initialize in your MAUI or Avalonia project
shellui-native init --yes

# Add components
Expand All @@ -53,8 +53,8 @@ shellui-native list

| Platform | Status | .NET Version |
|----------|--------|--------------|
| .NET MAUI | Available (`0.1.0-alpha.1`) — Android, iOS, Mac Catalyst, Windows | .NET 10.0 |
| Avalonia UI | Every component ported (Phase 2); not on NuGet yet, ships with the next release | .NET 10.0 (Avalonia 12) |
| .NET MAUI | Available since `0.1.0-alpha.1` — Android, iOS, Mac Catalyst, Windows | .NET 10.0 |
| Avalonia UI | Available since `0.1.0-alpha.2` — every component; checked on Windows | .NET 10.0 (Avalonia 12) |
| WinUI 3 | Conditional (Phase 3) | .NET 10.0 |

WPF is intentionally not on this list — it's recognized for project detection only, not an
Expand Down Expand Up @@ -126,7 +126,7 @@ YourProject/
│ └── Shell.cs
├── Resources/
│ └── Styles/
│ └── ShellUITheme.xaml
│ └── ShellUITheme.xaml # MAUI only
└── shellui-native.json
```

Expand Down
55 changes: 55 additions & 0 deletions docs/RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,60 @@
# ShellUI Native Release Notes

# ShellUI Native v0.1.0-alpha.2 🧪

> Avalonia support and five new components. Every component now has a .NET MAUI and an Avalonia version, installed by the same commands. Still a prerelease, so install with `--prerelease`. Report issues via [GitHub Issues](https://github.com/shellui-dev/shellui-native/issues).

## 📦 Install or update

```bash
dotnet tool update -g ShellUI.Native.CLI --prerelease

cd YourApp
shellui-native init --yes
shellui-native add button input card
```

Requires the .NET 10 SDK and a .NET MAUI or Avalonia 12 project. `init` detects which one it is.

## 🟣 Avalonia

- All 63 component families (94 CLI targets) have an Avalonia version, with the same names, properties and variants as MAUI. The few differences are listed in [COMPONENTS.md](https://github.com/shellui-dev/shellui-native/blob/main/docs/COMPONENTS.md#avalonia).
- Setup after `init`: call `Components.UI.ShellTheme.EnsureInitialized();` in `App.Initialize`, after `AvaloniaXamlLoader.Load(this);`, and add `xmlns:ui="using:YourApp.Components.UI"` to your XAML. `init` prints these steps.
- Overlays use Avalonia's `Popup`: menus and popovers flip above the trigger when there is no room below, a click outside or Escape closes them, and an open dialog, drawer or sheet keeps keyboard focus inside it.
- Keyboard: interactive parts are tab stops with shadcn's focus ring, and Enter / Space activate them.
- In an initialized project, `shellui-native list` shows the components for that project's platform.

## ✨ New components

For MAUI and Avalonia.

| Component | What it is |
|---|---|
| `resizable` | Panels side by side or stacked, with a divider to drag. Each panel has a share of the space and a minimum size; groups nest. |
| `navbar` | A top bar with a brand, links and actions. Below 640px wide the links move into a menu under the bar. |
| `sidebar` | An app sidebar with groups and items that collapses to an icon rail. |
| `date-range-picker` | One calendar for a start and an end date. `Calendar` gains `RangeStart` and `RangeEnd`, which highlight a span of days. |
| `file-upload` | A drop zone that opens the platform file picker and lists the picked files. |

## 🧰 CLI

- `init` derives a valid namespace when the project file has no `RootNamespace`.

## ⬆️ Upgrading from alpha.1

Components already in your project are not changed by installing the new tool. `date-range-picker` needs the new `Calendar`: if `calendar` is already in your project, run `shellui-native update calendar` before adding it. `update` rewrites the file, so reapply any edits you made to it.

## ⚠️ Known limitations

- Avalonia was checked on Windows. CI builds the Avalonia demo on Linux, Windows and macOS, but the components have not been run on macOS or Linux, or with touch.
- The five new components were checked on Windows (MAUI and Avalonia). On Android, iOS and Mac Catalyst they build but have not been run.
- `file-upload`: on MAUI, dropping files works on Windows only. The platform file dialog and file drop have not been tested beyond the build on either platform.
- iOS and Mac Catalyst build but have not been run on a device; Escape does not close overlays on Mac Catalyst yet.
- Very large MAUI pages on Windows can hit WinUI's layout-pass limit (`Layout cycle detected`). Split the page or keep sections hidden until needed; see [COMPONENTS.md](https://github.com/shellui-dev/shellui-native/blob/main/docs/COMPONENTS.md#long-pages-on-windows).
- The docs site (native.shellui.dev) is not live yet; see [COMPONENTS.md](https://github.com/shellui-dev/shellui-native/blob/main/docs/COMPONENTS.md) for usage.

---

# ShellUI Native v0.1.0-alpha.1 🧪

> The first public prerelease of ShellUI Native: shadcn-style, copy-and-own components for .NET MAUI, with the same design tokens as [ShellUI](https://shellui.dev/) for Blazor. It is a prerelease, so install with `--prerelease`. Report issues via [GitHub Issues](https://github.com/shellui-dev/shellui-native/issues).
Expand Down
2 changes: 1 addition & 1 deletion docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ No `NUGET_API_KEY` secret is needed; delete an old one if it exists.

## Releasing a version

1. Set the version in `Directory.Build.props` (`ShellUINativeVersion` and `ShellUINativeVersionSuffix`).
1. Set the version in `Directory.Build.props` (`ShellUINativeVersion` and `ShellUINativeVersionSuffix`) and in the version badge at the top of [README.md](./README.md). `prepare-release.ps1 -Version 0.1.0 -Suffix alpha.2` does both, then tests and packs.
2. Add a `# ShellUI Native v<version>` section to [RELEASE_NOTES.md](./RELEASE_NOTES.md). It becomes the GitHub release text.
3. Merge to `main`, then tag and push:

Expand Down
10 changes: 9 additions & 1 deletion prepare-release.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ $content = $content -replace '<ShellUINativeVersionSuffix>[^<]*</ShellUINativeVe
Set-Content $propsPath $content
Write-Host "Updated Directory.Build.props to version $Version" -ForegroundColor Green

# The README's version badge is static (a live NuGet lookup sometimes fails to load on GitHub)
$fullVersion = if ($Suffix) { "$Version-$Suffix" } else { $Version }
$readmePath = Join-Path $PSScriptRoot "docs/README.md"
$readme = [System.IO.File]::ReadAllText($readmePath)
$readme = $readme -replace 'badge/CLI-v[^?"]+-004880', "badge/CLI-v$($fullVersion.Replace('-', '--'))-004880"
$readme = $readme -replace 'alt="ShellUI\.Native\.CLI v[^"]* on NuGet"', "alt=`"ShellUI.Native.CLI v$fullVersion on NuGet`""
[System.IO.File]::WriteAllText($readmePath, $readme)
Write-Host "Updated the version badge in docs/README.md" -ForegroundColor Green

# Build and test (the MAUI demo is left out; it needs the MAUI workload)
Write-Host "Building and testing..." -ForegroundColor Cyan
dotnet test (Join-Path $PSScriptRoot "tests/ShellUI.Native.Tests/ShellUI.Native.Tests.csproj") -c Release
Expand All @@ -40,7 +49,6 @@ if ($LASTEXITCODE -ne 0) {
exit 1
}

$fullVersion = if ($Suffix) { "$Version-$Suffix" } else { $Version }
Write-Host ""
Write-Host "Release preparation complete! Package: ./nupkg" -ForegroundColor Green
Write-Host ""
Expand Down
6 changes: 3 additions & 3 deletions src/ShellUI.Native.CLI/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# ShellUI Native CLI

Command-line interface for ShellUI Native: shadcn-style, copy-and-own components for .NET MAUI, with the same design tokens as [ShellUI](https://shellui.dev/) for Blazor.
Command-line interface for ShellUI Native: shadcn-style, copy-and-own components for .NET MAUI and Avalonia, with the same design tokens as [ShellUI](https://shellui.dev/) for Blazor.

## Installation

Expand All @@ -25,7 +25,7 @@ shellui-native update [--all] # Update components
## Quick Start

```bash
# Navigate to your MAUI project
# Navigate to your MAUI or Avalonia project
cd YourProject

# Initialize ShellUI Native
Expand All @@ -35,7 +35,7 @@ shellui-native init --yes
shellui-native add button input card
```

Components are written to `Components/UI/` as plain C# files you own. Avalonia support is the next phase.
Components are written to `Components/UI/` as plain C# files you own. `init` detects whether the project is MAUI or Avalonia and installs that platform's version of each component.

## More Information

Expand Down
Loading