Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d01dc7c
Update to Uno 6.x, drop Uno.UI
MartinZikmund Feb 17, 2026
e70d8d9
Update to .NET 10 compatible Uno.WinUI version
MartinZikmund Feb 17, 2026
b17dd30
chore: Keep .NET 9 targets
MartinZikmund Feb 17, 2026
566fc13
Restore Uno 5.x for UWP targeting
MartinZikmund Feb 20, 2026
e213dce
Adjustments
MartinZikmund Feb 20, 2026
54afbc3
Undo change
MartinZikmund Feb 20, 2026
0cbae24
fix: Ensure WASM head can start up
MartinZikmund Mar 16, 2026
608080f
chore: Adjust host builder for Uno 6.x
MartinZikmund Mar 16, 2026
c052b37
Add Uno.Sdk project head
MartinZikmund Feb 24, 2026
8503cf3
Adjust scripts and workflows
MartinZikmund Feb 24, 2026
f4f33e6
Adjust CI to build all Uno.Sdk targets
MartinZikmund Feb 25, 2026
93b31a4
Pick correct dependencies for Uno
MartinZikmund Feb 25, 2026
4e11289
Adjust DependencyVariant
MartinZikmund Feb 25, 2026
588a976
Adjust Markdown sample
MartinZikmund Feb 25, 2026
7b8fb29
Add missing uno prop
MartinZikmund Feb 25, 2026
039b688
Add icon, fully qualify App
MartinZikmund Feb 26, 2026
54b711e
Fully qualify on all components
MartinZikmund Feb 26, 2026
389f7b2
Add missing webmanifest
MartinZikmund Feb 26, 2026
ce07079
Fully qualify iOS
MartinZikmund Feb 26, 2026
9ba4c3e
Disable AOT on Android
MartinZikmund Feb 26, 2026
5457779
Rename pipeline
MartinZikmund Feb 26, 2026
8df4381
Fix uno-linux CI job: drop iOS/maui workloads on Linux
MartinZikmund Jun 17, 2026
0ab40f3
Remove Windows-only setup-msbuild from uno-linux job
MartinZikmund Jun 17, 2026
ed352f7
Fix workload band mismatch in uno-linux job
MartinZikmund Jun 17, 2026
01a12c0
Add license headers to Uno head platform files
MartinZikmund Jun 17, 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
76 changes: 67 additions & 9 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,21 +112,26 @@ jobs:
with:
global-json-file: tooling/global.json

- name: Install .NET workloads
run: dotnet workload install wasm-tools

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info

- name: Copy props files to root
shell: pwsh
working-directory: ./
run: copy ./tooling/.github/workflows/config/* ./
run: |
copy ./tooling/.github/workflows/config/* ./
copy ./tooling/global.json ./

- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2

- name: Add project heads to ProjectTemplate
working-directory: ./${{ env.PROJECT_DIRECTORY }}
run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -IncludeUnoSdkHead -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}

# Build and use template for creating new experiments
- name: Build ProjectTemplate
Expand All @@ -141,14 +146,20 @@ jobs:
fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion.
matrix:
winui: [2, 3]
multitarget: ['uwp', 'wasdk', 'wasm']
multitarget: ['uwp', 'wasdk', 'wasm', 'unosdk']
exclude:
# WinUI 2 not supported on wasdk
- winui: 2
multitarget: wasdk
# WinUI 3 not supported on uwp
- winui: 3
multitarget: uwp
# Uno SDK is WinUI 3 only
- winui: 2
multitarget: unosdk
# WinUI 3 wasm is covered by the unosdk entry
- winui: 3
multitarget: wasm

env:
HEADS_DIRECTORY: tooling/ProjectHeads
Expand Down Expand Up @@ -178,6 +189,10 @@ jobs:
with:
global-json-file: tooling/global.json

- name: Install .NET workloads
if: ${{ matrix.multitarget == 'wasm' || matrix.multitarget == 'unosdk' }}
run: dotnet workload install wasm-tools ${{ matrix.multitarget == 'unosdk' && 'android ios maui' || '' }}

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
Expand All @@ -187,6 +202,7 @@ jobs:
working-directory: ./
run: |
copy ./tooling/.github/workflows/config/* ./
copy ./tooling/global.json ./
mkdir ./.config
copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json
mkdir ./components
Expand Down Expand Up @@ -214,12 +230,24 @@ jobs:

- name: Add project heads to ${{ env.TEST_PROJECT_NAME }}
working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }}
run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -MultiTargets ${{ matrix.multitarget }} -winui ${{ matrix.winui }} -componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}"${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
run: >-
${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1
-MultiTargets ${{ matrix.multitarget == 'unosdk' && 'wasm' || matrix.multitarget }}
-winui ${{ matrix.winui }}
-componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}"
${{ matrix.multitarget == 'unosdk' && ' -IncludeUnoSdkHead' || '' }}
${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}

- name: MSBuild
if: ${{ matrix.multitarget != 'unosdk' }}
working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }}
run: msbuild.exe ${{ env.TEST_PROJECT_NAME }}.sln /restore /nowarn:MSB4011 -p:Configuration=Release /m ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} /v:${{ env.MSBUILD_VERBOSITY }}

- name: Build Uno head
if: ${{ matrix.multitarget == 'unosdk' }}
working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }}
run: dotnet build heads/Uno/${{ env.TEST_PROJECT_NAME }}.Uno.csproj -p:Configuration=Release

# Run tests
- name: Setup VSTest Path
uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44
Expand All @@ -246,10 +274,11 @@ jobs:
name: new-experiment-logs-${{ matrix.multitarget }}-winui${{ matrix.winui }}
path: ./**/*.*log

wasm-linux:
uno-linux:
runs-on: ubuntu-latest
env:
HEADS_DIRECTORY: tooling/ProjectHeads
PROJECT_DIRECTORY: tooling/ProjectTemplate
TEST_PROJECT_NAME: CiTestExp

steps:
Expand All @@ -264,6 +293,18 @@ jobs:
with:
global-json-file: tooling/global.json

# iOS/maccatalyst workloads aren't installable on Linux (Uno.Sdk
# auto-filters those TFMs there). android + wasm-tools are both
# required: even a `-f net9.0-browserwasm` build restores all of the
# head's TargetFrameworks, so the net9.0-android TFM's workload is
# validated during restore.
# Run from ./tooling so global.json scopes the install to the pinned
# SDK feature band; otherwise the workloads land on the runner's newer
# preinstalled SDK and the 9.0.x build can't see them (NETSDK1147).
- name: Install .NET workloads
working-directory: tooling
run: dotnet workload install android wasm-tools

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
Expand All @@ -273,6 +314,7 @@ jobs:
working-directory: ./
run: |
copy ./tooling/.github/workflows/config/* ./
copy ./tooling/global.json ./
mkdir ./.config
copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json
mkdir ./components
Expand All @@ -294,20 +336,36 @@ jobs:
- name: Generate solution
shell: pwsh
working-directory: ./
run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -MultiTargets wasm
run: ./tooling/GenerateAllSolution.ps1 -IncludeUnoSdkHead${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -MultiTargets wasm

- name: dotnet build
shell: pwsh
working-directory: ./
run: ./tooling/Build-Toolkit-Components.ps1 -Release -MultiTargets wasm ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -BinlogOutput ./ -EnableBinLogs' || '' }}

# TODO: Do we want to run tests here? Can we do that on linux easily?

- name: Build Uno head (browserwasm)
shell: pwsh
working-directory: ./
run: >-
dotnet build
tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj
-f net9.0-browserwasm
-p:Configuration=Release

- name: Build Uno head (desktop)
shell: pwsh
working-directory: ./
run: >-
dotnet build
tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj
-f net9.0-desktop
-p:Configuration=Release

- name: Artifact - Diagnostic Logs
uses: actions/upload-artifact@v4
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }}
with:
name: linux-logs
name: uno-linux-logs
path: ./**/*.*log


2 changes: 1 addition & 1 deletion Build-Toolkit-Components.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Param (
[ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]
[Alias("mt")]
[string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), # default settings

[ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]
[string[]]$ExcludeMultiTargets = @(), # default settings

Expand Down
2 changes: 1 addition & 1 deletion Build-Toolkit-Gallery.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Param (
[ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]
[Alias("mt")]
[string[]]$MultiTargets = @('uwp', 'wasdk', 'wasm'), # default settings

[ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]
[string[]]$ExcludeMultiTargets = @(), # default settings

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
#endif
#endif

#if HAS_UNO_WASM
#if HAS_UNO_WASM && !WINUI3
using Markdig;
using Uno.Foundation.Interop;
using Uno.UI.Runtime.WebAssembly;
Expand All @@ -27,7 +27,7 @@ namespace CommunityToolkit.App.Shared.Renderers;
/// <summary>
/// Provide an abstraction around the Toolkit MarkdownTextBlock for both UWP and WinUI 3 in the same namespace (until 8.0) as well as a polyfill for WebAssembly/WASM.
/// </summary>
#if HAS_UNO_WASM
#if HAS_UNO_WASM && !WINUI3
[HtmlElement("div")]
public partial class MarkdownTextBlock : TextBlock
{
Expand Down
20 changes: 18 additions & 2 deletions GenerateAllSolution.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ Param (
[string[]]$ExcludeComponents,

[switch]$UseDiagnostics = $false,

[bool]$Launch = $true

[bool]$Launch = $true,

[switch]$IncludeUnoSdkHead = $false
)

if ($MultiTargets.Contains('all')) {
Expand Down Expand Up @@ -155,6 +157,11 @@ foreach ($componentName in $Components) {
# Once we have that, just do a transform on the csproj filename inside this loop to decide the same csproj for those separate MultiTargets.
# ===
foreach ($multitarget in $allUsedMultiTargetPrefs) {
# When using Uno.Sdk head, skip the traditional Wasm head (Uno SDK covers wasm for WinUI 3)
if ($multitarget -eq 'wasm' -and $IncludeUnoSdkHead) {
continue
}

# capitalize first letter, avoid case sensitivity issues on linux
$csprojFileNamePartForMultiTarget = $multitarget.substring(0,1).ToUpper() + $multitarget.Substring(1).ToLower()

Expand All @@ -168,6 +175,15 @@ foreach ($multitarget in $allUsedMultiTargetPrefs) {
}
}

if ($IncludeUnoSdkHead) {
$unoHeadPath = "./tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj"
if (Test-Path $unoHeadPath) {
[void]$projects.Add($unoHeadPath)
} else {
Write-Warning "Uno.Sdk head project not found at $unoHeadPath."
}
}

if ($UseDiagnostics.IsPresent)
{
$sdkoptions = "-d"
Expand Down
20 changes: 19 additions & 1 deletion GenerateSingleSolution.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ Param (
[string]$componentPath,

[Parameter(HelpMessage = "Add extra diagnostic output to slngen generator.")]
[switch]$UseDiagnostics = $false
[switch]$UseDiagnostics = $false,

[switch]$IncludeUnoSdkHead = $false
)

if ($null -ne $Env:Path -and $Env:Path.ToLower().Contains("msbuild") -eq $false) {
Expand Down Expand Up @@ -191,6 +193,11 @@ Write-Output "Generating solution for $componentName in $generatedSolutionFilePa
# TODO: this handles separate project heads, but won't directly handle the unified Skia head from Uno.
# Once we have that, just do a transform on the csproj filename inside this loop to decide the same csproj for those separate MultiTargets.
foreach ($multitarget in $MultiTargets) {
# When using Uno.Sdk head, skip the traditional Wasm head (Uno SDK covers wasm for WinUI 3)
if ($multitarget -eq 'wasm' -and $IncludeUnoSdkHead) {
continue
}

# capitalize first letter, avoid case sensitivity issues on linux
$csprojFileNamePartForMultiTarget = $multitarget.substring(0,1).ToUpper() + $multitarget.Substring(1).ToLower()

Expand All @@ -208,6 +215,17 @@ foreach ($multitarget in $MultiTargets) {
}
}

if ($IncludeUnoSdkHead) {
$unoHeadPath = "$outputHeadsDir\Uno\*Uno.csproj"
if (Test-Path $unoHeadPath) {
foreach ($foundItem in Get-ChildItem $unoHeadPath) {
$projects = $projects + $foundItem.FullName
}
} else {
Write-Warning "Uno.Sdk head project not found at $unoHeadPath."
}
}

# Include common dependencies required for solution to build
$projects = $projects + "$PSScriptRoot\CommunityToolkit.App.Shared\**\*.*proj"
$projects = $projects + "$PSScriptRoot\CommunityToolkit.Tests.Shared\**\*.*proj"
Expand Down
33 changes: 31 additions & 2 deletions GenerateVSCodeLaunchConfig.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function CreateVsCodeLaunchConfigJson {
)

return "{
`"name`": `"$projectName`",
`"name`": `"$projectName (Wasm)`",
`"type`": `"coreclr`",
`"request`": `"launch`",
`"program`": `"dotnet`",
Expand All @@ -29,6 +29,32 @@ function CreateVsCodeLaunchConfigJson {
}";
}

function CreateUnoVsCodeLaunchConfigJson {
param (
[string]$projectName
)

return "{
`"name`": `"$projectName (Uno)`",
`"type`": `"coreclr`",
`"request`": `"launch`",
`"program`": `"dotnet`",
`"args`": [
`"run`",
`"build`",
`"/r`",
`"/p:UnoSourceGeneratorUseGenerationHost=true`",
`"/p:UnoSourceGeneratorUseGenerationController=false`",
`"/p:UnoRemoteControlPort=443`",
`"--project=`$`{workspaceFolder`}/components/$projectName/heads/Uno/$projectName.Uno.csproj`"
],
`"presentation`": {
`"group`": `"2`"
},
`"cwd`": `"`$`{workspaceFolder`}/components/$projectName/heads/Uno`"
}";
}

$launchConfigJson = Get-Content -Path "$PSScriptRoot/../.vscode/launch.json" -ErrorAction Stop;
$launchConfig = $launchConfigJson | ConvertFrom-Json;

Expand All @@ -46,8 +72,11 @@ foreach ($projectPath in Get-ChildItem -Directory -Depth 0 -Path "$PSScriptRoot/

$configJson = CreateVsCodeLaunchConfigJson $projectName;
$config = $configJson | ConvertFrom-Json;

$launchConfig.configurations += $config;

$unoConfigJson = CreateUnoVsCodeLaunchConfigJson $projectName;
$unoConfig = $unoConfigJson | ConvertFrom-Json;
$launchConfig.configurations += $unoConfig;
}

if ($allowGitChanges.IsPresent) {
Expand Down
2 changes: 1 addition & 1 deletion MultiTarget/AvailableTargetFrameworks.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<WasmHeadTargetFramework Condition="'$(WasmHeadTargetFramework)' == ''">net9.0;</WasmHeadTargetFramework>
<LinuxHeadTargetFramework Condition="'$(LinuxHeadTargetFramework)' == ''">net9.0;</LinuxHeadTargetFramework>
<WpfHeadTargetFramework Condition="'$(WpfHeadTargetFramework)' == ''">net9.0;</WpfHeadTargetFramework>

<AndroidLibTargetFrameworks Condition="'$(AndroidLibTargetFrameworks)' == ''">net9.0-android;</AndroidLibTargetFrameworks>
<MacOSLibTargetFrameworks Condition="'$(MacOSLibTargetFrameworks)' == ''">net9.0-maccatalyst;</MacOSLibTargetFrameworks>
<iOSLibTargetFrameworks Condition="'$(iOSLibTargetFrameworks)' == ''">net9.0-ios;</iOSLibTargetFrameworks>
Expand Down
Loading
Loading