# Ursa.Avalonia Ursa.Avalonia is an enterprise-level UI library for building cross-platform applications with Avalonia UI. This is a .NET 8.0 library that provides advanced UI controls and themes for Avalonia applications. **Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.** ## Working Effectively ### Prerequisites and Setup - Requires .NET 8.0 SDK (minimum 8.0.0). Check version with `dotnet --version` - Install required workloads for full functionality: - `dotnet workload restore` -- installs wasi-experimental workload automatically - `dotnet workload install wasm-tools` -- required for browser demos. Takes 30-60 seconds. - Mobile workloads (Android/iOS) may not be available in all environments ### Building the Library - Use the provided build scripts for core libraries: - Linux/macOS: `./build.sh` -- builds core Ursa libraries. NEVER CANCEL. Takes ~26 seconds. Set timeout to 120+ seconds. - Windows: `./build.ps1` -- builds core Ursa libraries - Build specific projects: - Core library: `dotnet build src/Ursa/Ursa.csproj` - Themes: `dotnet build src/Ursa.Themes.Semi/Ursa.Themes.Semi.csproj` - Prism extension: `dotnet build src/Ursa.PrismExtension/Ursa.PrismExtension.csproj` - Build entire solution (excluding mobile): `dotnet build` -- may fail on mobile projects without workloads ### Running Demo Applications - Desktop demo: `dotnet run --project demo/Ursa.Demo.Desktop/Ursa.Demo.Desktop.csproj` -- NEVER CANCEL. Build takes ~22 seconds. Set timeout to 120+ seconds. - Cannot run in headless environments (will fail with XOpenDisplay error) - Browser demo: - Build: `dotnet build demo/Ursa.Demo.Browser/Ursa.Demo.Browser.csproj` -- NEVER CANCEL. Takes ~14 seconds. Set timeout to 120+ seconds. - Serve locally: `python3 -m http.server 8000 --directory demo/Ursa.Demo.Browser/bin/Debug/net8.0-browser/` - Access at: `http://127.0.0.1:8000` - Sandbox project: `dotnet run --project demo/Sandbox/Sandbox.csproj` -- minimal test environment ### Testing - Unit tests: `dotnet test tests/Test.Ursa` -- NEVER CANCEL. Takes ~13 seconds, runs 66 tests. Set timeout to 60+ seconds. - Headless tests: `dotnet test tests/HeadlessTest.Ursa` -- NEVER CANCEL. Takes ~29 seconds, runs 584 tests. Set timeout to 120+ seconds. - Both test suites should pass completely in a properly configured environment ### Validation Steps - Always run these commands after making changes: - `./build.sh` to validate core library builds - `dotnet test tests/Test.Ursa && dotnet test tests/HeadlessTest.Ursa` to validate functionality - Test browser demo functionality by building and serving locally - Verify mobile demo builds work if mobile workloads are available ## Repository Structure ### Key Directories - `/src/` -- Core library source code - `Ursa/` -- Main UI library (netstandard2.0 and net8.0) - `Ursa.Themes.Semi/` -- Semi Design theme package - `Ursa.PrismExtension/` -- Prism.Avalonia integration - `Ursa.ReactiveUIExtension/` -- ReactiveUI integration - `/demo/` -- Example applications - `Ursa.Demo/` -- Shared demo code - `Ursa.Demo.Desktop/` -- Desktop application (Windows/Linux/macOS) - `Ursa.Demo.Browser/` -- WebAssembly browser application - `Ursa.Demo.Android/` -- Android application (requires workloads) - `Ursa.Demo.iOS/` -- iOS application (requires workloads) - `Sandbox/` -- Simple test application - `/tests/` -- Test projects - `Test.Ursa/` -- Unit tests (66 tests) - `HeadlessTest.Ursa/` -- Headless UI tests (584 tests) ### Important Files - `global.json` -- Specifies .NET 8.0.0 SDK requirement - `Ursa.sln` -- Main solution file with all projects - `src/Package.props` -- Shared package properties (Avalonia 11.1.1) - `demo/Directory.Build.props` -- Demo-specific properties (Avalonia 11.2.5) - `build.sh`/`build.ps1` -- Core library build scripts ## Common Development Tasks ### Making Changes to Controls - Ursa controls are located in `src/Ursa/Controls/` - Themes and styles are in `src/Ursa.Themes.Semi/` - Always test changes with both unit tests and headless tests - Verify demo applications still function correctly ### Adding New Features - Follow existing patterns in `src/Ursa/Controls/` - Add corresponding tests in `tests/HeadlessTest.Ursa/Controls/` - Update demo applications to showcase new functionality - Ensure compatibility with both netstandard2.0 and net8.0 targets ### Working with Themes - Semi theme implementation is in `src/Ursa.Themes.Semi/` - Reference theme in applications: `xmlns:u-semi="https://irihi.tech/ursa/themes/semi"` - Theme must be included after Semi base theme in App.axaml ### CI/CD Integration - GitHub Actions are configured in `.github/workflows/` - `test.yml` runs on both Windows and Ubuntu - Tests include code coverage reporting - Mobile builds may be excluded from CI in environments without workloads ## Known Issues and Workarounds ### Build Warnings - Nullable reference type warnings are common and generally non-blocking - Async method warnings in demo code are cosmetic ### Platform Limitations - Desktop applications require display server (fail in headless environments) - Mobile applications require specific workloads that may not be available - Browser applications require WASM workloads ### Environment Dependencies - .NET 8.0 SDK is required (specified in global.json) - Avalonia versions differ between library (11.1.1) and demos (11.2.5) - Some workloads may have long installation times ## Troubleshooting ### Build Failures - Ensure correct .NET SDK version: `dotnet --version` should show 8.0.x - Install missing workloads: `dotnet workload restore` - Clean build artifacts: `dotnet clean` then rebuild ### Test Failures - Verify all dependencies are installed - Check that Avalonia themes are properly configured - Ensure headless environment is properly set up for UI tests ### Demo Issues - Desktop demos require display server - Browser demos need proper WASM workload installation - Mobile demos need platform-specific workloads Always validate that your changes work by running the full test suite and building all target projects before committing changes.