@oat-sa/tao-core-ui 3.11.0 → 3.12.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.
- package/dist/interactUtils.js +176 -0
- package/dist/mediaplayer/css/player.css +15 -0
- package/dist/mediaplayer/css/player.css.map +1 -1
- package/dist/mediaplayer.js +27 -18
- package/dist/previewer.js +1 -0
- package/dist/resourcemgr/fileSelector.js +6 -0
- package/package.json +1 -1
- package/scss/inc/_tooltip.scss +0 -0
- package/src/feedback/feedback.tpl +0 -0
- package/src/feedback.js +0 -0
- package/src/interactUtils.js +184 -0
- package/src/mediaplayer/css/player.css +15 -0
- package/src/mediaplayer/css/player.css.map +1 -1
- package/src/mediaplayer/scss/player.scss +16 -0
- package/src/mediaplayer/tpl/player.tpl +2 -0
- package/src/mediaplayer.js +28 -15
- package/src/previewer.js +2 -1
- package/src/resourcemgr/fileBrowser.js +0 -0
- package/src/resourcemgr/filePreview.js +0 -0
- package/src/resourcemgr/fileSelector.js +17 -1
- package/src/resourcemgr/scss/resourcemgr.scss +0 -0
- package/src/resourcemgr/tpl/fileSelect.tpl +0 -0
- package/src/resourcemgr/tpl/layout.tpl +0 -0
- package/src/validator/Report.js +0 -0
- package/src/validator/Validator.js +0 -0
- package/src/validator/validators.js +0 -0
package/dist/interactUtils.js
CHANGED
|
@@ -119,6 +119,182 @@ define(['jquery', 'lodash', 'interact', 'core/mouseEvent'], function ($, _, inte
|
|
|
119
119
|
domElement.style.transform = 'translate(0px, 0px) translateZ(0px)';
|
|
120
120
|
domElement.setAttribute('data-x', 0);
|
|
121
121
|
domElement.setAttribute('data-y', 0);
|
|
122
|
+
},
|
|
123
|
+
/**
|
|
124
|
+
* Improve touch devices support:
|
|
125
|
+
* - prevent native scroll while dragging
|
|
126
|
+
* - start drag only after longpress:
|
|
127
|
+
* when user is scrolling through the long page, he can accidentally get his finger on the draggable element:
|
|
128
|
+
* this will cause unwanted, unnoticed drag and can mess up his response.
|
|
129
|
+
* @example
|
|
130
|
+
* touchPatch = interactUtils.touchPatchFactory();
|
|
131
|
+
* interact(selector)
|
|
132
|
+
* .draggable({
|
|
133
|
+
onstart: () => {
|
|
134
|
+
touchPatch.onstart();
|
|
135
|
+
},
|
|
136
|
+
onend: () => {
|
|
137
|
+
touchPatch.onend();
|
|
138
|
+
}
|
|
139
|
+
})
|
|
140
|
+
.actionChecker(touchPatch.actionChecker);
|
|
141
|
+
...
|
|
142
|
+
function destroy() {
|
|
143
|
+
` touchPatch.destroy()
|
|
144
|
+
interact(selector).unset();
|
|
145
|
+
}
|
|
146
|
+
* @returns {Object}
|
|
147
|
+
*/
|
|
148
|
+
touchPatchFactory: function touchPatchFactory() {
|
|
149
|
+
const delayBefore = 300;
|
|
150
|
+
const distanceTolerance = 20; //while waiting for delayBefore, finger can move a little bit
|
|
151
|
+
|
|
152
|
+
interact.pointerMoveTolerance(distanceTolerance);
|
|
153
|
+
let isDragging = false;
|
|
154
|
+
|
|
155
|
+
// webKit requires cancelable `touchmove` events to be added as early as possible
|
|
156
|
+
// alternative: `touch-action: pinch-zoom` css: add it after drag start [?]; or have it always - worse ux
|
|
157
|
+
function touchmoveListener(e) {
|
|
158
|
+
if (isDragging) {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
window.addEventListener('touchmove', touchmoveListener, {
|
|
163
|
+
passive: false
|
|
164
|
+
});
|
|
165
|
+
function contextmenuListener(e) {
|
|
166
|
+
e.preventDefault();
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
/**
|
|
170
|
+
* @param {PointerEvent} pointer
|
|
171
|
+
* @param {PointerEvent} event
|
|
172
|
+
* @param {Object} action
|
|
173
|
+
* @param {Object} interactable
|
|
174
|
+
* @returns {Object}
|
|
175
|
+
*/
|
|
176
|
+
actionChecker: (pointer, event, action, interactable, element) => {
|
|
177
|
+
if (event && action && action.name === 'drag') {
|
|
178
|
+
const isTouch = event.pointerType === 'touch';
|
|
179
|
+
interactable.options[action.name].delay = isTouch ? delayBefore : 0;
|
|
180
|
+
if (isTouch && !element.dataset.noContextMenu) {
|
|
181
|
+
//prevent context menu on longpress
|
|
182
|
+
//this listener can stay forever until the element is destroyed
|
|
183
|
+
element.addEventListener('contextmenu', contextmenuListener);
|
|
184
|
+
element.dataset.noContextMenu = true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return action;
|
|
188
|
+
},
|
|
189
|
+
onstart: () => {
|
|
190
|
+
isDragging = true;
|
|
191
|
+
},
|
|
192
|
+
onend: () => {
|
|
193
|
+
isDragging = false;
|
|
194
|
+
},
|
|
195
|
+
destroy: () => {
|
|
196
|
+
window.removeEventListener('touchmove', touchmoveListener);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
},
|
|
200
|
+
/**
|
|
201
|
+
* Builds a scroll observer that will make sure the dragged element keeps an accurate positioning
|
|
202
|
+
* @example
|
|
203
|
+
* scrollObserver = interactUtils.scrollObserverFactory($container);
|
|
204
|
+
* dragOptions = {
|
|
205
|
+
autoScroll: {
|
|
206
|
+
container: scrollObserver.getScrollContainer().get(0)
|
|
207
|
+
},
|
|
208
|
+
onstart: function (e) {
|
|
209
|
+
scrollObserver.start($activeChoice);
|
|
210
|
+
},
|
|
211
|
+
onend: function (e) {
|
|
212
|
+
scrollObserver.stop();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
* @param {jQuery} $scrollContainer
|
|
216
|
+
* @returns {scrollObserver}
|
|
217
|
+
*/
|
|
218
|
+
scrollObserverFactory: function scrollObserverFactory($scrollContainer) {
|
|
219
|
+
let currentDraggable = null;
|
|
220
|
+
let beforeY = 0;
|
|
221
|
+
let beforeX = 0;
|
|
222
|
+
let afterY = 0;
|
|
223
|
+
let afterX = 0;
|
|
224
|
+
|
|
225
|
+
// reset the scroll observer context
|
|
226
|
+
function resetScrollObserver() {
|
|
227
|
+
currentDraggable = null;
|
|
228
|
+
beforeY = 0;
|
|
229
|
+
beforeX = 0;
|
|
230
|
+
afterY = 0;
|
|
231
|
+
afterX = 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// keep the position of the dragged element accurate with the scroll position
|
|
235
|
+
function onScrollCb() {
|
|
236
|
+
let x;
|
|
237
|
+
let y;
|
|
238
|
+
if (currentDraggable) {
|
|
239
|
+
beforeY = afterY;
|
|
240
|
+
beforeX = afterX;
|
|
241
|
+
if (afterY === 0 && beforeY === 0) beforeY = this.scrollTop;
|
|
242
|
+
if (afterX === 0 && beforeX === 0) beforeX = this.scrollLeft;
|
|
243
|
+
afterY = this.scrollTop;
|
|
244
|
+
afterX = this.scrollLeft;
|
|
245
|
+
y = (parseInt(currentDraggable.getAttribute('data-y'), 10) || 0) + (afterY - beforeY);
|
|
246
|
+
x = (parseInt(currentDraggable.getAttribute('data-x'), 10) || 0) + (afterX - beforeX);
|
|
247
|
+
|
|
248
|
+
// translate the element
|
|
249
|
+
currentDraggable.style.webkitTransform = currentDraggable.style.transform = `translate(${x}px, ${y}px)`;
|
|
250
|
+
|
|
251
|
+
// update the position attributes
|
|
252
|
+
currentDraggable.setAttribute('data-x', x);
|
|
253
|
+
currentDraggable.setAttribute('data-y', y);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// find the scroll container within the parents if any
|
|
258
|
+
$scrollContainer.parents().each(function findScrollContainer() {
|
|
259
|
+
const $el = $(this);
|
|
260
|
+
const ovf = $el.css('overflow');
|
|
261
|
+
if (ovf !== 'hidden' && ovf !== 'visible') {
|
|
262
|
+
$scrollContainer = $el;
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// make sure the drop zones will follow the scroll
|
|
268
|
+
interact.dynamicDrop(true);
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* @typedef {Object} scrollObserver
|
|
272
|
+
*/
|
|
273
|
+
return {
|
|
274
|
+
/**
|
|
275
|
+
* Gets the scroll container
|
|
276
|
+
* @returns {jQuery}
|
|
277
|
+
*/
|
|
278
|
+
getScrollContainer: function getScrollContainer() {
|
|
279
|
+
return $scrollContainer;
|
|
280
|
+
},
|
|
281
|
+
/**
|
|
282
|
+
* Initializes the scroll observer while dragging a choice
|
|
283
|
+
* @param {HTMLElement|jQuery} draggedElement
|
|
284
|
+
*/
|
|
285
|
+
start: function start(draggedElement) {
|
|
286
|
+
resetScrollObserver();
|
|
287
|
+
currentDraggable = draggedElement instanceof $ ? draggedElement.get(0) : draggedElement;
|
|
288
|
+
$scrollContainer.on('scroll.scrollObserver', _.throttle(onScrollCb, 50));
|
|
289
|
+
},
|
|
290
|
+
/**
|
|
291
|
+
* Tears down the the scroll observer once the dragging is done
|
|
292
|
+
*/
|
|
293
|
+
stop: function stop() {
|
|
294
|
+
$scrollContainer.off('.scrollObserver');
|
|
295
|
+
resetScrollObserver();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
122
298
|
}
|
|
123
299
|
};
|
|
124
300
|
var interactHelper$1 = interactHelper;
|
|
@@ -17,6 +17,7 @@ Usage:
|
|
|
17
17
|
min-height: 36px;
|
|
18
18
|
min-width: 200px;
|
|
19
19
|
direction: ltr;
|
|
20
|
+
padding: 2px;
|
|
20
21
|
}
|
|
21
22
|
.mediaplayer.youtube .player {
|
|
22
23
|
width: 100%;
|
|
@@ -108,6 +109,8 @@ Usage:
|
|
|
108
109
|
text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;
|
|
109
110
|
}
|
|
110
111
|
.mediaplayer .controls {
|
|
112
|
+
background-color: rgb(0, 0, 0);
|
|
113
|
+
color: rgb(255, 255, 255);
|
|
111
114
|
visibility: hidden;
|
|
112
115
|
position: relative;
|
|
113
116
|
padding: 5px;
|
|
@@ -427,6 +430,18 @@ Usage:
|
|
|
427
430
|
.mediaplayer.stalled .player-overlay [data-control=reload] {
|
|
428
431
|
display: inline-block;
|
|
429
432
|
}
|
|
433
|
+
.mediaplayer .transcription {
|
|
434
|
+
background-color: white;
|
|
435
|
+
color: black;
|
|
436
|
+
font-size: 14px;
|
|
437
|
+
line-height: 1.5;
|
|
438
|
+
max-height: 60px;
|
|
439
|
+
margin-bottom: 2px;
|
|
440
|
+
overflow-y: scroll;
|
|
441
|
+
}
|
|
442
|
+
.mediaplayer .transcription.hidden {
|
|
443
|
+
display: none;
|
|
444
|
+
}
|
|
430
445
|
.mediaplayer.video:not(.preview):not(.error) .player-overlay [data-control=start] {
|
|
431
446
|
display: inline-block;
|
|
432
447
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../scss/inc/_functions.scss","../../../scss/inc/fonts/_tao-icon-vars.scss","../scss/player.scss%23sass","../scss/player.scss","../../../scss/inc/_colors.scss"],"names":[],"mappings":"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","file":"player.css","sourcesContent":["@mixin iterate-sprite($iconList, $x, $y, $direction, $prefix:'') {\n @each $icon in $iconList {\n #{$prefix}#{$icon} {\n background-position: $x * 1px $y * 1px;\n }\n @if $direction == 'x' {\n $x: $x - 16;\n } @else {\n $y: $y - 16;\n }\n }\n}\n\n/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n@mixin linear-gradient($colorList, $direction: 'to right') {\n $percentage: 0;\n $units: '%';\n $count: length($colorList);\n $increment: calc(100 / ($count - 1));\n $css: #{$direction + ', '};\n $sep: ', ';\n @each $colorItem in $colorList {\n $color: $colorItem;\n @if (length($colorItem) > 1) {\n $color: nth($colorItem, 1);\n $percentage: nth($colorItem, 2);\n $units: '';\n }\n @if ($percentage >= 100 or index($colorList, $colorItem) == $count) {\n $sep: '';\n }\n $css: #{$css + $color + ' ' + $percentage + $units + $sep};\n $percentage: $percentage + $increment;\n }\n background: linear-gradient( #{$css} );\n}\n\n@mixin grid-unit($span, $numCols: 12, $gutter: 0) {\n $gridPx: 840;\n $rawSpanPx: calc((($gridPx - ($numCols * $gutter)) / $numCols));\n $spanPx: $rawSpanPx * $span + (($span - 1) * $gutter);\n $spanPercent: widthPerc($spanPx, $gridPx);\n $marginPercent: widthPerc($gutter, $gridPx);\n margin-inline-start: $marginPercent;\n inline-size: $spanPercent;\n}\n\n@mixin vendor-prefix($property, $value, $whatToPrefix: property, $prefixes: (-webkit-, -moz-, -ms-, -o-, '')) {\n @if $whatToPrefix == 'property' {\n @each $prefix in $prefixes {\n #{$prefix + $property}: #{$value};\n }\n }\n @else if $whatToPrefix == 'value' {\n @each $prefix in $prefixes {\n #{$property}: #{$prefix + $value};\n }\n }\n}\n@mixin flex-container($wrapBehavior: nowrap, $direction : row) {\n @include vendor-prefix(display, flex, value, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(flex-direction, $direction, property, (-ms-, -webkit-, ''));\n @include vendor-prefix(flex-wrap, $wrapBehavior, property, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(justify-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-items, stretch, property, (-webkit-, ''));\n}\n\n@mixin simple-flex-box($width: auto, $minWidth: 1) {\n\n @include vendor-prefix(order, 0, property, (-ms-, -webkit-, ''));\n flex-item-align: stretch;\n -ms-flex-item-align: stretch;\n @include vendor-prefix(align-self, stretch, property, (-webkit-, ''));\n\n // if both, min width and width are set, width will win this conflict\n @if ($width == auto) {\n @if ($minWidth != 1) {\n @include vendor-prefix(flex, 1 1 $minWidth, property, (-ms-, -webkit-, ''));\n }\n @else {\n @include vendor-prefix(flex, 1 1 auto, property, (-ms-, -webkit-, ''));\n // @see https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis#Values\n // for a discussion auto vs. main-size\n @include vendor-prefix(flex, 1 1, property, (-ms-, -webkit-, ''));\n }\n }\n @else {\n @include vendor-prefix(flex, 0 0 $width, property, (-ms-, -webkit-, ''));\n }\n}\n\n\n@mixin box-shadow($horiz: 1px, $vert: 1px, $blur: 2px, $spread: 0, $color: rgba(0, 0, 0, .2)) {\n @include vendor-prefix(box-shadow, $horiz $vert $blur $spread $color, property);\n}\n\n@mixin simple-border($color: #ddd) {\n border: 1px solid $color;\n border-radius: 2px;\n -webkit-border-radius: 2px;\n}\n\n@mixin border-radius($radius: 2) {\n -moz-border-radius: $radius * 1px;\n -webkit-border-radius: $radius * 1px;\n border-radius: $radius * 1px;\n}\n\n@mixin border-radius-top($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-right($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-left($radius: 2) {\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-box() {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n@function whiten($color, $white: 0.3) {\n @return mix(#fff, $color, ($white * 100) * 1%);\n}\n\n@function blacken($color, $black: 0.3) {\n @return mix(#000, $color, ($black * 100) * 1%);\n}\n\n@function widthPerc($colWidth, $context) {\n @return calc(($colWidth * 100 / $context) * 1%)\n}\n\n@function remDist($fontSizePx) {\n @return calc(($fontSizePx / 10) * 1rem)\n}\n\n@function black($alpha: 1) {\n @return (rgba(0, 0, 0, $alpha))\n}\n\n@function white($alpha: 1) {\n @return (rgba(255, 255, 255, $alpha))\n}\n\n@mixin font-size($remPx, $important: false) {\n @if $important == true {\n font-size: calc(($remPx) * 1px) !important;\n font-size: calc(($remPx / 10) * 1rem) !important;\n }\n @else {\n font-size: calc(($remPx) * 1px);\n font-size: calc(($remPx / 10) * 1rem);\n }\n}\n\n\n@mixin keyframes($name) {\n @-o-keyframes #{$name} { @content };\n @-moz-keyframes #{$name} { @content };\n @-webkit-keyframes #{$name} { @content };\n @keyframes #{$name} { @content };\n}\n\n\n@mixin animation($value, $type:'') {\n $animation: animation;\n @if $type != '' {\n $animation: $animation + '-' + $type;\n }\n @include vendor-prefix($animation, $value, property);\n}\n\n/// CSS transition mixin to the current selection (apply also vendor prefixes).\n/// See <https://developer.mozilla.org/en-US/docs/Web/CSS/transition> for the values\n///\n/// @param {property} [$type = all] the CSS property to apply the transition to\n/// @param {time} [$duration = .5s] the transition property\n/// @param {timing-function} [$effect = ease-out] the transition property\n@mixin transition($type : all, $duration : 0.5s, $effect : ease-out, $delay : 0s){\n @include vendor-prefix(transition, $type + ', ' + $duration + ', ' + $effect + ', ' + $delay, property);\n}\n\n@mixin fade($duration: 1s){\n\n @include keyframes(fade) {\n 0% {opacity:0;}\n 50% {opacity:1;}\n 100% {opacity:0;}\n }\n\n @include vendor-prefix(animation, fade 1s forwards, property);\n}\n\n@mixin repeat(){\n @include animation(infinite, iteration-count);\n}\n\n@mixin largeHeading() {\n @include font-size(20);\n font-family: $headingFont;\n font-style: normal;\n}\n\n@mixin disableSelect() {\n @include vendor-prefix(user-select, none, property);\n}\n\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n@mixin visuallyHidden() {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(1px, 1px, 1px, 1px);\n margin: 0;\n padding: 0;\n}\n","/* Do not edit */@mixin tao-icon-setup {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'tao' !important;\n speak: never;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@mixin icon-restricted { content: \"\\e92c\"; }\n@mixin icon-blocked { content: \"\\e92d\"; }\n@mixin icon-copy { content: \"\\e92b\"; }\n@mixin icon-align-center { content: \"\\e92a\"; }\n@mixin icon-multiple-magicwand { content: \"\\e929\"; }\n@mixin icon-sd-import { content: \"\\e91f\"; }\n@mixin icon-sd-export { content: \"\\e924\"; }\n@mixin icon-browse { content: \"\\e925\"; }\n@mixin icon-minus { content: \"\\e926\"; }\n@mixin icon-plus { content: \"\\e927\"; }\n@mixin icon-sd-save { content: \"\\e928\"; }\n@mixin icon-back-button { content: \"\\e91e\"; }\n@mixin icon-japan-incorrect { content: \"\\e91b\"; }\n@mixin icon-japan-correct { content: \"\\e91c\"; }\n@mixin icon-japan-partial { content: \"\\e91d\"; }\n@mixin icon-score-partial { content: \"\\e91a\"; }\n@mixin icon-furigana { content: \"\\e919\"; }\n@mixin icon-add-subsection { content: \"\\e918\"; }\n@mixin icon-info-bare { content: \"\\e923\"; }\n@mixin icon-bookmark-outline { content: \"\\e922\"; }\n@mixin icon-bookmark { content: \"\\e921\"; }\n@mixin icon-indicator { content: \"\\e920\"; }\n@mixin icon-wrap-inline { content: \"\\e915\"; }\n@mixin icon-wrap-left { content: \"\\e916\"; }\n@mixin icon-wrap-right { content: \"\\e917\"; }\n@mixin icon-offline { content: \"\\e913\"; }\n@mixin icon-online { content: \"\\e914\"; }\n@mixin icon-tab { content: \"\\e90d\"; }\n@mixin icon-untab { content: \"\\e90e\"; }\n@mixin icon-multi-select { content: \"\\e90b\"; }\n@mixin icon-clipboard { content: \"\\e90a\"; }\n@mixin icon-filebox { content: \"\\e909\"; }\n@mixin icon-click-to-speak { content: \"\\e907\"; }\n@mixin icon-speech-bubble { content: \"\\f0e5\"; }\n@mixin icon-microphone { content: \"\\f130\"; }\n@mixin icon-microphone-off { content: \"\\f131\"; }\n@mixin icon-disconnect { content: \"\\e905\"; }\n@mixin icon-connect { content: \"\\e906\"; }\n@mixin icon-eliminate { content: \"\\e904\"; }\n@mixin icon-wheelchair { content: \"\\e903\"; }\n@mixin icon-text-marker { content: \"\\e902\"; }\n@mixin icon-unshield { content: \"\\e32a\"; }\n@mixin icon-shield { content: \"\\e8e8\"; }\n@mixin icon-tree { content: \"\\e6b4\"; }\n@mixin icon-home { content: \"\\e6b3\"; }\n@mixin icon-shared-file { content: \"\\e6b2\"; }\n@mixin icon-end-attempt { content: \"\\e603\"; }\n@mixin icon-icon { content: \"\\f1c5\"; }\n@mixin icon-radio-bg { content: \"\\e600\"; }\n@mixin icon-checkbox-bg { content: \"\\e601\"; }\n@mixin icon-tag { content: \"\\e602\"; }\n@mixin icon-style { content: \"\\e604\"; }\n@mixin icon-ownership-transfer { content: \"\\e605\"; }\n@mixin icon-property-advanced { content: \"\\e606\"; }\n@mixin icon-property-add { content: \"\\e607\"; }\n@mixin icon-repository-add { content: \"\\e608\"; }\n@mixin icon-repository-remove { content: \"\\e609\"; }\n@mixin icon-repository { content: \"\\e60a\"; }\n@mixin icon-result-server { content: \"\\e60b\"; }\n@mixin icon-folder { content: \"\\e60c\"; }\n@mixin icon-folder-open { content: \"\\e60d\"; }\n@mixin icon-left { content: \"\\e60e\"; }\n@mixin icon-right { content: \"\\e60f\"; }\n@mixin icon-up { content: \"\\e610\"; }\n@mixin icon-down { content: \"\\e611\"; }\n@mixin icon-undo { content: \"\\e612\"; }\n@mixin icon-redo { content: \"\\e613\"; }\n@mixin icon-screen { content: \"\\e614\"; }\n@mixin icon-laptop { content: \"\\e615\"; }\n@mixin icon-tablet { content: \"\\e616\"; }\n@mixin icon-phone { content: \"\\e617\"; }\n@mixin icon-move { content: \"\\e618\"; }\n@mixin icon-bin { content: \"\\e619\"; }\n@mixin icon-shuffle { content: \"\\e61a\"; }\n@mixin icon-print { content: \"\\e61b\"; }\n@mixin icon-tools { content: \"\\e61c\"; }\n@mixin icon-settings { content: \"\\e61d\"; }\n@mixin icon-video { content: \"\\e61e\"; }\n@mixin icon-find { content: \"\\e61f\"; }\n@mixin icon-image { content: \"\\e620\"; }\n@mixin icon-edit { content: \"\\e621\"; }\n@mixin icon-document { content: \"\\e622\"; }\n@mixin icon-resize-grid { content: \"\\e623\"; }\n@mixin icon-resize { content: \"\\e624\"; }\n@mixin icon-help { content: \"\\e625\"; }\n@mixin icon-mobile-menu { content: \"\\e626\"; }\n@mixin icon-fix { content: \"\\e627\"; }\n@mixin icon-unlock { content: \"\\e628\"; }\n@mixin icon-lock { content: \"\\e629\"; }\n@mixin icon-ul { content: \"\\e62a\"; }\n@mixin icon-ol { content: \"\\e62b\"; }\n@mixin icon-email { content: \"\\e62c\"; }\n@mixin icon-download { content: \"\\e62d\"; }\n@mixin icon-logout { content: \"\\e62e\"; }\n@mixin icon-login { content: \"\\e62f\"; }\n@mixin icon-spinner { content: \"\\e630\"; }\n@mixin icon-preview { content: \"\\e631\"; }\n@mixin icon-external { content: \"\\e632\"; }\n@mixin icon-time { content: \"\\e633\"; }\n@mixin icon-save { content: \"\\e634\"; }\n@mixin icon-warning { content: \"\\e635\"; }\n@mixin icon-add { content: \"\\e636\"; }\n@mixin icon-error { content: \"\\e900\"; }\n@mixin icon-close { content: \"\\e637\"; }\n@mixin icon-success { content: \"\\e638\"; }\n@mixin icon-remove { content: \"\\e639\"; }\n@mixin icon-info { content: \"\\e63a\"; }\n@mixin icon-danger { content: \"\\e63b\"; }\n@mixin icon-users { content: \"\\e63c\"; }\n@mixin icon-user { content: \"\\e63d\"; }\n@mixin icon-test-taker { content: \"\\e63e\"; }\n@mixin icon-test-takers { content: \"\\e63f\"; }\n@mixin icon-item { content: \"\\e640\"; }\n@mixin icon-test { content: \"\\e641\"; }\n@mixin icon-delivery { content: \"\\e642\"; }\n@mixin icon-eye-slash { content: \"\\e643\"; }\n@mixin icon-result { content: \"\\e644\"; }\n@mixin icon-delivery-small { content: \"\\e645\"; }\n@mixin icon-upload { content: \"\\e646\"; }\n@mixin icon-result-small { content: \"\\e647\"; }\n@mixin icon-mobile-preview { content: \"\\e648\"; }\n@mixin icon-extension { content: \"\\e649\"; }\n@mixin icon-desktop-preview { content: \"\\e64a\"; }\n@mixin icon-tablet-preview { content: \"\\e64b\"; }\n@mixin icon-insert-horizontal-line { content: \"\\e64c\"; }\n@mixin icon-table { content: \"\\e64d\"; }\n@mixin icon-anchor { content: \"\\e64e\"; }\n@mixin icon-unlink { content: \"\\e64f\"; }\n@mixin icon-link { content: \"\\e650\"; }\n@mixin icon-right-left { content: \"\\e651\"; }\n@mixin icon-left-right { content: \"\\e652\"; }\n@mixin icon-special-character { content: \"\\e653\"; }\n@mixin icon-source { content: \"\\e654\"; }\n@mixin icon-new-page { content: \"\\e655\"; }\n@mixin icon-templates { content: \"\\e656\"; }\n@mixin icon-cut { content: \"\\e657\"; }\n@mixin icon-replace { content: \"\\e658\"; }\n@mixin icon-duplicate { content: \"\\e659\"; }\n@mixin icon-paste { content: \"\\e65a\"; }\n@mixin icon-select-all { content: \"\\e65b\"; }\n@mixin icon-paste-text { content: \"\\e65c\"; }\n@mixin icon-paste-word { content: \"\\e65d\"; }\n@mixin icon-bold { content: \"\\e65e\"; }\n@mixin icon-italic { content: \"\\e65f\"; }\n@mixin icon-underline { content: \"\\e660\"; }\n@mixin icon-subscript { content: \"\\e661\"; }\n@mixin icon-superscript { content: \"\\e662\"; }\n@mixin icon-strike-through { content: \"\\e663\"; }\n@mixin icon-decrease-indent { content: \"\\e664\"; }\n@mixin icon-increase-indent { content: \"\\e665\"; }\n@mixin icon-block-quote { content: \"\\e666\"; }\n@mixin icon-div-container { content: \"\\e667\"; }\n@mixin icon-align-left { content: \"\\e668\"; }\n@mixin icon-center { content: \"\\e669\"; }\n@mixin icon-align-right { content: \"\\e66a\"; }\n@mixin icon-justify { content: \"\\e66b\"; }\n@mixin icon-choice { content: \"\\e66c\"; }\n@mixin icon-inline-choice { content: \"\\e66d\"; }\n@mixin icon-match { content: \"\\e66e\"; }\n@mixin icon-associate { content: \"\\e66f\"; }\n@mixin icon-media { content: \"\\e670\"; }\n@mixin icon-graphic-order { content: \"\\e671\"; }\n@mixin icon-hotspot { content: \"\\e672\"; }\n@mixin icon-graphic-gap { content: \"\\e673\"; }\n@mixin icon-graphic-associate { content: \"\\e674\"; }\n@mixin icon-select-point { content: \"\\e675\"; }\n@mixin icon-pin { content: \"\\e676\"; }\n@mixin icon-import { content: \"\\e677\"; }\n@mixin icon-export { content: \"\\e678\"; }\n@mixin icon-move-item { content: \"\\e679\"; }\n@mixin icon-meta-data { content: \"\\e67a\"; }\n@mixin icon-slider { content: \"\\e67b\"; }\n@mixin icon-summary-report { content: \"\\e67c\"; }\n@mixin icon-text-entry { content: \"\\e67d\"; }\n@mixin icon-extended-text { content: \"\\e67e\"; }\n@mixin icon-eraser { content: \"\\e67f\"; }\n@mixin icon-row { content: \"\\e680\"; }\n@mixin icon-column { content: \"\\e681\"; }\n@mixin icon-text-color { content: \"\\e682\"; }\n@mixin icon-background-color { content: \"\\e683\"; }\n@mixin icon-spell-check { content: \"\\e684\"; }\n@mixin icon-polygon { content: \"\\e685\"; }\n@mixin icon-rectangle { content: \"\\e686\"; }\n@mixin icon-gap-match { content: \"\\e687\"; }\n@mixin icon-order { content: \"\\e688\"; }\n@mixin icon-hottext { content: \"\\e689\"; }\n@mixin icon-free-form { content: \"\\e68a\"; }\n@mixin icon-step-backward { content: \"\\e68b\"; }\n@mixin icon-fast-backward { content: \"\\e68c\"; }\n@mixin icon-backward { content: \"\\e68d\"; }\n@mixin icon-play { content: \"\\e68e\"; }\n@mixin icon-pause { content: \"\\e68f\"; }\n@mixin icon-stop { content: \"\\e690\"; }\n@mixin icon-forward { content: \"\\e691\"; }\n@mixin icon-fast-forward { content: \"\\e692\"; }\n@mixin icon-step-forward { content: \"\\e693\"; }\n@mixin icon-ellipsis { content: \"\\e694\"; }\n@mixin icon-circle { content: \"\\e695\"; }\n@mixin icon-target { content: \"\\e696\"; }\n@mixin icon-guide-arrow { content: \"\\e697\"; }\n@mixin icon-range-slider-right { content: \"\\e698\"; }\n@mixin icon-range-slider-left { content: \"\\e699\"; }\n@mixin icon-radio-checked { content: \"\\e69a\"; }\n@mixin icon-checkbox-indeterminate { content: \"\\e901\"; }\n@mixin icon-checkbox { content: \"\\e69b\"; }\n@mixin icon-checkbox-crossed { content: \"\\e69c\"; }\n@mixin icon-checkbox-checked { content: \"\\e69d\"; }\n@mixin icon-result-nok { content: \"\\e69e\"; }\n@mixin icon-result-ok { content: \"\\e69f\"; }\n@mixin icon-not-evaluated { content: \"\\e6a0\"; }\n@mixin icon-filter { content: \"\\e6a1\"; }\n@mixin icon-translate { content: \"\\e6a2\"; }\n@mixin icon-eject { content: \"\\e6a3\"; }\n@mixin icon-continue { content: \"\\e6a4\"; }\n@mixin icon-radio { content: \"\\e6a5\"; }\n@mixin icon-sphere { content: \"\\e6a6\"; }\n@mixin icon-reset { content: \"\\e6a7\"; }\n@mixin icon-smaller { content: \"\\e6a8\"; }\n@mixin icon-larger { content: \"\\e6a9\"; }\n@mixin icon-clock { content: \"\\e6aa\"; }\n@mixin icon-font { content: \"\\e6ab\"; }\n@mixin icon-maths { content: \"\\e6ac\"; }\n@mixin icon-grip { content: \"\\e6ad\"; }\n@mixin icon-rubric { content: \"\\e6ae\"; }\n@mixin icon-audio { content: \"\\e6af\"; }\n@mixin icon-grip-h { content: \"\\e6b0\"; }\n@mixin icon-magicwand { content: \"\\e6b1\"; }\n@mixin icon-loop { content: \"\\ea2e\"; }\n@mixin icon-calendar { content: \"\\e953\"; }\n@mixin icon-reload { content: \"\\e984\"; }\n@mixin icon-speed { content: \"\\e9a6\"; }\n@mixin icon-volume { content: \"\\ea27\"; }\n@mixin icon-contrast { content: \"\\e9d5\"; }\n@mixin icon-headphones { content: \"\\e910\"; }\n@mixin icon-compress { content: \"\\f066\"; }\n@mixin icon-map-o { content: \"\\f278\"; }\n@mixin icon-variable { content: \"\\e908\"; }\n@mixin icon-tooltip { content: \"\\e90c\"; }\n@mixin icon-globe { content: \"\\e9c9\"; }\n@mixin icon-highlighter { content: \"\\e90f\"; }\n@mixin icon-eliminate-crossed { content: \"\\e911\"; }\n@mixin icon-play-from-here { content: \"\\e912\"; }\n","@import \"inc/bootstrap\";\n\n$playerActionSize: 2.2rem;\n$playerActionSpace: 1rem;\n$playerBackground: black();\n$playerBorder: $darkBar;\n$playerText: #999;\n$playerIcon: $darkBarIcon;\n$playerTextOverlay: white();\n$playerSliderBorder: $uiGeneralContentBorder;\n$playerSliderBackground: $uiGeneralContentBg;\n$playerSliderColor: $darkBar;\n$playerSliderHandle: whiten($playerSliderColor, .4);\n$playerSliderHightlight: whiten($playerSliderColor, .2);\n$controlsHeight: 36px;\n\n.mediaplayer {\n position: relative;\n @include simple-border($playerBorder);\n @include border-radius(2);\n background: $playerBackground;\n max-width: 100%;\n min-height: $controlsHeight;\n min-width: 200px;\n direction: ltr;\n\n &.youtube {\n .player {\n width: 100%;\n height: 0px;\n padding-bottom: 56.25%; // 56.25% for widescreen 16:9 aspect ratio videos\n }\n }\n .icon-sound:before {\n @include icon-audio();\n }\n .icon-mute:before {\n @include icon-result-nok();\n }\n\n .error {\n display: none;\n }\n\n .player {\n position: relative;\n height: calc(100% - #{$controlsHeight});\n width: 100%;\n\n iframe {\n pointer-events: none;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%\n }\n\n .media:not(.youtube) {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n }\n\n .player-overlay {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n background: transparent none;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n .action {\n position: absolute;\n z-index: 2;\n top: 50%;\n left: 50%;\n transform: translate(-50%);\n margin-top: -32px;\n text-align: center;\n text-decoration: none;\n display: none;\n @include font-size(64);\n color: $playerTextOverlay;\n\n .icon {\n @include border-radius(10);\n padding: 6px 12px;\n background-color: $playerBackground;\n opacity: 0.2;\n\n &:hover {\n opacity: 0.6;\n }\n }\n\n &.reload {\n width: 100%;\n font-size: 50px;\n line-height: 30px;\n\n &:hover {\n .icon {\n opacity: 1;\n font-family: 'tao' !important;\n }\n }\n\n .icon {\n opacity: 0.6;\n background: none;\n font-family: 'tao' !important;\n }\n .message {\n font-size: 20px;\n }\n\n .icon, .message {\n text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;\n }\n }\n }\n }\n\n .controls {\n visibility: hidden;\n position: relative;\n padding: 5px;\n display: table;\n table-layout: fixed;\n width: 100%;\n border-top: 1px solid $playerBorder;\n height: $controlsHeight;\n\n .bar {\n display: table-row;\n }\n .control {\n display: table-cell;\n }\n\n .actions {\n position: relative;\n @include transition(all, 0.1,ease-in-out);\n\n .action {\n text-align: center;\n line-height: $playerActionSize;\n width: $playerActionSize;\n height: $playerActionSize;\n text-decoration: none;\n color: $playerIcon;\n @include transition(all, 0.2, ease-in-out);\n\n &:hover {\n opacity: 1;\n }\n\n .icon {\n line-height: $playerActionSize;\n font-family: 'tao' !important;\n }\n }\n\n .play {\n opacity: 0.7;\n border-right: 1px solid $playerBorder;\n }\n\n .mute {\n opacity: 0.8;\n border-left: 1px solid $playerBorder;\n }\n }\n\n .slider {\n cursor: pointer;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n @include transition(all, 0.1, ease-in-out);\n background: $playerSliderBackground;\n\n .noUi-background {\n @include border-radius(10);\n background: $playerSliderBackground;\n }\n &.noUi-connect, .noUi-connect {\n @include border-radius(10);\n background: $playerSliderColor;\n }\n\n .noUi-handle {\n width: 11px;\n height: 11px;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n background: $playerSliderHandle;\n }\n .noUi-handle:hover {\n background: $playerSliderHightlight;\n }\n .noUi-handle:after {\n display: none;\n }\n\n &.noUi-horizontal {\n height: 9px;\n\n .noUi-handle {\n top: -2px;\n }\n }\n\n &.noUi-vertical {\n width: 9px;\n\n .noUi-handle {\n left: -2px;\n }\n }\n }\n\n .infos {\n cursor: default;\n\n margin: 0 $playerActionSpace;\n line-height: $playerActionSize;\n\n color: $playerText;\n @include font-size(10);\n font-weight: bold;\n\n [data-control=\"time-end\"]:before {\n content: ' / ';\n }\n }\n\n .timer {\n width: 8rem;\n text-align: center;\n }\n\n .seek {\n position: relative;\n height: 1rem;\n margin-top: 5px;\n padding-left: $playerActionSpace;\n }\n\n .playback {\n margin-right: $playerActionSpace;\n width: $playerActionSize;\n }\n\n .sound {\n width: $playerActionSize;\n height: $playerActionSize;\n\n .action {\n position: relative;\n z-index: 1001;\n }\n .volume {\n cursor: default;\n position: absolute;\n z-index: 1000;\n background-color: $playerBackground;\n margin: 1px 2px;\n padding: 10px 0;\n width: 100%;\n height: 0;\n top: 0;\n left: -1px;\n opacity : 0;\n text-align: center;\n border: solid 1px $playerBorder;\n pointer-events: none;\n overflow: hidden;\n @include vendor-prefix(transition, 'height 300ms ease-out, top 300ms ease-out, opacity 50ms linear 250ms', property);\n\n &.up, &.down {\n height: 120px;\n opacity : 1;\n pointer-events: auto;\n .slider {\n display: inline-block;\n opacity : 1;\n transition: opacity 50ms linear 200ms;\n @include vendor-prefix(transition, 'opacity 50ms linear 200ms', property);\n }\n }\n &.up {\n top: -127px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, top 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n &.down {\n top: 30px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n }\n\n .slider {\n opacity : 0;\n display: none;\n .noUi-handle {\n cursor: pointer;\n width: 9px;\n height: 9px;\n }\n\n &.noUi-horizontal {\n width: 50px;\n height: 7px;\n }\n\n &.noUi-vertical {\n width: 7px;\n height: 100px;\n }\n }\n }\n\n [data-control=\"play\"] {\n display: none;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n\n [data-control=\"mute\"] {\n display: inline-block;\n }\n [data-control=\"unmute\"] {\n display: none;\n }\n }\n\n &.video, &.youtube {\n .sound {\n .volume {\n width: 2.8rem;\n bottom: $playerActionSize;\n right: 0;\n }\n }\n }\n\n &.audio {\n .sound {\n .volume {\n height: $playerActionSize;\n right: $playerActionSize;\n bottom: 0;\n }\n }\n\n &.stalled {\n .player {\n .player-overlay {\n [data-control=\"reload\"] {\n display: flex;\n align-items: center;\n background-color: #000;\n margin: 0;\n flex-wrap: wrap;\n padding: 5px 5px 5px 50px;\n text-align: left;\n line-height: 2.3rem;\n &.reload {\n width: calc(100% + 2px);\n font-size: 20px;\n line-height: 20px;\n min-height: 36px;\n\n .icon {\n text-shadow: none;\n position: absolute;\n left: 0;\n font-size: 2rem;\n font-weight: bold;\n }\n\n .message {\n text-shadow: none;\n font-size: 1.3rem;\n margin-right: 5px;\n }\n }\n }\n }\n }\n }\n }\n\n &.ready {\n .controls {\n visibility: visible;\n }\n\n &.paused.canplay {\n .player-overlay {\n cursor: pointer;\n font-family: 'tao' !important;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"play\"] {\n display: inline-block;\n }\n }\n }\n\n &.youtube.ended, &:not(.preview) {\n .player:hover {\n [data-control=\"play\"] {\n display: none;\n }\n }\n }\n }\n\n &.playing.canpause {\n .player-overlay {\n cursor: pointer;\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n }\n }\n\n &.playing.canpause {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n\n &.paused.canplay {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"play\"] {\n display: inline-block;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n }\n }\n\n &.muted {\n .controls {\n [data-control=\"mute\"] {\n display: none;\n }\n [data-control=\"unmute\"] {\n display: inline-block;\n }\n }\n }\n\n &.nogui {\n .player {\n iframe {\n pointer-events: inherit;\n }\n }\n .player-overlay {\n display: none !important;\n }\n .controls {\n display: none !important;\n }\n }\n\n &.error:not(.stalled) {\n .media, .controls {\n display: none;\n }\n\n .error {\n display: table;\n text-align: center;\n width: 100%;\n height: 100%;\n\n .message {\n color: $error;\n display: table-cell;\n vertical-align: middle;\n }\n }\n }\n\n &.loading:not(.stalled)::before {\n @keyframes spinner {\n to { transform: rotate(360deg); }\n }\n\n content: '';\n box-sizing: border-box;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n border: 1px solid #ccc;\n border-top-color: #07d;\n animation: spinner .6s linear infinite;\n }\n\n &.stalled {\n .video {\n filter: blur(4px);\n opacity: 0.4;\n }\n .player-overlay {\n [data-control=\"reload\"] {\n display: inline-block;\n }\n }\n }\n\n &.video:not(.preview):not(.error) {\n .player-overlay {\n [data-control=\"start\"] {\n display: inline-block;\n }\n }\n }\n}\n","@import \"inc/bootstrap\";\n\n$playerActionSize: 2.2rem;\n$playerActionSpace: 1rem;\n$playerBackground: black();\n$playerBorder: $darkBar;\n$playerText: #999;\n$playerIcon: $darkBarIcon;\n$playerTextOverlay: white();\n$playerSliderBorder: $uiGeneralContentBorder;\n$playerSliderBackground: $uiGeneralContentBg;\n$playerSliderColor: $darkBar;\n$playerSliderHandle: whiten($playerSliderColor, .4);\n$playerSliderHightlight: whiten($playerSliderColor, .2);\n$controlsHeight: 36px;\n\n.mediaplayer {\n position: relative;\n @include simple-border($playerBorder);\n @include border-radius(2);\n background: $playerBackground;\n max-width: 100%;\n min-height: $controlsHeight;\n min-width: 200px;\n direction: ltr;\n\n &.youtube {\n .player {\n width: 100%;\n height: 0px;\n padding-bottom: 56.25%; // 56.25% for widescreen 16:9 aspect ratio videos\n }\n }\n .icon-sound:before {\n @include icon-audio();\n }\n .icon-mute:before {\n @include icon-result-nok();\n }\n\n .error {\n display: none;\n }\n\n .player {\n position: relative;\n height: calc(100% - #{$controlsHeight});\n width: 100%;\n\n iframe {\n pointer-events: none;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%\n }\n\n .media:not(.youtube) {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n }\n\n .player-overlay {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n background: transparent none;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n .action {\n position: absolute;\n z-index: 2;\n top: 50%;\n left: 50%;\n transform: translate(-50%);\n margin-top: -32px;\n text-align: center;\n text-decoration: none;\n display: none;\n @include font-size(64);\n color: $playerTextOverlay;\n\n .icon {\n @include border-radius(10);\n padding: 6px 12px;\n background-color: $playerBackground;\n opacity: 0.2;\n\n &:hover {\n opacity: 0.6;\n }\n }\n\n &.reload {\n width: 100%;\n font-size: 50px;\n line-height: 30px;\n\n &:hover {\n .icon {\n opacity: 1;\n font-family: 'tao' !important;\n }\n }\n\n .icon {\n opacity: 0.6;\n background: none;\n font-family: 'tao' !important;\n }\n .message {\n font-size: 20px;\n }\n\n .icon, .message {\n text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;\n }\n }\n }\n }\n\n .controls {\n visibility: hidden;\n position: relative;\n padding: 5px;\n display: table;\n table-layout: fixed;\n width: 100%;\n border-top: 1px solid $playerBorder;\n height: $controlsHeight;\n\n .bar {\n display: table-row;\n }\n .control {\n display: table-cell;\n }\n\n .actions {\n position: relative;\n @include transition(all, 0.1,ease-in-out);\n\n .action {\n text-align: center;\n line-height: $playerActionSize;\n width: $playerActionSize;\n height: $playerActionSize;\n text-decoration: none;\n color: $playerIcon;\n @include transition(all, 0.2, ease-in-out);\n\n &:hover {\n opacity: 1;\n }\n\n .icon {\n line-height: $playerActionSize;\n font-family: 'tao' !important;\n }\n }\n\n .play {\n opacity: 0.7;\n border-right: 1px solid $playerBorder;\n }\n\n .mute {\n opacity: 0.8;\n border-left: 1px solid $playerBorder;\n }\n }\n\n .slider {\n cursor: pointer;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n @include transition(all, 0.1, ease-in-out);\n background: $playerSliderBackground;\n\n .noUi-background {\n @include border-radius(10);\n background: $playerSliderBackground;\n }\n &.noUi-connect, .noUi-connect {\n @include border-radius(10);\n background: $playerSliderColor;\n }\n\n .noUi-handle {\n width: 11px;\n height: 11px;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n background: $playerSliderHandle;\n }\n .noUi-handle:hover {\n background: $playerSliderHightlight;\n }\n .noUi-handle:after {\n display: none;\n }\n\n &.noUi-horizontal {\n height: 9px;\n\n .noUi-handle {\n top: -2px;\n }\n }\n\n &.noUi-vertical {\n width: 9px;\n\n .noUi-handle {\n left: -2px;\n }\n }\n }\n\n .infos {\n cursor: default;\n\n margin: 0 $playerActionSpace;\n line-height: $playerActionSize;\n\n color: $playerText;\n @include font-size(10);\n font-weight: bold;\n\n [data-control=\"time-end\"]:before {\n content: ' / ';\n }\n }\n\n .timer {\n width: 8rem;\n text-align: center;\n }\n\n .seek {\n position: relative;\n height: 1rem;\n margin-top: 5px;\n padding-left: $playerActionSpace;\n }\n\n .playback {\n margin-right: $playerActionSpace;\n width: $playerActionSize;\n }\n\n .sound {\n width: $playerActionSize;\n height: $playerActionSize;\n\n .action {\n position: relative;\n z-index: 1001;\n }\n .volume {\n cursor: default;\n position: absolute;\n z-index: 1000;\n background-color: $playerBackground;\n margin: 1px 2px;\n padding: 10px 0;\n width: 100%;\n height: 0;\n top: 0;\n left: -1px;\n opacity : 0;\n text-align: center;\n border: solid 1px $playerBorder;\n pointer-events: none;\n overflow: hidden;\n @include vendor-prefix(transition, 'height 300ms ease-out, top 300ms ease-out, opacity 50ms linear 250ms', property);\n\n &.up, &.down {\n height: 120px;\n opacity : 1;\n pointer-events: auto;\n .slider {\n display: inline-block;\n opacity : 1;\n transition: opacity 50ms linear 200ms;\n @include vendor-prefix(transition, 'opacity 50ms linear 200ms', property);\n }\n }\n &.up {\n top: -127px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, top 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n &.down {\n top: 30px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n }\n\n .slider {\n opacity : 0;\n display: none;\n .noUi-handle {\n cursor: pointer;\n width: 9px;\n height: 9px;\n }\n\n &.noUi-horizontal {\n width: 50px;\n height: 7px;\n }\n\n &.noUi-vertical {\n width: 7px;\n height: 100px;\n }\n }\n }\n\n [data-control=\"play\"] {\n display: none;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n\n [data-control=\"mute\"] {\n display: inline-block;\n }\n [data-control=\"unmute\"] {\n display: none;\n }\n }\n\n &.video, &.youtube {\n .sound {\n .volume {\n width: 2.8rem;\n bottom: $playerActionSize;\n right: 0;\n }\n }\n }\n\n &.audio {\n .sound {\n .volume {\n height: $playerActionSize;\n right: $playerActionSize;\n bottom: 0;\n }\n }\n\n &.stalled {\n .player {\n .player-overlay {\n [data-control=\"reload\"] {\n display: flex;\n align-items: center;\n background-color: #000;\n margin: 0;\n flex-wrap: wrap;\n padding: 5px 5px 5px 50px;\n text-align: left;\n line-height: 2.3rem;\n &.reload {\n width: calc(100% + 2px);\n font-size: 20px;\n line-height: 20px;\n min-height: 36px;\n\n .icon {\n text-shadow: none;\n position: absolute;\n left: 0;\n font-size: 2rem;\n font-weight: bold;\n }\n\n .message {\n text-shadow: none;\n font-size: 1.3rem;\n margin-right: 5px;\n }\n }\n }\n }\n }\n }\n }\n\n &.ready {\n .controls {\n visibility: visible;\n }\n\n &.paused.canplay {\n .player-overlay {\n cursor: pointer;\n font-family: 'tao' !important;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"play\"] {\n display: inline-block;\n }\n }\n }\n\n &.youtube.ended, &:not(.preview) {\n .player:hover {\n [data-control=\"play\"] {\n display: none;\n }\n }\n }\n }\n\n &.playing.canpause {\n .player-overlay {\n cursor: pointer;\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n }\n }\n\n &.playing.canpause {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n\n &.paused.canplay {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"play\"] {\n display: inline-block;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n }\n }\n\n &.muted {\n .controls {\n [data-control=\"mute\"] {\n display: none;\n }\n [data-control=\"unmute\"] {\n display: inline-block;\n }\n }\n }\n\n &.nogui {\n .player {\n iframe {\n pointer-events: inherit;\n }\n }\n .player-overlay {\n display: none !important;\n }\n .controls {\n display: none !important;\n }\n }\n\n &.error:not(.stalled) {\n .media, .controls {\n display: none;\n }\n\n .error {\n display: table;\n text-align: center;\n width: 100%;\n height: 100%;\n\n .message {\n color: $error;\n display: table-cell;\n vertical-align: middle;\n }\n }\n }\n\n &.loading:not(.stalled)::before {\n @keyframes spinner {\n to { transform: rotate(360deg); }\n }\n\n content: '';\n box-sizing: border-box;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n border: 1px solid #ccc;\n border-top-color: #07d;\n animation: spinner .6s linear infinite;\n }\n\n &.stalled {\n .video {\n filter: blur(4px);\n opacity: 0.4;\n }\n .player-overlay {\n [data-control=\"reload\"] {\n display: inline-block;\n }\n }\n }\n\n &.video:not(.preview):not(.error) {\n .player-overlay {\n [data-control=\"start\"] {\n display: inline-block;\n }\n }\n }\n}\n","// buttons and alerts\n$success: rgb(14, 145, 75);\n$info: rgb(14, 93, 145);\n$warning: rgb(216, 174, 91);\n$danger: rgb(201, 96, 67);\n$error: rgb(186, 18, 43);\n$activeInteraction: rgb(195, 90, 19);\n\n// corporate identity\n$logoRed: rgb(186, 18, 43);\n$grey: rgb(173, 161, 148);\n$darkBlueGrey: rgb(164, 187, 197);\n$mediumBlueGrey: rgb(193, 212, 220);\n$lightBlueGrey: rgb(228, 236, 239);\n$brownRedGrey: rgb(154, 137, 123);\n$darkBrown: rgb(111, 99, 89);\n$websiteBorder: rgb(141, 148, 158);\n\n// ui elements, these should only variations of the above\n// naming convention: jQueryUi theme roller -> camelCase\n\n$textColor: #222;\n$textHighlight: white;\n$textSecondary: #737373;\n$shadowColor: rgba(0, 0, 0, 0.25);\n\n$modalBorderColor: #dddfe2;\n$searchInp: #dddfe2;\n\n$uiGeneralContentBg: white();\n$uiGeneralContentBorder: #ddd;\n\n$uiHeaderBg: #d4d5d7;\n\n$uiClickableDefaultBg: #f3f1ef;\n$uiClickableHoverBg: whiten($info, 0.2);\n//$uiClickableActiveBg: $uiHeaderBg;\n$uiClickableActiveBg: whiten($websiteBorder, 0.2);\n//$uiClickableActiveBg: #aaa;\n\n$uiSelectableSelectedBg: whiten($info, 0.2);\n$uiSelectableSelectedHoverBg: whiten($info, 0.1);\n$uiSelectableHoverBg: whiten($info, 0.9);\n\n$uiOverlay: $lightBlueGrey;\n\n// new layout. Implemented now only for review panel\n$uiReviewPanelBg: #f2f2f2;\n$uiReviewPanelTextDisabled: hsl(0, 0%, 45%);\n$uiReviewPanelTextDefault: hsl(0, 0%, 12%);\n$uiReviewPanelBgDefault: $uiGeneralContentBg;\n$uiReviewPanelPrimaryHighlight: hsl(208, 100%, 32%);\n$uiReviewPanelBgInverted: $uiReviewPanelTextDefault;\n$uiReviewPanelTextInverted: $uiGeneralContentBg;\n\n// sidebars etc.\n$canvas: mix(#fff, $grey, 85%);\n\n// colors taken from feedback.scss\n$successBgColor: whiten($success, 0.8);\n$successBorderColor: whiten($success, 0.1);\n\n$infoBgColor: whiten($info, 0.8);\n$infoBorderColor: whiten($info, 0.1);\n\n$warningBgColor: whiten($warning, 0.8);\n$warningBorderColor: whiten($warning, 0.1);\n\n$dangerBgColor: whiten($danger, 0.8);\n$dangerBorderColor: whiten($danger, 0.1);\n\n$errorBgColor: whiten($error, 0.8);\n$errorBorderColor: whiten($error, 0.1);\n\n$darkBar: rgb(51, 51, 51);\n$darkBarTxt: rgb(230, 230, 230);\n$darkBarIcon: rgb(220, 220, 220);\n\n$actionLinkColor: #276d9b;\n$actionLinkHoverColor: #4f83a7;\n\n$colorWheel-01: #c3ba13;\n$colorWheel-02: #84a610;\n$colorWheel-03: #2b8e0e;\n$colorWheel-04: #0f9787;\n$colorWheel-05: #0e5d91;\n$colorWheel-06: #0d2689;\n$colorWheel-07: #400d83;\n$colorWheel-08: #960e7d;\n$colorWheel-09: #ba122b;\n$colorWheel-10: #c34713;\n$colorWheel-11: #c36f13;\n$colorWheel-12: #c39413;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../scss/inc/_functions.scss","../../../scss/inc/fonts/_tao-icon-vars.scss","../scss/player.scss%23sass","../scss/player.scss","../../../scss/inc/_colors.scss"],"names":[],"mappings":"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","file":"player.css","sourcesContent":["@mixin iterate-sprite($iconList, $x, $y, $direction, $prefix:'') {\n @each $icon in $iconList {\n #{$prefix}#{$icon} {\n background-position: $x * 1px $y * 1px;\n }\n @if $direction == 'x' {\n $x: $x - 16;\n } @else {\n $y: $y - 16;\n }\n }\n}\n\n/*\nUsage:\n- linear-gradient((color1, color2, color3)) - returns linear-gradient with evenly distributed colors,\n if 3 colors used then the position of each will be 33,33%\n- linear-gradient((color1 0%, color2 30%, color3 80%)) - returns linear-gradient with manually distributed colors,\n first param - color, second - position. Also you can use px or other valid units for set position.\n*/\n@mixin linear-gradient($colorList, $direction: 'to right') {\n $percentage: 0;\n $units: '%';\n $count: length($colorList);\n $increment: calc(100 / ($count - 1));\n $css: #{$direction + ', '};\n $sep: ', ';\n @each $colorItem in $colorList {\n $color: $colorItem;\n @if (length($colorItem) > 1) {\n $color: nth($colorItem, 1);\n $percentage: nth($colorItem, 2);\n $units: '';\n }\n @if ($percentage >= 100 or index($colorList, $colorItem) == $count) {\n $sep: '';\n }\n $css: #{$css + $color + ' ' + $percentage + $units + $sep};\n $percentage: $percentage + $increment;\n }\n background: linear-gradient( #{$css} );\n}\n\n@mixin grid-unit($span, $numCols: 12, $gutter: 0) {\n $gridPx: 840;\n $rawSpanPx: calc((($gridPx - ($numCols * $gutter)) / $numCols));\n $spanPx: $rawSpanPx * $span + (($span - 1) * $gutter);\n $spanPercent: widthPerc($spanPx, $gridPx);\n $marginPercent: widthPerc($gutter, $gridPx);\n margin-inline-start: $marginPercent;\n inline-size: $spanPercent;\n}\n\n@mixin vendor-prefix($property, $value, $whatToPrefix: property, $prefixes: (-webkit-, -moz-, -ms-, -o-, '')) {\n @if $whatToPrefix == 'property' {\n @each $prefix in $prefixes {\n #{$prefix + $property}: #{$value};\n }\n }\n @else if $whatToPrefix == 'value' {\n @each $prefix in $prefixes {\n #{$property}: #{$prefix + $value};\n }\n }\n}\n@mixin flex-container($wrapBehavior: nowrap, $direction : row) {\n @include vendor-prefix(display, flex, value, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(flex-direction, $direction, property, (-ms-, -webkit-, ''));\n @include vendor-prefix(flex-wrap, $wrapBehavior, property, (-ms-, -webkit-, ''));\n\n @include vendor-prefix(justify-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-content, flex-start, property, (-webkit-, ''));\n\n @include vendor-prefix(align-items, stretch, property, (-webkit-, ''));\n}\n\n@mixin simple-flex-box($width: auto, $minWidth: 1) {\n\n @include vendor-prefix(order, 0, property, (-ms-, -webkit-, ''));\n flex-item-align: stretch;\n -ms-flex-item-align: stretch;\n @include vendor-prefix(align-self, stretch, property, (-webkit-, ''));\n\n // if both, min width and width are set, width will win this conflict\n @if ($width == auto) {\n @if ($minWidth != 1) {\n @include vendor-prefix(flex, 1 1 $minWidth, property, (-ms-, -webkit-, ''));\n }\n @else {\n @include vendor-prefix(flex, 1 1 auto, property, (-ms-, -webkit-, ''));\n // @see https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis#Values\n // for a discussion auto vs. main-size\n @include vendor-prefix(flex, 1 1, property, (-ms-, -webkit-, ''));\n }\n }\n @else {\n @include vendor-prefix(flex, 0 0 $width, property, (-ms-, -webkit-, ''));\n }\n}\n\n\n@mixin box-shadow($horiz: 1px, $vert: 1px, $blur: 2px, $spread: 0, $color: rgba(0, 0, 0, .2)) {\n @include vendor-prefix(box-shadow, $horiz $vert $blur $spread $color, property);\n}\n\n@mixin simple-border($color: #ddd) {\n border: 1px solid $color;\n border-radius: 2px;\n -webkit-border-radius: 2px;\n}\n\n@mixin border-radius($radius: 2) {\n -moz-border-radius: $radius * 1px;\n -webkit-border-radius: $radius * 1px;\n border-radius: $radius * 1px;\n}\n\n@mixin border-radius-top($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-left($radius: 2) {\n -webkit-border-top-left-radius: $radius * 1px;\n -moz-border-radius-topleft: $radius * 1px;\n border-top-left-radius: $radius * 1px;\n}\n\n@mixin border-radius-top-right($radius: 2) {\n -webkit-border-top-right-radius: $radius * 1px;\n -moz-border-radius-topright: $radius * 1px;\n border-top-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-right($radius: 2) {\n -webkit-border-bottom-right-radius: $radius * 1px;\n -moz-border-radius-bottomright: $radius * 1px;\n border-bottom-right-radius: $radius * 1px;\n}\n\n@mixin border-radius-bottom-left($radius: 2) {\n -webkit-border-bottom-left-radius: $radius * 1px;\n -moz-border-radius-bottomleft: $radius * 1px;\n border-bottom-left-radius: $radius * 1px;\n}\n\n@mixin border-box() {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n@function whiten($color, $white: 0.3) {\n @return mix(#fff, $color, ($white * 100) * 1%);\n}\n\n@function blacken($color, $black: 0.3) {\n @return mix(#000, $color, ($black * 100) * 1%);\n}\n\n@function widthPerc($colWidth, $context) {\n @return calc(($colWidth * 100 / $context) * 1%)\n}\n\n@function remDist($fontSizePx) {\n @return calc(($fontSizePx / 10) * 1rem)\n}\n\n@function black($alpha: 1) {\n @return (rgba(0, 0, 0, $alpha))\n}\n\n@function white($alpha: 1) {\n @return (rgba(255, 255, 255, $alpha))\n}\n\n@mixin font-size($remPx, $important: false) {\n @if $important == true {\n font-size: calc(($remPx) * 1px) !important;\n font-size: calc(($remPx / 10) * 1rem) !important;\n }\n @else {\n font-size: calc(($remPx) * 1px);\n font-size: calc(($remPx / 10) * 1rem);\n }\n}\n\n\n@mixin keyframes($name) {\n @-o-keyframes #{$name} { @content };\n @-moz-keyframes #{$name} { @content };\n @-webkit-keyframes #{$name} { @content };\n @keyframes #{$name} { @content };\n}\n\n\n@mixin animation($value, $type:'') {\n $animation: animation;\n @if $type != '' {\n $animation: $animation + '-' + $type;\n }\n @include vendor-prefix($animation, $value, property);\n}\n\n/// CSS transition mixin to the current selection (apply also vendor prefixes).\n/// See <https://developer.mozilla.org/en-US/docs/Web/CSS/transition> for the values\n///\n/// @param {property} [$type = all] the CSS property to apply the transition to\n/// @param {time} [$duration = .5s] the transition property\n/// @param {timing-function} [$effect = ease-out] the transition property\n@mixin transition($type : all, $duration : 0.5s, $effect : ease-out, $delay : 0s){\n @include vendor-prefix(transition, $type + ', ' + $duration + ', ' + $effect + ', ' + $delay, property);\n}\n\n@mixin fade($duration: 1s){\n\n @include keyframes(fade) {\n 0% {opacity:0;}\n 50% {opacity:1;}\n 100% {opacity:0;}\n }\n\n @include vendor-prefix(animation, fade 1s forwards, property);\n}\n\n@mixin repeat(){\n @include animation(infinite, iteration-count);\n}\n\n@mixin largeHeading() {\n @include font-size(20);\n font-family: $headingFont;\n font-style: normal;\n}\n\n@mixin disableSelect() {\n @include vendor-prefix(user-select, none, property);\n}\n\n/* based on \"visually-hidden\" mixin in LDS for accessibility goals */\n@mixin visuallyHidden() {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(1px, 1px, 1px, 1px);\n margin: 0;\n padding: 0;\n}\n","/* Do not edit */@mixin tao-icon-setup {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'tao' !important;\n speak: never;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@mixin icon-restricted { content: \"\\e92c\"; }\n@mixin icon-blocked { content: \"\\e92d\"; }\n@mixin icon-copy { content: \"\\e92b\"; }\n@mixin icon-align-center { content: \"\\e92a\"; }\n@mixin icon-multiple-magicwand { content: \"\\e929\"; }\n@mixin icon-sd-import { content: \"\\e91f\"; }\n@mixin icon-sd-export { content: \"\\e924\"; }\n@mixin icon-browse { content: \"\\e925\"; }\n@mixin icon-minus { content: \"\\e926\"; }\n@mixin icon-plus { content: \"\\e927\"; }\n@mixin icon-sd-save { content: \"\\e928\"; }\n@mixin icon-back-button { content: \"\\e91e\"; }\n@mixin icon-japan-incorrect { content: \"\\e91b\"; }\n@mixin icon-japan-correct { content: \"\\e91c\"; }\n@mixin icon-japan-partial { content: \"\\e91d\"; }\n@mixin icon-score-partial { content: \"\\e91a\"; }\n@mixin icon-furigana { content: \"\\e919\"; }\n@mixin icon-add-subsection { content: \"\\e918\"; }\n@mixin icon-info-bare { content: \"\\e923\"; }\n@mixin icon-bookmark-outline { content: \"\\e922\"; }\n@mixin icon-bookmark { content: \"\\e921\"; }\n@mixin icon-indicator { content: \"\\e920\"; }\n@mixin icon-wrap-inline { content: \"\\e915\"; }\n@mixin icon-wrap-left { content: \"\\e916\"; }\n@mixin icon-wrap-right { content: \"\\e917\"; }\n@mixin icon-offline { content: \"\\e913\"; }\n@mixin icon-online { content: \"\\e914\"; }\n@mixin icon-tab { content: \"\\e90d\"; }\n@mixin icon-untab { content: \"\\e90e\"; }\n@mixin icon-multi-select { content: \"\\e90b\"; }\n@mixin icon-clipboard { content: \"\\e90a\"; }\n@mixin icon-filebox { content: \"\\e909\"; }\n@mixin icon-click-to-speak { content: \"\\e907\"; }\n@mixin icon-speech-bubble { content: \"\\f0e5\"; }\n@mixin icon-microphone { content: \"\\f130\"; }\n@mixin icon-microphone-off { content: \"\\f131\"; }\n@mixin icon-disconnect { content: \"\\e905\"; }\n@mixin icon-connect { content: \"\\e906\"; }\n@mixin icon-eliminate { content: \"\\e904\"; }\n@mixin icon-wheelchair { content: \"\\e903\"; }\n@mixin icon-text-marker { content: \"\\e902\"; }\n@mixin icon-unshield { content: \"\\e32a\"; }\n@mixin icon-shield { content: \"\\e8e8\"; }\n@mixin icon-tree { content: \"\\e6b4\"; }\n@mixin icon-home { content: \"\\e6b3\"; }\n@mixin icon-shared-file { content: \"\\e6b2\"; }\n@mixin icon-end-attempt { content: \"\\e603\"; }\n@mixin icon-icon { content: \"\\f1c5\"; }\n@mixin icon-radio-bg { content: \"\\e600\"; }\n@mixin icon-checkbox-bg { content: \"\\e601\"; }\n@mixin icon-tag { content: \"\\e602\"; }\n@mixin icon-style { content: \"\\e604\"; }\n@mixin icon-ownership-transfer { content: \"\\e605\"; }\n@mixin icon-property-advanced { content: \"\\e606\"; }\n@mixin icon-property-add { content: \"\\e607\"; }\n@mixin icon-repository-add { content: \"\\e608\"; }\n@mixin icon-repository-remove { content: \"\\e609\"; }\n@mixin icon-repository { content: \"\\e60a\"; }\n@mixin icon-result-server { content: \"\\e60b\"; }\n@mixin icon-folder { content: \"\\e60c\"; }\n@mixin icon-folder-open { content: \"\\e60d\"; }\n@mixin icon-left { content: \"\\e60e\"; }\n@mixin icon-right { content: \"\\e60f\"; }\n@mixin icon-up { content: \"\\e610\"; }\n@mixin icon-down { content: \"\\e611\"; }\n@mixin icon-undo { content: \"\\e612\"; }\n@mixin icon-redo { content: \"\\e613\"; }\n@mixin icon-screen { content: \"\\e614\"; }\n@mixin icon-laptop { content: \"\\e615\"; }\n@mixin icon-tablet { content: \"\\e616\"; }\n@mixin icon-phone { content: \"\\e617\"; }\n@mixin icon-move { content: \"\\e618\"; }\n@mixin icon-bin { content: \"\\e619\"; }\n@mixin icon-shuffle { content: \"\\e61a\"; }\n@mixin icon-print { content: \"\\e61b\"; }\n@mixin icon-tools { content: \"\\e61c\"; }\n@mixin icon-settings { content: \"\\e61d\"; }\n@mixin icon-video { content: \"\\e61e\"; }\n@mixin icon-find { content: \"\\e61f\"; }\n@mixin icon-image { content: \"\\e620\"; }\n@mixin icon-edit { content: \"\\e621\"; }\n@mixin icon-document { content: \"\\e622\"; }\n@mixin icon-resize-grid { content: \"\\e623\"; }\n@mixin icon-resize { content: \"\\e624\"; }\n@mixin icon-help { content: \"\\e625\"; }\n@mixin icon-mobile-menu { content: \"\\e626\"; }\n@mixin icon-fix { content: \"\\e627\"; }\n@mixin icon-unlock { content: \"\\e628\"; }\n@mixin icon-lock { content: \"\\e629\"; }\n@mixin icon-ul { content: \"\\e62a\"; }\n@mixin icon-ol { content: \"\\e62b\"; }\n@mixin icon-email { content: \"\\e62c\"; }\n@mixin icon-download { content: \"\\e62d\"; }\n@mixin icon-logout { content: \"\\e62e\"; }\n@mixin icon-login { content: \"\\e62f\"; }\n@mixin icon-spinner { content: \"\\e630\"; }\n@mixin icon-preview { content: \"\\e631\"; }\n@mixin icon-external { content: \"\\e632\"; }\n@mixin icon-time { content: \"\\e633\"; }\n@mixin icon-save { content: \"\\e634\"; }\n@mixin icon-warning { content: \"\\e635\"; }\n@mixin icon-add { content: \"\\e636\"; }\n@mixin icon-error { content: \"\\e900\"; }\n@mixin icon-close { content: \"\\e637\"; }\n@mixin icon-success { content: \"\\e638\"; }\n@mixin icon-remove { content: \"\\e639\"; }\n@mixin icon-info { content: \"\\e63a\"; }\n@mixin icon-danger { content: \"\\e63b\"; }\n@mixin icon-users { content: \"\\e63c\"; }\n@mixin icon-user { content: \"\\e63d\"; }\n@mixin icon-test-taker { content: \"\\e63e\"; }\n@mixin icon-test-takers { content: \"\\e63f\"; }\n@mixin icon-item { content: \"\\e640\"; }\n@mixin icon-test { content: \"\\e641\"; }\n@mixin icon-delivery { content: \"\\e642\"; }\n@mixin icon-eye-slash { content: \"\\e643\"; }\n@mixin icon-result { content: \"\\e644\"; }\n@mixin icon-delivery-small { content: \"\\e645\"; }\n@mixin icon-upload { content: \"\\e646\"; }\n@mixin icon-result-small { content: \"\\e647\"; }\n@mixin icon-mobile-preview { content: \"\\e648\"; }\n@mixin icon-extension { content: \"\\e649\"; }\n@mixin icon-desktop-preview { content: \"\\e64a\"; }\n@mixin icon-tablet-preview { content: \"\\e64b\"; }\n@mixin icon-insert-horizontal-line { content: \"\\e64c\"; }\n@mixin icon-table { content: \"\\e64d\"; }\n@mixin icon-anchor { content: \"\\e64e\"; }\n@mixin icon-unlink { content: \"\\e64f\"; }\n@mixin icon-link { content: \"\\e650\"; }\n@mixin icon-right-left { content: \"\\e651\"; }\n@mixin icon-left-right { content: \"\\e652\"; }\n@mixin icon-special-character { content: \"\\e653\"; }\n@mixin icon-source { content: \"\\e654\"; }\n@mixin icon-new-page { content: \"\\e655\"; }\n@mixin icon-templates { content: \"\\e656\"; }\n@mixin icon-cut { content: \"\\e657\"; }\n@mixin icon-replace { content: \"\\e658\"; }\n@mixin icon-duplicate { content: \"\\e659\"; }\n@mixin icon-paste { content: \"\\e65a\"; }\n@mixin icon-select-all { content: \"\\e65b\"; }\n@mixin icon-paste-text { content: \"\\e65c\"; }\n@mixin icon-paste-word { content: \"\\e65d\"; }\n@mixin icon-bold { content: \"\\e65e\"; }\n@mixin icon-italic { content: \"\\e65f\"; }\n@mixin icon-underline { content: \"\\e660\"; }\n@mixin icon-subscript { content: \"\\e661\"; }\n@mixin icon-superscript { content: \"\\e662\"; }\n@mixin icon-strike-through { content: \"\\e663\"; }\n@mixin icon-decrease-indent { content: \"\\e664\"; }\n@mixin icon-increase-indent { content: \"\\e665\"; }\n@mixin icon-block-quote { content: \"\\e666\"; }\n@mixin icon-div-container { content: \"\\e667\"; }\n@mixin icon-align-left { content: \"\\e668\"; }\n@mixin icon-center { content: \"\\e669\"; }\n@mixin icon-align-right { content: \"\\e66a\"; }\n@mixin icon-justify { content: \"\\e66b\"; }\n@mixin icon-choice { content: \"\\e66c\"; }\n@mixin icon-inline-choice { content: \"\\e66d\"; }\n@mixin icon-match { content: \"\\e66e\"; }\n@mixin icon-associate { content: \"\\e66f\"; }\n@mixin icon-media { content: \"\\e670\"; }\n@mixin icon-graphic-order { content: \"\\e671\"; }\n@mixin icon-hotspot { content: \"\\e672\"; }\n@mixin icon-graphic-gap { content: \"\\e673\"; }\n@mixin icon-graphic-associate { content: \"\\e674\"; }\n@mixin icon-select-point { content: \"\\e675\"; }\n@mixin icon-pin { content: \"\\e676\"; }\n@mixin icon-import { content: \"\\e677\"; }\n@mixin icon-export { content: \"\\e678\"; }\n@mixin icon-move-item { content: \"\\e679\"; }\n@mixin icon-meta-data { content: \"\\e67a\"; }\n@mixin icon-slider { content: \"\\e67b\"; }\n@mixin icon-summary-report { content: \"\\e67c\"; }\n@mixin icon-text-entry { content: \"\\e67d\"; }\n@mixin icon-extended-text { content: \"\\e67e\"; }\n@mixin icon-eraser { content: \"\\e67f\"; }\n@mixin icon-row { content: \"\\e680\"; }\n@mixin icon-column { content: \"\\e681\"; }\n@mixin icon-text-color { content: \"\\e682\"; }\n@mixin icon-background-color { content: \"\\e683\"; }\n@mixin icon-spell-check { content: \"\\e684\"; }\n@mixin icon-polygon { content: \"\\e685\"; }\n@mixin icon-rectangle { content: \"\\e686\"; }\n@mixin icon-gap-match { content: \"\\e687\"; }\n@mixin icon-order { content: \"\\e688\"; }\n@mixin icon-hottext { content: \"\\e689\"; }\n@mixin icon-free-form { content: \"\\e68a\"; }\n@mixin icon-step-backward { content: \"\\e68b\"; }\n@mixin icon-fast-backward { content: \"\\e68c\"; }\n@mixin icon-backward { content: \"\\e68d\"; }\n@mixin icon-play { content: \"\\e68e\"; }\n@mixin icon-pause { content: \"\\e68f\"; }\n@mixin icon-stop { content: \"\\e690\"; }\n@mixin icon-forward { content: \"\\e691\"; }\n@mixin icon-fast-forward { content: \"\\e692\"; }\n@mixin icon-step-forward { content: \"\\e693\"; }\n@mixin icon-ellipsis { content: \"\\e694\"; }\n@mixin icon-circle { content: \"\\e695\"; }\n@mixin icon-target { content: \"\\e696\"; }\n@mixin icon-guide-arrow { content: \"\\e697\"; }\n@mixin icon-range-slider-right { content: \"\\e698\"; }\n@mixin icon-range-slider-left { content: \"\\e699\"; }\n@mixin icon-radio-checked { content: \"\\e69a\"; }\n@mixin icon-checkbox-indeterminate { content: \"\\e901\"; }\n@mixin icon-checkbox { content: \"\\e69b\"; }\n@mixin icon-checkbox-crossed { content: \"\\e69c\"; }\n@mixin icon-checkbox-checked { content: \"\\e69d\"; }\n@mixin icon-result-nok { content: \"\\e69e\"; }\n@mixin icon-result-ok { content: \"\\e69f\"; }\n@mixin icon-not-evaluated { content: \"\\e6a0\"; }\n@mixin icon-filter { content: \"\\e6a1\"; }\n@mixin icon-translate { content: \"\\e6a2\"; }\n@mixin icon-eject { content: \"\\e6a3\"; }\n@mixin icon-continue { content: \"\\e6a4\"; }\n@mixin icon-radio { content: \"\\e6a5\"; }\n@mixin icon-sphere { content: \"\\e6a6\"; }\n@mixin icon-reset { content: \"\\e6a7\"; }\n@mixin icon-smaller { content: \"\\e6a8\"; }\n@mixin icon-larger { content: \"\\e6a9\"; }\n@mixin icon-clock { content: \"\\e6aa\"; }\n@mixin icon-font { content: \"\\e6ab\"; }\n@mixin icon-maths { content: \"\\e6ac\"; }\n@mixin icon-grip { content: \"\\e6ad\"; }\n@mixin icon-rubric { content: \"\\e6ae\"; }\n@mixin icon-audio { content: \"\\e6af\"; }\n@mixin icon-grip-h { content: \"\\e6b0\"; }\n@mixin icon-magicwand { content: \"\\e6b1\"; }\n@mixin icon-loop { content: \"\\ea2e\"; }\n@mixin icon-calendar { content: \"\\e953\"; }\n@mixin icon-reload { content: \"\\e984\"; }\n@mixin icon-speed { content: \"\\e9a6\"; }\n@mixin icon-volume { content: \"\\ea27\"; }\n@mixin icon-contrast { content: \"\\e9d5\"; }\n@mixin icon-headphones { content: \"\\e910\"; }\n@mixin icon-compress { content: \"\\f066\"; }\n@mixin icon-map-o { content: \"\\f278\"; }\n@mixin icon-variable { content: \"\\e908\"; }\n@mixin icon-tooltip { content: \"\\e90c\"; }\n@mixin icon-globe { content: \"\\e9c9\"; }\n@mixin icon-highlighter { content: \"\\e90f\"; }\n@mixin icon-eliminate-crossed { content: \"\\e911\"; }\n@mixin icon-play-from-here { content: \"\\e912\"; }\n","@import \"inc/bootstrap\";\n\n$playerActionSize: 2.2rem;\n$playerActionSpace: 1rem;\n$playerBackground: black();\n$playerBorder: $darkBar;\n$playerText: #999;\n$playerIcon: $darkBarIcon;\n$playerTextOverlay: white();\n$playerSliderBorder: $uiGeneralContentBorder;\n$playerSliderBackground: $uiGeneralContentBg;\n$playerSliderColor: $darkBar;\n$playerSliderHandle: whiten($playerSliderColor, .4);\n$playerSliderHightlight: whiten($playerSliderColor, .2);\n$controlsHeight: 36px;\n\n.mediaplayer {\n position: relative;\n @include simple-border($playerBorder);\n @include border-radius(2);\n background: $playerBackground;\n max-width: 100%;\n min-height: $controlsHeight;\n min-width: 200px;\n direction: ltr;\n padding: 2px;\n\n &.youtube {\n .player {\n width: 100%;\n height: 0px;\n padding-bottom: 56.25%; // 56.25% for widescreen 16:9 aspect ratio videos\n }\n }\n .icon-sound:before {\n @include icon-audio();\n }\n .icon-mute:before {\n @include icon-result-nok();\n }\n\n .error {\n display: none;\n }\n\n .player {\n position: relative;\n height: calc(100% - #{$controlsHeight});\n width: 100%;\n\n iframe {\n pointer-events: none;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%\n }\n\n .media:not(.youtube) {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n }\n\n .player-overlay {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n background: transparent none;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n .action {\n position: absolute;\n z-index: 2;\n top: 50%;\n left: 50%;\n transform: translate(-50%);\n margin-top: -32px;\n text-align: center;\n text-decoration: none;\n display: none;\n @include font-size(64);\n color: $playerTextOverlay;\n\n .icon {\n @include border-radius(10);\n padding: 6px 12px;\n background-color: $playerBackground;\n opacity: 0.2;\n\n &:hover {\n opacity: 0.6;\n }\n }\n\n &.reload {\n width: 100%;\n font-size: 50px;\n line-height: 30px;\n\n &:hover {\n .icon {\n opacity: 1;\n font-family: 'tao' !important;\n }\n }\n\n .icon {\n opacity: 0.6;\n background: none;\n font-family: 'tao' !important;\n }\n .message {\n font-size: 20px;\n }\n\n .icon, .message {\n text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;\n }\n }\n }\n }\n\n .controls {\n background-color: $playerBackground;\n color: $playerTextOverlay;\n visibility: hidden;\n position: relative;\n padding: 5px;\n display: table;\n table-layout: fixed;\n width: 100%;\n border-top: 1px solid $playerBorder;\n height: $controlsHeight;\n\n .bar {\n display: table-row;\n }\n .control {\n display: table-cell;\n }\n\n .actions {\n position: relative;\n @include transition(all, 0.1,ease-in-out);\n\n .action {\n text-align: center;\n line-height: $playerActionSize;\n width: $playerActionSize;\n height: $playerActionSize;\n text-decoration: none;\n color: $playerIcon;\n @include transition(all, 0.2, ease-in-out);\n\n &:hover {\n opacity: 1;\n }\n\n .icon {\n line-height: $playerActionSize;\n font-family: 'tao' !important;\n }\n }\n\n .play {\n opacity: 0.7;\n border-right: 1px solid $playerBorder;\n }\n\n .mute {\n opacity: 0.8;\n border-left: 1px solid $playerBorder;\n }\n }\n\n .slider {\n cursor: pointer;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n @include transition(all, 0.1, ease-in-out);\n background: $playerSliderBackground;\n\n .noUi-background {\n @include border-radius(10);\n background: $playerSliderBackground;\n }\n &.noUi-connect, .noUi-connect {\n @include border-radius(10);\n background: $playerSliderColor;\n }\n\n .noUi-handle {\n width: 11px;\n height: 11px;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n background: $playerSliderHandle;\n }\n .noUi-handle:hover {\n background: $playerSliderHightlight;\n }\n .noUi-handle:after {\n display: none;\n }\n\n &.noUi-horizontal {\n height: 9px;\n\n .noUi-handle {\n top: -2px;\n }\n }\n\n &.noUi-vertical {\n width: 9px;\n\n .noUi-handle {\n left: -2px;\n }\n }\n }\n\n .infos {\n cursor: default;\n\n margin: 0 $playerActionSpace;\n line-height: $playerActionSize;\n\n color: $playerText;\n @include font-size(10);\n font-weight: bold;\n\n [data-control=\"time-end\"]:before {\n content: ' / ';\n }\n }\n\n .timer {\n width: 8rem;\n text-align: center;\n }\n\n .seek {\n position: relative;\n height: 1rem;\n margin-top: 5px;\n padding-left: $playerActionSpace;\n }\n\n .playback {\n margin-right: $playerActionSpace;\n width: $playerActionSize;\n }\n\n .sound {\n width: $playerActionSize;\n height: $playerActionSize;\n\n .action {\n position: relative;\n z-index: 1001;\n }\n .volume {\n cursor: default;\n position: absolute;\n z-index: 1000;\n background-color: $playerBackground;\n margin: 1px 2px;\n padding: 10px 0;\n width: 100%;\n height: 0;\n top: 0;\n left: -1px;\n opacity : 0;\n text-align: center;\n border: solid 1px $playerBorder;\n pointer-events: none;\n overflow: hidden;\n @include vendor-prefix(transition, 'height 300ms ease-out, top 300ms ease-out, opacity 50ms linear 250ms', property);\n\n &.up, &.down {\n height: 120px;\n opacity : 1;\n pointer-events: auto;\n .slider {\n display: inline-block;\n opacity : 1;\n transition: opacity 50ms linear 200ms;\n @include vendor-prefix(transition, 'opacity 50ms linear 200ms', property);\n }\n }\n &.up {\n top: -127px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, top 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n &.down {\n top: 30px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n }\n\n .slider {\n opacity : 0;\n display: none;\n .noUi-handle {\n cursor: pointer;\n width: 9px;\n height: 9px;\n }\n\n &.noUi-horizontal {\n width: 50px;\n height: 7px;\n }\n\n &.noUi-vertical {\n width: 7px;\n height: 100px;\n }\n }\n }\n\n [data-control=\"play\"] {\n display: none;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n\n [data-control=\"mute\"] {\n display: inline-block;\n }\n [data-control=\"unmute\"] {\n display: none;\n }\n }\n\n &.video, &.youtube {\n .sound {\n .volume {\n width: 2.8rem;\n bottom: $playerActionSize;\n right: 0;\n }\n }\n }\n\n &.audio {\n .sound {\n .volume {\n height: $playerActionSize;\n right: $playerActionSize;\n bottom: 0;\n }\n }\n\n &.stalled {\n .player {\n .player-overlay {\n [data-control=\"reload\"] {\n display: flex;\n align-items: center;\n background-color: #000;\n margin: 0;\n flex-wrap: wrap;\n padding: 5px 5px 5px 50px;\n text-align: left;\n line-height: 2.3rem;\n &.reload {\n width: calc(100% + 2px);\n font-size: 20px;\n line-height: 20px;\n min-height: 36px;\n\n .icon {\n text-shadow: none;\n position: absolute;\n left: 0;\n font-size: 2rem;\n font-weight: bold;\n }\n\n .message {\n text-shadow: none;\n font-size: 1.3rem;\n margin-right: 5px;\n }\n }\n }\n }\n }\n }\n }\n\n &.ready {\n .controls {\n visibility: visible;\n }\n\n &.paused.canplay {\n .player-overlay {\n cursor: pointer;\n font-family: 'tao' !important;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"play\"] {\n display: inline-block;\n }\n }\n }\n\n &.youtube.ended, &:not(.preview) {\n .player:hover {\n [data-control=\"play\"] {\n display: none;\n }\n }\n }\n }\n\n &.playing.canpause {\n .player-overlay {\n cursor: pointer;\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n }\n }\n\n &.playing.canpause {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n\n &.paused.canplay {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"play\"] {\n display: inline-block;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n }\n }\n\n &.muted {\n .controls {\n [data-control=\"mute\"] {\n display: none;\n }\n [data-control=\"unmute\"] {\n display: inline-block;\n }\n }\n }\n\n &.nogui {\n .player {\n iframe {\n pointer-events: inherit;\n }\n }\n .player-overlay {\n display: none !important;\n }\n .controls {\n display: none !important;\n }\n }\n\n &.error:not(.stalled) {\n .media, .controls {\n display: none;\n }\n\n .error {\n display: table;\n text-align: center;\n width: 100%;\n height: 100%;\n\n .message {\n color: $error;\n display: table-cell;\n vertical-align: middle;\n }\n }\n }\n\n &.loading:not(.stalled)::before {\n @keyframes spinner {\n to { transform: rotate(360deg); }\n }\n\n content: '';\n box-sizing: border-box;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n border: 1px solid #ccc;\n border-top-color: #07d;\n animation: spinner .6s linear infinite;\n }\n\n &.stalled {\n .video {\n filter: blur(4px);\n opacity: 0.4;\n }\n .player-overlay {\n [data-control=\"reload\"] {\n display: inline-block;\n }\n }\n }\n\n .transcription {\n background-color: white;\n color: black;\n font-size: 14px;\n line-height: 1.5;\n max-height: 60px;\n margin-bottom: 2px;\n overflow-y: scroll;\n &.hidden {\n display: none;\n }\n }\n\n &.video:not(.preview):not(.error) {\n .player-overlay {\n [data-control=\"start\"] {\n display: inline-block;\n }\n }\n }\n}\n","@import \"inc/bootstrap\";\n\n$playerActionSize: 2.2rem;\n$playerActionSpace: 1rem;\n$playerBackground: black();\n$playerBorder: $darkBar;\n$playerText: #999;\n$playerIcon: $darkBarIcon;\n$playerTextOverlay: white();\n$playerSliderBorder: $uiGeneralContentBorder;\n$playerSliderBackground: $uiGeneralContentBg;\n$playerSliderColor: $darkBar;\n$playerSliderHandle: whiten($playerSliderColor, .4);\n$playerSliderHightlight: whiten($playerSliderColor, .2);\n$controlsHeight: 36px;\n\n.mediaplayer {\n position: relative;\n @include simple-border($playerBorder);\n @include border-radius(2);\n background: $playerBackground;\n max-width: 100%;\n min-height: $controlsHeight;\n min-width: 200px;\n direction: ltr;\n padding: 2px;\n\n &.youtube {\n .player {\n width: 100%;\n height: 0px;\n padding-bottom: 56.25%; // 56.25% for widescreen 16:9 aspect ratio videos\n }\n }\n .icon-sound:before {\n @include icon-audio();\n }\n .icon-mute:before {\n @include icon-result-nok();\n }\n\n .error {\n display: none;\n }\n\n .player {\n position: relative;\n height: calc(100% - #{$controlsHeight});\n width: 100%;\n\n iframe {\n pointer-events: none;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%\n }\n\n .media:not(.youtube) {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n }\n\n .player-overlay {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n opacity: 1;\n background: transparent none;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n .action {\n position: absolute;\n z-index: 2;\n top: 50%;\n left: 50%;\n transform: translate(-50%);\n margin-top: -32px;\n text-align: center;\n text-decoration: none;\n display: none;\n @include font-size(64);\n color: $playerTextOverlay;\n\n .icon {\n @include border-radius(10);\n padding: 6px 12px;\n background-color: $playerBackground;\n opacity: 0.2;\n\n &:hover {\n opacity: 0.6;\n }\n }\n\n &.reload {\n width: 100%;\n font-size: 50px;\n line-height: 30px;\n\n &:hover {\n .icon {\n opacity: 1;\n font-family: 'tao' !important;\n }\n }\n\n .icon {\n opacity: 0.6;\n background: none;\n font-family: 'tao' !important;\n }\n .message {\n font-size: 20px;\n }\n\n .icon, .message {\n text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000;\n }\n }\n }\n }\n\n .controls {\n background-color: $playerBackground;\n color: $playerTextOverlay;\n visibility: hidden;\n position: relative;\n padding: 5px;\n display: table;\n table-layout: fixed;\n width: 100%;\n border-top: 1px solid $playerBorder;\n height: $controlsHeight;\n\n .bar {\n display: table-row;\n }\n .control {\n display: table-cell;\n }\n\n .actions {\n position: relative;\n @include transition(all, 0.1,ease-in-out);\n\n .action {\n text-align: center;\n line-height: $playerActionSize;\n width: $playerActionSize;\n height: $playerActionSize;\n text-decoration: none;\n color: $playerIcon;\n @include transition(all, 0.2, ease-in-out);\n\n &:hover {\n opacity: 1;\n }\n\n .icon {\n line-height: $playerActionSize;\n font-family: 'tao' !important;\n }\n }\n\n .play {\n opacity: 0.7;\n border-right: 1px solid $playerBorder;\n }\n\n .mute {\n opacity: 0.8;\n border-left: 1px solid $playerBorder;\n }\n }\n\n .slider {\n cursor: pointer;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n @include transition(all, 0.1, ease-in-out);\n background: $playerSliderBackground;\n\n .noUi-background {\n @include border-radius(10);\n background: $playerSliderBackground;\n }\n &.noUi-connect, .noUi-connect {\n @include border-radius(10);\n background: $playerSliderColor;\n }\n\n .noUi-handle {\n width: 11px;\n height: 11px;\n @include simple-border($playerSliderBorder);\n @include border-radius(10);\n background: $playerSliderHandle;\n }\n .noUi-handle:hover {\n background: $playerSliderHightlight;\n }\n .noUi-handle:after {\n display: none;\n }\n\n &.noUi-horizontal {\n height: 9px;\n\n .noUi-handle {\n top: -2px;\n }\n }\n\n &.noUi-vertical {\n width: 9px;\n\n .noUi-handle {\n left: -2px;\n }\n }\n }\n\n .infos {\n cursor: default;\n\n margin: 0 $playerActionSpace;\n line-height: $playerActionSize;\n\n color: $playerText;\n @include font-size(10);\n font-weight: bold;\n\n [data-control=\"time-end\"]:before {\n content: ' / ';\n }\n }\n\n .timer {\n width: 8rem;\n text-align: center;\n }\n\n .seek {\n position: relative;\n height: 1rem;\n margin-top: 5px;\n padding-left: $playerActionSpace;\n }\n\n .playback {\n margin-right: $playerActionSpace;\n width: $playerActionSize;\n }\n\n .sound {\n width: $playerActionSize;\n height: $playerActionSize;\n\n .action {\n position: relative;\n z-index: 1001;\n }\n .volume {\n cursor: default;\n position: absolute;\n z-index: 1000;\n background-color: $playerBackground;\n margin: 1px 2px;\n padding: 10px 0;\n width: 100%;\n height: 0;\n top: 0;\n left: -1px;\n opacity : 0;\n text-align: center;\n border: solid 1px $playerBorder;\n pointer-events: none;\n overflow: hidden;\n @include vendor-prefix(transition, 'height 300ms ease-out, top 300ms ease-out, opacity 50ms linear 250ms', property);\n\n &.up, &.down {\n height: 120px;\n opacity : 1;\n pointer-events: auto;\n .slider {\n display: inline-block;\n opacity : 1;\n transition: opacity 50ms linear 200ms;\n @include vendor-prefix(transition, 'opacity 50ms linear 200ms', property);\n }\n }\n &.up {\n top: -127px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, top 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n &.down {\n top: 30px;\n @include vendor-prefix(transition, 'height 300ms ease-out 50ms, opacity 50ms linear', property);\n }\n }\n\n .slider {\n opacity : 0;\n display: none;\n .noUi-handle {\n cursor: pointer;\n width: 9px;\n height: 9px;\n }\n\n &.noUi-horizontal {\n width: 50px;\n height: 7px;\n }\n\n &.noUi-vertical {\n width: 7px;\n height: 100px;\n }\n }\n }\n\n [data-control=\"play\"] {\n display: none;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n\n [data-control=\"mute\"] {\n display: inline-block;\n }\n [data-control=\"unmute\"] {\n display: none;\n }\n }\n\n &.video, &.youtube {\n .sound {\n .volume {\n width: 2.8rem;\n bottom: $playerActionSize;\n right: 0;\n }\n }\n }\n\n &.audio {\n .sound {\n .volume {\n height: $playerActionSize;\n right: $playerActionSize;\n bottom: 0;\n }\n }\n\n &.stalled {\n .player {\n .player-overlay {\n [data-control=\"reload\"] {\n display: flex;\n align-items: center;\n background-color: #000;\n margin: 0;\n flex-wrap: wrap;\n padding: 5px 5px 5px 50px;\n text-align: left;\n line-height: 2.3rem;\n &.reload {\n width: calc(100% + 2px);\n font-size: 20px;\n line-height: 20px;\n min-height: 36px;\n\n .icon {\n text-shadow: none;\n position: absolute;\n left: 0;\n font-size: 2rem;\n font-weight: bold;\n }\n\n .message {\n text-shadow: none;\n font-size: 1.3rem;\n margin-right: 5px;\n }\n }\n }\n }\n }\n }\n }\n\n &.ready {\n .controls {\n visibility: visible;\n }\n\n &.paused.canplay {\n .player-overlay {\n cursor: pointer;\n font-family: 'tao' !important;\n a.action {\n span.icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"play\"] {\n display: inline-block;\n }\n }\n }\n\n &.youtube.ended, &:not(.preview) {\n .player:hover {\n [data-control=\"play\"] {\n display: none;\n }\n }\n }\n }\n\n &.playing.canpause {\n .player-overlay {\n cursor: pointer;\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n }\n\n &:not(.audio) {\n .player:hover {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n }\n }\n\n &.playing.canpause {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"pause\"] {\n display: inline-block;\n }\n }\n }\n\n &.paused.canplay {\n .action {\n .icon {\n font-family: 'tao' !important;\n }\n }\n .controls {\n [data-control=\"play\"] {\n display: inline-block;\n }\n [data-control=\"pause\"] {\n display: none;\n }\n }\n }\n\n &.muted {\n .controls {\n [data-control=\"mute\"] {\n display: none;\n }\n [data-control=\"unmute\"] {\n display: inline-block;\n }\n }\n }\n\n &.nogui {\n .player {\n iframe {\n pointer-events: inherit;\n }\n }\n .player-overlay {\n display: none !important;\n }\n .controls {\n display: none !important;\n }\n }\n\n &.error:not(.stalled) {\n .media, .controls {\n display: none;\n }\n\n .error {\n display: table;\n text-align: center;\n width: 100%;\n height: 100%;\n\n .message {\n color: $error;\n display: table-cell;\n vertical-align: middle;\n }\n }\n }\n\n &.loading:not(.stalled)::before {\n @keyframes spinner {\n to { transform: rotate(360deg); }\n }\n\n content: '';\n box-sizing: border-box;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n border-radius: 50%;\n border: 1px solid #ccc;\n border-top-color: #07d;\n animation: spinner .6s linear infinite;\n }\n\n &.stalled {\n .video {\n filter: blur(4px);\n opacity: 0.4;\n }\n .player-overlay {\n [data-control=\"reload\"] {\n display: inline-block;\n }\n }\n }\n\n .transcription {\n background-color: white;\n color: black;\n font-size: 14px;\n line-height: 1.5;\n max-height: 60px;\n margin-bottom: 2px;\n overflow-y: scroll;\n &.hidden {\n display: none;\n }\n }\n\n &.video:not(.preview):not(.error) {\n .player-overlay {\n [data-control=\"start\"] {\n display: inline-block;\n }\n }\n }\n}\n","// buttons and alerts\n$success: rgb(14, 145, 75);\n$info: rgb(14, 93, 145);\n$warning: rgb(216, 174, 91);\n$danger: rgb(201, 96, 67);\n$error: rgb(186, 18, 43);\n$activeInteraction: rgb(195, 90, 19);\n\n// corporate identity\n$logoRed: rgb(186, 18, 43);\n$grey: rgb(173, 161, 148);\n$darkBlueGrey: rgb(164, 187, 197);\n$mediumBlueGrey: rgb(193, 212, 220);\n$lightBlueGrey: rgb(228, 236, 239);\n$brownRedGrey: rgb(154, 137, 123);\n$darkBrown: rgb(111, 99, 89);\n$websiteBorder: rgb(141, 148, 158);\n\n// ui elements, these should only variations of the above\n// naming convention: jQueryUi theme roller -> camelCase\n\n$textColor: #222;\n$textHighlight: white;\n$textSecondary: #737373;\n$shadowColor: rgba(0, 0, 0, 0.25);\n\n$modalBorderColor: #dddfe2;\n$searchInp: #dddfe2;\n\n$uiGeneralContentBg: white();\n$uiGeneralContentBorder: #ddd;\n\n$uiHeaderBg: #d4d5d7;\n\n$uiClickableDefaultBg: #f3f1ef;\n$uiClickableHoverBg: whiten($info, 0.2);\n//$uiClickableActiveBg: $uiHeaderBg;\n$uiClickableActiveBg: whiten($websiteBorder, 0.2);\n//$uiClickableActiveBg: #aaa;\n\n$uiSelectableSelectedBg: whiten($info, 0.2);\n$uiSelectableSelectedHoverBg: whiten($info, 0.1);\n$uiSelectableHoverBg: whiten($info, 0.9);\n\n$uiOverlay: $lightBlueGrey;\n\n// new layout. Implemented now only for review panel\n$uiReviewPanelBg: #f2f2f2;\n$uiReviewPanelTextDisabled: hsl(0, 0%, 45%);\n$uiReviewPanelTextDefault: hsl(0, 0%, 12%);\n$uiReviewPanelBgDefault: $uiGeneralContentBg;\n$uiReviewPanelPrimaryHighlight: hsl(208, 100%, 32%);\n$uiReviewPanelBgInverted: $uiReviewPanelTextDefault;\n$uiReviewPanelTextInverted: $uiGeneralContentBg;\n\n// sidebars etc.\n$canvas: mix(#fff, $grey, 85%);\n\n// colors taken from feedback.scss\n$successBgColor: whiten($success, 0.8);\n$successBorderColor: whiten($success, 0.1);\n\n$infoBgColor: whiten($info, 0.8);\n$infoBorderColor: whiten($info, 0.1);\n\n$warningBgColor: whiten($warning, 0.8);\n$warningBorderColor: whiten($warning, 0.1);\n\n$dangerBgColor: whiten($danger, 0.8);\n$dangerBorderColor: whiten($danger, 0.1);\n\n$errorBgColor: whiten($error, 0.8);\n$errorBorderColor: whiten($error, 0.1);\n\n$darkBar: rgb(51, 51, 51);\n$darkBarTxt: rgb(230, 230, 230);\n$darkBarIcon: rgb(220, 220, 220);\n\n$actionLinkColor: #276d9b;\n$actionLinkHoverColor: #4f83a7;\n\n$colorWheel-01: #c3ba13;\n$colorWheel-02: #84a610;\n$colorWheel-03: #2b8e0e;\n$colorWheel-04: #0f9787;\n$colorWheel-05: #0e5d91;\n$colorWheel-06: #0d2689;\n$colorWheel-07: #400d83;\n$colorWheel-08: #960e7d;\n$colorWheel-09: #ba122b;\n$colorWheel-10: #c34713;\n$colorWheel-11: #c36f13;\n$colorWheel-12: #c39413;\n"]}
|
package/dist/mediaplayer.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/mimetype', 'core/store', 'ui/mediaplayer/support', 'ui/mediaplayer/players', 'handlebars', 'lib/handlebars/helpers', 'css!ui/mediaplayer/css/player.css', 'nouislider'], function ($$1, _, async, UrlParser, eventifier, mimetype, store, support, players, Handlebars, Helpers0, player_css, nouislider) { 'use strict';
|
|
1
|
+
define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/dataProvider/request', 'core/eventifier', 'core/mimetype', 'core/store', 'ui/mediaplayer/support', 'ui/mediaplayer/players', 'handlebars', 'lib/handlebars/helpers', 'css!ui/mediaplayer/css/player.css', 'nouislider'], function ($$1, _, async, UrlParser, request, eventifier, mimetype, store, support, players, Handlebars, Helpers0, player_css, nouislider) { 'use strict';
|
|
2
2
|
|
|
3
3
|
$$1 = $$1 && Object.prototype.hasOwnProperty.call($$1, 'default') ? $$1['default'] : $$1;
|
|
4
4
|
_ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;
|
|
5
5
|
async = async && Object.prototype.hasOwnProperty.call(async, 'default') ? async['default'] : async;
|
|
6
6
|
UrlParser = UrlParser && Object.prototype.hasOwnProperty.call(UrlParser, 'default') ? UrlParser['default'] : UrlParser;
|
|
7
|
+
request = request && Object.prototype.hasOwnProperty.call(request, 'default') ? request['default'] : request;
|
|
7
8
|
eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;
|
|
8
9
|
mimetype = mimetype && Object.prototype.hasOwnProperty.call(mimetype, 'default') ? mimetype['default'] : mimetype;
|
|
9
10
|
store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;
|
|
@@ -52,9 +53,9 @@ define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/
|
|
|
52
53
|
+ escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, "Mute", options) : helperMissing.call(depth0, "__", "Mute", options)))
|
|
53
54
|
+ "\"><span class=\"icon icon-sound\"></span></a>\n <a class=\"action mute\" data-control=\"unmute\" title=\""
|
|
54
55
|
+ escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, "Restore sound", options) : helperMissing.call(depth0, "__", "Restore sound", options)))
|
|
55
|
-
+ "\"><span class=\"icon icon-mute\"></span></a>\n </div>\n </div>\n </div>\n <div class=\"error\">\n <div class=\"message\">"
|
|
56
|
+
+ "\"><span class=\"icon icon-mute\"></span></a>\n </div>\n </div>\n </div>\n <div class=\"transcription\"></div>\n <div class=\"error\">\n <div class=\"message\">"
|
|
56
57
|
+ escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, "This media cannot be played!", options) : helperMissing.call(depth0, "__", "This media cannot be played!", options)))
|
|
57
|
-
+ "</div>\n </div>\n</div>\n";
|
|
58
|
+
+ "</div>\n </div>\n</div>\n\n";
|
|
58
59
|
return buffer;
|
|
59
60
|
});
|
|
60
61
|
function playerTpl(data, options, asString) {
|
|
@@ -305,6 +306,8 @@ define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/
|
|
|
305
306
|
_.defer(() => this.render());
|
|
306
307
|
}
|
|
307
308
|
});
|
|
309
|
+
this._initTranscription();
|
|
310
|
+
this._setMaxHeight();
|
|
308
311
|
return this;
|
|
309
312
|
},
|
|
310
313
|
/**
|
|
@@ -865,6 +868,18 @@ define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/
|
|
|
865
868
|
this._setState('cors', isCORS);
|
|
866
869
|
this._setState('ready', false);
|
|
867
870
|
},
|
|
871
|
+
async _initTranscription() {
|
|
872
|
+
if (this.config.transcriptionUrl) {
|
|
873
|
+
try {
|
|
874
|
+
const response = await request(this.config.transcriptionUrl);
|
|
875
|
+
if (response && response.value) {
|
|
876
|
+
this.$component.find('.transcription').replaceWith('<div class="transcription">' + response.value + '</div>');
|
|
877
|
+
}
|
|
878
|
+
} catch (error) {
|
|
879
|
+
console.log('Error fetching transcription metadata:', error);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
},
|
|
868
883
|
/**
|
|
869
884
|
* Resets the internals attributes
|
|
870
885
|
* @private
|
|
@@ -1168,9 +1183,7 @@ define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/
|
|
|
1168
1183
|
} else if (this.autoStart) {
|
|
1169
1184
|
this.play();
|
|
1170
1185
|
}
|
|
1171
|
-
|
|
1172
|
-
this._setMaxHeight();
|
|
1173
|
-
}
|
|
1186
|
+
this._setMaxHeight();
|
|
1174
1187
|
},
|
|
1175
1188
|
/**
|
|
1176
1189
|
* Set max height limit for container
|
|
@@ -1178,18 +1191,14 @@ define(['jquery', 'lodash', 'async', 'util/urlParser', 'core/eventifier', 'core/
|
|
|
1178
1191
|
* @private
|
|
1179
1192
|
*/
|
|
1180
1193
|
_setMaxHeight() {
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
this.$component.css({
|
|
1190
|
-
maxHeight: `${this.config.height + controlsHeight}px`
|
|
1191
|
-
});
|
|
1192
|
-
this.execute('setSize', Math.floor(videoWidth), 'auto');
|
|
1194
|
+
if (this.config.preview && this.$container && this.config.height && this.config.height !== 'auto') {
|
|
1195
|
+
const $video = this.$container.find('video.video');
|
|
1196
|
+
const scale = $video.height() / this.config.height;
|
|
1197
|
+
const playerWidth = this.$container.find('.player').width();
|
|
1198
|
+
const videoWidth = $video.width() / scale;
|
|
1199
|
+
if (videoWidth > playerWidth) {
|
|
1200
|
+
this.execute('setSize', '100%', 'auto');
|
|
1201
|
+
}
|
|
1193
1202
|
}
|
|
1194
1203
|
},
|
|
1195
1204
|
/**
|
package/dist/previewer.js
CHANGED
|
@@ -301,6 +301,9 @@ define(['jquery', 'lodash', 'async', 'i18n', 'core/mimetype', 'handlebars', 'lib
|
|
|
301
301
|
}
|
|
302
302
|
}
|
|
303
303
|
});
|
|
304
|
+
function injectTranscriptionMetadata(transcriptionUrl, metadataUri, resourceUri) {
|
|
305
|
+
return `${transcriptionUrl}?metadataUri=${encodeURIComponent(metadataUri)}&resourceUri=${resourceUri.replace('taomedia://mediamanager/', '')}`;
|
|
306
|
+
}
|
|
304
307
|
|
|
305
308
|
//listen for file activation
|
|
306
309
|
$$1(parentSelector).off('click', '.files li').on('click', '.files li', function (e) {
|
|
@@ -311,6 +314,9 @@ define(['jquery', 'lodash', 'async', 'i18n', 'core/mimetype', 'handlebars', 'lib
|
|
|
311
314
|
let $selected = $$1(this);
|
|
312
315
|
let $files = $$1('.files > li', $fileSelector);
|
|
313
316
|
let data = _.clone($selected.data());
|
|
317
|
+
if (options.resourceMetadataUrl && options.transcriptionMetadata && data.file.includes('taomedia://mediamanager/')) {
|
|
318
|
+
data.transcriptionUrl = injectTranscriptionMetadata(options.resourceMetadataUrl, options.transcriptionMetadata, data.file);
|
|
319
|
+
}
|
|
314
320
|
$files.removeClass('active');
|
|
315
321
|
$selected.addClass('active');
|
|
316
322
|
$container.trigger(`fileselect.${ns}`, [data]);
|