ovenplayer 0.10.49 → 0.10.51
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/dist/ovenplayer.js +1 -1
- package/dist/ovenplayer.js.map +1 -1
- package/package.json +49 -49
- package/src/js/api/Configurator.js +1 -1
- package/src/js/api/ads/vast/Ad.js +237 -237
- package/src/js/api/caption/Loader.js +1 -1
- package/src/js/api/caption/Manager.js +1 -1
- package/src/js/api/caption/parser/VttParser.js +1541 -1542
- package/src/js/api/playlist/Manager.js +229 -229
- package/src/js/api/provider/html5/providers/Dash.js +286 -286
- package/src/js/api/provider/html5/providers/Hls.js +110 -2
- package/src/js/api/provider/html5/providers/WebRTC.js +2 -1
- package/src/js/api/provider/html5/providers/WebRTCLoader.js +35 -2
- package/src/js/api/provider/utils.js +69 -69
- package/src/js/ovenplayer.sdk.js +143 -143
- package/src/js/utils/likeA$.js +241 -242
- package/src/js/utils/resize-sensor.js +145 -168
- package/src/js/utils/strings.js +104 -104
- package/src/js/view/components/controls/settingPanel/audioTrackPanel.js +57 -57
- package/src/js/view/components/controls/settingPanel/main.js +1 -1
- package/src/js/view/components/controls/settingPanel/mainTemplate.js +29 -29
- package/src/js/view/components/controls/settingPanel/qualityPanel.js +68 -68
- package/src/js/view/components/controls/settingPanel/subtitleTrackPanel.js +56 -56
- package/src/js/view/components/helpers/captionViewer.js +97 -15
- package/src/js/view/components/helpers/captionViewerTemplate.js +1 -2
- package/src/js/view/components/helpers/waterMark.js +69 -69
- package/src/js/view/engine/OvenTemplate.js +158 -158
- package/src/js/view/global/PanelManager.js +47 -47
- package/src/stylesheet/ovenplayer.less +52 -21
- package/src/js/utils/adapter.js +0 -4944
- package/src/js/utils/captions/vttCue.js +0 -308
- package/src/js/utils/captions/vttRegion.js +0 -136
- package/src/js/utils/polyfills/dom.js +0 -634
- package/src/js/utils/underscore.js +0 -6
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by hoho on 2018. 7. 19..
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import Templates from "view/engine/Templates";
|
|
6
|
-
import LA$ from 'utils/likeA$';
|
|
7
|
-
import _ from "
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @brief This is simple ui renderer. This returns onRendered callback, onDestroyed callback on Template. And this bind events for Templates.
|
|
11
|
-
* @param container dom element or LA$ object
|
|
12
|
-
* @param templateName templateName
|
|
13
|
-
* @param data preload data
|
|
14
|
-
* @param events Template's events.
|
|
15
|
-
* @param onRendered This callback occurs after append template.
|
|
16
|
-
* @param onDestroyed This callback occurs after destroyed template.
|
|
17
|
-
* @param isRoot
|
|
18
|
-
*
|
|
19
|
-
* */
|
|
20
|
-
const OvenTemplate = function (container, templateName, playerConfig, data, events, onRendered, onDestroyed, isRoot) {
|
|
21
|
-
|
|
22
|
-
let $container = _.isElement(container) ? LA$(container) : container;
|
|
23
|
-
let $template;
|
|
24
|
-
let viewEvents = {};
|
|
25
|
-
let uiText = null;
|
|
26
|
-
let that = {};
|
|
27
|
-
that.data = data;
|
|
28
|
-
let createAndSelectElement = function (html) {
|
|
29
|
-
const newElement = document.createElement('div');
|
|
30
|
-
newElement.innerHTML = html;
|
|
31
|
-
|
|
32
|
-
$template = LA$(newElement.firstChild);
|
|
33
|
-
|
|
34
|
-
return newElement.firstChild;
|
|
35
|
-
}
|
|
36
|
-
if(playerConfig && playerConfig.systemText){
|
|
37
|
-
uiText = playerConfig.systemText.ui;
|
|
38
|
-
}
|
|
39
|
-
if (isRoot) {
|
|
40
|
-
$container.replace(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
|
|
41
|
-
} else {
|
|
42
|
-
$container.append(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (onRendered) {
|
|
46
|
-
onRendered($template, that);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
Object.keys(events).forEach(eventString => {
|
|
50
|
-
let explodedText = eventString.split(" ");
|
|
51
|
-
let eventName = explodedText[0].replace(/ /gi, "");
|
|
52
|
-
let target = explodedText[1].replace(/ /gi, "");
|
|
53
|
-
|
|
54
|
-
let $target = "";
|
|
55
|
-
|
|
56
|
-
if(target === "document" || target === "window" || target === "body"){
|
|
57
|
-
$target = LA$(target);
|
|
58
|
-
}else{
|
|
59
|
-
$target = $template.find(target) || ($template.hasClass(target.replace(".","")) ? $template : null);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (eventName && target && $target) {
|
|
64
|
-
let id = Object.keys(viewEvents).length++;
|
|
65
|
-
|
|
66
|
-
//because It retuns another data.
|
|
67
|
-
let wrappedFunc = function (event) {
|
|
68
|
-
return events[eventString](event, $template, that);
|
|
69
|
-
};
|
|
70
|
-
viewEvents[id] = {name: eventName, target: target, callback: wrappedFunc};
|
|
71
|
-
|
|
72
|
-
/*$template.get().addEventListener(eventName,function(evt){
|
|
73
|
-
var gtarget = evt.target;
|
|
74
|
-
while (gtarget!= null){
|
|
75
|
-
if (gtarget.isEqualNode($target.get())){
|
|
76
|
-
console.log("isEqual", gtarget, $target.get());
|
|
77
|
-
wrappedFunc(evt);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
gtarget = gtarget.parentElement;
|
|
81
|
-
}
|
|
82
|
-
}, true);*/
|
|
83
|
-
|
|
84
|
-
let eventOption = null;
|
|
85
|
-
|
|
86
|
-
if (eventName.indexOf('touch') > -1) {
|
|
87
|
-
eventOption = { passive: true };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
//sometimes target is NodeList
|
|
91
|
-
let nodeLength = $target.get().length;
|
|
92
|
-
|
|
93
|
-
if(nodeLength > 1){
|
|
94
|
-
let nodeList = $target.get();
|
|
95
|
-
for(let i = 0; i < nodeLength; i ++){
|
|
96
|
-
nodeList[i].addEventListener(eventName, wrappedFunc, eventOption);
|
|
97
|
-
}
|
|
98
|
-
//IE NodeList doesn't have forEach. It's wack.
|
|
99
|
-
//$target.get().forEach(function($item){
|
|
100
|
-
// $item.addEventListener(eventName, wrappedFunc);
|
|
101
|
-
//});
|
|
102
|
-
}else{
|
|
103
|
-
$target.get().addEventListener(eventName, wrappedFunc, eventOption);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
} else {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
that.destroy = function () {
|
|
113
|
-
Object.keys(viewEvents).forEach(id => {
|
|
114
|
-
let event = viewEvents[id];
|
|
115
|
-
let $target = "";
|
|
116
|
-
|
|
117
|
-
if(event.target === "document" || event.target === "window" || event.target === "body"){
|
|
118
|
-
$target = LA$(event.target);
|
|
119
|
-
}else{
|
|
120
|
-
$target = $template.find(event.target) || ($template.hasClass(event.target.replace(".","")) ? $template : null);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
//sometimes target is NodeList
|
|
124
|
-
let nodeLength = $target.get().length;
|
|
125
|
-
if(nodeLength > 1){
|
|
126
|
-
let nodeList = $target.get();
|
|
127
|
-
for(let i = 0; i < nodeLength; i ++){
|
|
128
|
-
nodeList[i].removeEventListener(event.name, event.callback);
|
|
129
|
-
}
|
|
130
|
-
/*$target.get().forEach(function($item){
|
|
131
|
-
$item.removeEventListener(event.name, event.callback);
|
|
132
|
-
});*/
|
|
133
|
-
}else{
|
|
134
|
-
$target.get().removeEventListener(event.name, event.callback);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
delete viewEvents[id];
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
if($template){
|
|
141
|
-
if(isRoot){
|
|
142
|
-
$template.removeChild();
|
|
143
|
-
$template.removeAttribute("class");
|
|
144
|
-
}else{
|
|
145
|
-
$template.remove();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (onDestroyed) {
|
|
150
|
-
onDestroyed(that);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
return that;
|
|
154
|
-
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
export default OvenTemplate;
|
|
1
|
+
/**
|
|
2
|
+
* Created by hoho on 2018. 7. 19..
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import Templates from "view/engine/Templates";
|
|
6
|
+
import LA$ from 'utils/likeA$';
|
|
7
|
+
import _ from "underscore";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @brief This is simple ui renderer. This returns onRendered callback, onDestroyed callback on Template. And this bind events for Templates.
|
|
11
|
+
* @param container dom element or LA$ object
|
|
12
|
+
* @param templateName templateName
|
|
13
|
+
* @param data preload data
|
|
14
|
+
* @param events Template's events.
|
|
15
|
+
* @param onRendered This callback occurs after append template.
|
|
16
|
+
* @param onDestroyed This callback occurs after destroyed template.
|
|
17
|
+
* @param isRoot
|
|
18
|
+
*
|
|
19
|
+
* */
|
|
20
|
+
const OvenTemplate = function (container, templateName, playerConfig, data, events, onRendered, onDestroyed, isRoot) {
|
|
21
|
+
|
|
22
|
+
let $container = _.isElement(container) ? LA$(container) : container;
|
|
23
|
+
let $template;
|
|
24
|
+
let viewEvents = {};
|
|
25
|
+
let uiText = null;
|
|
26
|
+
let that = {};
|
|
27
|
+
that.data = data;
|
|
28
|
+
let createAndSelectElement = function (html) {
|
|
29
|
+
const newElement = document.createElement('div');
|
|
30
|
+
newElement.innerHTML = html;
|
|
31
|
+
|
|
32
|
+
$template = LA$(newElement.firstChild);
|
|
33
|
+
|
|
34
|
+
return newElement.firstChild;
|
|
35
|
+
}
|
|
36
|
+
if(playerConfig && playerConfig.systemText){
|
|
37
|
+
uiText = playerConfig.systemText.ui;
|
|
38
|
+
}
|
|
39
|
+
if (isRoot) {
|
|
40
|
+
$container.replace(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
|
|
41
|
+
} else {
|
|
42
|
+
$container.append(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (onRendered) {
|
|
46
|
+
onRendered($template, that);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Object.keys(events).forEach(eventString => {
|
|
50
|
+
let explodedText = eventString.split(" ");
|
|
51
|
+
let eventName = explodedText[0].replace(/ /gi, "");
|
|
52
|
+
let target = explodedText[1].replace(/ /gi, "");
|
|
53
|
+
|
|
54
|
+
let $target = "";
|
|
55
|
+
|
|
56
|
+
if(target === "document" || target === "window" || target === "body"){
|
|
57
|
+
$target = LA$(target);
|
|
58
|
+
}else{
|
|
59
|
+
$target = $template.find(target) || ($template.hasClass(target.replace(".","")) ? $template : null);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
if (eventName && target && $target) {
|
|
64
|
+
let id = Object.keys(viewEvents).length++;
|
|
65
|
+
|
|
66
|
+
//because It retuns another data.
|
|
67
|
+
let wrappedFunc = function (event) {
|
|
68
|
+
return events[eventString](event, $template, that);
|
|
69
|
+
};
|
|
70
|
+
viewEvents[id] = {name: eventName, target: target, callback: wrappedFunc};
|
|
71
|
+
|
|
72
|
+
/*$template.get().addEventListener(eventName,function(evt){
|
|
73
|
+
var gtarget = evt.target;
|
|
74
|
+
while (gtarget!= null){
|
|
75
|
+
if (gtarget.isEqualNode($target.get())){
|
|
76
|
+
console.log("isEqual", gtarget, $target.get());
|
|
77
|
+
wrappedFunc(evt);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
gtarget = gtarget.parentElement;
|
|
81
|
+
}
|
|
82
|
+
}, true);*/
|
|
83
|
+
|
|
84
|
+
let eventOption = null;
|
|
85
|
+
|
|
86
|
+
if (eventName.indexOf('touch') > -1) {
|
|
87
|
+
eventOption = { passive: true };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//sometimes target is NodeList
|
|
91
|
+
let nodeLength = $target.get().length;
|
|
92
|
+
|
|
93
|
+
if(nodeLength > 1){
|
|
94
|
+
let nodeList = $target.get();
|
|
95
|
+
for(let i = 0; i < nodeLength; i ++){
|
|
96
|
+
nodeList[i].addEventListener(eventName, wrappedFunc, eventOption);
|
|
97
|
+
}
|
|
98
|
+
//IE NodeList doesn't have forEach. It's wack.
|
|
99
|
+
//$target.get().forEach(function($item){
|
|
100
|
+
// $item.addEventListener(eventName, wrappedFunc);
|
|
101
|
+
//});
|
|
102
|
+
}else{
|
|
103
|
+
$target.get().addEventListener(eventName, wrappedFunc, eventOption);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
} else {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
that.destroy = function () {
|
|
113
|
+
Object.keys(viewEvents).forEach(id => {
|
|
114
|
+
let event = viewEvents[id];
|
|
115
|
+
let $target = "";
|
|
116
|
+
|
|
117
|
+
if(event.target === "document" || event.target === "window" || event.target === "body"){
|
|
118
|
+
$target = LA$(event.target);
|
|
119
|
+
}else{
|
|
120
|
+
$target = $template.find(event.target) || ($template.hasClass(event.target.replace(".","")) ? $template : null);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
//sometimes target is NodeList
|
|
124
|
+
let nodeLength = $target.get().length;
|
|
125
|
+
if(nodeLength > 1){
|
|
126
|
+
let nodeList = $target.get();
|
|
127
|
+
for(let i = 0; i < nodeLength; i ++){
|
|
128
|
+
nodeList[i].removeEventListener(event.name, event.callback);
|
|
129
|
+
}
|
|
130
|
+
/*$target.get().forEach(function($item){
|
|
131
|
+
$item.removeEventListener(event.name, event.callback);
|
|
132
|
+
});*/
|
|
133
|
+
}else{
|
|
134
|
+
$target.get().removeEventListener(event.name, event.callback);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
delete viewEvents[id];
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if($template){
|
|
141
|
+
if(isRoot){
|
|
142
|
+
$template.removeChild();
|
|
143
|
+
$template.removeAttribute("class");
|
|
144
|
+
}else{
|
|
145
|
+
$template.remove();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (onDestroyed) {
|
|
150
|
+
onDestroyed(that);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
return that;
|
|
154
|
+
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
export default OvenTemplate;
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by hoho on 2018. 7. 26..
|
|
3
|
-
*/
|
|
4
|
-
import _ from "
|
|
5
|
-
|
|
6
|
-
let settingPanelList = [];
|
|
7
|
-
|
|
8
|
-
const PanelManager = function(){
|
|
9
|
-
const that = {};
|
|
10
|
-
|
|
11
|
-
let refreshFront = function(){
|
|
12
|
-
for(let i = 0 ; i < settingPanelList.length; i ++){
|
|
13
|
-
settingPanelList[i].data.setFront(false);
|
|
14
|
-
}
|
|
15
|
-
if(settingPanelList.length ){
|
|
16
|
-
settingPanelList[settingPanelList.length - 1].data.setFront(true);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
that.clear = () => {
|
|
20
|
-
//clear all SettingPanelTemplate
|
|
21
|
-
|
|
22
|
-
_.each(settingPanelList, function(settingPanel){
|
|
23
|
-
settingPanel.destroy();
|
|
24
|
-
});
|
|
25
|
-
settingPanelList = [];
|
|
26
|
-
refreshFront();
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
that.removeLastItem = () =>{
|
|
30
|
-
let last = settingPanelList.pop();
|
|
31
|
-
last.destroy();
|
|
32
|
-
refreshFront();
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
that.add = (settingPanelObject) => {
|
|
36
|
-
settingPanelList.push(settingPanelObject);
|
|
37
|
-
refreshFront();
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
that.size = () => {
|
|
41
|
-
return settingPanelList.length;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
return that;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export default PanelManager;
|
|
1
|
+
/**
|
|
2
|
+
* Created by hoho on 2018. 7. 26..
|
|
3
|
+
*/
|
|
4
|
+
import _ from "underscore";
|
|
5
|
+
|
|
6
|
+
let settingPanelList = [];
|
|
7
|
+
|
|
8
|
+
const PanelManager = function(){
|
|
9
|
+
const that = {};
|
|
10
|
+
|
|
11
|
+
let refreshFront = function(){
|
|
12
|
+
for(let i = 0 ; i < settingPanelList.length; i ++){
|
|
13
|
+
settingPanelList[i].data.setFront(false);
|
|
14
|
+
}
|
|
15
|
+
if(settingPanelList.length ){
|
|
16
|
+
settingPanelList[settingPanelList.length - 1].data.setFront(true);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
that.clear = () => {
|
|
20
|
+
//clear all SettingPanelTemplate
|
|
21
|
+
|
|
22
|
+
_.each(settingPanelList, function(settingPanel){
|
|
23
|
+
settingPanel.destroy();
|
|
24
|
+
});
|
|
25
|
+
settingPanelList = [];
|
|
26
|
+
refreshFront();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
that.removeLastItem = () =>{
|
|
30
|
+
let last = settingPanelList.pop();
|
|
31
|
+
last.destroy();
|
|
32
|
+
refreshFront();
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
that.add = (settingPanelObject) => {
|
|
36
|
+
settingPanelList.push(settingPanelObject);
|
|
37
|
+
refreshFront();
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
that.size = () => {
|
|
41
|
+
return settingPanelList.length;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
return that;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export default PanelManager;
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
zoom: 1 !important;
|
|
110
110
|
width: 100%;
|
|
111
111
|
display: block;
|
|
112
|
-
font-family:
|
|
112
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
113
113
|
background-color: #000;
|
|
114
114
|
-moz-box-sizing: border-box;
|
|
115
115
|
-webkit-box-sizing: border-box;
|
|
@@ -193,6 +193,10 @@
|
|
|
193
193
|
.op-caption-text-container {
|
|
194
194
|
bottom: 25px;
|
|
195
195
|
}
|
|
196
|
+
|
|
197
|
+
.op-caption-cue:not(.op-caption-cue-positioned) {
|
|
198
|
+
bottom: 25px;
|
|
199
|
+
}
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
&.op-no-controls {
|
|
@@ -1588,25 +1592,52 @@ i.op-con {
|
|
|
1588
1592
|
|
|
1589
1593
|
.op-caption-text-container {
|
|
1590
1594
|
position: absolute;
|
|
1591
|
-
|
|
1595
|
+
top: 0;
|
|
1596
|
+
left: 0;
|
|
1592
1597
|
width: 100%;
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
+
height: 100%;
|
|
1599
|
+
overflow: visible;
|
|
1600
|
+
pointer-events: none;
|
|
1601
|
+
|
|
1602
|
+
.op-caption-cue {
|
|
1603
|
+
position: absolute;
|
|
1604
|
+
bottom: 60px;
|
|
1605
|
+
width: 100%;
|
|
1606
|
+
left: 50%;
|
|
1607
|
+
transform: translateX(-50%);
|
|
1608
|
+
text-align: center;
|
|
1609
|
+
padding: 0 8%;
|
|
1610
|
+
-moz-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
|
|
1611
|
+
-webkit-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
|
|
1612
|
+
transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
|
|
1613
|
+
|
|
1614
|
+
&.op-caption-cue-positioned {
|
|
1615
|
+
bottom: auto;
|
|
1616
|
+
padding: 0;
|
|
1617
|
+
transition: none;
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1598
1620
|
|
|
1599
1621
|
.op-caption-text {
|
|
1622
|
+
display: inline-block;
|
|
1600
1623
|
color: #fff;
|
|
1601
|
-
font-size:
|
|
1602
|
-
line-height: 1.
|
|
1603
|
-
|
|
1604
|
-
|
|
1624
|
+
font-size: 1.5em;
|
|
1625
|
+
line-height: 1.5em;
|
|
1626
|
+
font-weight: 400;
|
|
1627
|
+
text-shadow: none;
|
|
1628
|
+
background: rgba(8, 8, 8, 0.75);
|
|
1629
|
+
padding: .25em .6em;
|
|
1630
|
+
border-radius: .25em;
|
|
1605
1631
|
user-select: none;
|
|
1606
|
-
word-break:
|
|
1632
|
+
word-break: keep-all;
|
|
1633
|
+
overflow-wrap: break-word;
|
|
1607
1634
|
white-space: pre-line;
|
|
1608
1635
|
border: none;
|
|
1609
|
-
|
|
1636
|
+
|
|
1637
|
+
&:empty {
|
|
1638
|
+
background: none;
|
|
1639
|
+
padding: 0;
|
|
1640
|
+
}
|
|
1610
1641
|
}
|
|
1611
1642
|
}
|
|
1612
1643
|
}
|
|
@@ -1634,8 +1665,8 @@ i.op-con {
|
|
|
1634
1665
|
font-size: 14px;
|
|
1635
1666
|
|
|
1636
1667
|
.op-caption-text {
|
|
1637
|
-
font-size: 2em;
|
|
1638
|
-
line-height:
|
|
1668
|
+
font-size: 2em; /* 14px × 2 = 28px */
|
|
1669
|
+
line-height: 1.5em;
|
|
1639
1670
|
}
|
|
1640
1671
|
|
|
1641
1672
|
}
|
|
@@ -1644,8 +1675,8 @@ i.op-con {
|
|
|
1644
1675
|
font-size: 12px;
|
|
1645
1676
|
|
|
1646
1677
|
.op-caption-text {
|
|
1647
|
-
font-size: 1.
|
|
1648
|
-
line-height: 1.
|
|
1678
|
+
font-size: 1.75em; /* 12px × 1.75 = 21px */
|
|
1679
|
+
line-height: 1.5em;
|
|
1649
1680
|
}
|
|
1650
1681
|
}
|
|
1651
1682
|
|
|
@@ -1653,8 +1684,8 @@ i.op-con {
|
|
|
1653
1684
|
font-size: 10px;
|
|
1654
1685
|
|
|
1655
1686
|
.op-caption-text {
|
|
1656
|
-
font-size: 1.
|
|
1657
|
-
line-height: 1.
|
|
1687
|
+
font-size: 1.6em; /* 10px × 1.6 = 16px */
|
|
1688
|
+
line-height: 1.5em;
|
|
1658
1689
|
}
|
|
1659
1690
|
|
|
1660
1691
|
.op-playlist {
|
|
@@ -1681,8 +1712,8 @@ i.op-con {
|
|
|
1681
1712
|
}
|
|
1682
1713
|
|
|
1683
1714
|
.op-caption-text {
|
|
1684
|
-
font-size: 1.
|
|
1685
|
-
line-height: 1.
|
|
1715
|
+
font-size: 1.3em; /* 10px × 1.3 = 13px */
|
|
1716
|
+
line-height: 1.5em;
|
|
1686
1717
|
}
|
|
1687
1718
|
|
|
1688
1719
|
.op-playlist {
|