feat: refine branded operator experience

Add the MBN-branded startup intro, semantic sidebar icons, and refined card-based operator visuals. Strengthen packaged UI and input smoke coverage for the updated experience.
This commit is contained in:
2026-07-24 01:26:13 +09:00
parent f43483533a
commit b050f2f06c
25 changed files with 2316 additions and 164 deletions

View File

@@ -834,6 +834,11 @@ public sealed class LegacyPackageInputSmokeContractTests
"delete-selected-playlist-rows",
"selections[1].shift !== true",
"shiftRangeDeletedRowIds = [rangeStartRowId, rangeEndRowId]");
Assert.Contains("neutral-pointer guard", request, StringComparison.Ordinal);
Assert.Contains("await moveMouse(neutralPoint)", request,
StringComparison.Ordinal);
Assert.Contains("neutralSignature !== guardSignature", request,
StringComparison.Ordinal);
Assert.DoesNotContain("Input.dispatchMouseEvent", request,
StringComparison.Ordinal);
@@ -934,6 +939,39 @@ public sealed class LegacyPackageInputSmokeContractTests
StringComparison.Ordinal);
}
[Fact]
public void StartupIntroMustBeDismissedBeforeThePhysicalInputHarnessStarts()
{
var wait = Slice(
Runner,
"function Wait-StartupIntroDismissed",
"function Assert-NoExistingContentDialog");
Assert.Contains("[datetime]::UtcNow.AddSeconds(4)", wait,
StringComparison.Ordinal);
Assert.Contains("매일경제TV V-STOCK 시작 화면", wait,
StringComparison.Ordinal);
Assert.Contains("[Windows.Automation.PropertyCondition]::new(", wait,
StringComparison.Ordinal);
Assert.Contains("$intro.Current.IsOffscreen", wait,
StringComparison.Ordinal);
Assert.Contains("Assert-ExactApplicationStillRunning", wait,
StringComparison.Ordinal);
Assert.Contains("Assert-NoTornadoConnection", wait,
StringComparison.Ordinal);
Assert.Contains("remained visible beyond its four-second bound", wait,
StringComparison.Ordinal);
var launch = Slice(
Runner,
"$script:Phase = 'package launch'",
"$harnessRun = Invoke-NodeHarnessUnderTcpWatch");
AssertInOrder(
launch,
"Wait-ExactLoopbackListener",
"Wait-StartupIntroDismissed",
"$script:Phase = 'real input harness'");
}
[Fact]
public void DebugAppXMustMatchTheLatestMsixAndCurrentWebSourceBeforeLaunch()
{
@@ -946,7 +984,10 @@ public sealed class LegacyPackageInputSmokeContractTests
StringComparison.Ordinal);
Assert.Contains("[IO.Compression.ZipFile]::OpenRead($msix)", guard,
StringComparison.Ordinal);
Assert.Contains("'AppxManifest.xml'", guard, StringComparison.Ordinal);
Assert.Contains("'Assets/StartupHero.png'", guard, StringComparison.Ordinal);
Assert.Contains("'Web/app.js'", guard, StringComparison.Ordinal);
Assert.Contains("'Web/Brand/logo.png'", guard, StringComparison.Ordinal);
Assert.Contains("'Web/index.html'", guard, StringComparison.Ordinal);
Assert.Contains("'Web/playout-ui.js'", guard, StringComparison.Ordinal);
Assert.Contains("'Web/styles.css'", guard, StringComparison.Ordinal);
@@ -956,7 +997,20 @@ public sealed class LegacyPackageInputSmokeContractTests
StringComparison.Ordinal);
Assert.Contains("registered Debug AppX is stale", guard,
StringComparison.Ordinal);
Assert.Contains("Web\\app.js", guard, StringComparison.Ordinal);
foreach (var relativeSource in new[]
{
"Web\\app.js",
"Web\\index.html",
"Web\\styles.css",
"Web\\workspace-navigation.js"
})
{
Assert.Contains(relativeSource, guard, StringComparison.Ordinal);
}
Assert.Contains("$sourcePath = Join-Path $projectRoot $relativeSource", guard,
StringComparison.Ordinal);
Assert.Contains("$installedPath = Join-Path $InstallLocation $relativeSource", guard,
StringComparison.Ordinal);
Assert.Contains(
"Assert-DebugAppXMatchesLatestPackage ([string]$package.InstallLocation)",
Runner,