From c7efbfa1279d9f7ee72775f2bb3e6dfb5229e67a Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 9 Oct 2026 11:54:47 +0200 Subject: [PATCH 1/7] chore: adopt Uno 7 tooling and SDK pins Points the tooling submodule at the Uno 7 branch and updates global.json (.NET SDK 10.0.401, Uno.Sdk 7.0.0-dev.51, MSBuild.Sdk.Extras 3.0.44). Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01E8bkzyS24p8CYDWLUPsaPC --- global.json | 5 +++-- tooling | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/global.json b/global.json index 338ca727d..7f21440ea 100644 --- a/global.json +++ b/global.json @@ -1,10 +1,11 @@ { "sdk": { - "version": "9.0.310", + "version": "10.0.401", "rollForward": "latestFeature" }, "msbuild-sdks": { - "MSBuild.Sdk.Extras":"3.0.23" + "MSBuild.Sdk.Extras":"3.0.44", + "Uno.Sdk": "7.0.0-dev.51" } } diff --git a/tooling b/tooling index 5ebeaabec..0686dbc6a 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit 5ebeaabeccc7a1d157ab40b784686a8758d15766 +Subproject commit 0686dbc6ae8ba2faca9ff52ac46488410cd00daf From 7bb22c2b1c063eacb44753c507346df8728f1059 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 9 Oct 2026 11:54:47 +0200 Subject: [PATCH 2/7] feat(MarkdownTextBlock): multi-target Uno Platform 7 heads Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01E8bkzyS24p8CYDWLUPsaPC --- .../CommunityToolkit.WinUI.Controls.MarkdownTextBlock.csproj | 4 ++-- components/MarkdownTextBlock/src/MultiTarget.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/MarkdownTextBlock/src/CommunityToolkit.WinUI.Controls.MarkdownTextBlock.csproj b/components/MarkdownTextBlock/src/CommunityToolkit.WinUI.Controls.MarkdownTextBlock.csproj index f9a01416e..64edb1843 100644 --- a/components/MarkdownTextBlock/src/CommunityToolkit.WinUI.Controls.MarkdownTextBlock.csproj +++ b/components/MarkdownTextBlock/src/CommunityToolkit.WinUI.Controls.MarkdownTextBlock.csproj @@ -25,7 +25,7 @@ - + @@ -33,7 +33,7 @@ - + diff --git a/components/MarkdownTextBlock/src/MultiTarget.props b/components/MarkdownTextBlock/src/MultiTarget.props index 18f6c7c98..81a497fd2 100644 --- a/components/MarkdownTextBlock/src/MultiTarget.props +++ b/components/MarkdownTextBlock/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk; + uwp;wasdk;wasm;win32;linux;macos;ios;android; From fe033a8baecd3f044838aac452d34819c318e394 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 9 Oct 2026 11:57:24 +0200 Subject: [PATCH 3/7] fix(MarkdownTextBlock): annotate GetPositionAtOffset result as nullable Uno annotates TextPointer.GetPositionAtOffset as nullable, which fails the build with warnings as errors. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01E8bkzyS24p8CYDWLUPsaPC --- components/MarkdownTextBlock/src/Extensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/MarkdownTextBlock/src/Extensions.cs b/components/MarkdownTextBlock/src/Extensions.cs index 8c682fe2d..4eb5203b4 100644 --- a/components/MarkdownTextBlock/src/Extensions.cs +++ b/components/MarkdownTextBlock/src/Extensions.cs @@ -365,7 +365,7 @@ public static string ToAlphabetical(this int index) else { // Try to find the next insertion position by moving one symbol forward - TextPointer next = position.GetPositionAtOffset(1, logicalDirection); + TextPointer? next = position.GetPositionAtOffset(1, logicalDirection); // If there is no next position, return null if (next == null) { @@ -384,7 +384,7 @@ public static bool IsAtInsertionPosition(this TextPointer position, LogicalDirec // Get the character rect of the current position Rect currentRect = position.GetCharacterRect(logicalDirection); // Try to get the next position by moving one symbol forward - TextPointer next = position.GetPositionAtOffset(1, logicalDirection); + TextPointer? next = position.GetPositionAtOffset(1, logicalDirection); // If there is no next position, return false if (next == null) { From 203e32574ce6df4dda634eb1c50a1fb649b45b7f Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 9 Oct 2026 12:28:01 +0200 Subject: [PATCH 4/7] fix(MarkdownTextBlock): use RenderTransform on Uno where Transform3D is a stub Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01E8bkzyS24p8CYDWLUPsaPC --- .../MarkdownTextBlock/src/TextElements/MyInlineCode.cs | 5 +++++ .../MarkdownTextBlock/src/TextElements/MyTaskListCheckBox.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/components/MarkdownTextBlock/src/TextElements/MyInlineCode.cs b/components/MarkdownTextBlock/src/TextElements/MyInlineCode.cs index 090f1a21d..8edffe312 100644 --- a/components/MarkdownTextBlock/src/TextElements/MyInlineCode.cs +++ b/components/MarkdownTextBlock/src/TextElements/MyInlineCode.cs @@ -29,9 +29,14 @@ public MyInlineCode(CodeInline codeInline, MarkdownConfig config) border.BorderThickness = _config.Themes.InlineCodeBorderThickness; border.CornerRadius = _config.Themes.InlineCodeCornerRadius; border.Padding = _config.Themes.InlineCodePadding; +#if HAS_UNO + // UIElement.Transform3D is not implemented on Uno + border.RenderTransform = new TranslateTransform { Y = 4 }; +#else CompositeTransform3D transform = new CompositeTransform3D(); transform.TranslateY = 4; border.Transform3D = transform; +#endif var textBlock = new TextBlock(); textBlock.FontSize = _config.Themes.InlineCodeFontSize; textBlock.Foreground = _config.Themes.InlineCodeForeground; diff --git a/components/MarkdownTextBlock/src/TextElements/MyTaskListCheckBox.cs b/components/MarkdownTextBlock/src/TextElements/MyTaskListCheckBox.cs index afd9d39f2..19ca34adb 100644 --- a/components/MarkdownTextBlock/src/TextElements/MyTaskListCheckBox.cs +++ b/components/MarkdownTextBlock/src/TextElements/MyTaskListCheckBox.cs @@ -15,9 +15,14 @@ public MyTaskListCheckBox(TaskList taskList) { _taskList = taskList; var grid = new Grid(); +#if HAS_UNO + // UIElement.Transform3D is not implemented on Uno + grid.RenderTransform = new TranslateTransform { Y = 2 }; +#else CompositeTransform3D transform = new CompositeTransform3D(); transform.TranslateY = 2; grid.Transform3D = transform; +#endif grid.Width = 16; grid.Height = 16; grid.Margin = new Thickness(2, 0, 2, 0); From b1251bb9e61515a622b789a8649890741f0c703a Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Fri, 9 Oct 2026 12:30:25 +0200 Subject: [PATCH 5/7] chore: bump tooling to latest Uno 7 branch head Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01E8bkzyS24p8CYDWLUPsaPC --- tooling | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling b/tooling index 0686dbc6a..843a88ab2 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit 0686dbc6ae8ba2faca9ff52ac46488410cd00daf +Subproject commit 843a88ab27f6240dc1f540e981602955122cf3b0 From 987820eadd8c54a4440df652255cf15e288ddcd6 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 3 Nov 2026 16:42:37 +0100 Subject: [PATCH 6/7] Rename the linuxgtk MultiTarget to linux, add win32 The Uno 7 tooling renamed linuxgtk to linux and added the win32 desktop target; Filter-Supported-Components rejects the old name, failing every build job. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TXMNu1EDpoRrpP3hnDukwz --- components/Adorners/src/MultiTarget.props | 2 +- components/GradientSlider/src/MultiTarget.props | 2 +- components/Ribbon/src/MultiTarget.props | 2 +- components/WrapPanel2/src/MultiTarget.props | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/Adorners/src/MultiTarget.props b/components/Adorners/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Adorners/src/MultiTarget.props +++ b/components/Adorners/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/GradientSlider/src/MultiTarget.props b/components/GradientSlider/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/GradientSlider/src/MultiTarget.props +++ b/components/GradientSlider/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/Ribbon/src/MultiTarget.props b/components/Ribbon/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/Ribbon/src/MultiTarget.props +++ b/components/Ribbon/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file diff --git a/components/WrapPanel2/src/MultiTarget.props b/components/WrapPanel2/src/MultiTarget.props index b11c19426..7d1e11c3c 100644 --- a/components/WrapPanel2/src/MultiTarget.props +++ b/components/WrapPanel2/src/MultiTarget.props @@ -4,6 +4,6 @@ MultiTarget is a custom property that indicates which target a project is designed to be built for / run on. Used to create project references, generate solution files, enable/disable TargetFrameworks, and build nuget packages. --> - uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + uwp;wasdk;wpf;win32;wasm;linux;macos;ios;android; \ No newline at end of file From 7114e8bb9f06c87b0a570fb1605fe81cf5e94a8e Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Tue, 3 Nov 2026 16:42:37 +0100 Subject: [PATCH 7/7] CI: Build the gallery through the Uno.Sdk head on WinUI 3 Ports the CommunityToolkit/Windows workflow changes for the Uno 7 tooling: the win32/linux matrix, the Uno.Sdk head on the WinUI 3 wasm job and wasm-linux becoming uno-linux, which builds that head for browserwasm and desktop. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TXMNu1EDpoRrpP3hnDukwz --- .github/workflows/build.yml | 64 +++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 81ff65cb0..a67d60a21 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ 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', 'wpf', 'linuxgtk', 'macos', 'ios', 'android'] + multitarget: ['uwp', 'wasdk', 'wasm', 'wpf', 'win32', 'linux', 'macos', 'ios', 'android'] exclude: # WinUI 2 not supported on wasdk - winui: 2 @@ -80,6 +80,18 @@ jobs: # WinUI 3 not supported on uwp - winui: 3 multitarget: uwp + # wpf is the Uno 5 Skia WPF head, which Uno 6 replaced with win32 + - winui: 3 + multitarget: wpf + # win32 is the Uno 6 Skia desktop head, which has no Uno 5 equivalent + - winui: 2 + multitarget: win32 + include: + # On WinUI 3 the Uno.Sdk head replaces the classic Wasm head, so it rides on the + # existing wasm job as a flag rather than a fake entry in the multitarget axis. + - winui: 3 + multitarget: wasm + unoSdkHead: true env: MULTI_TARGET_DIRECTORY: tooling/MultiTarget @@ -167,7 +179,7 @@ jobs: run: dotnet tool restore - name: Run Uno Check to Install Dependencies - if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' && env.HAS_BUILDABLE_COMPONENTS == 'true' }} + if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linux' && matrix.multitarget != 'wpf' && matrix.multitarget != 'win32' && !matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }} run: > dotnet tool run uno-check --ci @@ -180,6 +192,12 @@ jobs: --skip vswin --verbose + # The Uno.Sdk head builds desktop/browserwasm/android (iOS is filtered on + # Windows). Install the matching workloads directly instead of uno-check. + - name: Install .NET workloads (Uno.Sdk head) + if: ${{ matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }} + run: dotnet workload install wasm-tools android ios maui + - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v2 if: ${{ env.HAS_BUILDABLE_COMPONENTS == 'true' }} @@ -191,11 +209,11 @@ jobs: - name: Generate solution with ${{ matrix.multitarget }} gallery, components and tests working-directory: ./ if: ${{ env.HAS_BUILDABLE_COMPONENTS == 'true' }} - run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -Components ${{ env.CHANGED_COMPONENTS_LIST }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop + run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }}${{ matrix.unoSdkHead && ',win32 -IncludeUnoSdkHead' || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -Components ${{ env.CHANGED_COMPONENTS_LIST }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop # Build solution - name: MSBuild (With diagnostics) - if: ${{ env.ENABLE_DIAGNOSTICS == 'true' && env.HAS_BUILDABLE_COMPONENTS == 'true' }} + if: ${{ env.ENABLE_DIAGNOSTICS == 'true' && env.HAS_BUILDABLE_COMPONENTS == 'true' && !matrix.unoSdkHead }} run: > msbuild.exe /restore /nowarn:MSB4011 /p:Configuration=Release @@ -205,9 +223,15 @@ jobs: CommunityToolkit.AllComponents.sln - name: MSBuild - if: ${{ env.ENABLE_DIAGNOSTICS == 'false' && env.HAS_BUILDABLE_COMPONENTS == 'true' }} + if: ${{ env.ENABLE_DIAGNOSTICS == 'false' && env.HAS_BUILDABLE_COMPONENTS == 'true' && !matrix.unoSdkHead }} run: msbuild.exe CommunityToolkit.AllComponents.sln /restore /nowarn:MSB4011 -p:Configuration=Release + # The Uno.Sdk head is a single project covering desktop/browserwasm/android + # (iOS is filtered on Windows); build it directly with dotnet. + - name: Build Uno.Sdk head + if: ${{ matrix.unoSdkHead && env.HAS_BUILDABLE_COMPONENTS == 'true' }} + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -p:Configuration=Release ${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} + # Run tests - name: Setup VSTest Path uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44 @@ -482,7 +506,7 @@ jobs: --api-key ${{ secrets.NUGET_PACKAGE_PUSH_TOKEN }} --skip-duplicate - wasm-linux: + uno-linux: runs-on: ubuntu-latest env: HEADS_DIRECTORY: tooling/ProjectHeads @@ -502,6 +526,12 @@ jobs: with: global-json-file: global.json + # iOS/maccatalyst aren't installable on Linux (Uno.Sdk filters those TFMs + # there). android + wasm-tools are both required: even a single-TFM build + # restores all of the head's TargetFrameworks, validating net10.0-android. + - name: Install .NET workloads + run: dotnet workload install android wasm-tools + - name: .NET Info (if diagnostics) if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} run: dotnet --info @@ -510,27 +540,27 @@ jobs: - name: Restore dotnet tools run: dotnet tool restore + # Generate the full solution with the Uno.Sdk gallery head, components and tests - name: Generate solution shell: pwsh working-directory: ./ - run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} + run: ./tooling/GenerateAllSolution.ps1 -MultiTargets wasm,linux -IncludeUnoSdkHead -WinUIMajorVersion 3${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} - - name: Install ninja for WASM native dependencies - run: sudo apt-get install ninja-build + - name: Build Uno head (browserwasm) + shell: pwsh + working-directory: ./ + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net10.0-browserwasm -p:Configuration=Release - # Issue with Comment Links currently, see: https://github.com/mrlacey/CommentLinks/issues/38 - # See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.App.Wasm.csproj - - name: dotnet build - working-directory: ./${{ env.HEADS_DIRECTORY }}/AllComponents/Wasm/ - run: dotnet build /r /bl /p:UnoSourceGeneratorUseGenerationHost=true /p:UnoSourceGeneratorUseGenerationController=false - - # TODO: Do we want to run tests here? Can we do that on linux easily? + - name: Build Uno head (desktop) + shell: pwsh + working-directory: ./ + run: dotnet build tooling/ProjectHeads/AllComponents/Uno/CommunityToolkit.App.Uno.csproj -f net10.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