@gcorevideo/player 2.24.0 → 2.24.2
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.
- package/assets/bottom-gear/gear-sub-menu.scss +1 -0
- package/dist/core.js +1 -1
- package/dist/index.css +761 -760
- package/dist/index.js +70 -76
- package/dist/player.d.ts +46 -1
- package/docs/api/player.cmcdconfig._constructor_.md +50 -0
- package/docs/api/player.cmcdconfig.bindevents.md +19 -0
- package/docs/api/player.cmcdconfig.exportids.md +21 -0
- package/docs/api/player.cmcdconfig.md +191 -0
- package/docs/api/player.cmcdconfig.name.md +15 -0
- package/docs/api/player.cmcdconfig.supportedversion.md +14 -0
- package/docs/api/player.cmcdconfig.version.md +14 -0
- package/docs/api/player.cmcdconfigpluginsettings.md +18 -0
- package/docs/api/player.md +22 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -0
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +17 -17
- package/lib/plugins/cmcd-config/CmcdConfig.d.ts +8 -8
- package/lib/plugins/cmcd-config/CmcdConfig.d.ts.map +1 -1
- package/lib/plugins/cmcd-config/CmcdConfig.js +43 -47
- package/lib/plugins/cmcd-config/utils.d.ts +0 -1
- package/lib/plugins/cmcd-config/utils.d.ts.map +1 -1
- package/lib/plugins/cmcd-config/utils.js +0 -9
- package/lib/plugins/media-control/MediaControl.d.ts +7 -0
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +14 -5
- package/lib/testUtils.d.ts +1 -0
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +3 -0
- package/package.json +1 -1
- package/src/plugins/bottom-gear/BottomGear.ts +40 -28
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +34 -7
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +5 -2
- package/src/plugins/cmcd-config/CmcdConfig.ts +57 -57
- package/src/plugins/cmcd-config/__tests__/CmcdConfig.test.ts +96 -84
- package/src/plugins/cmcd-config/utils.ts +0 -10
- package/src/plugins/media-control/MediaControl.ts +18 -6
- package/src/testUtils.ts +3 -0
- package/temp/player.api.json +243 -0
- package/tsconfig.tsbuildinfo +1 -1
package/docs/api/player.md
CHANGED
|
@@ -119,6 +119,17 @@ Description
|
|
|
119
119
|
**_(BETA)_** `PLUGIN` that provides a UI to select the subtitles when available.
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
</td></tr>
|
|
123
|
+
<tr><td>
|
|
124
|
+
|
|
125
|
+
[CmcdConfig](./player.cmcdconfig.md)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
</td><td>
|
|
129
|
+
|
|
130
|
+
**_(BETA)_** A `PLUGIN` that configures CMCD for playback
|
|
131
|
+
|
|
132
|
+
|
|
122
133
|
</td></tr>
|
|
123
134
|
<tr><td>
|
|
124
135
|
|
|
@@ -736,6 +747,17 @@ Description
|
|
|
736
747
|
**_(BETA)_** Configuration options for the [ClosedCaptions](./player.closedcaptions.md) plugin.
|
|
737
748
|
|
|
738
749
|
|
|
750
|
+
</td></tr>
|
|
751
|
+
<tr><td>
|
|
752
|
+
|
|
753
|
+
[CmcdConfigPluginSettings](./player.cmcdconfigpluginsettings.md)
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
</td><td>
|
|
757
|
+
|
|
758
|
+
**_(BETA)_**
|
|
759
|
+
|
|
760
|
+
|
|
739
761
|
</td></tr>
|
|
740
762
|
<tr><td>
|
|
741
763
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAU5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAO;IAExB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IA2B1D,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,YAAY;CASrB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UICorePlugin, template, Events as ClapprEvents,
|
|
1
|
+
import { UICorePlugin, template, Events as ClapprEvents, $, } from '@clappr/core';
|
|
2
2
|
import { trace } from '@gcorevideo/utils';
|
|
3
3
|
import assert from 'assert';
|
|
4
4
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
@@ -10,6 +10,8 @@ import gearHdIcon from '../../../assets/icons/new/gear-hd.svg';
|
|
|
10
10
|
import { ExtendedEvents } from '../media-control/MediaControl.js';
|
|
11
11
|
const VERSION = '2.19.12';
|
|
12
12
|
const T = 'plugins.bottom_gear';
|
|
13
|
+
const MENU_VMARGIN = 12;
|
|
14
|
+
const MENU_BACKLINK_HEIGHT = 44;
|
|
13
15
|
/**
|
|
14
16
|
* Events triggered by the plugin
|
|
15
17
|
* @beta
|
|
@@ -21,7 +23,6 @@ export var GearEvents;
|
|
|
21
23
|
*/
|
|
22
24
|
GearEvents["RENDERED"] = "rendered";
|
|
23
25
|
})(GearEvents || (GearEvents = {}));
|
|
24
|
-
// TODO disabled if no items added
|
|
25
26
|
/**
|
|
26
27
|
* `PLUGIN` that adds a button to extend the media controls UI with extra options.
|
|
27
28
|
* @beta
|
|
@@ -158,7 +159,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
158
159
|
* ```
|
|
159
160
|
*/
|
|
160
161
|
addItem(name, $subMenu) {
|
|
161
|
-
const $existingItem = this.$el.find(`#gear-options li[data-${name}`);
|
|
162
|
+
const $existingItem = this.$el.find(`#gear-options li[data-${name}]`);
|
|
162
163
|
if ($existingItem.length) {
|
|
163
164
|
trace(`${T} addItem already exists`, { name });
|
|
164
165
|
return $existingItem;
|
|
@@ -173,20 +174,17 @@ export class BottomGear extends UICorePlugin {
|
|
|
173
174
|
.hide()
|
|
174
175
|
.appendTo(this.$el.find('#gear-options-wrapper'));
|
|
175
176
|
$item.on('click', (e) => {
|
|
176
|
-
trace(`${T} addItem submenu clicked`, { name });
|
|
177
177
|
e.stopPropagation();
|
|
178
|
+
this.alignSubmenu($subMenu);
|
|
178
179
|
$subMenu.show();
|
|
179
180
|
this.$el.find('#gear-options').hide();
|
|
180
181
|
});
|
|
181
182
|
}
|
|
182
183
|
this.numItems++;
|
|
183
|
-
|
|
184
|
-
this.$el.show();
|
|
185
|
-
}
|
|
184
|
+
this.$el.show();
|
|
186
185
|
return $item;
|
|
187
186
|
}
|
|
188
187
|
bindContainerEvents(container) {
|
|
189
|
-
trace(`${T} bindContainerEvents`);
|
|
190
188
|
this.listenTo(container, ClapprEvents.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
|
|
191
189
|
this.listenTo(container, ClapprEvents.CONTAINER_CLICK, () => {
|
|
192
190
|
this.collapse();
|
|
@@ -201,7 +199,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
201
199
|
* @internal
|
|
202
200
|
*/
|
|
203
201
|
render() {
|
|
204
|
-
trace(`${T} render`);
|
|
205
202
|
const mediaControl = this.core.getPlugin('media_control');
|
|
206
203
|
if (!mediaControl) {
|
|
207
204
|
return this; // TODO test
|
|
@@ -242,11 +239,11 @@ export class BottomGear extends UICorePlugin {
|
|
|
242
239
|
else {
|
|
243
240
|
this.$el.find('#gear-options-wrapper').show();
|
|
244
241
|
}
|
|
245
|
-
this.$el
|
|
246
|
-
|
|
242
|
+
this.$el
|
|
243
|
+
.find('#gear-button')
|
|
244
|
+
.attr('aria-expanded', (!this.collapsed).toString());
|
|
247
245
|
}
|
|
248
246
|
collapse() {
|
|
249
|
-
trace(`${T} collapse`);
|
|
250
247
|
this.collapsed = true;
|
|
251
248
|
this.$el.find('#gear-options-wrapper').hide();
|
|
252
249
|
this.$el.find('#gear-button').attr('aria-expanded', 'false');
|
|
@@ -254,7 +251,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
254
251
|
this.collapseSubmenus();
|
|
255
252
|
}
|
|
256
253
|
onCoreReady() {
|
|
257
|
-
trace(`${T} onCoreReady`);
|
|
258
254
|
const mediaControl = this.core.getPlugin('media_control');
|
|
259
255
|
assert(mediaControl, 'media_control plugin is required');
|
|
260
256
|
this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_RENDERED, this.onMediaControlRendered);
|
|
@@ -270,14 +266,18 @@ export class BottomGear extends UICorePlugin {
|
|
|
270
266
|
this.bindContainerEvents(mediaControl.container);
|
|
271
267
|
}
|
|
272
268
|
onMediaControlRendered() {
|
|
273
|
-
trace(`${T} onMediaControlRendered`);
|
|
274
269
|
this.mount();
|
|
275
270
|
}
|
|
276
271
|
mount() {
|
|
277
|
-
trace(`${T} mount`, {
|
|
278
|
-
numItems: this.numItems,
|
|
279
|
-
});
|
|
280
272
|
const mediaControl = this.core.getPlugin('media_control');
|
|
281
273
|
mediaControl.mount('gear', this.$el);
|
|
282
274
|
}
|
|
275
|
+
alignSubmenu($subMenu) {
|
|
276
|
+
const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
|
|
277
|
+
MENU_VMARGIN * 2;
|
|
278
|
+
$subMenu.css('max-height', `${availableHeight}px`);
|
|
279
|
+
$subMenu
|
|
280
|
+
.find('.gear-sub-menu')
|
|
281
|
+
.css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`);
|
|
282
|
+
}
|
|
283
283
|
}
|
|
@@ -8,10 +8,10 @@ export type CmcdConfigPluginSettings = {
|
|
|
8
8
|
*/
|
|
9
9
|
sessionId: string;
|
|
10
10
|
/**
|
|
11
|
-
* Content ID,
|
|
12
|
-
* If ommitted,
|
|
11
|
+
* Content ID,
|
|
12
|
+
* If ommitted, the pathname part of the first source URL will be used
|
|
13
13
|
*/
|
|
14
|
-
contentId?: string
|
|
14
|
+
contentId?: string;
|
|
15
15
|
};
|
|
16
16
|
/**
|
|
17
17
|
* A `PLUGIN` that configures CMCD for playback
|
|
@@ -27,19 +27,19 @@ export declare class CmcdConfig extends CorePlugin {
|
|
|
27
27
|
* @inheritdocs
|
|
28
28
|
*/
|
|
29
29
|
get name(): string;
|
|
30
|
+
get version(): string;
|
|
31
|
+
get supportedVersion(): string;
|
|
30
32
|
constructor(core: Core);
|
|
31
33
|
/**
|
|
32
34
|
* @inheritdocs
|
|
33
35
|
*/
|
|
34
36
|
bindEvents(): void;
|
|
35
|
-
|
|
37
|
+
exportIds(): {
|
|
36
38
|
sid: string;
|
|
37
39
|
cid: string;
|
|
38
|
-
}
|
|
40
|
+
};
|
|
39
41
|
private updateSettings;
|
|
40
|
-
private updateDashjsSettings;
|
|
41
42
|
private updateHlsjsSettings;
|
|
42
|
-
private
|
|
43
|
-
private evalContentId;
|
|
43
|
+
private generateContentId;
|
|
44
44
|
}
|
|
45
45
|
//# sourceMappingURL=CmcdConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CmcdConfig.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/CmcdConfig.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CmcdConfig.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/CmcdConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,UAAU,EAAU,MAAM,cAAc,CAAA;AA6BrE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAID;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,GAAG,CAAQ;IAEnB,OAAO,CAAC,GAAG,CAAK;IAEhB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED,IAAI,OAAO,WAEV;IAED,IAAI,gBAAgB,WAEnB;gBAEW,IAAI,EAAE,IAAI;IAMtB;;OAEG;IACM,UAAU;IAMnB,SAAS,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;YAO3B,cAAc;IA8B5B,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,iBAAiB;CAK1B"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { CorePlugin, Events
|
|
2
|
-
import {
|
|
1
|
+
import { $, CorePlugin, Events } from '@clappr/core';
|
|
2
|
+
// import { trace } from '@gcorevideo/utils'
|
|
3
|
+
import { generateSessionId } from './utils';
|
|
4
|
+
import { CLAPPR_VERSION } from '../../build.js';
|
|
3
5
|
const CMCD_KEYS = [
|
|
4
6
|
'br',
|
|
5
7
|
'd',
|
|
@@ -20,6 +22,7 @@ const CMCD_KEYS = [
|
|
|
20
22
|
'st',
|
|
21
23
|
'v',
|
|
22
24
|
];
|
|
25
|
+
// const T = 'plugins.cmcd'
|
|
23
26
|
/**
|
|
24
27
|
* A `PLUGIN` that configures CMCD for playback
|
|
25
28
|
* @beta
|
|
@@ -36,56 +39,62 @@ export class CmcdConfig extends CorePlugin {
|
|
|
36
39
|
get name() {
|
|
37
40
|
return 'cmcd';
|
|
38
41
|
}
|
|
42
|
+
get version() {
|
|
43
|
+
return '0.1.0';
|
|
44
|
+
}
|
|
45
|
+
get supportedVersion() {
|
|
46
|
+
return CLAPPR_VERSION;
|
|
47
|
+
}
|
|
39
48
|
constructor(core) {
|
|
40
49
|
super(core);
|
|
41
50
|
this.sid = this.options.cmcd?.sessionId ?? generateSessionId();
|
|
51
|
+
this.cid = this.options.cmcd?.contentId ?? this.generateContentId();
|
|
42
52
|
}
|
|
43
53
|
/**
|
|
44
54
|
* @inheritdocs
|
|
45
55
|
*/
|
|
46
56
|
bindEvents() {
|
|
47
|
-
this.listenTo(this.core, Events.
|
|
57
|
+
this.listenTo(this.core, Events.CORE_CONTAINERS_CREATED, () => this.updateSettings(this.core.containers[0]));
|
|
48
58
|
}
|
|
49
|
-
|
|
59
|
+
exportIds() {
|
|
50
60
|
return {
|
|
51
61
|
sid: this.sid,
|
|
52
|
-
cid:
|
|
62
|
+
cid: this.cid,
|
|
53
63
|
};
|
|
54
64
|
}
|
|
55
|
-
updateSettings() {
|
|
56
|
-
switch (
|
|
65
|
+
async updateSettings(container) {
|
|
66
|
+
switch (container.playback.name) {
|
|
57
67
|
case 'dash':
|
|
58
|
-
|
|
68
|
+
$.extend(true, container.playback.options, {
|
|
69
|
+
dash: {
|
|
70
|
+
cmcd: {
|
|
71
|
+
enabled: true,
|
|
72
|
+
enabledKeys: CMCD_KEYS,
|
|
73
|
+
sid: this.sid,
|
|
74
|
+
cid: this.cid,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
59
78
|
break;
|
|
60
79
|
case 'hls':
|
|
61
|
-
|
|
80
|
+
$.extend(true, container.playback.options, {
|
|
81
|
+
playback: {
|
|
82
|
+
hlsjsConfig: {
|
|
83
|
+
cmcd: {
|
|
84
|
+
includeKeys: CMCD_KEYS,
|
|
85
|
+
sessionId: this.sid,
|
|
86
|
+
contentId: this.cid,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
62
91
|
break;
|
|
63
92
|
}
|
|
64
93
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const options = this.core.activePlayback.options;
|
|
68
|
-
this.core.activePlayback.options = {
|
|
69
|
-
...options,
|
|
70
|
-
dash: {
|
|
71
|
-
...(options.dash ?? {}),
|
|
72
|
-
cmcd: {
|
|
73
|
-
enabled: true,
|
|
74
|
-
enabledKeys: CMCD_KEYS,
|
|
75
|
-
sid,
|
|
76
|
-
cid,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
async updateHlsjsSettings() {
|
|
82
|
-
const { cid, sid } = await this.getIds();
|
|
83
|
-
const options = this.core.activePlayback.options;
|
|
84
|
-
this.core.activePlayback.options = {
|
|
85
|
-
...options,
|
|
94
|
+
updateHlsjsSettings(options, { cid, sid }) {
|
|
95
|
+
$.extend(true, options, {
|
|
86
96
|
playback: {
|
|
87
97
|
hlsjsConfig: {
|
|
88
|
-
...(options.playback?.hlsjsConfig ?? {}),
|
|
89
98
|
cmcd: {
|
|
90
99
|
includeKeys: CMCD_KEYS,
|
|
91
100
|
sessionId: sid,
|
|
@@ -93,22 +102,9 @@ export class CmcdConfig extends CorePlugin {
|
|
|
93
102
|
},
|
|
94
103
|
},
|
|
95
104
|
},
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
async ensureContentId() {
|
|
99
|
-
if (!this.cid) {
|
|
100
|
-
this.cid = await this.evalContentId();
|
|
101
|
-
}
|
|
102
|
-
return this.cid;
|
|
105
|
+
});
|
|
103
106
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return generateContentId(this.core.activePlayback.options.src);
|
|
107
|
-
}
|
|
108
|
-
const contentId = this.core.activeContainer.options.cmcd.contentId;
|
|
109
|
-
if (typeof contentId === 'string') {
|
|
110
|
-
return contentId;
|
|
111
|
-
}
|
|
112
|
-
return Promise.resolve(contentId(this.core.activePlayback.options.src));
|
|
107
|
+
generateContentId() {
|
|
108
|
+
return new URL(this.core.options.source ?? this.core.options.sources[0].source).pathname.slice(0, 64);
|
|
113
109
|
}
|
|
114
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/cmcd-config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
1
|
export function generateSessionId() {
|
|
2
2
|
return window.crypto.randomUUID();
|
|
3
3
|
}
|
|
4
|
-
export function generateContentId(sourceUrl) {
|
|
5
|
-
return window.crypto.subtle.digest('SHA-1', new TextEncoder().encode(sourceUrl))
|
|
6
|
-
.then(buffer => {
|
|
7
|
-
const hex = Array.from(new Uint8Array(buffer))
|
|
8
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
9
|
-
.join('');
|
|
10
|
-
return hex;
|
|
11
|
-
});
|
|
12
|
-
}
|
|
@@ -183,6 +183,13 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
183
183
|
* Reenables the plugin disabled earlier with the {@link MediaControl.disable} method
|
|
184
184
|
*/
|
|
185
185
|
enable(): void;
|
|
186
|
+
/**
|
|
187
|
+
*
|
|
188
|
+
* @returns Vertical space available to render something on top of the container.
|
|
189
|
+
* @remarks
|
|
190
|
+
* This takes into account the container height and excludes the height of the controls bar
|
|
191
|
+
*/
|
|
192
|
+
getAvailableHeight(): number;
|
|
186
193
|
/**
|
|
187
194
|
* Set the initial volume, which is preserved when playback is interrupted by an advertisement
|
|
188
195
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C,OAAO,kDAAkD,CAAA;AAWzD;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,UAAU,GACV,KAAK,GACL,WAAW,GACX,UAAU,GACV,UAAU,GACV,QAAQ,GACR,OAAO,CAAA;AAEX;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,kBAAkB,CAAA;AAErE;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,IAAI,GACJ,YAAY,GACZ,cAAc,GACd,MAAM,GACN,aAAa,GACb,KAAK,GACL,IAAI,CAAA;AAER;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,wBAAwB,GACxB,wBAAwB,CAAA;AAY5B;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,uBAAuB,EAAE,CAAA;IAC/B,KAAK,EAAE,wBAAwB,EAAE,CAAA;IACjC,OAAO,EAAE,wBAAwB,EAAE,CAAA;IACnC,WAAW,EAAE,OAAO,CAAA;CACrB,CAAA;AAmCD,oBAAY,cAAc;IACxB,mBAAmB,wBAAwB;IAC3C,0BAA0B,+BAA+B;CAC1D;AAkBD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAG5C,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,wBAAwB,CAAI;IAEpC,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,0BAA0B,CAAsB;IAExD,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,OAAO,CAAC,6BAA6B,CAAQ;IAE7C,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,YAAY,CAA6C;IAEjE,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,WAAW,CAAQ;IAE3B,OAAO,CAAC,IAAI,CAAM;IAElB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,aAAa,CAA6C;IAElE,OAAO,CAAC,QAAQ,CAAQ;IAExB,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,mBAAmB,CAA2B;IAEtD,OAAO,CAAC,oBAAoB,CAA2B;IAEvD,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,kBAAkB,CAA2B;IAErD,OAAO,CAAC,gBAAgB,CAA2B;IAEnD,OAAO,CAAC,WAAW,CAA2B;IAE9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAE7D;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED,OAAO,KAAK,QAAQ,GAMnB;IAED;;;OAGG;IACH,IAAI,SAAS,QAEZ;IAED;;;OAGG;IACH,IAAI,QAAQ,QAEX;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED;;OAEG;IACH,IAAa,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;MA4BlB;IAED,IAAI,cAAc,WAEjB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAInB;IAED;;OAEG;IACH,IAAI,KAAK,YAER;gBAEW,IAAI,EAAE,IAAI;IAqBtB;;OAEG;IACM,oBAAoB;2BAyaZ,MAAM;;;IAlavB;;OAEG;IACM,UAAU;IAuCnB,OAAO,CAAC,mBAAmB;IA6E3B;;OAEG;IACM,OAAO;IAQhB;;OAEG;IACM,MAAM;IAUf;;;;;OAKG;IACH,kBAAkB;IAMlB;;OAEG;IACH,gBAAgB;IAOhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,cAAc;IAwDtB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,QAAQ,CAUf;IAED,OAAO,CAAC,UAAU,CAkBjB;IAED,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,UAAU;IAIlB;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,UAAQ;IAgChD,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,IAAI;IAiBZ,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;IAkCZ,OAAO,CAAC,IAAI;IAmCZ,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,cAAc;IAuDtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,oBAAoB;IAgC5B;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW;IAiBrD;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO;IAItD,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACM,OAAO;IAUhB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACM,MAAM;IA0Ef,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAcvB;;OAEG;IACH,mBAAmB;IAMnB;;OAEG;IACH,qBAAqB;IAOrB,OAAO,CAAC,6BAA6B;IAQrC,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,iBAAiB;CAO1B"}
|
|
@@ -318,6 +318,15 @@ export class MediaControl extends UICorePlugin {
|
|
|
318
318
|
this.bindKeyEvents();
|
|
319
319
|
this.show();
|
|
320
320
|
}
|
|
321
|
+
/**
|
|
322
|
+
*
|
|
323
|
+
* @returns Vertical space available to render something on top of the container.
|
|
324
|
+
* @remarks
|
|
325
|
+
* This takes into account the container height and excludes the height of the controls bar
|
|
326
|
+
*/
|
|
327
|
+
getAvailableHeight() {
|
|
328
|
+
return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
|
|
329
|
+
}
|
|
321
330
|
/**
|
|
322
331
|
* Set the initial volume, which is preserved when playback is interrupted by an advertisement
|
|
323
332
|
*/
|
|
@@ -417,11 +426,11 @@ export class MediaControl extends UICorePlugin {
|
|
|
417
426
|
this.applyButtonStyle(this.$playStopToggle);
|
|
418
427
|
}
|
|
419
428
|
mousemoveOnSeekBar(event) {
|
|
420
|
-
const offset = MediaControl.getPageX(event) -
|
|
421
|
-
|
|
422
|
-
const
|
|
423
|
-
(this.$
|
|
424
|
-
|
|
429
|
+
const offset = MediaControl.getPageX(event) - (this.$seekBarContainer.offset().left ?? 0); // TODO check if the result can be negative
|
|
430
|
+
const hoverOffset = offset - (this.$seekBarHover.width() ?? 0) / 2;
|
|
431
|
+
const pos = offset
|
|
432
|
+
? Math.min(1, Math.max(offset / this.$seekBarContainer.width(), 0))
|
|
433
|
+
: 0;
|
|
425
434
|
if (this.settings.seekEnabled) {
|
|
426
435
|
// TODO test that it works when the element does not exist
|
|
427
436
|
this.$seekBarHover.css({ left: hoverOffset });
|
package/lib/testUtils.d.ts
CHANGED
package/lib/testUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAGlC,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAAkC;;;;;;;;;;;;;;;;;EAsB9C;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtF;AAED,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,QAAQ,GAAE,GAAgD;;;;;;;;;;;;;;;;;;;;;;;;EA6B3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAmB/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,GAAG,OAe7C"}
|
package/lib/testUtils.js
CHANGED
|
@@ -9,6 +9,7 @@ export function createMockCore(options = {}, container = createMockContainer(opt
|
|
|
9
9
|
$el: $(el),
|
|
10
10
|
activePlayback: container.playback,
|
|
11
11
|
activeContainer: container,
|
|
12
|
+
containers: [container],
|
|
12
13
|
i18n: {
|
|
13
14
|
t: vi.fn().mockImplementation((key) => key),
|
|
14
15
|
},
|
|
@@ -111,6 +112,8 @@ export function createMockMediaControl(core) {
|
|
|
111
112
|
// @ts-ignore
|
|
112
113
|
mediaControl.container = core.activeContainer;
|
|
113
114
|
// @ts-ignore
|
|
115
|
+
mediaControl.getAvailableHeight = vi.fn().mockReturnValue(300);
|
|
116
|
+
// @ts-ignore
|
|
114
117
|
mediaControl.toggleElement = vi.fn();
|
|
115
118
|
vi.spyOn(mediaControl, 'trigger');
|
|
116
119
|
core.$el.append(mediaControl.$el);
|
package/package.json
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
UICorePlugin,
|
|
3
|
+
template,
|
|
4
|
+
Events as ClapprEvents,
|
|
5
|
+
$,
|
|
6
|
+
Container,
|
|
7
|
+
} from '@clappr/core'
|
|
2
8
|
import { trace } from '@gcorevideo/utils'
|
|
3
9
|
import assert from 'assert'
|
|
4
10
|
|
|
@@ -16,6 +22,9 @@ const VERSION = '2.19.12'
|
|
|
16
22
|
|
|
17
23
|
const T = 'plugins.bottom_gear'
|
|
18
24
|
|
|
25
|
+
const MENU_VMARGIN = 12
|
|
26
|
+
const MENU_BACKLINK_HEIGHT = 44
|
|
27
|
+
|
|
19
28
|
/**
|
|
20
29
|
* Events triggered by the plugin
|
|
21
30
|
* @beta
|
|
@@ -27,8 +36,6 @@ export enum GearEvents {
|
|
|
27
36
|
RENDERED = 'rendered',
|
|
28
37
|
}
|
|
29
38
|
|
|
30
|
-
// TODO disabled if no items added
|
|
31
|
-
|
|
32
39
|
/**
|
|
33
40
|
* `PLUGIN` that adds a button to extend the media controls UI with extra options.
|
|
34
41
|
* @beta
|
|
@@ -100,9 +107,9 @@ export enum GearEvents {
|
|
|
100
107
|
export class BottomGear extends UICorePlugin {
|
|
101
108
|
private hd = false
|
|
102
109
|
|
|
103
|
-
private numItems = 0
|
|
110
|
+
private numItems = 0
|
|
104
111
|
|
|
105
|
-
private collapsed = true
|
|
112
|
+
private collapsed = true
|
|
106
113
|
|
|
107
114
|
/**
|
|
108
115
|
* @internal
|
|
@@ -175,7 +182,7 @@ export class BottomGear extends UICorePlugin {
|
|
|
175
182
|
* ```
|
|
176
183
|
*/
|
|
177
184
|
addItem(name: string, $subMenu?: ZeptoResult): ZeptoResult {
|
|
178
|
-
const $existingItem = this.$el.find(`#gear-options li[data-${name}`)
|
|
185
|
+
const $existingItem = this.$el.find(`#gear-options li[data-${name}]`)
|
|
179
186
|
if ($existingItem.length) {
|
|
180
187
|
trace(`${T} addItem already exists`, { name })
|
|
181
188
|
return $existingItem
|
|
@@ -190,21 +197,18 @@ export class BottomGear extends UICorePlugin {
|
|
|
190
197
|
.hide()
|
|
191
198
|
.appendTo(this.$el.find('#gear-options-wrapper'))
|
|
192
199
|
$item.on('click', (e: MouseEvent) => {
|
|
193
|
-
trace(`${T} addItem submenu clicked`, { name })
|
|
194
200
|
e.stopPropagation()
|
|
201
|
+
this.alignSubmenu($subMenu)
|
|
195
202
|
$subMenu.show()
|
|
196
203
|
this.$el.find('#gear-options').hide()
|
|
197
204
|
})
|
|
198
205
|
}
|
|
199
|
-
this.numItems
|
|
200
|
-
|
|
201
|
-
this.$el.show()
|
|
202
|
-
}
|
|
206
|
+
this.numItems++
|
|
207
|
+
this.$el.show()
|
|
203
208
|
return $item
|
|
204
209
|
}
|
|
205
210
|
|
|
206
211
|
private bindContainerEvents(container: Container) {
|
|
207
|
-
trace(`${T} bindContainerEvents`)
|
|
208
212
|
this.listenTo(
|
|
209
213
|
container,
|
|
210
214
|
ClapprEvents.CONTAINER_HIGHDEFINITIONUPDATE,
|
|
@@ -225,14 +229,13 @@ export class BottomGear extends UICorePlugin {
|
|
|
225
229
|
* @internal
|
|
226
230
|
*/
|
|
227
231
|
override render() {
|
|
228
|
-
trace(`${T} render`)
|
|
229
232
|
const mediaControl = this.core.getPlugin('media_control')
|
|
230
233
|
if (!mediaControl) {
|
|
231
234
|
return this // TODO test
|
|
232
235
|
}
|
|
233
236
|
const icon = this.hd ? gearHdIcon : gearIcon
|
|
234
|
-
this.collapsed = true
|
|
235
|
-
this.numItems = 0
|
|
237
|
+
this.collapsed = true
|
|
238
|
+
this.numItems = 0
|
|
236
239
|
this.$el
|
|
237
240
|
.html(BottomGear.template({ icon }))
|
|
238
241
|
.hide() // until numItems > 0
|
|
@@ -264,19 +267,19 @@ export class BottomGear extends UICorePlugin {
|
|
|
264
267
|
this.core
|
|
265
268
|
.getPlugin('media_control')
|
|
266
269
|
.trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name)
|
|
267
|
-
this.collapsed = !this.collapsed
|
|
270
|
+
this.collapsed = !this.collapsed
|
|
268
271
|
if (this.collapsed) {
|
|
269
272
|
this.$el.find('#gear-options-wrapper').hide()
|
|
270
273
|
} else {
|
|
271
274
|
this.$el.find('#gear-options-wrapper').show()
|
|
272
275
|
}
|
|
273
|
-
this.$el
|
|
274
|
-
|
|
276
|
+
this.$el
|
|
277
|
+
.find('#gear-button')
|
|
278
|
+
.attr('aria-expanded', (!this.collapsed).toString())
|
|
275
279
|
}
|
|
276
280
|
|
|
277
281
|
private collapse() {
|
|
278
|
-
|
|
279
|
-
this.collapsed = true;
|
|
282
|
+
this.collapsed = true
|
|
280
283
|
this.$el.find('#gear-options-wrapper').hide()
|
|
281
284
|
this.$el.find('#gear-button').attr('aria-expanded', 'false')
|
|
282
285
|
// TODO hide submenus
|
|
@@ -284,7 +287,6 @@ export class BottomGear extends UICorePlugin {
|
|
|
284
287
|
}
|
|
285
288
|
|
|
286
289
|
private onCoreReady() {
|
|
287
|
-
trace(`${T} onCoreReady`)
|
|
288
290
|
const mediaControl = this.core.getPlugin('media_control')
|
|
289
291
|
assert(mediaControl, 'media_control plugin is required')
|
|
290
292
|
this.listenTo(
|
|
@@ -293,9 +295,13 @@ export class BottomGear extends UICorePlugin {
|
|
|
293
295
|
this.onMediaControlRendered,
|
|
294
296
|
)
|
|
295
297
|
this.listenTo(mediaControl, ClapprEvents.MEDIACONTROL_HIDE, this.collapse)
|
|
296
|
-
this.listenTo(
|
|
297
|
-
|
|
298
|
-
|
|
298
|
+
this.listenTo(
|
|
299
|
+
mediaControl,
|
|
300
|
+
ClapprEvents.MEDIACONTROL_CONTAINERCHANGED,
|
|
301
|
+
() => {
|
|
302
|
+
this.bindContainerEvents(mediaControl.container)
|
|
303
|
+
},
|
|
304
|
+
)
|
|
299
305
|
this.listenTo(
|
|
300
306
|
mediaControl,
|
|
301
307
|
ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE,
|
|
@@ -309,15 +315,21 @@ export class BottomGear extends UICorePlugin {
|
|
|
309
315
|
}
|
|
310
316
|
|
|
311
317
|
private onMediaControlRendered() {
|
|
312
|
-
trace(`${T} onMediaControlRendered`)
|
|
313
318
|
this.mount()
|
|
314
319
|
}
|
|
315
320
|
|
|
316
321
|
private mount() {
|
|
317
|
-
trace(`${T} mount`, {
|
|
318
|
-
numItems: this.numItems,
|
|
319
|
-
})
|
|
320
322
|
const mediaControl = this.core.getPlugin('media_control')
|
|
321
323
|
mediaControl.mount('gear', this.$el)
|
|
322
324
|
}
|
|
325
|
+
|
|
326
|
+
private alignSubmenu($subMenu: ZeptoResult) {
|
|
327
|
+
const availableHeight =
|
|
328
|
+
this.core.getPlugin('media_control').getAvailableHeight() -
|
|
329
|
+
MENU_VMARGIN * 2
|
|
330
|
+
$subMenu.css('max-height', `${availableHeight}px`)
|
|
331
|
+
$subMenu
|
|
332
|
+
.find('.gear-sub-menu')
|
|
333
|
+
.css('max-height', `${availableHeight - MENU_BACKLINK_HEIGHT}px`)
|
|
334
|
+
}
|
|
323
335
|
}
|