From 37752f9f0785e81583bd2fdbce0b990531b8bce3 Mon Sep 17 00:00:00 2001 From: thepra Date: Thu, 15 Oct 2026 08:08:37 +0200 Subject: [PATCH] me-web? 0.3: the path in drawn steps, each step's checks under it, the real RAM - The path from this device to the internet is a vertical zig-zag of larger drawings (this phone or computer, the router or the mobile network, a shared exit, the provider's building, the globe) that pulse while their step is checked, joined by curved wires with the link and its speed, and a few details beside each: the model, the addresses inside and outside the router and which port-opening protocols answer, the AS number, the public addresses. - The results are grouped under the step they concern, in the path's order, with the same drawing as a heading; tapping a step in the path scrolls to its checks. - After a check, the status and "Check again" move to the end, beside sharing. - Memory reads the device's RAM: on Android it showed the runtime's heap limit (0.1 GB). Labelled "Memory (RAM)" in every language. Free disk is read for the app's own folder, so Android shows it too. The device's model is read on Android, Linux and Windows. - Two icons drew outside their box (the outside test's shield, the calls and games radio tower): joined Lucide elements started with a relative move. Fixed; twelve unused icons deleted. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB --- CLAUDE.md | 12 +- Directory.Build.props | 2 +- README.md | 4 +- src/MeWeb.Android/AndroidPlatform.cs | 27 +++ src/MeWeb.App/App.axaml | 1 + src/MeWeb.App/Resources/Art.axaml | 38 +++ src/MeWeb.App/Resources/Icons.axaml | 23 +- src/MeWeb.App/Resources/Styles.axaml | 147 ++++++++++- src/MeWeb.App/Strings/am.json | 2 +- src/MeWeb.App/Strings/ar.json | 2 +- src/MeWeb.App/Strings/ay.json | 2 +- src/MeWeb.App/Strings/az-Cyrl.json | 2 +- src/MeWeb.App/Strings/az.json | 2 +- src/MeWeb.App/Strings/be.json | 2 +- src/MeWeb.App/Strings/bg.json | 2 +- src/MeWeb.App/Strings/bi.json | 2 +- src/MeWeb.App/Strings/bn.json | 2 +- src/MeWeb.App/Strings/bs-Cyrl.json | 2 +- src/MeWeb.App/Strings/bs.json | 2 +- src/MeWeb.App/Strings/ca.json | 2 +- src/MeWeb.App/Strings/cs.json | 2 +- src/MeWeb.App/Strings/da.json | 2 +- src/MeWeb.App/Strings/de.json | 2 +- src/MeWeb.App/Strings/dv.json | 2 +- src/MeWeb.App/Strings/dz.json | 2 +- src/MeWeb.App/Strings/el.json | 2 +- src/MeWeb.App/Strings/en.json | 2 +- src/MeWeb.App/Strings/es.json | 2 +- src/MeWeb.App/Strings/et.json | 2 +- src/MeWeb.App/Strings/fa.json | 2 +- src/MeWeb.App/Strings/fi.json | 2 +- src/MeWeb.App/Strings/fil.json | 2 +- src/MeWeb.App/Strings/fj.json | 2 +- src/MeWeb.App/Strings/fr.json | 2 +- src/MeWeb.App/Strings/ga.json | 2 +- src/MeWeb.App/Strings/gil.json | 2 +- src/MeWeb.App/Strings/gn.json | 2 +- src/MeWeb.App/Strings/gsw.json | 2 +- src/MeWeb.App/Strings/he.json | 2 +- src/MeWeb.App/Strings/hi.json | 2 +- src/MeWeb.App/Strings/hif.json | 2 +- src/MeWeb.App/Strings/ho.json | 2 +- src/MeWeb.App/Strings/hr.json | 2 +- src/MeWeb.App/Strings/ht.json | 2 +- src/MeWeb.App/Strings/hu.json | 2 +- src/MeWeb.App/Strings/hy.json | 2 +- src/MeWeb.App/Strings/id.json | 2 +- src/MeWeb.App/Strings/is.json | 2 +- src/MeWeb.App/Strings/it.json | 2 +- src/MeWeb.App/Strings/ja.json | 2 +- src/MeWeb.App/Strings/ka.json | 2 +- src/MeWeb.App/Strings/kk.json | 2 +- src/MeWeb.App/Strings/km.json | 2 +- src/MeWeb.App/Strings/ko.json | 2 +- src/MeWeb.App/Strings/ky.json | 2 +- src/MeWeb.App/Strings/lb.json | 2 +- src/MeWeb.App/Strings/lo.json | 2 +- src/MeWeb.App/Strings/lt.json | 2 +- src/MeWeb.App/Strings/lv.json | 2 +- src/MeWeb.App/Strings/mg.json | 2 +- src/MeWeb.App/Strings/mh.json | 2 +- src/MeWeb.App/Strings/mi.json | 2 +- src/MeWeb.App/Strings/mk.json | 2 +- src/MeWeb.App/Strings/mn.json | 2 +- src/MeWeb.App/Strings/ms-Arab.json | 2 +- src/MeWeb.App/Strings/ms.json | 2 +- src/MeWeb.App/Strings/mt.json | 2 +- src/MeWeb.App/Strings/my.json | 2 +- src/MeWeb.App/Strings/nb.json | 2 +- src/MeWeb.App/Strings/nd.json | 2 +- src/MeWeb.App/Strings/ne.json | 2 +- src/MeWeb.App/Strings/nl.json | 2 +- src/MeWeb.App/Strings/nn.json | 2 +- src/MeWeb.App/Strings/no.json | 2 +- src/MeWeb.App/Strings/ny.json | 2 +- src/MeWeb.App/Strings/pl.json | 2 +- src/MeWeb.App/Strings/ps.json | 2 +- src/MeWeb.App/Strings/pt.json | 2 +- src/MeWeb.App/Strings/qu.json | 2 +- src/MeWeb.App/Strings/rn.json | 2 +- src/MeWeb.App/Strings/ro.json | 2 +- src/MeWeb.App/Strings/ru.json | 2 +- src/MeWeb.App/Strings/rw.json | 2 +- src/MeWeb.App/Strings/sg.json | 2 +- src/MeWeb.App/Strings/si.json | 2 +- src/MeWeb.App/Strings/sk.json | 2 +- src/MeWeb.App/Strings/sl.json | 2 +- src/MeWeb.App/Strings/sm.json | 2 +- src/MeWeb.App/Strings/sn.json | 2 +- src/MeWeb.App/Strings/so.json | 2 +- src/MeWeb.App/Strings/sq.json | 2 +- src/MeWeb.App/Strings/sr-Latn.json | 2 +- src/MeWeb.App/Strings/sr.json | 2 +- src/MeWeb.App/Strings/ss.json | 2 +- src/MeWeb.App/Strings/st.json | 2 +- src/MeWeb.App/Strings/sv.json | 2 +- src/MeWeb.App/Strings/sw.json | 2 +- src/MeWeb.App/Strings/ta.json | 2 +- src/MeWeb.App/Strings/tet.json | 2 +- src/MeWeb.App/Strings/tg.json | 2 +- src/MeWeb.App/Strings/th.json | 2 +- src/MeWeb.App/Strings/ti.json | 2 +- src/MeWeb.App/Strings/tk.json | 2 +- src/MeWeb.App/Strings/tn.json | 2 +- src/MeWeb.App/Strings/to.json | 2 +- src/MeWeb.App/Strings/tpi.json | 2 +- src/MeWeb.App/Strings/tr.json | 2 +- src/MeWeb.App/Strings/tvl.json | 2 +- src/MeWeb.App/Strings/tzm.json | 2 +- src/MeWeb.App/Strings/uk.json | 2 +- src/MeWeb.App/Strings/ur.json | 2 +- src/MeWeb.App/Strings/uz-Cyrl.json | 2 +- src/MeWeb.App/Strings/uz.json | 2 +- src/MeWeb.App/Strings/vi.json | 2 +- src/MeWeb.App/Strings/wni.json | 2 +- src/MeWeb.App/Strings/wo.json | 2 +- src/MeWeb.App/Strings/yo.json | 2 +- src/MeWeb.App/Strings/zdj.json | 2 +- src/MeWeb.App/Strings/zh.json | 2 +- src/MeWeb.App/ViewModels/MainViewModel.cs | 91 ++++--- src/MeWeb.App/ViewModels/PathNodeViewModel.cs | 48 +++- src/MeWeb.App/Views/MainView.axaml | 229 ++++++++++-------- src/MeWeb.App/Views/MainView.axaml.cs | 31 ++- src/MeWeb.Core/Net/DeviceCheck.cs | 12 +- src/MeWeb.Core/Net/LocalNetwork.cs | 85 +++++++ tools/Screenshots/Program.cs | 8 +- 126 files changed, 699 insertions(+), 281 deletions(-) create mode 100644 src/MeWeb.App/Resources/Art.axaml 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 @@ + + - + + + + + + + + + + + + + + + + - - + + +