You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix: the running-stream banner's width and drop its status line - #94
The running-stream banner is a top safeAreaInset on the catalog page's scroll view, and that
region is the scroll view's frame. A ScrollView is as wide as its widest content — a rail still
on its skeleton runs past the window — so the banner was laid out centred on that inflated width
and only its right-hand end was on screen. The page now clamps the scroll view to the page width,
the same way the hero and the session banner already clamp their own.
The banner also drops its "Playing in its own window" line, which restated where the stream plays.
Both catalog status banners now share one chrome view instead of duplicating it.
swift run OpenNOWBenchmarks all on fix/nec-74-running-stream-banner-width at 0f294127b554.
Informational only, not a merge gate. These timings come from a shared CI runner and move
between runs, so this comment claims no regression: there is no stable baseline to compare
against yet. Gating starts only once that baseline exists (Phase 0, P0-2).
Package
Operation
N
Iterations
Mean (ms)
Min (ms)
Max (ms)
OPN.GameServices
JSONDecoder.decode([OPNGameInfo])
96
25
6.483
5.265
9.218
OPN.GameServices
JSONEncoder.encode([OPNGameInfo])
96
25
5.012
4.186
8.663
OPN.GameServices
OPNCatalogGameObject init map
96
50
0.222
0.179
0.273
OPN.GameServices
OPNCatalogGameObject swiftValue map
96
50
0.249
0.215
0.306
OPN.GameServices
OPNCatalogPanelObject init map
96
50
0.760
0.594
1.814
OpenNOW
CatalogViewModel.catalogSections equivalent
96
500
0.006
0.004
0.120
OpenNOW
CatalogViewModel.marqueeGames equivalent
96
500
0.046
0.040
0.086
OpenNOW
selected detail section scan equivalent
96
2000
0.011
0.010
0.087
OpenNOW
best image URL derivation equivalent
96
500
0.116
0.106
0.203
OPN.GameServices
JSONDecoder.decode([OPNGameInfo])
500
25
30.577
25.988
40.309
OPN.GameServices
JSONEncoder.encode([OPNGameInfo])
500
25
25.253
23.177
32.000
OPN.GameServices
OPNCatalogGameObject init map
500
50
1.198
1.065
1.773
OPN.GameServices
OPNCatalogGameObject swiftValue map
500
50
1.422
1.160
2.603
OPN.GameServices
OPNCatalogPanelObject init map
500
50
1.103
1.012
1.311
OpenNOW
CatalogViewModel.catalogSections equivalent
500
500
0.006
0.004
0.016
OpenNOW
CatalogViewModel.marqueeGames equivalent
500
500
0.120
0.101
0.177
OpenNOW
selected detail section scan equivalent
500
2000
0.023
0.017
0.433
OpenNOW
best image URL derivation equivalent
500
500
0.717
0.562
1.673
OPN.GameServices
JSONDecoder.decode([OPNGameInfo])
1500
25
94.037
86.465
110.869
OPN.GameServices
JSONEncoder.encode([OPNGameInfo])
1500
25
74.630
67.917
93.050
OPN.GameServices
OPNCatalogGameObject init map
1500
50
4.194
3.226
6.904
OPN.GameServices
OPNCatalogGameObject swiftValue map
1500
50
3.956
3.448
5.925
OPN.GameServices
OPNCatalogPanelObject init map
1500
50
2.781
2.126
5.276
OpenNOW
CatalogViewModel.catalogSections equivalent
1500
500
0.005
0.004
0.017
OpenNOW
CatalogViewModel.marqueeGames equivalent
1500
500
0.267
0.218
0.406
OpenNOW
selected detail section scan equivalent
1500
2000
0.048
0.039
0.126
OpenNOW
best image URL derivation equivalent
1500
500
2.086
1.670
4.539
OPN.GameServices
JSONDecoder.decode([OPNGameInfo])
3000
25
176.262
164.609
194.482
OPN.GameServices
JSONEncoder.encode([OPNGameInfo])
3000
25
143.695
128.319
159.581
OPN.GameServices
OPNCatalogGameObject init map
3000
50
7.289
6.620
10.716
OPN.GameServices
OPNCatalogGameObject swiftValue map
3000
50
8.597
7.729
12.101
OPN.GameServices
OPNCatalogPanelObject init map
3000
50
2.874
2.540
8.343
OpenNOW
CatalogViewModel.catalogSections equivalent
3000
500
0.005
0.004
0.017
OpenNOW
CatalogViewModel.marqueeGames equivalent
3000
500
0.266
0.229
0.532
OpenNOW
selected detail section scan equivalent
3000
2000
0.050
0.039
0.250
OpenNOW
best image URL derivation equivalent
3000
500
4.516
3.893
8.075
OPN.Common
OPNStreamPreferences.loadDeviceCapabilities
n/a
200
0.512
0.120
55.905
OPN.Common
OPNStreamPreferences.loadMicrophoneDeviceOptions
n/a
100
0.002
0.000
0.142
OPN.Common
OPNStreamPreferences.loadProfile/effectiveProfile
n/a
1000
0.548
0.394
1.520
Full JSON: opennow-benchmarks artifact in this workflow run — one file per audit
(benchmark-catalog.json, benchmark-stream-preferences.json). The same JSON is printed in the Run benchmark suite job log, which outlives the artifact.
Updated in place on every benchmark run for this PR.
anderson-oki
changed the title
NEC-74: keep the running-stream banner the width of the page
NEC-74: fix the running-stream banner's width and drop its status line
Oct 4, 2026
anderson-oki
changed the title
NEC-74: fix the running-stream banner's width and drop its status line
fix: the running-stream banner's width and drop its status line
Oct 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The running-stream banner is a top
safeAreaInseton the catalog page's scroll view, and thatregion is the scroll view's frame. A
ScrollViewis as wide as its widest content — a rail stillon its skeleton runs past the window — so the banner was laid out centred on that inflated width
and only its right-hand end was on screen. The page now clamps the scroll view to the page width,
the same way the hero and the session banner already clamp their own.
The banner also drops its "Playing in its own window" line, which restated where the stream plays.
Both catalog status banners now share one chrome view instead of duplicating it.
Closes NEC-74