Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
1e9e7b9
Migrate to Uno.Sdk
MartinZikmund Oct 9, 2026
8ba2956
Target Uno Platform 7.0 for WinUI 3
MartinZikmund Oct 9, 2026
6e1735e
Work around MSBuild.Sdk.Extras inferring net10.0 as .NETFramework
MartinZikmund Oct 9, 2026
0ce5baf
Align Uno.Fonts.Fluent with Uno.WinUI 7
MartinZikmund Oct 9, 2026
22741bf
Disable Hot Design and App MCP on Uno 7 heads
MartinZikmund Oct 9, 2026
8e73a66
Only set MarkdownTextBlock Background on Windows
MartinZikmund Oct 9, 2026
2ca4db3
Use RichTextBlock with syntax highlighting for sample code on Uno 7
MartinZikmund Oct 9, 2026
a46ea4f
Render docs with the Labs MarkdownTextBlock on Uno 7
MartinZikmund Oct 9, 2026
7e489b1
Fix the Labs MarkdownTextBlock wrapper build and inline code size
MartinZikmund Oct 9, 2026
d3a60e4
Update to Uno.Sdk 7.0.0-dev.89
MartinZikmund Oct 27, 2026
8817e16
Don't pass -r to dotnet build in Build-Toolkit-Gallery
MartinZikmund Oct 27, 2026
f7d5d55
Use the Uno 7 build of Uno.Microsoft.Xaml.Behaviors.Interactivity.WinUI
MartinZikmund Oct 27, 2026
e47c8fc
Don't reference System.Collections.Immutable from net10.0 sample proj…
MartinZikmund Oct 27, 2026
178d10f
Share the gallery's Toolkit dependencies with the Uno.Sdk heads
MartinZikmund Oct 27, 2026
8a865b0
Build the gallery's Toolkit dependencies from source in the Uno.Sdk C…
MartinZikmund Oct 27, 2026
09f4734
Set the doc MarkdownTextBlock background in code
MartinZikmund Nov 3, 2026
cdf49ee
Let SupportedOSPlatformVersion drive the Android min SDK
MartinZikmund Nov 3, 2026
1307d7a
Only add the Uno.Sdk head for WinUI 3
MartinZikmund Nov 3, 2026
4e83b8a
CI: Build Toolkit deps from source in project-template, enable long p…
MartinZikmund Nov 3, 2026
2c40f3a
CI: Build from a subst drive instead of enabling long paths
MartinZikmund Nov 3, 2026
758fbea
CI: Only use the subst drive for the wasm experiment build
MartinZikmund Nov 3, 2026
3c92e69
Use the Uno 7 Android host types in the Uno.Sdk heads
MartinZikmund Nov 3, 2026
84d2ca8
Identify the WinUI 3 macos library build as Uno
MartinZikmund Nov 3, 2026
8a6b36d
Only add the shared .NET TFM for macos on WinUI 3
MartinZikmund Nov 3, 2026
3620ce9
chore: bump Uno.Sdk to 7.0.0-dev.132 (Uno.WinUI 7.0.0-dev.2556)
MartinZikmund Nov 4, 2026
14c2f75
chore: bump Uno.Sdk to stable 7.0.5 (Uno.WinUI 7.0.32)
MartinZikmund Nov 11, 2026
ad8f470
Stop Build-Toolkit-Gallery at the first failed build
MartinZikmund Nov 11, 2026
80738a8
Only add the Uno.Sdk head for WinUI 3 in single-component solutions
MartinZikmund Nov 11, 2026
f98360c
Generate a VS Code launch config per Uno head framework
MartinZikmund Nov 11, 2026
b10e33a
Emit PackageProjectUrlAttribute from the Uno.Sdk heads
MartinZikmund Nov 11, 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
149 changes: 132 additions & 17 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ env:
MSBUILD_VERBOSITY: diagnostic
#COREHOST_TRACE: 1
COREHOST_TRACEFILE: corehosttrace.log
# The Uno.Sdk heads depend on the Converters, SettingsControls, Extensions and Triggers components
# (and Helpers, used by Triggers). Their published packages are built against Uno 5 and don't compile
# on Uno 7 (CS0012), so the Uno.Sdk jobs build them from source at this CommunityToolkit/Windows
# commit, which ports them to Uno 7 (CommunityToolkit/Windows#880).
# TODO: Remove once Uno 7 builds of those packages are published.
TOOLKIT_COMPONENTS_REF: 6bf8e8280f5d126c043002e9af08e6a39cce72ff

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
Expand Down Expand Up @@ -101,6 +107,12 @@ jobs:
with:
global-json-file: tooling/global.json

# 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.
- name: Install .NET workloads
working-directory: tooling
run: dotnet workload install wasm-tools

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
Expand All @@ -112,6 +124,26 @@ jobs:
copy ./tooling/.github/workflows/config/* ./
copy ./tooling/global.json ./

# The ProjectTemplate solution includes the Uno.Sdk head, see TOOLKIT_COMPONENTS_REF
- name: Checkout Toolkit components the gallery depends on
uses: actions/checkout@v4
with:
repository: CommunityToolkit/Windows
ref: ${{ env.TOOLKIT_COMPONENTS_REF }}
path: windows
sparse-checkout: |
components/Converters
components/Extensions
components/Helpers
components/SettingsControls
components/Triggers

- name: Copy Toolkit components next to the template
shell: pwsh
run: |
New-Item -ItemType Directory -Force ./components | Out-Null
Move-Item ./windows/components/* ./components/

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

Expand All @@ -120,9 +152,13 @@ jobs:
run: ${{ github.workspace }}/${{ env.HEADS_DIRECTORY }}/GenerateSingleSampleHeads.ps1 -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}

# Build and use template for creating new experiments
# Built from a drive letter mapped to the workspace: Uno's wasm runtime deploys files under
# wwwroot/package_<hash>/ that go past MAX_PATH from the runner's long workspace path
- name: Build ProjectTemplate
working-directory: ./${{ env.PROJECT_DIRECTORY }}
run: msbuild.exe ProjectTemplate.sln /restore /nowarn:MSB4011 -p:Configuration=Debug
run: |
subst W: "${{ github.workspace }}"
Set-Location "W:\${{ env.PROJECT_DIRECTORY }}"
msbuild.exe ProjectTemplate.sln /restore /nowarn:MSB4011 -p:Configuration=Debug

# Test job to build a single experiment to ensure our changes work for both our main types of solutions at the moment
new-experiment:
Expand All @@ -140,6 +176,14 @@ jobs:
# WinUI 3 not supported on uwp
- winui: 3
multitarget: uwp
include:
# The Uno.Sdk head replaces the classic Wasm head on WinUI 3, so it rides on the
# existing wasm/winui3 job as a flag rather than a fake entry in the multitarget axis.
# GenerateSingleSampleHeads.ps1 derives the same thing itself (wasm + WinUI 3); this flag
# only drives which CI steps run below (workloads, build command), not the script's own behavior.
- winui: 3
multitarget: wasm
unoSdkHead: true

env:
HEADS_DIRECTORY: tooling/ProjectHeads
Expand Down Expand Up @@ -169,6 +213,13 @@ jobs:
with:
global-json-file: tooling/global.json

# 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.
- name: Install .NET workloads
if: ${{ matrix.multitarget == 'wasm' }}
working-directory: tooling
run: dotnet workload install wasm-tools ${{ matrix.unoSdkHead && 'android ios maui' || '' }}

- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
Expand All @@ -183,6 +234,25 @@ jobs:
copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json
mkdir ./components

- name: Checkout Toolkit components the gallery depends on
if: ${{ matrix.unoSdkHead }}
uses: actions/checkout@v4
with:
repository: CommunityToolkit/Windows
ref: ${{ env.TOOLKIT_COMPONENTS_REF }}
path: windows
sparse-checkout: |
components/Converters
components/Extensions
components/Helpers
components/SettingsControls
components/Triggers

- name: Copy Toolkit components next to the experiment
if: ${{ matrix.unoSdkHead }}
shell: pwsh
run: Move-Item ./windows/components/* ./components/

- name: Install Windows SDKs
shell: pwsh
run: ./tooling/Install-WindowsSdk.ps1
Expand All @@ -206,11 +276,29 @@ 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 }}
-winui ${{ matrix.winui }}
-componentPath "${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}"
${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}

# The generated solution already contains only the head(s) for the requested MultiTarget(s)
# (GenerateSingleSolution.ps1 swaps in the Uno.Sdk head instead of the classic Wasm one for
# WinUI 3 + wasm), so one MSBuild invocation covers the Uno.Sdk head too - msbuild.exe builds
# it fine, verified locally against dotnet build with identical results.
# wasm builds from a drive letter mapped to the workspace: Uno's wasm runtime deploys files under
# wwwroot/package_<hash>/ that go past MAX_PATH from the runner's long workspace path. Not for the
# Windows heads, whose test packages are registered by a service that can't see a subst drive.
- name: MSBuild
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 }}
run: |
if ('${{ matrix.multitarget }}' -eq 'wasm') {
subst W: "${{ github.workspace }}"
Set-Location "W:\${{ env.TEST_PROJECT_DIRECTORY }}"
} else {
Set-Location "${{ github.workspace }}\${{ env.TEST_PROJECT_DIRECTORY }}"
}
msbuild.exe ${{ env.TEST_PROJECT_NAME }}.sln /restore /nowarn:MSB4011 -p:Configuration=Release /m ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} /v:${{ env.MSBUILD_VERBOSITY }}

# Run tests
- name: Setup VSTest Path
Expand Down Expand Up @@ -238,10 +326,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 @@ -256,6 +345,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 net10.0-browserwasm` build restores all of the
# head's TargetFrameworks, so the net10.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 @@ -270,6 +371,23 @@ jobs:
copy ./tooling/.config/dotnet-tools.json ./.config/dotnet-tools.json
mkdir ./components

- name: Checkout Toolkit components the gallery depends on
uses: actions/checkout@v4
with:
repository: CommunityToolkit/Windows
ref: ${{ env.TOOLKIT_COMPONENTS_REF }}
path: windows
sparse-checkout: |
components/Converters
components/Extensions
components/Helpers
components/SettingsControls
components/Triggers

- name: Copy Toolkit components next to the experiment
shell: pwsh
run: Move-Item ./windows/components/* ./components/

# Restore Tools from Manifest list in the Repository
- name: Restore dotnet tools
working-directory: ./
Expand All @@ -284,21 +402,18 @@ jobs:
working-directory: ./components
run: dotnet new ctk-component -n ${{ env.TEST_PROJECT_NAME }}

- name: Generate solution
shell: pwsh
working-directory: ./
run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -MultiTargets wasm

- name: dotnet build
# Build-Toolkit-Gallery.ps1 sets up TFMs/WinUI/project references and builds the Uno head
# directly (components are pulled in transitively as ProjectReferences), so this replaces
# the previous solution-gen + component prebuild + two head builds with one step - the old
# sequence built every component up to 3x over.
- name: Build Uno head (gallery)
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?
run: ./tooling/Build-Toolkit-Gallery.ps1 -Heads Uno -Release -MultiTargets wasm,linux ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -BinlogOutput ./ -EnableBinLogs' || '' }}

- 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
8 changes: 8 additions & 0 deletions .github/workflows/config/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
<RepositoryDirectory>$([MSBuild]::EnsureTrailingSlash('$(MSBuildThisFileDirectory)'))</RepositoryDirectory>
<ToolingDirectory>$(RepositoryDirectory)tooling</ToolingDirectory>

<!-- Toolkit components the gallery depends on, when CI checks them out next to the template component.
Without them, the gallery uses the published packages instead. -->
<ToolkitConvertersSourceProject Condition="Exists('$(RepositoryDirectory)components\Converters\src\CommunityToolkit.WinUI.Converters.csproj')">$(RepositoryDirectory)components\Converters\src\CommunityToolkit.WinUI.Converters.csproj</ToolkitConvertersSourceProject>
<ToolkitExtensionsSourceProject Condition="Exists('$(RepositoryDirectory)components\Extensions\src\CommunityToolkit.WinUI.Extensions.csproj')">$(RepositoryDirectory)components\Extensions\src\CommunityToolkit.WinUI.Extensions.csproj</ToolkitExtensionsSourceProject>
<ToolkitTriggersSourceProject Condition="Exists('$(RepositoryDirectory)components\Triggers\src\CommunityToolkit.WinUI.Triggers.csproj')">$(RepositoryDirectory)components\Triggers\src\CommunityToolkit.WinUI.Triggers.csproj</ToolkitTriggersSourceProject>
<ToolkitHelpersSourceProject Condition="Exists('$(RepositoryDirectory)components\Helpers\src\CommunityToolkit.WinUI.Helpers.csproj')">$(RepositoryDirectory)components\Helpers\src\CommunityToolkit.WinUI.Helpers.csproj</ToolkitHelpersSourceProject>
<ToolkitSettingsControlsSourceProject Condition="Exists('$(RepositoryDirectory)components\SettingsControls\src\CommunityToolkit.WinUI.Controls.SettingsControls.csproj')">$(RepositoryDirectory)components\SettingsControls\src\CommunityToolkit.WinUI.Controls.SettingsControls.csproj</ToolkitSettingsControlsSourceProject>

<MajorVersion>1</MajorVersion>
<MinorVersion>0</MinorVersion>
</PropertyGroup>
Expand Down
8 changes: 4 additions & 4 deletions Build-Toolkit-Components.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,11 @@
Date: 2/19/2024
#>
Param (
[ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]
[ValidateSet('all', 'wasm', 'uwp', 'wasdk', 'wpf', 'win32', 'linux', 'macos', 'ios', 'android', 'netstandard')]
[Alias("mt")]
[string[]]$MultiTargets = @('uwp', 'wasm', 'wasdk'), # default settings
[ValidateSet('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')]

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

[Alias("c")]
Expand Down Expand Up @@ -97,7 +97,7 @@ Param (


if ($MultiTargets -eq 'all') {
$MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'linuxgtk', 'macos', 'ios', 'android', 'netstandard')
$MultiTargets = @('wasm', 'uwp', 'wasdk', 'wpf', 'win32', 'linux', 'macos', 'ios', 'android', 'netstandard')
}

if ($null -eq $ExcludeMultiTargets)
Expand Down
Loading
Loading