feat: modernize legacy operator interface

This commit is contained in:
2026-07-21 01:23:37 +09:00
parent f1fe65ebe4
commit 44a7d90413
9 changed files with 941 additions and 9 deletions

View File

@@ -12,6 +12,7 @@ public sealed class LegacyWorkspaceLayoutContractTests
"Web");
private static readonly string Markup = File.ReadAllText(Path.Combine(WebRoot, "index.html"));
private static readonly string Styles = File.ReadAllText(Path.Combine(WebRoot, "styles.css"));
private static readonly string App = File.ReadAllText(Path.Combine(WebRoot, "app.js"));
private static readonly string Navigation = File.ReadAllText(
Path.Combine(WebRoot, "workspace-navigation.js"));
@@ -54,6 +55,62 @@ public sealed class LegacyWorkspaceLayoutContractTests
Styles);
}
[Fact]
public void ModernOperatorThemePreservesAccessibleAndSemanticStates()
{
Assert.Contains(
"Modern operator theme: visual-only overrides; geometry and native contracts stay intact",
Styles,
StringComparison.Ordinal);
Assert.Contains("--ui-canvas:", Styles, StringComparison.Ordinal);
Assert.Contains("--ui-accent:", Styles, StringComparison.Ordinal);
Assert.Contains("--ui-success:", Styles, StringComparison.Ordinal);
Assert.Contains("--ui-danger:", Styles, StringComparison.Ordinal);
Assert.Contains(
"font-family: \"Segoe UI Variable\", \"Segoe UI\", \"Noto Sans KR\"",
Styles,
StringComparison.Ordinal);
Assert.Matches(
new Regex(
@"button:focus-visible,[\s\S]*?outline:\s*2px solid var\(--ui-accent\)",
RegexOptions.CultureInvariant),
Styles);
Assert.Contains(".playlist-data-row.on-air.selected", Styles, StringComparison.Ordinal);
Assert.Contains(".playout-actions .take-in:not(:disabled)", Styles, StringComparison.Ordinal);
Assert.Contains(".playout-actions .next:not(:disabled)", Styles, StringComparison.Ordinal);
Assert.Contains(".playout-actions .take-out:not(:disabled)", Styles, StringComparison.Ordinal);
Assert.Contains(
".playlist-data-row[data-active=\"true\"]:not(.on-air)",
Styles,
StringComparison.Ordinal);
Assert.Contains(
".playlist-data-row[aria-selected=\"true\"]:not(.on-air)",
Styles,
StringComparison.Ordinal);
Assert.Contains("@media (forced-colors: active)", Styles, StringComparison.Ordinal);
Assert.Contains("scrollbar-gutter: stable", Styles, StringComparison.Ordinal);
Assert.Contains("@media (prefers-reduced-motion: reduce)", Styles, StringComparison.Ordinal);
Assert.Contains("aria-keyshortcuts=\"F8\"", Markup, StringComparison.Ordinal);
Assert.Contains("aria-keyshortcuts=\"Escape\"", Markup, StringComparison.Ordinal);
Assert.Contains(
".connection-state.dry-run:not(.outcome-unknown)",
Styles,
StringComparison.Ordinal);
Assert.Contains("accessibleStates.push(\"현재 PGM\")", App, StringComparison.Ordinal);
Assert.Contains("accessibleStates.push(\"송출 후보\")", App, StringComparison.Ordinal);
Assert.Contains("accessibleStates.push(\"삭제 선택됨\")", App, StringComparison.Ordinal);
Assert.Matches(
new Regex(
@"id=""stock-search-button""[\s\S]*?<svg[^>]*viewBox=""0 0 24 24""",
RegexOptions.CultureInvariant),
Markup);
Assert.Matches(
new Regex(
@"class=""playlist-heading-icon""[\s\S]*?<svg[^>]*viewBox=""0 0 24 24""",
RegexOptions.CultureInvariant),
Markup);
}
[Fact]
public void NavigationChangesPresentationWithoutNativeOrStoredState()
{