fix(ui): invariant decimals + LocaleState test isolation + drawer offset + bundled Plotly

Cross-cutting polish that surfaced while Phase 8 was being implemented:

* Invariant-culture formatting on every decimal ToString("0.00" / "0.##")
  (OddsCell, OddsTimeline, SeverityBadge, AnomalyEvidence,
  Pages/Events/Detail) — previously the comma/dot decimal separator
  switched with the locale and broke tabular alignment + tests.

* LocaleState constructor no longer mutates process-wide ambient culture;
  apply only happens through Set(...). Stops parallel bUnit test runs
  leaking ru-RU into each other's threads.

* MainLayout: drawer-open state now offsets main content / footer / appbar
  by the drawer width (248px) so the sidebar no longer overlaps content.
  Mobile breakpoint (≤720px) keeps the original full-width layout.

* wwwroot/index.html (Marathon.UI RCL): switched from Plotly CDN to the
  bundled "_content/Plotly.Blazor/plotly-2.35.3.min.js" — works offline
  and matches the Plotly.Blazor 5.4.1 version pin.

* Marathon.Hosts.WpfBlazor/wwwroot/index.html: host-level page that
  BlazorWebView's HostPage attribute resolves to. Same Plotly bundle,
  no autostart="false" (BlazorWebView auto-starts).
This commit is contained in:
2026-05-09 15:11:13 +03:00
parent 9f090cec1f
commit a627c360c3
9 changed files with 106 additions and 14 deletions
+5 -3
View File
@@ -105,7 +105,7 @@
<td>@BetTypeLabel(row.Type)</td>
<td>@SideLabel(row.Side)</td>
<td class="m-mono" style="text-align: right;">@FormatThreshold(row.Threshold)</td>
<td class="m-mono" style="text-align: right; font-weight: 500;">@row.Rate.ToString("0.00")</td>
<td class="m-mono" style="text-align: right; font-weight: 500;">@row.Rate.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture)</td>
</tr>
}
</tbody>
@@ -334,6 +334,8 @@
_ => s.ToString(),
};
private static string FormatRate(decimal? r) => r is { } v ? v.ToString("0.00") : "—";
private static string FormatThreshold(decimal? v) => v is { } x ? x.ToString("0.##") : "—";
private static string FormatRate(decimal? r) =>
r is { } v ? v.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture) : "—";
private static string FormatThreshold(decimal? v) =>
v is { } x ? x.ToString("0.##", System.Globalization.CultureInfo.InvariantCulture) : "—";
}