bitmovin-player-ui 4.20.2 → 4.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/AGENTS.md +61 -0
  2. package/CHANGELOG.md +17 -0
  3. package/dist/css/bitmovinplayer-ui.css +1 -1
  4. package/dist/css/bitmovinplayer-ui.css.map +1 -1
  5. package/dist/js/bitmovinplayer-ui.js +1 -1
  6. package/dist/js/bitmovinplayer-ui.js.map +1 -1
  7. package/dist/js/framework/components/Component.d.ts +1 -0
  8. package/dist/js/framework/components/Component.js +3 -0
  9. package/dist/js/framework/components/settings/DynamicSettingsPanelItem.js +1 -9
  10. package/dist/js/framework/main.d.ts +1 -0
  11. package/dist/js/framework/main.js +2 -22
  12. package/dist/js/framework/polyfills.d.ts +21 -0
  13. package/dist/js/framework/polyfills.js +60 -0
  14. package/dist/js/framework/utils/AdBreakTracker.js +6 -2
  15. package/dist/js/framework/utils/BrowserUtils.js +1 -3
  16. package/docs/classes/AdClickOverlay.html +28 -28
  17. package/docs/classes/AdControlBar.html +31 -31
  18. package/docs/classes/AdCounterLabel.html +31 -31
  19. package/docs/classes/AdMessageLabel.html +31 -31
  20. package/docs/classes/AdSkipButton.html +27 -27
  21. package/docs/classes/AdStatusOverlay.html +31 -31
  22. package/docs/classes/AirPlayToggleButton.html +35 -35
  23. package/docs/classes/AudioQualitySelectBox.html +41 -41
  24. package/docs/classes/AudioTrackListBox.html +39 -39
  25. package/docs/classes/AudioTrackSelectBox.html +41 -41
  26. package/docs/classes/BackgroundColorSelectBox.html +41 -41
  27. package/docs/classes/BackgroundOpacitySelectBox.html +41 -41
  28. package/docs/classes/BrowserUtils.html +2 -2
  29. package/docs/classes/BufferingOverlay.html +31 -31
  30. package/docs/classes/Button.html +27 -27
  31. package/docs/classes/CaptionToggleButton.html +35 -35
  32. package/docs/classes/CastStatusOverlay.html +31 -31
  33. package/docs/classes/CastToggleButton.html +35 -35
  34. package/docs/classes/CastUIContainer.html +31 -31
  35. package/docs/classes/CharacterEdgeColorSelectBox.html +41 -41
  36. package/docs/classes/CharacterEdgeSelectBox.html +41 -41
  37. package/docs/classes/ClickOverlay.html +28 -28
  38. package/docs/classes/CloseButton.html +27 -27
  39. package/docs/classes/Component.html +25 -25
  40. package/docs/classes/Container.html +31 -31
  41. package/docs/classes/ContextMenu.html +39 -39
  42. package/docs/classes/ControlBar.html +31 -31
  43. package/docs/classes/DismissClickOverlay.html +31 -31
  44. package/docs/classes/DynamicSettingsPanelItem.html +34 -34
  45. package/docs/classes/EcoModeContainer.html +32 -32
  46. package/docs/classes/EcoModeToggleButton.html +35 -35
  47. package/docs/classes/ErrorMessageOverlay.html +31 -31
  48. package/docs/classes/FontColorSelectBox.html +41 -41
  49. package/docs/classes/FontFamilySelectBox.html +41 -41
  50. package/docs/classes/FontOpacitySelectBox.html +41 -41
  51. package/docs/classes/FontSizeSelectBox.html +41 -41
  52. package/docs/classes/FontStyleSelectBox.html +41 -41
  53. package/docs/classes/FullscreenToggleButton.html +35 -35
  54. package/docs/classes/HugePlaybackToggleButton.html +35 -35
  55. package/docs/classes/HugeReplayButton.html +27 -27
  56. package/docs/classes/I18n.html +2 -2
  57. package/docs/classes/Icon.html +25 -25
  58. package/docs/classes/InteractiveContextMenuItem.html +34 -34
  59. package/docs/classes/InteractiveSettingsPanelItem.html +34 -34
  60. package/docs/classes/ItemSelectionList.html +41 -41
  61. package/docs/classes/Label.html +31 -31
  62. package/docs/classes/ListBox.html +39 -39
  63. package/docs/classes/ListSelector.html +41 -41
  64. package/docs/classes/MetadataLabel.html +31 -31
  65. package/docs/classes/NavigationGroup.html +11 -11
  66. package/docs/classes/PersistentPreferencesToggleButton.html +35 -35
  67. package/docs/classes/PictureInPictureToggleButton.html +35 -35
  68. package/docs/classes/PlaybackSpeedSelectBox.html +41 -41
  69. package/docs/classes/PlaybackTimeLabel.html +32 -32
  70. package/docs/classes/PlaybackToggleButton.html +35 -35
  71. package/docs/classes/PlaybackToggleOverlay.html +31 -31
  72. package/docs/classes/PlayerContextMenu.html +39 -39
  73. package/docs/classes/PlayerInsightsPanel.html +39 -39
  74. package/docs/classes/PlayerUtils.LiveStreamDetector.html +2 -2
  75. package/docs/classes/PlayerUtils.TimeShiftAvailabilityDetector.html +2 -2
  76. package/docs/classes/PlayerWrapper.html +4 -4
  77. package/docs/classes/QuickSeekButton.html +27 -27
  78. package/docs/classes/RecommendationItem.html +25 -25
  79. package/docs/classes/RecommendationOverlay.html +31 -31
  80. package/docs/classes/ReplayButton.html +27 -27
  81. package/docs/classes/RootNavigationGroup.html +11 -11
  82. package/docs/classes/SeekBar.html +36 -36
  83. package/docs/classes/SeekBarLabel.html +35 -35
  84. package/docs/classes/SelectBox.html +41 -41
  85. package/docs/classes/SettingsPanel.html +39 -39
  86. package/docs/classes/SettingsPanelItem.html +33 -33
  87. package/docs/classes/SettingsPanelNavigationGroup.html +11 -11
  88. package/docs/classes/SettingsPanelNavigationGroupConfig.html +2 -2
  89. package/docs/classes/SettingsPanelPage.html +33 -33
  90. package/docs/classes/SettingsPanelPageBackButton.html +29 -29
  91. package/docs/classes/SettingsPanelPageNavigatorButton.html +29 -29
  92. package/docs/classes/SettingsPanelPageOpenButton.html +29 -29
  93. package/docs/classes/SettingsPanelSelectOption.html +34 -34
  94. package/docs/classes/SettingsPanelSeparator.html +31 -31
  95. package/docs/classes/SettingsToggleButton.html +35 -35
  96. package/docs/classes/ShadowDomManager.html +2 -2
  97. package/docs/classes/SmallCenteredPlaybackToggleButton.html +35 -35
  98. package/docs/classes/Spacer.html +25 -25
  99. package/docs/classes/SpatialNavigation.html +4 -4
  100. package/docs/classes/SubtitleListBox.html +39 -39
  101. package/docs/classes/SubtitleOverlay.html +31 -31
  102. package/docs/classes/SubtitleSelectBox.html +41 -41
  103. package/docs/classes/SubtitleSettingSelectBox.html +41 -41
  104. package/docs/classes/SubtitleSettingsPanelPage.html +33 -33
  105. package/docs/classes/SubtitleSettingsResetButton.html +27 -27
  106. package/docs/classes/TitleBar.html +31 -31
  107. package/docs/classes/ToggleButton.html +35 -35
  108. package/docs/classes/ToggleSettingsPanelItem.html +34 -34
  109. package/docs/classes/TouchControlOverlay.html +31 -31
  110. package/docs/classes/TvNoiseCanvas.html +25 -25
  111. package/docs/classes/UIContainer.html +31 -31
  112. package/docs/classes/UIInstanceManager.html +16 -16
  113. package/docs/classes/UIManager.html +17 -17
  114. package/docs/classes/UIPreferencesManager.html +5 -5
  115. package/docs/classes/VRToggleButton.html +35 -35
  116. package/docs/classes/VideoQualitySelectBox.html +42 -42
  117. package/docs/classes/VolumeControlButton.html +33 -33
  118. package/docs/classes/VolumeSlider.html +36 -36
  119. package/docs/classes/VolumeToggleButton.html +35 -35
  120. package/docs/classes/Watermark.html +28 -28
  121. package/docs/classes/WindowColorSelectBox.html +41 -41
  122. package/docs/classes/WindowOpacitySelectBox.html +41 -41
  123. package/docs/enums/ButtonStyle.html +5 -5
  124. package/docs/enums/LabelStyle.html +4 -4
  125. package/docs/enums/MetadataLabelContent.html +3 -3
  126. package/docs/enums/NavigationDirection.html +2 -2
  127. package/docs/enums/PlaybackTimeLabelMode.html +5 -5
  128. package/docs/enums/PlayerUtils.PlayerState.html +2 -2
  129. package/docs/enums/UIComponentLayoutOverride.html +2 -2
  130. package/docs/enums/UIUtils.KeyCode.html +2 -2
  131. package/docs/enums/UIVariantIdentifier.html +2 -2
  132. package/docs/enums/ViewMode.html +3 -3
  133. package/docs/functions/ArrayUtils.remove.html +1 -1
  134. package/docs/functions/ErrorUtils.defaultMobileV3ErrorMessageTranslator.html +1 -1
  135. package/docs/functions/PlayerUtils.clampValueToRange.html +1 -1
  136. package/docs/functions/PlayerUtils.getCurrentTimeRelativeToSeekableRange.html +1 -1
  137. package/docs/functions/PlayerUtils.getSeekableRangeRespectingLive.html +1 -1
  138. package/docs/functions/PlayerUtils.getSeekableRangeStart.html +1 -1
  139. package/docs/functions/PlayerUtils.getState.html +1 -1
  140. package/docs/functions/PlayerUtils.isTimeShiftAvailable.html +1 -1
  141. package/docs/functions/StorageUtils.getItem.html +1 -1
  142. package/docs/functions/StorageUtils.getObject.html +1 -1
  143. package/docs/functions/StorageUtils.removeItem.html +1 -1
  144. package/docs/functions/StorageUtils.setItem.html +1 -1
  145. package/docs/functions/StorageUtils.setObject.html +1 -1
  146. package/docs/functions/StorageUtils.setStorageApiDisabled.html +1 -1
  147. package/docs/functions/StringUtils.replaceAdMessagePlaceholders.html +1 -1
  148. package/docs/functions/StringUtils.secondsToText.html +1 -1
  149. package/docs/functions/StringUtils.secondsToTime.html +1 -1
  150. package/docs/functions/UIFactory.buildCastReceiverUI.html +1 -1
  151. package/docs/functions/UIFactory.buildSmallScreenUI.html +1 -1
  152. package/docs/functions/UIFactory.buildSubtitleUI.html +1 -1
  153. package/docs/functions/UIFactory.buildTvUI.html +1 -1
  154. package/docs/functions/UIFactory.buildUI.html +1 -1
  155. package/docs/functions/UIFactory.defaultLayouts.ads.html +1 -1
  156. package/docs/functions/UIFactory.defaultLayouts.castReceiver.html +1 -1
  157. package/docs/functions/UIFactory.defaultLayouts.emptyState.html +1 -1
  158. package/docs/functions/UIFactory.defaultLayouts.main.html +1 -1
  159. package/docs/functions/UIFactory.defaultLayouts.smallScreen.html +1 -1
  160. package/docs/functions/UIFactory.defaultLayouts.smallScreenAds.html +1 -1
  161. package/docs/functions/UIFactory.defaultLayouts.subtitle.html +1 -1
  162. package/docs/functions/UIFactory.defaultLayouts.tv.html +1 -1
  163. package/docs/functions/UIFactory.defaultLayouts.tvAds.html +1 -1
  164. package/docs/functions/UIUtils.traverseTree.html +1 -1
  165. package/docs/interfaces/ActiveUiChangedArgs.html +3 -3
  166. package/docs/interfaces/AdControlBarConfig.html +12 -12
  167. package/docs/interfaces/AdSkipButtonConfig.html +16 -16
  168. package/docs/interfaces/AudioTrackListBoxConfig.html +19 -19
  169. package/docs/interfaces/BufferingOverlayConfig.html +13 -13
  170. package/docs/interfaces/ButtonConfig.html +14 -14
  171. package/docs/interfaces/ClickOverlayConfig.html +15 -15
  172. package/docs/interfaces/CloseButtonConfig.html +15 -15
  173. package/docs/interfaces/ComponentConfig.html +11 -11
  174. package/docs/interfaces/ComponentFocusChangedEventArgs.html +2 -2
  175. package/docs/interfaces/ComponentHoverChangedEventArgs.html +2 -2
  176. package/docs/interfaces/ContainerConfig.html +12 -12
  177. package/docs/interfaces/ContextMenuConfig.html +17 -17
  178. package/docs/interfaces/ControlBarConfig.html +12 -12
  179. package/docs/interfaces/DismissClickOverlayConfig.html +14 -14
  180. package/docs/interfaces/DynamicSettingsPanelItemConfig.html +19 -19
  181. package/docs/interfaces/ErrorMessageMap.html +1 -1
  182. package/docs/interfaces/ErrorMessageOverlayConfig.html +13 -13
  183. package/docs/interfaces/ErrorMessageTranslator.html +1 -1
  184. package/docs/interfaces/ExternalRecommendationLink.html +3 -3
  185. package/docs/interfaces/InteractiveContextMenuItemConfig.html +18 -18
  186. package/docs/interfaces/InternalUIConfig.html +26 -26
  187. package/docs/interfaces/LabelConfig.html +14 -14
  188. package/docs/interfaces/ListBoxConfig.html +20 -20
  189. package/docs/interfaces/ListItem.html +2 -2
  190. package/docs/interfaces/ListItemFilter.html +1 -1
  191. package/docs/interfaces/ListItemLabelTranslator.html +1 -1
  192. package/docs/interfaces/ListSelectorConfig.html +12 -12
  193. package/docs/interfaces/LocalizationConfig.html +5 -5
  194. package/docs/interfaces/MetadataLabelConfig.html +15 -15
  195. package/docs/interfaces/PlaybackTimeLabelConfig.html +16 -16
  196. package/docs/interfaces/PlaybackToggleButtonConfig.html +19 -19
  197. package/docs/interfaces/PlaybackToggleOverlayConfig.html +13 -13
  198. package/docs/interfaces/PlayerContextMenuConfig.html +18 -18
  199. package/docs/interfaces/PlayerInsightsPanelConfig.html +18 -18
  200. package/docs/interfaces/PlayerUtils.LiveStreamDetectorEventArgs.html +2 -2
  201. package/docs/interfaces/PlayerUtils.TimeShiftAvailabilityChangedArgs.html +2 -2
  202. package/docs/interfaces/QuickSeekButtonConfig.html +15 -15
  203. package/docs/interfaces/RecommendationConfig.html +4 -4
  204. package/docs/interfaces/RecommendationItemConfig.html +12 -12
  205. package/docs/interfaces/RecommendationsApi.html +4 -4
  206. package/docs/interfaces/SeekBarConfig.html +19 -19
  207. package/docs/interfaces/SeekBarLabelConfig.html +12 -12
  208. package/docs/interfaces/SeekBarMarker.html +2 -2
  209. package/docs/interfaces/SeekPreviewArgs.html +3 -3
  210. package/docs/interfaces/SeekPreviewEventArgs.html +4 -4
  211. package/docs/interfaces/SettingsPanelConfig.html +17 -17
  212. package/docs/interfaces/SettingsPanelItemConfig.html +17 -17
  213. package/docs/interfaces/SettingsPanelPageConfig.html +13 -13
  214. package/docs/interfaces/SettingsPanelPageNavigatorConfig.html +17 -17
  215. package/docs/interfaces/SettingsPanelSelectOptionConfig.html +18 -18
  216. package/docs/interfaces/SettingsPanelSeparatorConfig.html +12 -12
  217. package/docs/interfaces/SettingsPanelState.html +2 -2
  218. package/docs/interfaces/SettingsToggleButtonConfig.html +20 -20
  219. package/docs/interfaces/ShadowDomConfig.html +4 -4
  220. package/docs/interfaces/SubtitleListBoxConfig.html +19 -19
  221. package/docs/interfaces/SubtitleOverlayConfig.html +14 -14
  222. package/docs/interfaces/SubtitleSettingSelectBoxConfig.html +12 -12
  223. package/docs/interfaces/SubtitleSettingsPanelPageConfig.html +13 -13
  224. package/docs/interfaces/TimelineMarker.html +6 -6
  225. package/docs/interfaces/TimelineMarkersApi.html +4 -4
  226. package/docs/interfaces/TitleBarConfig.html +13 -13
  227. package/docs/interfaces/ToggleButtonConfig.html +18 -18
  228. package/docs/interfaces/ToggleSettingsPanelItemConfig.html +17 -17
  229. package/docs/interfaces/TouchControlOverlayConfig.html +17 -17
  230. package/docs/interfaces/UIComponentConfigMap.html +2 -2
  231. package/docs/interfaces/UIComponentConfigOverrides.html +10 -10
  232. package/docs/interfaces/UIComponentLayoutOverrideMap.html +2 -2
  233. package/docs/interfaces/UIComponentLayoutOverrides.html +10 -10
  234. package/docs/interfaces/UIConditionContext.html +10 -10
  235. package/docs/interfaces/UIConditionResolver.html +1 -1
  236. package/docs/interfaces/UIConfig.html +24 -24
  237. package/docs/interfaces/UIContainerConfig.html +17 -17
  238. package/docs/interfaces/UIUtils.TreeTraversalCallback.html +1 -1
  239. package/docs/interfaces/UIVariant.html +5 -5
  240. package/docs/interfaces/UIVariantFactory.html +4 -4
  241. package/docs/interfaces/ViewModeChangedEventArgs.html +2 -2
  242. package/docs/interfaces/Vocabularies.html +1 -1
  243. package/docs/interfaces/Vocabulary.html +2 -2
  244. package/docs/interfaces/VolumeControlButtonConfig.html +14 -14
  245. package/docs/interfaces/VolumeSliderConfig.html +21 -21
  246. package/docs/interfaces/WatermarkConfig.html +15 -15
  247. package/docs/interfaces/WrappedPlayer.html +2 -2
  248. package/docs/media/CHANGELOG.md +17 -0
  249. package/docs/types/CustomVocabulary.html +1 -1
  250. package/docs/types/ListItemComparator.html +1 -1
  251. package/docs/types/LocalizableText.html +1 -1
  252. package/docs/types/Localizer.html +1 -1
  253. package/docs/variables/ErrorUtils.defaultErrorMessages.html +1 -1
  254. package/docs/variables/ErrorUtils.defaultWebErrorMessageTranslator.html +1 -1
  255. package/docs/variables/StringUtils.FORMAT_HHMMSS.html +1 -1
  256. package/docs/variables/StringUtils.FORMAT_MMSS.html +1 -1
  257. package/docs/variables/i18n.html +1 -1
  258. package/docs/variables/version.html +1 -1
  259. package/package.json +5 -2
  260. package/playwright.config.ts +34 -0
  261. package/src/scss/components/settings/_settings-panel-item.scss +20 -0
  262. package/src/scss/components/settings/_settings-panel.scss +3 -2
  263. package/src/ts/components/Component.ts +3 -0
  264. package/src/ts/components/settings/DynamicSettingsPanelItem.ts +2 -9
  265. package/src/ts/main.ts +2 -24
  266. package/src/ts/polyfills.ts +66 -0
  267. package/src/ts/utils/AdBreakTracker.ts +6 -2
  268. package/src/ts/utils/BrowserUtils.ts +1 -5
  269. package/test/browser/README.md +98 -0
  270. package/test/browser/control-bar-layout.pw.ts +73 -0
  271. package/test/browser/harness.ts +243 -0
  272. package/test/browser/helpers/control-bar.ts +149 -0
  273. package/test/browser/playback-toggle.pw.ts +18 -0
  274. package/test/browser/tsconfig.json +13 -0
  275. package/test/browser/ui-variants.pw.ts +11 -0
package/AGENTS.md CHANGED
@@ -94,6 +94,8 @@ export interface UIComponentConfigMap {
94
94
 
95
95
  - Use targeted checks while iterating:
96
96
  - `npx jest <spec> --runInBand`
97
+ - `npm run test:browser` for browser-dependent UI behavior (see below)
98
+ - `npm run typecheck:browser` while iterating on the Playwright harness or specs
97
99
  - `npm run lint-ts`
98
100
  - `npm run lint-sass`
99
101
  - `npx tsc --noEmit`
@@ -103,3 +105,62 @@ export interface UIComponentConfigMap {
103
105
  - For Android or iOS SDK impact, record what was manually checked. If mobile SDK verification was needed but not possible in the current environment, say that explicitly and do not treat browser checks as equivalent.
104
106
  - Treat `npm run docs` by exit code; TypeDoc warnings can be acceptable when the command exits `0`.
105
107
  - For merge conflicts, confirm real unresolved conflicts with `git ls-files -u`; text searches for conflict markers can hit false positives in this repo.
108
+
109
+ ## Browser Integration Tests
110
+
111
+ Choose the test level that can observe the behavior being changed:
112
+
113
+ - Use Jest for pure logic and component behavior that jsdom models faithfully.
114
+ - Use Playwright in `test/browser/` when correctness depends on real layout or computed styles,
115
+ focus, keyboard or pointer input, browser APIs, Shadow DOM, generated markup, or multiple UI
116
+ components responding to player events. Do not rely on Jest-only coverage for those changes.
117
+ - The Playwright harness uses the built UI against a deterministic stub player. It does not cover
118
+ real playback, streams, networking, decoding, or mobile SDK bridges. Full-player browser system
119
+ tests may also use Playwright, but exercise those real dependencies instead of this stub; verify
120
+ mobile SDK bridges in their platform environments.
121
+
122
+ Run browser integration tests with `npm run test:browser`. Structure scenarios as
123
+ Arrange–Act–Assert when that makes the phases clearer; comments naming the phases are not required.
124
+ Use role- or label-based locators and Playwright's web-first assertions for interactive behavior.
125
+ Raw CSS selectors and `page.evaluate()` are appropriate when measuring geometry or another browser
126
+ property that has no user-facing locator.
127
+
128
+ Rules that keep these tests deterministic. Follow them or the suite gets disabled:
129
+
130
+ - **Import `test` and `expect` from `test/browser/harness.ts`**, not from `@playwright/test`. The
131
+ harness fails a test on any uncaught page error, so a stub player that has drifted from the real
132
+ API fails instead of leaving a partial DOM that can produce false positives.
133
+ - **Drive player behavior through the typed controller returned by `mountUi()`.** When a scenario
134
+ needs a player operation the controller does not expose, add only that operation together with
135
+ the state changes and events the real player produces. Do not access harness browser globals from
136
+ specs, and do not add speculative controller APIs for hypothetical future tests.
137
+ - **Keep the generic mount generic.** Layout- or feature-specific readiness assertions and DOM
138
+ measurement helpers belong in `test/browser/helpers/`; they must not make unrelated UIFactory
139
+ layouts depend on the default control bar.
140
+ - **Keep every test isolated.** Mount a fresh UI in each test and do not share mutable page or player
141
+ state between tests.
142
+ - **No sleeping and no retries.** Use web-first assertions for observable UI changes and fire
143
+ deterministic player events for state transitions. `retries` remains `0` so flakiness is visible.
144
+ - **No real streams, CDN, or video decode.** Keep those in full-player system tests, which may also
145
+ use Playwright but do not use this deterministic stub-backed harness. Real media dependencies are
146
+ the main sources of flake in player browser tests.
147
+ - **Prove every new test can fail.** Break the behavior it guards, observe the expected red result,
148
+ then restore the behavior and watch it pass.
149
+
150
+ Additional rules for layout and sizing tests:
151
+
152
+ - **Never assert absolute pixel values.** Fonts render differently across operating systems, so
153
+ `expect(width).toBe(73)` passes locally and fails in CI. Assert relationships instead: unchanged
154
+ between two measurements, never grew, fits inside the parent, one element wider than another.
155
+ - **Compare a measurement to another measurement**, taken in the same browser in the same run.
156
+ That is what makes the assertion portable.
157
+ - **Measure the elements that can actually change.** Container rows are full-width by construction,
158
+ so comparing only those passes no matter how badly the controls inside them resize. Walk
159
+ descendants, and when checking that children fit a row, find the flex container that actually
160
+ distributes the space rather than the wrapper around it.
161
+ - **An empty measurement must fail, not pass.** A helper that returns `{}` or `[]` when its selector
162
+ matches nothing makes "nothing is wrong" indistinguishable from "nothing was measured". Throw when
163
+ the subject is missing, and assert that each test measured something.
164
+ - **Cover both host-page worlds** when a change touches sizing: with and without a global
165
+ `box-sizing: border-box` reset. Most real pages have one, our demo page has one via Bootstrap,
166
+ and plenty of customer pages do not. `mountUi(page, { hostReset })` switches between them.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
+ ## [4.21.1] - 2026-09-17
9
+
10
+ ### Fixed
11
+
12
+ - The UI failing to load on legacy platforms such as webOS 3.x when required polyfills were not yet installed.
13
+
14
+ ## [4.21.0] - 2026-09-10
15
+
16
+ ### Changed
17
+
18
+ - The selected subtitle track label no longer includes the number of available tracks.
19
+
20
+ ### Fixed
21
+
22
+ - Long option names causing settings panels to overflow or setting labels to become unreadable.
23
+ - Ad count in `AdCounterLabel` no longer increases incorrectly when used on mobile SDKs.
24
+
8
25
  ## [4.20.2] - 2026-09-03
9
26
 
10
27
  ### Fixed