Some checks failed
CI / build-and-test (push) Failing after 33s
Replaces the Stone theme with Wild Dragon branding (canvas #0A0A0A, accent cyan #97EDF0, secondary #9AE0FD, coral alert #FB819C — sourced from wilddragon.net) and reorganizes MainWindow into a Microsoft Teams-style three-column layout: a 72px left rail (logo + Participants/Settings nav + engine-status indicator), a center content area (header + participants card), and a right settings panel. Adds InitialsConverter so participant avatars render real initials (Brendon Power -> 'BP', '(Local)' -> 'L') instead of a generic glyph. Drops the obsolete StoneTheme.xaml; the project now ships exactly one theme dictionary. Typography: Inter (with Segoe UI Variable Display fallback) for the sans stack, JetBrains Mono (Cascadia Mono fallback) for machine names and timecodes — matching the wilddragon.net site. Verified live against the running Teams meeting: app launches, participant 'Brendon Power' displays with avatar, settings panel surfaces NDI groups + Hide-Local toggle, engine status pill shows green/live.
30 lines
1.3 KiB
C#
30 lines
1.3 KiB
C#
using System.Globalization;
|
|
using System.Windows.Data;
|
|
|
|
namespace TeamsISO.App.Converters;
|
|
|
|
/// <summary>
|
|
/// Converts a display name to up to two uppercase initials for an avatar bubble.
|
|
/// "Brendon Power" → "BP". "(Local)" → "L". Falls back to "·" for empty inputs.
|
|
/// </summary>
|
|
public sealed class InitialsConverter : IValueConverter
|
|
{
|
|
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
|
|
{
|
|
var s = value as string;
|
|
if (string.IsNullOrWhiteSpace(s)) return "·";
|
|
|
|
// Strip surrounding parens / punctuation that would otherwise become
|
|
// useless initials (e.g. "(Local)" should yield "L", not "(").
|
|
var cleaned = new string(s.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)).ToArray()).Trim();
|
|
if (cleaned.Length == 0) return "·";
|
|
|
|
var parts = cleaned.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
if (parts.Length == 0) return "·";
|
|
if (parts.Length == 1) return char.ToUpperInvariant(parts[0][0]).ToString();
|
|
return $"{char.ToUpperInvariant(parts[0][0])}{char.ToUpperInvariant(parts[^1][0])}";
|
|
}
|
|
|
|
public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
|
|
=> throw new NotSupportedException();
|
|
}
|