diff --git a/src/AdvancedCalculator.sln b/src/AdvancedCalculator.sln
index 0598078..5e98a69 100644
--- a/src/AdvancedCalculator.sln
+++ b/src/AdvancedCalculator.sln
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
-VisualStudioVersion = 17.12.35707.178 d17.12
+VisualStudioVersion = 17.12.35707.178
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedCalculator", "AdvancedCalculator\AdvancedCalculator.csproj", "{690788A5-B548-4BE1-8B01-966BBE907C2D}"
EndProject
@@ -11,6 +11,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedCalculator.Browser"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvancedCalculator.Desktop", "AdvancedCalculator.Desktop\AdvancedCalculator.Desktop.csproj", "{E39C7683-E7DA-4730-B805-7F1F9DB624CB}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}"
+ ProjectSection(SolutionItems) = preProject
+ build.ps1 = build.ps1
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -39,4 +44,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {223763A0-49A6-44DD-8702-1FB65776F5E9}
+ EndGlobalSection
EndGlobal
diff --git a/src/AdvancedCalculator/AdvancedCalculator.csproj b/src/AdvancedCalculator/AdvancedCalculator.csproj
index 293a585..1a66cf0 100644
--- a/src/AdvancedCalculator/AdvancedCalculator.csproj
+++ b/src/AdvancedCalculator/AdvancedCalculator.csproj
@@ -19,6 +19,6 @@
-
+
diff --git a/src/build.ps1 b/src/build.ps1
new file mode 100644
index 0000000..eaba9fc
--- /dev/null
+++ b/src/build.ps1
@@ -0,0 +1,123 @@
+#!/usr/bin/env pwsh
+<#
+ build.ps1 – cross-platform build for Avalonia (Windows exe, Web/WASM, Android APK)
+ Usage:
+ pwsh ./build.ps1 # build all
+ pwsh ./build.ps1 -Targets win # just Windows
+ pwsh ./build.ps1 -Targets web,android # pick targets
+ pwsh ./build.ps1 -Version 1.2.3 # override version (else tries git tag)
+#>
+
+param(
+ [string[]]$Targets = @('win','web','android'),
+ [string]$Configuration = 'Release',
+ [string]$Version = ''
+)
+
+$ErrorActionPreference = 'Stop'
+
+# --- PROJECT PATHS (tweak to your repo) ---
+$ProjDesktop = 'src/AdvancedCalculator/AdvancedCalculator.csproj'
+$ProjWeb = 'src/AdvancedCalculator/AdvancedCalculator.csproj' # same csproj if multi-targeting Browser
+$ProjAndroid = 'src/AdvancedCalculator.Android/AdvancedCalculator.Android.csproj'
+
+# --- ARTIFACTS ---
+$Root = Split-Path -Parent $MyInvocation.MyCommand.Path
+Set-Location $Root
+$Artifacts = Join-Path $Root 'artifacts'
+$OutWin = Join-Path $Artifacts 'win-x64'
+$OutWeb = Join-Path $Artifacts 'web'
+$OutDroid = Join-Path $Artifacts 'android'
+New-Item -ItemType Directory -Force -Path $Artifacts,$OutWin,$OutWeb,$OutDroid | Out-Null
+
+# --- Resolve dotnet exe once ---
+$DotnetExe = (Get-Command dotnet -CommandType Application).Source
+
+function Invoke-Dotnet {
+ param([Parameter(ValueFromRemainingArguments = $true)][string[]]$Args)
+ Write-Host ">> dotnet $($Args -join ' ')" -ForegroundColor Cyan
+ & $DotnetExe @Args
+ $code = $LASTEXITCODE
+ if ($code -ne 0) { throw "dotnet exited with $code" }
+}
+
+# --- Version (git tag 'vX.Y.Z' > explicit > empty) ---
+if (-not $Version) {
+ try {
+ $tag = (git describe --tags --abbrev=0) 2>$null
+ if ($LASTEXITCODE -eq 0 -and $tag) { $Version = $tag.TrimStart('v') }
+ } catch { }
+}
+if ($Version) { Write-Host "Using Version: $Version" -ForegroundColor Yellow }
+
+# --- Ensure SDK/workloads present ---
+Invoke-Dotnet --info | Out-Null
+Invoke-Dotnet workload restore
+
+# ---------------- TARGETS ----------------
+
+if ($Targets -contains 'win') {
+ # Windows desktop single-file exe (buildable from any OS)
+ $args = @(
+ 'publish', $ProjDesktop,
+ '-c', $Configuration,
+ '-r', 'win-x64',
+ '--self-contained', 'true',
+ '-p:PublishSingleFile=true',
+ '-p:IncludeNativeLibrariesForSelfExtract=true',
+ '-o', $OutWin
+ )
+ if ($Version) { $args += "-p:Version=$Version" }
+ Invoke-Dotnet @args
+}
+
+if ($Targets -contains 'web') {
+ # Browser/WASM (Avalonia Web)
+ $args = @(
+ 'publish', $ProjWeb,
+ '-c', $Configuration,
+ '-r', 'browser-wasm',
+ '--self-contained', 'true',
+ '-o', $OutWeb
+ )
+ if ($Version) { $args += "-p:Version=$Version" }
+ Invoke-Dotnet @args
+
+ Set-Content -Path (Join-Path $OutWeb 'README.txt') -Value @'
+Serve these files over HTTP(S). Do not open index.html via file://
+Place the folder behind any static web server.
+'@
+}
+
+if ($Targets -contains 'android') {
+ # Android APK (unsigned unless env vars provided)
+ $baseArgs = @(
+ 'publish', $ProjAndroid,
+ '-c', $Configuration,
+ '-r', 'android-arm64',
+ '--self-contained', 'true',
+ '-p:AndroidPackageFormat=apk',
+ '-o', $OutDroid
+ )
+ if ($Version) { $baseArgs += "-p:Version=$Version" }
+
+ # Unsigned build
+ Invoke-Dotnet @baseArgs
+
+ # Optional signing if env vars are set
+ if ($env:ANDROID_KEYSTORE -and $env:ANDROID_KEY_ALIAS -and $env:ANDROID_KEY_PASSWORD) {
+ $signArgs = $baseArgs + @(
+ '-p:AndroidKeyStore=true',
+ "-p:AndroidSigningKeyStore=$($env:ANDROID_KEYSTORE)",
+ "-p:AndroidSigningKeyAlias=$($env:ANDROID_KEY_ALIAS)",
+ "-p:AndroidSigningKeyPass=$($env:ANDROID_KEY_PASSWORD)",
+ "-p:AndroidSigningStorePass=$($env:ANDROID_KEY_PASSWORD)"
+ )
+ Invoke-Dotnet @signArgs
+ }
+}
+
+Write-Host "`nArtifacts -> $Artifacts" -ForegroundColor Green
+Write-Host " Windows: $OutWin" -ForegroundColor Green
+Write-Host " Web: $OutWeb" -ForegroundColor Green
+Write-Host " Android: $OutDroid" -ForegroundColor Green