Skip to content

build(uno): Uno.Sdk 7.0 with Uno.Extensions 8.0.0-dev.83 and a Shell navigation root - #74

Draft
kazo0 wants to merge 5 commits into
masterfrom
dev/sb/uno-7
Draft

kazo0 wants to merge 5 commits into
masterfrom
dev/sb/uno-7

Conversation

@kazo0

@kazo0 kazo0 commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner

Rebased onto master after #73 squash-merged (GitHub reported the stacked branch as conflicting and ran no CI). Moves the app to Uno Platform 7.0: global.json to Uno.Sdk 7.0.0-dev.73 (the latest 7.0 dev build on nuget.org), Uno.Extensions pinned to 8.0.0-dev.83 ahead of the Sdk, and a Shell navigation root. Every head builds, every page renders, 110 unit tests pass.

What this does

  • Drops the UnoThemeVersion / UnoToolkitVersion pins from Directory.Packages.props (they only existed to stay on the pre-7.0 servicing lines). The Sdk's groups resolve to Uno.WinUI 7.0.0-dev.2270, Themes 9.0.0-dev.41, Toolkit 11.0.0-dev.140. The Uno.Fonts.Roboto 2.10.0-dev.12 pin from feat(reading): larger default text, a Text Size setting and fixed tab labels #73 stays: the 7.0 Sdk still pins fonts at dev.9.
  • Pins UnoExtensionsVersion to 8.0.0-dev.83 (chore: Rebuild against current Uno 7.0 Core (7.0.0-dev.2162) unoplatform/uno.extensions#3223, the rebuild against the current 7.0 core). The Sdk still carries 8.0.0-dev.76, built against an older core; its Navigation.UI / Reactive.UI referenced types 7.0 no longer has (UNOB0020, "will fail at runtime"). Drop the pin once an Sdk carries dev.83 or later.
  • Fixes web-deploy.yml's "Verify profile-guided AOT" step: Uno 7.0 writes uno-config.js at the wwwroot root, not under package_<hash>/ (the web preview job failed on that ls). Checked against a local Release publish: runtime mode InterpreterAndAOT, profiled AOT on, 117 assemblies compiled against aot.profile, dotnet.native.wasm 22.4 MB. _headers needs no change: the file is not fingerprinted and keeps the Pages default of revalidating.
  • Adds Views/Shell.xaml, the template-style navigation root (a UserControl around one ContentControl, exposed through IContentControlProvider), and OnLaunched now calls NavigateAsync<Shell>(). Routes, pages and view-models are unchanged: the default Main route navigates MainPage into the shell through a FrameView, and MainPage's TabBar regions attach under that navigator.

What 7.0 needed in the app

  • Application.Resuming / EnteredBackground are gone. App.xaml.cs and NotificationService.Android.cs use the static Windows.ApplicationModel.Core.CoreApplication events, which Uno.UI 7.0 raises.
  • Android host: Uno.UI.Runtime.Android.NativeApplication is abstract and builds the host in CreateHost() (UnoPlatformHostBuilder.Create().App(() => new App()).UseAndroid().Build()); ApplicationActivity moved to the same namespace.
  • UnoSplashScreenColor → UnoSplashScreenBackgroundColor (UNOB0028).
  • Android minSdk 21 → 24. The 7.0 AndroidX graph needs 23 (androidx.tracing, AMM0000) and the Sdk defaults to 24. The deliberate Xamarin-era 21 pin (spec 009) cannot survive 7.0; spec 009 and AGENTS.md are updated. This is a product call.
  • Uno.UI.Toolkit.ElevatedView (the settings dropdown from feat(reading): larger default text, a Text Size setting and fixed tab labels #73) is Uno.UI.Xaml.Controls.ElevatedView: 7.0 renamed the Uno.UI.Toolkit assembly to Uno.UI.Extras and moved its types with no forwarders.
  • Microsoft.Extensions.Configuration.* 10.0.12 to match the Sdk's graph (NU1605 otherwise).
  • A Page can no longer be the shell (see below).

Why the pages were blank, and why dev.83 alone was not enough

Two causes, found one under the other.

  1. Uno.Extensions 8.0.0-dev.76 vs the 7.0 core — the UNOB0020 warnings above. 8.0.0-dev.83 removes them on every head.
  2. NavigateAsync<MainPage>() with a Page as the shell. The navigation host casts the shell to ContentControl to make it the root region, and falls back to the Toolkit's root-view initializer otherwise. Up to 6.x Uno's UserControl, and so Page, derived from ContentControl, so MainPage itself was the root region and the app worked. Uno 7.0 aligns UserControl with WinUI (: Control; checked in the Uno.UI metadata, 6.8 vs 7.0.0-dev.2270): the cast yields null, the fallback is a LoadingView that never enters the visual tree, and the root navigator's Main request parks forever ("Region '' has no children to forward request to … Parking navigation 'Main'"). Nothing was logged because the navigation engine logs only through the host's own logger factory, which this app never configured (trace it with ConfigureLogging on the IHostBuilder, not through InitializeLogging). The fix is the template's shell shape, a ContentControl exposed through IContentControlProvider. The maintainers already track the silent failure as BC14 in Uno 7.0 retarget: follow-ups for the public Uno.Sdk and release day unoplatform/uno.extensions#3186 ("needs a runtime-verified fix plus a regression test"); this app's runtime confirmation of it is filed as [Navigation] NavigateAsync<TShell>() with a Page/UserControl shell is a silent blank screen on Uno 7.0 (BC14 in #3186) unoplatform/uno.extensions#3225 and linked from that bullet.

Verification

  • UNOB0020 gone from the iOS and Android builds; desktop, Android, iOS simulator and WebAssembly heads build.
  • iOS simulator (iPhone 17 Pro): the Reflection page renders. Web head driven headlessly: all three tabs render at phone width, the side rail at 1024 wide, dark theme too.
  • Navigation trace on the web head: Main → FrameView → MainPage, Reflection → DailyReflectionPage, then SoberTime / Settings on tab taps; no parked root request, no "initial navigation returned null".
  • 52 presentation + 58 services unit tests pass; XamlStyler, dotnet format whitespace and style pass.
  • After switching Sdk, rm -rf DailyReflection/obj DailyReflection/bin (a stale 6.x Uno.dll next to 7.0's Uno.WinRT.dll crashes the iOS registrar with "Cannot register two managed types … VideoSurface").

🤖 Generated with Claude Code

https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ

@kazo0
kazo0 added this pull request to stack #75 October 12, 2026 23:35
Base automatically changed from dev/sb/reading-text-size to master October 12, 2026 23:43
@kazo0 kazo0 changed the title wip(uno): Uno.Sdk 7.0 — compiles on every head, pages do not render (needs a matching Uno.Extensions) build(uno): Uno.Sdk 7.0 with Uno.Extensions 8.0.0-dev.83 and a Shell navigation root Oct 13, 2026
kazo0 and others added 2 commits October 12, 2026 21:00
…s do not render

Drops the UnoThemeVersion / UnoToolkitVersion pins (they only kept us on
the pre-7.0 servicing lines) and moves global.json to the latest 7.0 dev
Sdk. What 7.0 needed in the app:

- Application.Resuming / EnteredBackground are gone: App.xaml.cs and
  NotificationService.Android.cs use the static
  Windows.ApplicationModel.Core.CoreApplication events (Uno.WinRT),
  which Uno.UI 7.0 raises.
- Android host: Uno.UI.Runtime.Android.NativeApplication is abstract and
  builds the host in CreateHost(); ApplicationActivity moved there too.
- UnoSplashScreenColor -> UnoSplashScreenBackgroundColor (UNOB0028).
- Android minSdk 21 -> 24: the 7.0 AndroidX graph needs 23 (AMM0000) and
  the Sdk defaults to 24; spec 009 and AGENTS.md updated. Product call.
- Microsoft.Extensions.Configuration.* 10.0.12 to match the Sdk graph.
- Uno.UI.Toolkit.ElevatedView (settings dropdown) is
  Uno.UI.Xaml.Controls.ElevatedView: 7.0 renamed Uno.UI.Toolkit to
  Uno.UI.Extras and moved its types without forwarders.

Parked: every 7.0 Sdk (dev.60 … dev.73, nuget.org and unoplatformdev)
pins Uno.Extensions 8.0.0-dev.76, built against Uno.WinUI 7.0.0-dev.1574.
The iOS/Android builds warn UNOB0020 that Navigation.UI / Reactive.UI
reference types the 7.0 core no longer has, and at runtime (iOS
simulator, web head) only the TabBar shell renders: regions empty,
nothing logged even with the extensions at Debug. After switching Sdk,
rm -rf DailyReflection/obj DailyReflection/bin (a stale 6.x Uno.dll next
to 7.0's Uno.WinRT.dll crashes the iOS registrar).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DxndQ1L7ruaSHzi9voExNb
… the 7.0 core

Pins UnoExtensionsVersion ahead of the Sdk (7.0.0-dev.73 still carries
8.0.0-dev.76). dev.76 was built against an older 7.0 core, and its
Navigation.UI / Reactive.UI reference types the current core no longer
has: the iOS and Android builds warned UNOB0020 ("will fail at
runtime"). dev.83 is the rebuild from unoplatform/uno.extensions#3223;
the warning is gone on every head. Drop the pin once an Sdk carries it.

This alone does not bring the pages back; see the next commit.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ
kazo0 added a commit that referenced this pull request Oct 13, 2026
The migration-ordering note in spec 001 names NavigateAsync<MainPage>;
PR #74 moves the app to a Shell navigation root. The ordering it
documents is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

🌐 Web preview deployed

https://f6bc770f.dailyreflection.pages.dev

Built from 9ff74dd. Updates on every push.

kazo0 and others added 3 commits October 13, 2026 11:58
On Uno 7.0 the pages stayed blank behind the TabBar even with the
rebuilt Uno.Extensions. The cause is the shell: NavigateAsync<MainPage>()
passed a Page. The navigation host casts the shell to ContentControl to
make it the root region, and falls back to the Toolkit's root-view
initializer otherwise. Up to 6.x Uno's UserControl, and so Page, derived
from ContentControl, so MainPage itself was the root region. Uno 7.0
aligns UserControl with WinUI (it derives from Control): the cast yields
null, the fallback is a LoadingView that never enters the visual tree,
and its "Main" request parks forever. Navigation logs only through the
host's logger factory, which is why nothing was logged. The maintainers
track the silent failure as BC14 in unoplatform/uno.extensions#3186.

Views/Shell.xaml is the template's shape: a UserControl around one
ContentControl, exposed through IContentControlProvider, so the root
region sits in the tree and the default "Main" route navigates MainPage
into it through a FrameView. MainPage's TabBar regions then attach under
that navigator as designed. Routes, pages and view-models are unchanged.

Verified on the iOS simulator, the web head (phone and 1024-wide rail,
light and dark) and the desktop and Android builds; 110 unit tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ
The web preview job failed on this branch at "Verify profile-guided
AOT": it looked for publish/wwwroot/package_*/uno-config.js, and the
7.0 bootstrapper writes the file at the wwwroot root instead (the
package_<hash>/ folder still holds the assets and bootstrap scripts).
Checked against a local Release publish: the runtime-mode and
profiled-AOT keys are unchanged, 117 assemblies AOT-compile against
aot.profile, and dotnet.native.wasm is 22.4 MB, under the Pages limit.
The file is not fingerprinted, so _headers needs no change: it falls
under the Pages default of revalidating on every request.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ
The migration-ordering note in spec 001 names NavigateAsync<MainPage>;
PR #74 moves the app to a Shell navigation root. The ordering it
documents is unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qakj5qRUPLXR5HdMmDnBfZ

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant