@mattebox/player 0.1.0

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 (164) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +24 -0
  3. package/README.md +22 -0
  4. package/dist/cdn/mattebox-player.min.js +340 -0
  5. package/dist/controls/bar.d.ts +56 -0
  6. package/dist/controls/bar.d.ts.map +1 -0
  7. package/dist/controls/bar.js +245 -0
  8. package/dist/controls/bar.js.map +1 -0
  9. package/dist/controls/buttons.d.ts +13 -0
  10. package/dist/controls/buttons.d.ts.map +1 -0
  11. package/dist/controls/buttons.js +157 -0
  12. package/dist/controls/buttons.js.map +1 -0
  13. package/dist/controls/control.d.ts +12 -0
  14. package/dist/controls/control.d.ts.map +1 -0
  15. package/dist/controls/control.js +2 -0
  16. package/dist/controls/control.js.map +1 -0
  17. package/dist/controls/cues.d.ts +33 -0
  18. package/dist/controls/cues.d.ts.map +1 -0
  19. package/dist/controls/cues.js +170 -0
  20. package/dist/controls/cues.js.map +1 -0
  21. package/dist/controls/fullscreen.d.ts +21 -0
  22. package/dist/controls/fullscreen.d.ts.map +1 -0
  23. package/dist/controls/fullscreen.js +78 -0
  24. package/dist/controls/fullscreen.js.map +1 -0
  25. package/dist/controls/icons.d.ts +35 -0
  26. package/dist/controls/icons.d.ts.map +1 -0
  27. package/dist/controls/icons.js +76 -0
  28. package/dist/controls/icons.js.map +1 -0
  29. package/dist/controls/keys.d.ts +26 -0
  30. package/dist/controls/keys.d.ts.map +1 -0
  31. package/dist/controls/keys.js +66 -0
  32. package/dist/controls/keys.js.map +1 -0
  33. package/dist/controls/live.d.ts +10 -0
  34. package/dist/controls/live.d.ts.map +1 -0
  35. package/dist/controls/live.js +59 -0
  36. package/dist/controls/live.js.map +1 -0
  37. package/dist/controls/menu.d.ts +34 -0
  38. package/dist/controls/menu.d.ts.map +1 -0
  39. package/dist/controls/menu.js +225 -0
  40. package/dist/controls/menu.js.map +1 -0
  41. package/dist/controls/menus.d.ts +43 -0
  42. package/dist/controls/menus.d.ts.map +1 -0
  43. package/dist/controls/menus.js +262 -0
  44. package/dist/controls/menus.js.map +1 -0
  45. package/dist/controls/options.d.ts +44 -0
  46. package/dist/controls/options.d.ts.map +1 -0
  47. package/dist/controls/options.js +54 -0
  48. package/dist/controls/options.js.map +1 -0
  49. package/dist/controls/pip.d.ts +16 -0
  50. package/dist/controls/pip.d.ts.map +1 -0
  51. package/dist/controls/pip.js +53 -0
  52. package/dist/controls/pip.js.map +1 -0
  53. package/dist/controls/ranges.d.ts +24 -0
  54. package/dist/controls/ranges.d.ts.map +1 -0
  55. package/dist/controls/ranges.js +48 -0
  56. package/dist/controls/ranges.js.map +1 -0
  57. package/dist/controls/screens.d.ts +22 -0
  58. package/dist/controls/screens.d.ts.map +1 -0
  59. package/dist/controls/screens.js +69 -0
  60. package/dist/controls/screens.js.map +1 -0
  61. package/dist/controls/seek.d.ts +52 -0
  62. package/dist/controls/seek.d.ts.map +1 -0
  63. package/dist/controls/seek.js +215 -0
  64. package/dist/controls/seek.js.map +1 -0
  65. package/dist/controls/slider.d.ts +28 -0
  66. package/dist/controls/slider.d.ts.map +1 -0
  67. package/dist/controls/slider.js +145 -0
  68. package/dist/controls/slider.js.map +1 -0
  69. package/dist/controls/speed.d.ts +8 -0
  70. package/dist/controls/speed.d.ts.map +1 -0
  71. package/dist/controls/speed.js +34 -0
  72. package/dist/controls/speed.js.map +1 -0
  73. package/dist/controls/time.d.ts +8 -0
  74. package/dist/controls/time.d.ts.map +1 -0
  75. package/dist/controls/time.js +25 -0
  76. package/dist/controls/time.js.map +1 -0
  77. package/dist/controls/volume.d.ts +8 -0
  78. package/dist/controls/volume.d.ts.map +1 -0
  79. package/dist/controls/volume.js +29 -0
  80. package/dist/controls/volume.js.map +1 -0
  81. package/dist/dom.d.ts +18 -0
  82. package/dist/dom.d.ts.map +1 -0
  83. package/dist/dom.js +45 -0
  84. package/dist/dom.js.map +1 -0
  85. package/dist/element.d.ts +101 -0
  86. package/dist/element.d.ts.map +1 -0
  87. package/dist/element.js +327 -0
  88. package/dist/element.js.map +1 -0
  89. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/asyncToGenerator.js +27 -0
  90. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/defineProperty.js +12 -0
  91. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/objectSpread2.js +25 -0
  92. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/toPrimitive.js +14 -0
  93. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/toPropertyKey.js +9 -0
  94. package/dist/es2015/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/typeof.js +11 -0
  95. package/dist/es2015/controls/bar.js +227 -0
  96. package/dist/es2015/controls/buttons.js +146 -0
  97. package/dist/es2015/controls/cues.js +153 -0
  98. package/dist/es2015/controls/fullscreen.js +54 -0
  99. package/dist/es2015/controls/icons.js +50 -0
  100. package/dist/es2015/controls/keys.js +60 -0
  101. package/dist/es2015/controls/live.js +60 -0
  102. package/dist/es2015/controls/menu.js +226 -0
  103. package/dist/es2015/controls/menus.js +258 -0
  104. package/dist/es2015/controls/options.js +46 -0
  105. package/dist/es2015/controls/pip.js +39 -0
  106. package/dist/es2015/controls/ranges.js +51 -0
  107. package/dist/es2015/controls/screens.js +74 -0
  108. package/dist/es2015/controls/seek.js +203 -0
  109. package/dist/es2015/controls/slider.js +136 -0
  110. package/dist/es2015/controls/speed.js +41 -0
  111. package/dist/es2015/controls/time.js +27 -0
  112. package/dist/es2015/controls/volume.js +30 -0
  113. package/dist/es2015/dom.js +43 -0
  114. package/dist/es2015/element.js +311 -0
  115. package/dist/es2015/index.js +10 -0
  116. package/dist/es2015/namespaces.js +7 -0
  117. package/dist/es2015/panels/drm.js +29 -0
  118. package/dist/es2015/panels/error.js +25 -0
  119. package/dist/es2015/panels/live.js +48 -0
  120. package/dist/es2015/panels/quality.js +52 -0
  121. package/dist/es2015/panels/tracks.js +47 -0
  122. package/dist/es2015/presets.js +46 -0
  123. package/dist/es2015/style.js +347 -0
  124. package/dist/index.d.ts +4 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +9 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/namespaces.d.ts +45 -0
  129. package/dist/namespaces.d.ts.map +1 -0
  130. package/dist/namespaces.js +5 -0
  131. package/dist/namespaces.js.map +1 -0
  132. package/dist/panels/drm.d.ts +8 -0
  133. package/dist/panels/drm.d.ts.map +1 -0
  134. package/dist/panels/drm.js +36 -0
  135. package/dist/panels/drm.js.map +1 -0
  136. package/dist/panels/error.d.ts +13 -0
  137. package/dist/panels/error.d.ts.map +1 -0
  138. package/dist/panels/error.js +23 -0
  139. package/dist/panels/error.js.map +1 -0
  140. package/dist/panels/live.d.ts +3 -0
  141. package/dist/panels/live.d.ts.map +1 -0
  142. package/dist/panels/live.js +56 -0
  143. package/dist/panels/live.js.map +1 -0
  144. package/dist/panels/panel.d.ts +13 -0
  145. package/dist/panels/panel.d.ts.map +1 -0
  146. package/dist/panels/panel.js +2 -0
  147. package/dist/panels/panel.js.map +1 -0
  148. package/dist/panels/quality.d.ts +3 -0
  149. package/dist/panels/quality.d.ts.map +1 -0
  150. package/dist/panels/quality.js +59 -0
  151. package/dist/panels/quality.js.map +1 -0
  152. package/dist/panels/tracks.d.ts +3 -0
  153. package/dist/panels/tracks.d.ts.map +1 -0
  154. package/dist/panels/tracks.js +49 -0
  155. package/dist/panels/tracks.js.map +1 -0
  156. package/dist/presets.d.ts +23 -0
  157. package/dist/presets.d.ts.map +1 -0
  158. package/dist/presets.js +36 -0
  159. package/dist/presets.js.map +1 -0
  160. package/dist/style.d.ts +13 -0
  161. package/dist/style.d.ts.map +1 -0
  162. package/dist/style.js +345 -0
  163. package/dist/style.js.map +1 -0
  164. package/package.json +58 -0
@@ -0,0 +1,245 @@
1
+ import { el, state } from '../dom.js';
2
+ import { namespaces } from '../namespaces.js';
3
+ import { fullscreenButton, muteButton, pipButton, playButton, skipButton } from './buttons.js';
4
+ import { cueLift, cueStyle } from './cues.js';
5
+ import { fullscreen } from './fullscreen.js';
6
+ import { keys } from './keys.js';
7
+ import { liveButton } from './live.js';
8
+ import { MENUS } from './menus.js';
9
+ import { clusters } from './options.js';
10
+ import { pictureInPicture } from './pip.js';
11
+ import { errorScreen, startButton } from './screens.js';
12
+ import { seekBar } from './seek.js';
13
+ import { speedMenu } from './speed.js';
14
+ import { volumeSlider } from './volume.js';
15
+ export function controlBar(host, stage, video, options,
16
+ /** Told of the states the host reflects, so the page can reach the light-DOM video by them. */
17
+ reflect,
18
+ /** What the error screen's retry does. */
19
+ retry) {
20
+ const root = el('div', 'controls');
21
+ const flags = {};
22
+ let timer;
23
+ /** Whether the last input was a key, so focus inside is a keyboard user's and holds the bar. */
24
+ let keyboard = false;
25
+ function render() {
26
+ state(root, 'controls', flags);
27
+ }
28
+ function flag(name, on) {
29
+ if (flags[name] === on)
30
+ return;
31
+ flags[name] = on;
32
+ render();
33
+ if (name === 'fullscreen')
34
+ reflect(name, on);
35
+ if (name === 'idle')
36
+ cues.lifted(!on);
37
+ if (name === 'seekable')
38
+ live.seekable(on);
39
+ }
40
+ /** What keeps the bar up when the timer fires. Read then, never remembered. */
41
+ function held() {
42
+ if (video.paused)
43
+ return true;
44
+ if (root.querySelector('[part~="open"]') !== null)
45
+ return true;
46
+ if (!keyboard)
47
+ return false;
48
+ const active = root.getRootNode().activeElement;
49
+ return active !== null && root.contains(active);
50
+ }
51
+ function sleep() {
52
+ timer = undefined;
53
+ // A hold is checked again later: a menu closes and a pause ends without
54
+ // an event the bar hears.
55
+ if (held()) {
56
+ timer = setTimeout(sleep, options.idleMs);
57
+ return;
58
+ }
59
+ flag('idle', true);
60
+ }
61
+ /** Shows the bar and arms the timer again. */
62
+ function wake() {
63
+ clearTimeout(timer);
64
+ if (flags.idle === true)
65
+ flag('idle', false);
66
+ timer = setTimeout(sleep, options.idleMs);
67
+ }
68
+ function pointer() {
69
+ keyboard = false;
70
+ wake();
71
+ }
72
+ function key() {
73
+ keyboard = true;
74
+ wake();
75
+ }
76
+ cueStyle();
77
+ const cues = cueLift(video, root, host);
78
+ // The live button first: the seek row reports whether it is seekable as
79
+ // it is built, and the flag passes that on to the button.
80
+ const live = liveButton(video);
81
+ const seek = seekBar(video, flag, options);
82
+ seek.root.append(live.root);
83
+ const screen = fullscreen(host, stage, video);
84
+ const start = startButton(video, flag, options.start !== 0);
85
+ const failure = errorScreen(retry);
86
+ /** An error over a picture that then plays is wrong by definition: playback resuming clears it. */
87
+ function played() {
88
+ if (failure.shown()) {
89
+ failure.clear();
90
+ start.root.hidden = !video.paused;
91
+ }
92
+ }
93
+ video.addEventListener('playing', played);
94
+ stage.append(start.root, failure.root);
95
+ /** The menus' places in the row, filled per session. */
96
+ const slots = new Map();
97
+ let session = [];
98
+ /** A control by the name the layout gives it, or null for a name that is not one. */
99
+ function build(name) {
100
+ switch (name) {
101
+ case 'skip-back':
102
+ return options.skipBack > 0 ? skipButton(video, -options.skipBack) : null;
103
+ case 'skip-forward':
104
+ return options.skipForward > 0 ? skipButton(video, options.skipForward) : null;
105
+ case 'play':
106
+ return playButton(video, flag);
107
+ case 'volume': {
108
+ const group = el('div', 'group volume-group');
109
+ const sound = [muteButton(video, flag), volumeSlider(video)];
110
+ for (const control of sound)
111
+ group.append(control.root);
112
+ return {
113
+ root: group,
114
+ dispose() {
115
+ for (const control of sound)
116
+ control.dispose();
117
+ },
118
+ };
119
+ }
120
+ case 'speed':
121
+ return speedMenu(video);
122
+ case 'pip':
123
+ return pipButton(pictureInPicture(video), flag);
124
+ case 'fullscreen':
125
+ return fullscreenButton(screen, flag);
126
+ default: {
127
+ if (!(name in MENUS))
128
+ return null;
129
+ const slot = el('div', `slot ${name}-slot`);
130
+ slots.set(name, slot);
131
+ return { root: slot, dispose() { } };
132
+ }
133
+ }
134
+ }
135
+ const row = el('div', 'row buttons');
136
+ const cluster = el('div', 'cluster');
137
+ const built = [];
138
+ const [leftNames, rightNames] = clusters(options.layout);
139
+ for (const name of leftNames) {
140
+ const control = build(name);
141
+ if (control === null)
142
+ continue;
143
+ built.push(control);
144
+ row.append(control.root);
145
+ }
146
+ for (const name of rightNames) {
147
+ const control = build(name);
148
+ if (control === null)
149
+ continue;
150
+ built.push(control);
151
+ cluster.append(control.root);
152
+ }
153
+ row.append(cluster);
154
+ root.append(seek.root, row);
155
+ const controls = [
156
+ ...built,
157
+ live,
158
+ start,
159
+ failure,
160
+ keys({
161
+ host,
162
+ stage,
163
+ own: [root, start.root, failure.root],
164
+ video,
165
+ step: options.seekStep,
166
+ fullscreen: screen,
167
+ }),
168
+ cues,
169
+ ];
170
+ function drop() {
171
+ for (const control of session)
172
+ control.dispose();
173
+ session = [];
174
+ for (const slot of slots.values())
175
+ slot.replaceChildren();
176
+ }
177
+ stage.addEventListener('pointermove', pointer);
178
+ stage.addEventListener('pointerdown', pointer);
179
+ host.addEventListener('keydown', key);
180
+ video.addEventListener('play', wake);
181
+ video.addEventListener('pause', wake);
182
+ video.addEventListener('ended', wake);
183
+ wake();
184
+ cues.lifted(true);
185
+ return {
186
+ root,
187
+ attach(current) {
188
+ drop();
189
+ const engine = current.engine;
190
+ if (engine === null) {
191
+ seek.attach({});
192
+ live.attach(undefined);
193
+ return;
194
+ }
195
+ const found = namespaces(engine);
196
+ seek.attach({
197
+ live: found.live,
198
+ thumbnails: found.thumbnails,
199
+ pdt: found.pdt,
200
+ // The forward buffer goal and the availability window live on the
201
+ // diagnostics snapshot and nowhere else.
202
+ bufferGoal: () => engine.stats.snapshot().scheduling.bufferGoal,
203
+ window: () => engine.stats.snapshot().live?.span ?? null,
204
+ });
205
+ live.attach(found.live);
206
+ for (const [name, slot] of slots) {
207
+ const factory = MENUS[name];
208
+ if (factory === undefined)
209
+ continue;
210
+ const control = factory({ engine, host });
211
+ session.push(control);
212
+ slot.append(control.root);
213
+ }
214
+ },
215
+ detach() {
216
+ drop();
217
+ seek.detach();
218
+ live.detach();
219
+ },
220
+ error(error) {
221
+ failure.show(error);
222
+ start.root.hidden = true;
223
+ },
224
+ clearError() {
225
+ failure.clear();
226
+ start.root.hidden = options.start === 0 || !video.paused;
227
+ },
228
+ dispose() {
229
+ clearTimeout(timer);
230
+ drop();
231
+ seek.dispose();
232
+ for (const control of controls)
233
+ control.dispose();
234
+ stage.removeEventListener('pointermove', pointer);
235
+ stage.removeEventListener('pointerdown', pointer);
236
+ host.removeEventListener('keydown', key);
237
+ video.removeEventListener('play', wake);
238
+ video.removeEventListener('pause', wake);
239
+ video.removeEventListener('ended', wake);
240
+ video.removeEventListener('playing', played);
241
+ root.remove();
242
+ },
243
+ };
244
+ }
245
+ //# sourceMappingURL=bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar.js","sourceRoot":"","sources":["../../src/controls/bar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Control, Flag } from './control.js';
2
+ import type { Fullscreen } from './fullscreen.js';
3
+ import type { IconName } from './icons.js';
4
+ import type { PictureInPicture } from './pip.js';
5
+ /** A button with its glyph. `control` is the generic name, so `::part(control)` reaches every one. */
6
+ export declare function button(name: string, first: IconName): [HTMLButtonElement, SVGSVGElement];
7
+ export declare function playButton(video: HTMLVideoElement, flag: Flag): Control;
8
+ export declare function muteButton(video: HTMLVideoElement, flag: Flag): Control;
9
+ /** Moves the playhead by `seconds`, negative for back, within what the video can reach. */
10
+ export declare function skipButton(video: HTMLVideoElement, seconds: number): Control;
11
+ export declare function pipButton(api: PictureInPicture, flag: Flag): Control;
12
+ export declare function fullscreenButton(api: Fullscreen, flag: Flag): Control;
13
+ //# sourceMappingURL=buttons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../src/controls/buttons.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,sGAAsG;AACtG,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAMxF;AASD,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAgCvE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAiCvE;AASD,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAuB5E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAsBpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAsBrE"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * The buttons: play/pause, mute, fullscreen. Each reads the video on the
3
+ * events the video already fires, swaps its glyph and its name, and writes
4
+ * one thing back on click. The glyph is decoration; the name is on the
5
+ * button, where a screen reader reads it.
6
+ */
7
+ import { el } from '../dom.js';
8
+ import { glyph, icon } from './icons.js';
9
+ /** A button with its glyph. `control` is the generic name, so `::part(control)` reaches every one. */
10
+ export function button(name, first) {
11
+ const node = el('button', `control ${name}-button`);
12
+ node.type = 'button';
13
+ const svg = icon(first);
14
+ node.append(svg);
15
+ return [node, svg];
16
+ }
17
+ function listen(target, names, fn) {
18
+ for (const name of names)
19
+ target.addEventListener(name, fn);
20
+ return () => {
21
+ for (const name of names)
22
+ target.removeEventListener(name, fn);
23
+ };
24
+ }
25
+ export function playButton(video, flag) {
26
+ const [root, svg] = button('play', 'play');
27
+ function render() {
28
+ const paused = video.paused;
29
+ const name = video.ended ? 'replay' : paused ? 'play' : 'pause';
30
+ glyph(svg, name);
31
+ root.setAttribute('aria-label', video.ended ? 'Replay' : paused ? 'Play' : 'Pause');
32
+ flag('playing', !paused);
33
+ }
34
+ function click() {
35
+ if (video.paused) {
36
+ // Rejected outside a user gesture on an unmuted video, which the
37
+ // browser reports on the video's own error path; nothing to add.
38
+ video.play().catch(() => undefined);
39
+ }
40
+ else {
41
+ video.pause();
42
+ }
43
+ }
44
+ root.addEventListener('click', click);
45
+ const off = listen(video, ['play', 'pause', 'ended', 'emptied'], render);
46
+ render();
47
+ return {
48
+ root,
49
+ dispose() {
50
+ root.removeEventListener('click', click);
51
+ off();
52
+ },
53
+ };
54
+ }
55
+ export function muteButton(video, flag) {
56
+ const [root, svg] = button('mute', 'volume-high');
57
+ function render() {
58
+ const silent = video.muted || video.volume === 0;
59
+ const name = silent ? 'mute' : video.volume <= 0.5 ? 'volume-low' : 'volume-high';
60
+ glyph(svg, name);
61
+ root.setAttribute('aria-label', silent ? 'Unmute' : 'Mute');
62
+ root.setAttribute('aria-pressed', String(video.muted));
63
+ flag('muted', silent);
64
+ }
65
+ function click() {
66
+ if (video.muted) {
67
+ video.muted = false;
68
+ // Unmuting at zero volume would change nothing the viewer can hear.
69
+ if (video.volume === 0)
70
+ video.volume = 1;
71
+ }
72
+ else {
73
+ video.muted = true;
74
+ }
75
+ }
76
+ root.addEventListener('click', click);
77
+ const off = listen(video, ['volumechange', 'emptied'], render);
78
+ render();
79
+ return {
80
+ root,
81
+ dispose() {
82
+ root.removeEventListener('click', click);
83
+ off();
84
+ },
85
+ };
86
+ }
87
+ /** The glyph for a skip amount: the set draws 10 and 30, and a plain arrow says the rest. */
88
+ function skipGlyph(back, amount) {
89
+ const side = back ? 'seek-backward' : 'seek-forward';
90
+ if (amount === 10 || amount === 30)
91
+ return `${side}-${amount}`;
92
+ return side;
93
+ }
94
+ /** Moves the playhead by `seconds`, negative for back, within what the video can reach. */
95
+ export function skipButton(video, seconds) {
96
+ const back = seconds < 0;
97
+ const amount = Math.abs(seconds);
98
+ const [root] = button(back ? 'skip-back' : 'skip-forward', skipGlyph(back, amount));
99
+ root.setAttribute('aria-label', `${back ? 'Back' : 'Forward'} ${amount} seconds`);
100
+ function click() {
101
+ const ranges = video.seekable;
102
+ const end = Number.isFinite(video.duration)
103
+ ? video.duration
104
+ : ranges.length > 0
105
+ ? ranges.end(ranges.length - 1)
106
+ : video.currentTime;
107
+ video.currentTime = Math.min(end, Math.max(0, video.currentTime + seconds));
108
+ }
109
+ root.addEventListener('click', click);
110
+ return {
111
+ root,
112
+ dispose() {
113
+ root.removeEventListener('click', click);
114
+ },
115
+ };
116
+ }
117
+ export function pipButton(api, flag) {
118
+ const [root, svg] = button('pip', 'picture-in-picture');
119
+ root.hidden = !api.supported;
120
+ function render() {
121
+ const active = api.active();
122
+ glyph(svg, active ? 'picture-in-picture-exit' : 'picture-in-picture');
123
+ root.setAttribute('aria-label', active ? 'Leave picture in picture' : 'Picture in picture');
124
+ flag('pip', active);
125
+ }
126
+ root.addEventListener('click', api.toggle);
127
+ const off = api.watch(render);
128
+ render();
129
+ return {
130
+ root,
131
+ dispose() {
132
+ root.removeEventListener('click', api.toggle);
133
+ off();
134
+ },
135
+ };
136
+ }
137
+ export function fullscreenButton(api, flag) {
138
+ const [root, svg] = button('fullscreen', 'fullscreen');
139
+ root.hidden = !api.supported;
140
+ function render() {
141
+ const active = api.active();
142
+ glyph(svg, active ? 'fullscreen-exit' : 'fullscreen');
143
+ root.setAttribute('aria-label', active ? 'Exit fullscreen' : 'Enter fullscreen');
144
+ flag('fullscreen', active);
145
+ }
146
+ root.addEventListener('click', api.toggle);
147
+ const off = api.watch(render);
148
+ render();
149
+ return {
150
+ root,
151
+ dispose() {
152
+ root.removeEventListener('click', api.toggle);
153
+ off();
154
+ },
155
+ };
156
+ }
157
+ //# sourceMappingURL=buttons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../src/controls/buttons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * What a control is: a root the bar places, and a teardown. The same shape
3
+ * as a panel, kept separate because a control reads the video and a panel
4
+ * reads an engine namespace.
5
+ */
6
+ export interface Control {
7
+ readonly root: HTMLElement;
8
+ dispose(): void;
9
+ }
10
+ /** Reports a state the bar carries on its part name: `playing`, `muted`, `fullscreen`. */
11
+ export type Flag = (name: string, on: boolean) => void;
12
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/controls/control.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,0FAA0F;AAC1F,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/controls/control.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Subtitles and the bar. Two things.
3
+ *
4
+ * The lift: the browser draws native cues at the bottom of the video, under
5
+ * the bar. While the bar shows, every active cue the author left
6
+ * unpositioned is moved above it, and put back when the bar hides. The
7
+ * position is a negative line count, the one form every browser wraps at
8
+ * the video's width; a percentage does not wrap in Chromium. Chromium
9
+ * anchors the box's top on the count and Gecko its bottom, and their
10
+ * overlap avoidance pushes in opposite directions, so nothing is left to
11
+ * them: subtitles often show two cues at once, and the cues stack by their
12
+ * own measured heights, wrapping included, clear under both readings. A
13
+ * cue with a position of its own is the author's and is not touched.
14
+ *
15
+ * The look: `::cue` can only be styled from the document that holds the
16
+ * video, which is the page and not the shadow root, and it takes no custom
17
+ * properties. So a small sheet goes into the document, once, with one rule
18
+ * per look the host's `subtitle-size` and `subtitle-background` attributes
19
+ * can take. Sizes are percentages of the browser's own cue size, which
20
+ * already follows the video's height, in the page and in fullscreen alike.
21
+ * A page that wants more writes its own `mattebox-player > video::cue`.
22
+ */
23
+ import type { Control } from './control.js';
24
+ /** How the sizes scale the browser's own cue size; the lift counts lines by it. */
25
+ export declare const SCALES: Readonly<Record<string, number>>;
26
+ /** Puts the cue rules in the document, once. */
27
+ export declare function cueStyle(): void;
28
+ export interface CueLift extends Control {
29
+ /** Whether the bar is showing, so the cues move above it or back. */
30
+ lifted(on: boolean): void;
31
+ }
32
+ export declare function cueLift(video: HTMLVideoElement, bar: HTMLElement, host: HTMLElement): CueLift;
33
+ //# sourceMappingURL=cues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cues.d.ts","sourceRoot":"","sources":["../../src/controls/cues.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKnD,CAAC;AA4BF,gDAAgD;AAChD,wBAAgB,QAAQ,IAAI,IAAI,CAM/B;AASD,MAAM,WAAW,OAAQ,SAAQ,OAAO;IACtC,qEAAqE;IACrE,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAqI7F"}