diff --git a/CLAUDE.md b/CLAUDE.md index bcba9af..d1e480f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,7 +60,7 @@ The Android release key: alias `meweb`, certificate SHA-256 |---|---| | `src/MeWeb.Shared` | `Endpoints.cs` (routes and hosts), wire contracts, `MeWebJsonContext`, generated `BuildInfo` | | `src/MeWeb.Core` | the checks, no UI: `Net/` (address kinds, local network, TTL route, STUN, the probe's `Answerer`, DNS, speed, the device), `Router/` (UPnP IGD, NAT-PMP, PCP; `PortMapper` opens and removes mappings, `Leftovers` remembers them across a crash), `Mail/` (port 25, reverse name, blocklists through the user's resolver), `Knowledge/` (provider map and profiles), `History/` (checks, shared submissions), `Checks/` (`CheckRunner`, `Verdicts`, `Reach`, `Uses`, `ServerProbe`, `SharePayload`) | -| `src/MeWeb.App` | Avalonia views and view models, `Services/Localizer.cs` (+ `{s:Tr Key}`), `Strings/.json`, `Resources/Colors.axaml` | +| `src/MeWeb.App` | Avalonia views and view models, `Services/Localizer.cs` (+ `{s:Tr Key}`), `Strings/.json`, `Resources/Colors.axaml`; `Resources/Icons.axaml` (Lucide, 24 units, for cards and lists) and `Resources/Art.axaml` (the path's drawings, 48 units: `ArtBase`, up to three `Beat`s that pulse in turn while the step is checked and take its verdict colour, and a `Spin` for the globe). The path is a vertical zig-zag of `PathNodeViewModel`s, and the same nodes carry the result cards (`Cards`, regrouped by `MainViewModel.Home`), so a step in the path and its group of cards are one object | | `src/MeWeb.Desktop` | desktop head (`meweb` executable), Windows manifest | | `src/MeWeb.Android` | Android head (`software.arasaka.meweb`), resources, manifest | | `src/MeWeb.Server` | `meweb.arasaka.software`: `/api/info`, `/api/ip`, the download page `/` and `/privacy` (en, it), `/download/{platform}` from the latest Gitea release, the probe (`/api/probe/ticket`, `/api/probe/{id}`) and shared findings (`/api/share`, files under `/var/lib/meweb/shares`, swept after `KeepDays`) | @@ -93,6 +93,16 @@ The Android release key: alias `meweb`, certificate SHA-256 - **Shared findings are files, not Mongo.** The box's Mongo has auth on and me-web? has no user there; a file per submission under the unit's `StateDirectory`, with only the delete token's SHA-256, needs no credentials. - **An address inside right-to-left text reorders around `→`.** `Texts.Isolate` wraps every literal value in U+2068/U+2069. +- **A Lucide icon joined from several SVG elements must start each one with an absolute `M`.** A leading `m` is + absolute only as a path's first command; joined after another element it becomes relative and draws outside the box. + The shield and the radio tower did that until 0.3; check new geometry by walking its points against 24 (or 48). +- **On Android `GC.GetGCMemoryInfo().TotalAvailableMemoryBytes` is the runtime's limit, not the RAM** (0.1 GB on a + phone with several): `AndroidPlatform` reads `ActivityManager.MemoryInfo.TotalMem`, Linux `/proc/meminfo`. +- **`DriveInfo` on Unix takes any path** (it calls `statvfs`): pass the app's folder, not `/`, or Android reads the + read-only root and reports no free disk at all. +- **An IPv6 address only wraps at a colon if it is allowed to**: the path's detail lines put U+200B after each colon; + they are plain `TextBlock`s for that reason, so a copy never carries the invisible character (the cards' values, + which are selectable, stay untouched). - **Avalonia 12 Android head:** `[Application] MainApplication : AvaloniaAndroidApplication` plus a non-generic `AvaloniaMainActivity`; the main view comes through `IActivityApplicationLifetime.MainViewFactory`, checked before diff --git a/Directory.Build.props b/Directory.Build.props index 54b1571..7089896 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.2.0 + 0.3.0 me-web? Arasaka di Hvozdikov Yevheniy © 2026 Arasaka di Hvozdikov Yevheniy diff --git a/README.md b/README.md index 36892f6..7af97f6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ words, what you could host at home, what stands in the way, and what would fix i ## What it checks -me-web? checks, and draws as a path from this device to the internet: +me-web? draws the path from this device to the internet one step at a time (this device, your router, any shared +exit of your provider, your provider, the internet), with the details it found for each, and groups what it checks +under the step it concerns: - whether you are online, or behind a login page; - how this device is connected, and the address your router gave it; diff --git a/src/MeWeb.Android/AndroidPlatform.cs b/src/MeWeb.Android/AndroidPlatform.cs index 34f4725..2cd2775 100644 --- a/src/MeWeb.Android/AndroidPlatform.cs +++ b/src/MeWeb.Android/AndroidPlatform.cs @@ -1,4 +1,6 @@ +using Android.App; using Android.Content; +using Android.OS; using Android.Net; using Android.Net.Wifi; @@ -16,6 +18,31 @@ public class AndroidPlatform : SystemPlatform public override bool? HasBattery => true; + public override string SystemName => $"Android {Build.VERSION.Release} (API {(int)Build.VERSION.SdkInt}, {System.Runtime.InteropServices.RuntimeInformation.OSArchitecture})"; + + public override string Model + { + get + { + var maker = Build.Manufacturer?.Trim() ?? ""; + var model = Build.Model?.Trim() ?? ""; + if (model.Length == 0) return null; + if (maker.Length == 0 || model.StartsWith(maker, StringComparison.OrdinalIgnoreCase)) return model; + return $"{char.ToUpperInvariant(maker[0])}{maker[1..]} {model}"; + } + } + + public override long MemoryBytes + { + get + { + if (Context.GetSystemService(Context.ActivityService) is not ActivityManager activities) return base.MemoryBytes; + var memory = new ActivityManager.MemoryInfo(); + activities.GetMemoryInfo(memory); + return memory.TotalMem > 0 ? memory.TotalMem : base.MemoryBytes; + } + } + public override bool ShareLink(string url, string title) { var send = new Intent(Intent.ActionSend); diff --git a/src/MeWeb.App/App.axaml b/src/MeWeb.App/App.axaml index 973829a..b8321a9 100644 --- a/src/MeWeb.App/App.axaml +++ b/src/MeWeb.App/App.axaml @@ -8,6 +8,7 @@ + diff --git a/src/MeWeb.App/Resources/Art.axaml b/src/MeWeb.App/Resources/Art.axaml new file mode 100644 index 0000000..f52a710 --- /dev/null +++ b/src/MeWeb.App/Resources/Art.axaml @@ -0,0 +1,38 @@ + + M 17 4 H 31 A 4 4 0 0 1 35 8 V 40 A 4 4 0 0 1 31 44 H 17 A 4 4 0 0 1 13 40 V 8 A 4 4 0 0 1 17 4 Z M 22 8.5 H 26 M 21 39.5 H 27 + M 18 16 H 30 + M 18 22 H 30 + M 18 28 H 25 + + M 11 9 H 37 A 2.5 2.5 0 0 1 39.5 11.5 V 31 H 8.5 V 11.5 A 2.5 2.5 0 0 1 11 9 Z M 8.5 31 L 4.6 37 A 1.4 1.4 0 0 0 5.8 39 H 42.2 A 1.4 1.4 0 0 0 43.4 37 L 39.5 31 M 21 35 H 27 + M 14 16 H 28 + M 14 21 H 34 + M 14 26 H 23 + + M 9 26 H 39 A 4 4 0 0 1 43 30 V 35 A 4 4 0 0 1 39 39 H 9 A 4 4 0 0 1 5 35 V 30 A 4 4 0 0 1 9 26 Z M 11 39 V 42 M 37 39 V 42 M 29 32.5 H 37 + M 20.46 18.46 A 5 5 0 0 1 27.54 18.46 M 10 32.5 H 12 + M 16.93 14.93 A 10 10 0 0 1 31.07 14.93 M 15 32.5 H 17 + M 13.39 11.39 A 15 15 0 0 1 34.61 11.39 M 20 32.5 H 22 + + M 24 20 L 16 44 M 24 20 L 32 44 M 21.4 28.5 H 26.6 M 19.5 34 H 28.5 M 12 44 H 36 M 21 17 A 3 3 0 1 0 27 17 A 3 3 0 1 0 21 17 Z + M 19.05 12.05 A 7 7 0 0 0 19.05 21.95 M 28.95 12.05 A 7 7 0 0 1 28.95 21.95 + M 15.51 8.51 A 12 12 0 0 0 15.51 25.49 M 32.49 8.51 A 12 12 0 0 1 32.49 25.49 + M 11.98 4.98 A 17 17 0 0 0 11.98 29.02 M 36.02 4.98 A 17 17 0 0 1 36.02 29.02 + + M 15 6 H 33 A 3 3 0 0 1 36 9 V 15 A 3 3 0 0 1 33 18 H 15 A 3 3 0 0 1 12 15 V 9 A 3 3 0 0 1 15 6 Z M 17 12 H 19 M 24 18 V 26 M 10 33 V 30 A 4 4 0 0 1 14 26 H 34 A 4 4 0 0 1 38 30 V 33 M 24 26 V 33 + M 5.5 44 V 38.5 L 10 34.5 L 14.5 38.5 V 44 Z + M 19.5 44 V 38.5 L 24 34.5 L 28.5 38.5 V 44 Z + M 33.5 44 V 38.5 L 38 34.5 L 42.5 38.5 V 44 Z + + M 15 44 V 8 A 2 2 0 0 1 17 6 H 31 A 2 2 0 0 1 33 8 V 44 M 15 22 H 8 A 2 2 0 0 0 6 24 V 44 M 33 22 H 40 A 2 2 0 0 1 42 24 V 44 M 3 44 H 45 M 21 44 V 38 H 27 V 44 M 24 6 V 2 + M 19.5 12 H 21.5 M 26.5 12 H 28.5 M 9.5 28 H 11 M 37 34 H 38.5 + M 19.5 18 H 21.5 M 26.5 24 H 28.5 M 37 28 H 38.5 + M 26.5 18 H 28.5 M 19.5 24 H 21.5 M 19.5 30 H 21.5 M 26.5 30 H 28.5 M 9.5 34 H 11 + + M 6 24 A 18 18 0 1 0 42 24 A 18 18 0 1 0 6 24 Z M 6 24 H 42 M 8.4 15 H 39.6 M 8.4 33 H 39.6 + M 24 6 A 9 18 0 0 0 24 42 A 9 18 0 0 0 24 6 Z + + M 0 0 C 0 0.62 1 0.38 1 1 + M 1 0 C 1 0.62 0 0.38 0 1 + diff --git a/src/MeWeb.App/Resources/Icons.axaml b/src/MeWeb.App/Resources/Icons.axaml index eb67fa0..f7ad42e 100644 --- a/src/MeWeb.App/Resources/Icons.axaml +++ b/src/MeWeb.App/Resources/Icons.axaml @@ -1,31 +1,21 @@ - M 18 5 a 2 2 0 0 1 2 2 v 8.526 a 2 2 0 0 0 .212 .897 l 1.068 2.127 a 1 1 0 0 1 -.9 1.45 H 3.62 a 1 1 0 0 1 -.9 -1.45 l 1.068 -2.127 A 2 2 0 0 0 4 15.526 V 7 a 2 2 0 0 1 2 -2 z M 20.054 15.987 H 3.946 - M 7 2 H 17 A 2 2 0 0 1 19 4 V 20 A 2 2 0 0 1 17 22 H 7 A 2 2 0 0 1 5 20 V 4 A 2 2 0 0 1 7 2 Z M 12 18 h .01 M 12 20 h .01 M 2 8.82 a 15 15 0 0 1 20 0 M 5 12.859 a 10 10 0 0 1 14 0 M 8.5 16.429 a 5 5 0 0 1 7 0 + M 2 20 h .01 M 7 20 v -4 M 12 20 v -8 M 17 20 V 8 M 22 4 v 16 M 17 19 a 1 1 0 0 1 -1 -1 v -2 a 2 2 0 0 1 2 -2 h 2 a 2 2 0 0 1 2 2 v 2 a 1 1 0 0 1 -1 1 z M 17 21 v -2 M 19 14 V 6.5 a 1 1 0 0 0 -7 0 v 11 a 1 1 0 0 1 -7 0 V 10 M 21 21 v -2 M 3 5 V 3 M 4 10 a 2 2 0 0 1 -2 -2 V 6 a 1 1 0 0 1 1 -1 h 4 a 1 1 0 0 1 1 1 v 2 a 2 2 0 0 1 -2 2 z M 7 5 V 3 M 4 14 H 20 A 2 2 0 0 1 22 16 V 20 A 2 2 0 0 1 20 22 H 4 A 2 2 0 0 1 2 20 V 16 A 2 2 0 0 1 4 14 Z M 6.01 18 H 6 M 10.01 18 H 10 M 15 10 v 4 M 17.84 7.17 a 4 4 0 0 0 -5.66 0 M 20.66 4.34 a 8 8 0 0 0 -11.31 0 M 10 12 h 4 M 10 8 h 4 M 14 21 v -3 a 2 2 0 0 0 -4 0 v 3 M 6 10 H 4 a 2 2 0 0 0 -2 2 v 7 a 2 2 0 0 0 2 2 h 16 a 2 2 0 0 0 2 -2 V 9 a 2 2 0 0 0 -2 -2 h -2 M 6 21 V 5 a 2 2 0 0 1 2 -2 h 8 a 2 2 0 0 1 2 2 v 16 - M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z M 12 2 a 14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0 -20 M 2 12 h 20 + M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z M 12 2 a 14.5 14.5 0 0 0 0 20 a 14.5 14.5 0 0 0 0 -20 M 2 12 h 20 M 17 16 H 21 A 1 1 0 0 1 22 17 V 21 A 1 1 0 0 1 21 22 H 17 A 1 1 0 0 1 16 21 V 17 A 1 1 0 0 1 17 16 Z M 3 16 H 7 A 1 1 0 0 1 8 17 V 21 A 1 1 0 0 1 7 22 H 3 A 1 1 0 0 1 2 21 V 17 A 1 1 0 0 1 3 16 Z M 10 2 H 14 A 1 1 0 0 1 15 3 V 7 A 1 1 0 0 1 14 8 H 10 A 1 1 0 0 1 9 7 V 3 A 1 1 0 0 1 10 2 Z M 5 16 v -3 a 1 1 0 0 1 1 -1 h 12 a 1 1 0 0 1 1 1 v 3 M 12 12 V 8 - M 4.9 16.1 C 1 12.2 1 5.8 4.9 1.9 M 7.8 4.7 a 6.14 6.14 0 0 0 -.8 7.5 M 10 9 A 2 2 0 1 0 14 9 A 2 2 0 1 0 10 9 Z M 16.2 4.8 c 2 2 2.26 5.11 .8 7.47 M 19.1 1.9 a 9.96 9.96 0 0 1 0 14.1 M 9.5 18 h 5 m 8 22 4 -11 4 11 - M 3 12 a 9 9 0 1 0 9 -9 9.75 9.75 0 0 0 -6.74 2.74 L 3 8 M 3 3 v 5 h 5 M 12 7 v 5 l 4 2 + M 4.9 16.1 C 1 12.2 1 5.8 4.9 1.9 M 7.8 4.7 a 6.14 6.14 0 0 0 -.8 7.5 M 10 9 A 2 2 0 1 0 14 9 A 2 2 0 1 0 10 9 Z M 16.2 4.8 c 2 2 2.26 5.11 .8 7.47 M 19.1 1.9 a 9.96 9.96 0 0 1 0 14.1 M 9.5 18 h 5 M 8 22 l 4 -11 l 4 11 + M 3 12 a 9 9 0 1 0 9 -9 a 9.75 9.75 0 0 0 -6.74 2.74 L 3 8 M 3 3 v 5 h 5 M 12 7 v 5 l 4 2 M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z M 12 16 v -4 M 12 8 h .01 - M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z m 16 9 -5.5 5.5 L 8 12 - m 21.73 18 -8 -14 a 2 2 0 0 0 -3.48 0 l -8 14 A 2 2 0 0 0 4 21 h 16 a 2 2 0 0 0 1.73 -3 M 12 9 v 4 M 12 17 h .01 - M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z m 15 9 -6 6 m 9 9 6 6 - M 2 12 A 10 10 0 1 0 22 12 A 10 10 0 1 0 2 12 Z M 9.09 9 a 3 3 0 0 1 5.83 1 c 0 2 -3 3 -3 3 M 12 17 h .01 - M 3 12 a 9 9 0 0 1 9 -9 9.75 9.75 0 0 1 6.74 2.74 L 21 8 M 21 3 v 5 h -5 M 21 12 a 9 9 0 0 1 -9 9 9.75 9.75 0 0 1 -6.74 -2.74 L 3 16 M 8 16 H 3 v 5 - m 5 8 6 6 m 4 14 6 -6 2 -3 M 2 5 h 12 M 7 2 h 1 m 22 22 -5 -10 -5 10 M 14 18 h 6 - M 12 22 v -5 M 15 8 V 2 M 17 8 a 1 1 0 0 1 1 1 v 4 a 4 4 0 0 1 -4 4 h -4 a 4 4 0 0 1 -4 -4 V 9 a 1 1 0 0 1 1 -1 z M 9 8 V 2 M 12.83 2.18 a 2 2 0 0 0 -1.66 0 L 2.6 6.08 a 1 1 0 0 0 0 1.83 l 8.58 3.91 a 2 2 0 0 0 1.66 0 l 8.58 -3.9 a 1 1 0 0 0 0 -1.83 z M 2 12 a 1 1 0 0 0 .58 .91 l 8.6 3.91 a 2 2 0 0 0 1.65 0 l 8.58 -3.9 A 1 1 0 0 0 22 12 M 2 17 a 1 1 0 0 0 .58 .91 l 8.6 3.91 a 2 2 0 0 0 1.65 0 l 8.58 -3.9 A 1 1 0 0 0 22 17 M 20 10 c 0 4.993 -5.539 10.193 -7.399 11.799 a 1 1 0 0 1 -1.202 0 C 9.539 20.193 4 14.993 4 10 a 8 8 0 0 1 16 0 M 9 10 A 3 3 0 1 0 15 10 A 3 3 0 1 0 9 10 Z - m 6 9 6 6 6 -6 M 4 2 H 20 A 2 2 0 0 1 22 4 V 8 A 2 2 0 0 1 20 10 H 4 A 2 2 0 0 1 2 8 V 4 A 2 2 0 0 1 4 2 Z M 4 14 H 20 A 2 2 0 0 1 22 16 V 20 A 2 2 0 0 1 20 22 H 4 A 2 2 0 0 1 2 20 V 16 A 2 2 0 0 1 4 14 Z M 6 6 L 6.01 6 M 6 18 L 6.01 18 - M 20 13 c 0 5 -3.5 7.5 -7.66 8.95 a 1 1 0 0 1 -.67 -.01 C 7.5 20.5 4 18 4 13 V 6 a 1 1 0 0 1 1 -1 c 2 0 4.5 -1.2 6.24 -2.72 a 1.17 1.17 0 0 1 1.52 0 C 14.51 3.81 17 5 19 5 a 1 1 0 0 1 1 1 z m 9 12 2 2 4 -4 + M 20 13 c 0 5 -3.5 7.5 -7.66 8.95 a 1 1 0 0 1 -.67 -.01 C 7.5 20.5 4 18 4 13 V 6 a 1 1 0 0 1 1 -1 c 2 0 4.5 -1.2 6.24 -2.72 a 1.17 1.17 0 0 1 1.52 0 C 14.51 3.81 17 5 19 5 a 1 1 0 0 1 1 1 z M 9 12 l 2 2 l 4 -4 M 3 19 A 3 3 0 1 0 9 19 A 3 3 0 1 0 3 19 Z M 9 19 h 8.5 a 3.5 3.5 0 0 0 0 -7 h -11 a 3.5 3.5 0 0 1 0 -7 H 15 M 15 5 A 3 3 0 1 0 21 5 A 3 3 0 1 0 15 5 Z - M 7 7 h 10 v 10 M 7 17 17 7 - M 12 15 V 3 M 21 15 v 4 a 2 2 0 0 1 -2 2 H 5 a 2 2 0 0 1 -2 -2 v -4 m 7 10 5 5 5 -5 + M 7 7 h 10 v 10 M 7 17 L 17 7 M 15 21 v -8 a 1 1 0 0 0 -1 -1 h -4 a 1 1 0 0 0 -1 1 v 8 M 3 10 a 2 2 0 0 1 .709 -1.528 l 7 -6 a 2 2 0 0 1 2.582 0 l 7 6 A 2 2 0 0 1 21 10 v 9 a 2 2 0 0 1 -2 2 H 5 a 2 2 0 0 1 -2 -2 z m 22 11 -1.296 -1.296 a 2.4 2.4 0 0 0 -3.408 0 L 11 16 M 4 8 a 2 2 0 0 0 -2 2 v 10 a 2 2 0 0 0 2 2 h 10 a 2 2 0 0 0 2 -2 M 12 7 A 1 1 0 1 0 14 7 A 1 1 0 1 0 12 7 Z M 10 2 H 20 A 2 2 0 0 1 22 4 V 14 A 2 2 0 0 1 20 16 H 10 A 2 2 0 0 1 8 14 V 4 A 2 2 0 0 1 10 2 Z M 6 11 L 10 11 M 8 9 L 8 13 M 15 12 L 15.01 12 M 18 10 L 18.01 10 M 17.32 5 H 6.68 a 4 4 0 0 0 -3.978 3.59 c -.006 .052 -.01 .101 -.017 .152 C 2.604 9.416 2 14.456 2 16 a 3 3 0 0 0 3 3 c 1 0 1.5 -.5 2 -1 l 1.414 -1.414 A 2 2 0 0 1 9.828 16 h 4.344 a 2 2 0 0 1 1.414 .586 L 17 18 c .5 .5 1 1 2 1 a 3 3 0 0 0 3 -3 c 0 -1.545 -.604 -6.584 -.685 -7.258 -.007 -.05 -.011 -.1 -.017 -.151 A 4 4 0 0 0 17.32 5 z @@ -34,5 +24,4 @@ m 12 14 4 -4 M 3.34 19 a 10 10 0 1 1 17.32 0 M 12 20 v 2 M 12 2 v 2 M 17 20 v 2 M 17 2 v 2 M 2 12 h 2 M 2 17 h 2 M 2 7 h 2 M 20 12 h 2 M 20 17 h 2 M 20 7 h 2 M 7 20 v 2 M 7 2 v 2 M 6 4 H 18 A 2 2 0 0 1 20 6 V 18 A 2 2 0 0 1 18 20 H 6 A 2 2 0 0 1 4 18 V 6 A 2 2 0 0 1 6 4 Z M 9 8 H 15 A 1 1 0 0 1 16 9 V 15 A 1 1 0 0 1 15 16 H 9 A 1 1 0 0 1 8 15 V 9 A 1 1 0 0 1 9 8 Z M 15 5 A 3 3 0 1 0 21 5 A 3 3 0 1 0 15 5 Z M 3 12 A 3 3 0 1 0 9 12 A 3 3 0 1 0 3 12 Z M 15 19 A 3 3 0 1 0 21 19 A 3 3 0 1 0 15 19 Z M 8.59 13.51 L 15.42 17.49 M 15.41 6.51 L 8.59 10.49 - M 4 3 H 7 A 1 1 0 0 1 8 4 V 7 A 1 1 0 0 1 7 8 H 4 A 1 1 0 0 1 3 7 V 4 A 1 1 0 0 1 4 3 Z M 17 3 H 20 A 1 1 0 0 1 21 4 V 7 A 1 1 0 0 1 20 8 H 17 A 1 1 0 0 1 16 7 V 4 A 1 1 0 0 1 17 3 Z M 4 16 H 7 A 1 1 0 0 1 8 17 V 20 A 1 1 0 0 1 7 21 H 4 A 1 1 0 0 1 3 20 V 17 A 1 1 0 0 1 4 16 Z M 21 16 h -3 a 2 2 0 0 0 -2 2 v 3 M 21 21 v .01 M 12 7 v 3 a 2 2 0 0 1 -2 2 H 7 M 3 12 h .01 M 12 3 h .01 M 12 16 v .01 M 16 12 h 1 M 21 12 v .01 M 12 21 v -1 diff --git a/src/MeWeb.App/Resources/Styles.axaml b/src/MeWeb.App/Resources/Styles.axaml index 206f4a0..83c43d0 100644 --- a/src/MeWeb.App/Resources/Styles.axaml +++ b/src/MeWeb.App/Resources/Styles.axaml @@ -152,14 +152,26 @@ - + + - @@ -167,14 +179,124 @@ + + - + + + + + + + + + + + + + + + + - - + + +