@tabler/core 1.0.0-beta17 → 1.0.0-beta19
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/README.md +23 -7
- package/dist/.DS_Store +0 -0
- package/dist/css/demo.css +13 -43
- package/dist/css/demo.min.css +3 -3
- package/dist/css/demo.rtl.css +13 -43
- package/dist/css/demo.rtl.min.css +3 -3
- package/dist/css/tabler-flags.css +5 -3
- package/dist/css/tabler-flags.min.css +3 -3
- package/dist/css/tabler-flags.rtl.css +5 -3
- package/dist/css/tabler-flags.rtl.min.css +3 -3
- package/dist/css/tabler-payments.css +12 -2
- package/dist/css/tabler-payments.min.css +3 -3
- package/dist/css/tabler-payments.rtl.css +12 -2
- package/dist/css/tabler-payments.rtl.min.css +3 -3
- package/dist/css/tabler-social.css +10 -0
- package/dist/css/tabler-social.min.css +8 -0
- package/dist/css/tabler-social.rtl.css +10 -0
- package/dist/css/tabler-social.rtl.min.css +8 -0
- package/dist/css/tabler-vendors.css +114 -38
- package/dist/css/tabler-vendors.min.css +3 -3
- package/dist/css/tabler-vendors.rtl.css +114 -38
- package/dist/css/tabler-vendors.rtl.min.css +3 -3
- package/dist/css/tabler.css +3831 -2185
- package/dist/css/tabler.min.css +7 -3
- package/dist/css/tabler.rtl.css +3831 -2186
- package/dist/css/tabler.rtl.min.css +7 -3
- package/dist/img/payments/epayco-dark.svg +1 -0
- package/dist/img/payments/epayco.svg +1 -0
- package/dist/js/demo-theme.js +9 -6
- package/dist/js/demo-theme.min.js +3 -3
- package/dist/js/demo.js +16 -16
- package/dist/js/demo.min.js +2 -2
- package/dist/js/tabler.esm.js +2115 -2970
- package/dist/js/tabler.esm.min.js +6 -6
- package/dist/js/tabler.js +2115 -2970
- package/dist/js/tabler.min.js +6 -6
- package/dist/libs/apexcharts/dist/apexcharts.amd.js +1 -1
- package/dist/libs/apexcharts/dist/apexcharts.common.js +5 -5
- package/dist/libs/apexcharts/dist/apexcharts.esm.js +5 -5
- package/dist/libs/apexcharts/dist/apexcharts.js +3010 -2741
- package/dist/libs/apexcharts/dist/apexcharts.min.js +5 -5
- package/dist/libs/bootstrap/dist/js/bootstrap.bundle.js +228 -228
- package/dist/libs/bootstrap/dist/js/bootstrap.bundle.js.map +1 -1
- package/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js +3 -3
- package/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js.map +1 -1
- package/dist/libs/bootstrap/dist/js/bootstrap.esm.js +196 -195
- package/dist/libs/bootstrap/dist/js/bootstrap.esm.js.map +1 -1
- package/dist/libs/bootstrap/dist/js/bootstrap.esm.min.js +3 -3
- package/dist/libs/bootstrap/dist/js/bootstrap.esm.min.js.map +1 -1
- package/dist/libs/bootstrap/dist/js/bootstrap.js +197 -196
- package/dist/libs/bootstrap/dist/js/bootstrap.js.map +1 -1
- package/dist/libs/bootstrap/dist/js/bootstrap.min.js +3 -3
- package/dist/libs/bootstrap/dist/js/bootstrap.min.js.map +1 -1
- package/dist/libs/countup.js/dist/countUp.d.ts +8 -3
- package/dist/libs/countup.js/dist/countUp.js +26 -8
- package/dist/libs/countup.js/dist/countUp.min.js +1 -1
- package/dist/libs/countup.js/dist/countUp.umd.js +1 -293
- package/dist/libs/countup.js/dist/requestAnimationFrame.polyfill.js +26 -0
- package/dist/libs/fslightbox/README.md +39 -33
- package/dist/libs/fslightbox/index.js +1 -1
- package/dist/libs/fslightbox/package.json +10 -44
- package/dist/libs/jsvectormap/dist/js/jsvectormap.js +517 -857
- package/dist/libs/jsvectormap/dist/js/jsvectormap.min.js +1 -1
- package/dist/libs/nouislider/dist/nouislider.d.ts +2 -0
- package/dist/libs/nouislider/dist/nouislider.js +28 -0
- package/dist/libs/nouislider/dist/nouislider.min.js +1 -1
- package/dist/libs/nouislider/dist/nouislider.min.mjs +1 -1
- package/dist/libs/nouislider/dist/nouislider.mjs +28 -0
- package/dist/libs/plyr/dist/plyr.css +1 -1
- package/dist/libs/plyr/dist/plyr.js +289 -229
- package/dist/libs/plyr/dist/plyr.min.js +1 -1
- package/dist/libs/plyr/dist/plyr.min.js.map +1 -1
- package/dist/libs/plyr/dist/plyr.min.mjs +1 -1
- package/dist/libs/plyr/dist/plyr.min.mjs.map +1 -1
- package/dist/libs/plyr/dist/plyr.mjs +289 -229
- package/dist/libs/plyr/dist/plyr.polyfilled.js +289 -229
- package/dist/libs/plyr/dist/plyr.polyfilled.min.js +1 -1
- package/dist/libs/plyr/dist/plyr.polyfilled.min.js.map +1 -1
- package/dist/libs/plyr/dist/plyr.polyfilled.min.mjs +1 -1
- package/dist/libs/plyr/dist/plyr.polyfilled.min.mjs.map +1 -1
- package/dist/libs/plyr/dist/plyr.polyfilled.mjs +289 -229
- package/dist/libs/star-rating.js/dist/star-rating.cjs.js +481 -0
- package/dist/libs/star-rating.js/dist/star-rating.css +220 -0
- package/dist/libs/star-rating.js/dist/star-rating.esm.js +479 -0
- package/dist/libs/star-rating.js/dist/star-rating.esm.min.js +1 -0
- package/dist/libs/star-rating.js/dist/star-rating.js +491 -0
- package/dist/libs/star-rating.js/dist/star-rating.min.css +8 -0
- package/dist/libs/star-rating.js/dist/star-rating.min.js +8 -0
- package/dist/libs/tinymce/CHANGELOG.md +112 -0
- package/dist/libs/tinymce/composer.json +1 -1
- package/dist/libs/tinymce/icons/default/icons.js +4 -0
- package/dist/libs/tinymce/icons/default/icons.min.js +1 -1
- package/dist/libs/tinymce/models/dom/model.js +79 -23
- package/dist/libs/tinymce/models/dom/model.min.js +2 -2
- package/dist/libs/tinymce/package.json +1 -1
- package/dist/libs/tinymce/plugins/advlist/plugin.js +34 -28
- package/dist/libs/tinymce/plugins/advlist/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/anchor/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/anchor/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/autolink/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/autolink/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/autoresize/plugin.js +46 -11
- package/dist/libs/tinymce/plugins/autoresize/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/autosave/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/autosave/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/charmap/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/charmap/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/code/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/code/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/codesample/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/codesample/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/directionality/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/directionality/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/emoticons/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/emoticons/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/fullscreen/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/fullscreen/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/help/plugin.js +12 -4
- package/dist/libs/tinymce/plugins/help/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/image/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/image/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/importcss/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/importcss/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/insertdatetime/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/insertdatetime/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/link/plugin.js +21 -7
- package/dist/libs/tinymce/plugins/link/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/lists/plugin.js +132 -50
- package/dist/libs/tinymce/plugins/lists/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/media/plugin.js +7 -2
- package/dist/libs/tinymce/plugins/media/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/nonbreaking/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/nonbreaking/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/pagebreak/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/pagebreak/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/preview/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/preview/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/quickbars/plugin.js +21 -13
- package/dist/libs/tinymce/plugins/quickbars/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/save/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/save/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/searchreplace/plugin.js +56 -43
- package/dist/libs/tinymce/plugins/searchreplace/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/table/plugin.js +73 -55
- package/dist/libs/tinymce/plugins/table/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/template/plugin.js +17 -14
- package/dist/libs/tinymce/plugins/template/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/visualblocks/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/visualblocks/plugin.min.js +1 -1
- package/dist/libs/tinymce/plugins/visualchars/plugin.js +58 -7
- package/dist/libs/tinymce/plugins/visualchars/plugin.min.js +2 -2
- package/dist/libs/tinymce/plugins/wordcount/plugin.js +1 -1
- package/dist/libs/tinymce/plugins/wordcount/plugin.min.js +1 -1
- package/dist/libs/tinymce/skins/ui/oxide/skin.css +454 -6
- package/dist/libs/tinymce/skins/ui/oxide/skin.min.css +1 -1
- package/dist/libs/tinymce/skins/ui/oxide-dark/skin.css +454 -6
- package/dist/libs/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
- package/dist/libs/tinymce/skins/ui/tinymce-5/skin.css +455 -6
- package/dist/libs/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
- package/dist/libs/tinymce/skins/ui/tinymce-5-dark/skin.css +454 -5
- package/dist/libs/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
- package/dist/libs/tinymce/themes/silver/theme.js +4374 -3074
- package/dist/libs/tinymce/themes/silver/theme.min.js +2 -2
- package/dist/libs/tinymce/tinymce.d.ts +305 -236
- package/dist/libs/tinymce/tinymce.js +1957 -1597
- package/dist/libs/tinymce/tinymce.min.js +2 -2
- package/package.json +63 -42
- package/src/js/demo-theme.js +13 -10
- package/src/js/demo.js +18 -15
- package/src/js/tabler.esm.js +7 -8
- package/src/js/tabler.js +12 -12
- package/src/scss/_bootstrap-components.scss +33 -33
- package/src/scss/_bootstrap-config.scss +6 -6
- package/src/scss/_bootstrap-override.scss +8 -12
- package/src/scss/_config.scss +2 -1
- package/src/scss/_core.scss +1 -1
- package/src/scss/_debug.scss +41 -30
- package/src/scss/_utilities.scss +21 -19
- package/src/scss/_variables-dark.scss +17 -0
- package/src/scss/_variables.scss +233 -169
- package/src/scss/demo/_examples.scss +0 -16
- package/src/scss/demo.scss +36 -25
- package/src/scss/layout/_core.scss +0 -1
- package/src/scss/layout/_dark.scss +47 -162
- package/src/scss/layout/_navbar.scss +19 -99
- package/src/scss/layout/_page.scss +9 -6
- package/src/scss/layout/_root.scss +21 -7
- package/src/scss/mixins/_functions.scss +2 -6
- package/src/scss/mixins/_mixins.scss +0 -32
- package/src/scss/tabler-social.scss +1 -0
- package/src/scss/tabler-vendors.scss +1 -0
- package/src/scss/tabler.scss +0 -1
- package/src/scss/ui/_avatars.scss +1 -1
- package/src/scss/ui/_buttons.scss +1 -1
- package/src/scss/ui/_dropdowns.scss +1 -3
- package/src/scss/ui/_grid.scss +2 -18
- package/src/scss/ui/_payments.scss +1 -1
- package/src/scss/ui/_status.scss +0 -10
- package/src/scss/ui/_tables.scss +12 -26
- package/src/scss/ui/_timeline.scss +3 -3
- package/src/scss/utils/_colors.scss +6 -2
- package/src/scss/vendor/_apexcharts.scss +16 -0
- package/src/scss/vendor/_jsvectormap.scss +1 -1
- package/src/scss/vendor/_nouislider.scss +1 -1
- package/src/scss/vendor/_stars-rating.scss +20 -0
- package/src/scss/vendor/_tinymce.scss +5 -7
- package/src/scss/vendor/_tom-select.scss +43 -2
- package/dist/libs/countup.js/dist/countUp.withPolyfill.min.js +0 -1
- package/dist/libs/fslightbox/jest-setup.js +0 -1
|
@@ -475,6 +475,7 @@ function createCommonjsModule(fn, module) {
|
|
|
475
475
|
})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);
|
|
476
476
|
|
|
477
477
|
function _defineProperty$1(obj, key, value) {
|
|
478
|
+
key = _toPropertyKey(key);
|
|
478
479
|
if (key in obj) {
|
|
479
480
|
Object.defineProperty(obj, key, {
|
|
480
481
|
value: value,
|
|
@@ -487,6 +488,20 @@ function _defineProperty$1(obj, key, value) {
|
|
|
487
488
|
}
|
|
488
489
|
return obj;
|
|
489
490
|
}
|
|
491
|
+
function _toPrimitive(input, hint) {
|
|
492
|
+
if (typeof input !== "object" || input === null) return input;
|
|
493
|
+
var prim = input[Symbol.toPrimitive];
|
|
494
|
+
if (prim !== undefined) {
|
|
495
|
+
var res = prim.call(input, hint || "default");
|
|
496
|
+
if (typeof res !== "object") return res;
|
|
497
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
498
|
+
}
|
|
499
|
+
return (hint === "string" ? String : Number)(input);
|
|
500
|
+
}
|
|
501
|
+
function _toPropertyKey(arg) {
|
|
502
|
+
var key = _toPrimitive(arg, "string");
|
|
503
|
+
return typeof key === "symbol" ? key : String(key);
|
|
504
|
+
}
|
|
490
505
|
|
|
491
506
|
function _classCallCheck(e, t) {
|
|
492
507
|
if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function");
|
|
@@ -788,12 +803,20 @@ function repaint(element, delay) {
|
|
|
788
803
|
// Unfortunately, due to mixed support, UA sniffing is required
|
|
789
804
|
// ==========================================================================
|
|
790
805
|
|
|
791
|
-
const
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
806
|
+
const isIE = Boolean(window.document.documentMode);
|
|
807
|
+
const isEdge = /Edge/g.test(navigator.userAgent);
|
|
808
|
+
const isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent);
|
|
809
|
+
const isIPhone = /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;
|
|
810
|
+
// navigator.platform may be deprecated but this check is still required
|
|
811
|
+
const isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
|
|
812
|
+
const isIos = /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;
|
|
813
|
+
var browser = {
|
|
814
|
+
isIE,
|
|
815
|
+
isEdge,
|
|
816
|
+
isWebKit,
|
|
817
|
+
isIPhone,
|
|
818
|
+
isIPadOS,
|
|
819
|
+
isIos
|
|
797
820
|
};
|
|
798
821
|
|
|
799
822
|
// ==========================================================================
|
|
@@ -866,9 +889,7 @@ function wrap(elements, wrapper) {
|
|
|
866
889
|
|
|
867
890
|
// Set attributes
|
|
868
891
|
function setAttributes(element, attributes) {
|
|
869
|
-
if (!is.element(element) || is.empty(attributes))
|
|
870
|
-
return;
|
|
871
|
-
}
|
|
892
|
+
if (!is.element(element) || is.empty(attributes)) return;
|
|
872
893
|
|
|
873
894
|
// Assume null and undefined attributes should be left out,
|
|
874
895
|
// Setting them would otherwise convert them to "null" and "undefined"
|
|
@@ -894,19 +915,15 @@ function createElement(type, attributes, text) {
|
|
|
894
915
|
return element;
|
|
895
916
|
}
|
|
896
917
|
|
|
897
|
-
//
|
|
918
|
+
// Insert an element after another
|
|
898
919
|
function insertAfter(element, target) {
|
|
899
|
-
if (!is.element(element) || !is.element(target))
|
|
900
|
-
return;
|
|
901
|
-
}
|
|
920
|
+
if (!is.element(element) || !is.element(target)) return;
|
|
902
921
|
target.parentNode.insertBefore(element, target.nextSibling);
|
|
903
922
|
}
|
|
904
923
|
|
|
905
924
|
// Insert a DocumentFragment
|
|
906
925
|
function insertElement(type, parent, attributes, text) {
|
|
907
|
-
if (!is.element(parent))
|
|
908
|
-
return;
|
|
909
|
-
}
|
|
926
|
+
if (!is.element(parent)) return;
|
|
910
927
|
parent.appendChild(createElement(type, attributes, text));
|
|
911
928
|
}
|
|
912
929
|
|
|
@@ -924,9 +941,7 @@ function removeElement(element) {
|
|
|
924
941
|
|
|
925
942
|
// Remove all child elements
|
|
926
943
|
function emptyElement(element) {
|
|
927
|
-
if (!is.element(element))
|
|
928
|
-
return;
|
|
929
|
-
}
|
|
944
|
+
if (!is.element(element)) return;
|
|
930
945
|
let {
|
|
931
946
|
length
|
|
932
947
|
} = element.childNodes;
|
|
@@ -938,9 +953,7 @@ function emptyElement(element) {
|
|
|
938
953
|
|
|
939
954
|
// Replace element
|
|
940
955
|
function replaceElement(newChild, oldChild) {
|
|
941
|
-
if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild))
|
|
942
|
-
return null;
|
|
943
|
-
}
|
|
956
|
+
if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;
|
|
944
957
|
oldChild.parentNode.replaceChild(newChild, oldChild);
|
|
945
958
|
return newChild;
|
|
946
959
|
}
|
|
@@ -952,9 +965,7 @@ function getAttributesFromSelector(sel, existingAttributes) {
|
|
|
952
965
|
// '#test' to { id: 'test' }
|
|
953
966
|
// '[data-test="test"]' to { 'data-test': 'test' }
|
|
954
967
|
|
|
955
|
-
if (!is.string(sel) || is.empty(sel)) {
|
|
956
|
-
return {};
|
|
957
|
-
}
|
|
968
|
+
if (!is.string(sel) || is.empty(sel)) return {};
|
|
958
969
|
const attributes = {};
|
|
959
970
|
const existing = extend({}, existingAttributes);
|
|
960
971
|
sel.split(',').forEach(s => {
|
|
@@ -992,9 +1003,7 @@ function getAttributesFromSelector(sel, existingAttributes) {
|
|
|
992
1003
|
|
|
993
1004
|
// Toggle hidden
|
|
994
1005
|
function toggleHidden(element, hidden) {
|
|
995
|
-
if (!is.element(element))
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
1006
|
+
if (!is.element(element)) return;
|
|
998
1007
|
let hide = hidden;
|
|
999
1008
|
if (!is.boolean(hide)) {
|
|
1000
1009
|
hide = !element.hidden;
|
|
@@ -1067,20 +1076,14 @@ function getElement(selector) {
|
|
|
1067
1076
|
}
|
|
1068
1077
|
|
|
1069
1078
|
// Set focus and tab focus class
|
|
1070
|
-
function setFocus(element = null,
|
|
1071
|
-
if (!is.element(element))
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1079
|
+
function setFocus(element = null, focusVisible = false) {
|
|
1080
|
+
if (!is.element(element)) return;
|
|
1074
1081
|
|
|
1075
1082
|
// Set regular focus
|
|
1076
1083
|
element.focus({
|
|
1077
|
-
preventScroll: true
|
|
1084
|
+
preventScroll: true,
|
|
1085
|
+
focusVisible
|
|
1078
1086
|
});
|
|
1079
|
-
|
|
1080
|
-
// If we want to mimic keyboard focus via tab
|
|
1081
|
-
if (tabFocus) {
|
|
1082
|
-
toggleClass(element, this.config.classNames.tabFocus);
|
|
1083
|
-
}
|
|
1084
1087
|
}
|
|
1085
1088
|
|
|
1086
1089
|
// ==========================================================================
|
|
@@ -1101,10 +1104,9 @@ const support = {
|
|
|
1101
1104
|
video: 'canPlayType' in document.createElement('video'),
|
|
1102
1105
|
// Check for support
|
|
1103
1106
|
// Basic functionality vs full UI
|
|
1104
|
-
check(type, provider
|
|
1105
|
-
const canPlayInline = browser.isIPhone && playsinline && support.playsinline;
|
|
1107
|
+
check(type, provider) {
|
|
1106
1108
|
const api = support[type] || provider !== 'html5';
|
|
1107
|
-
const ui = api && support.rangeInput
|
|
1109
|
+
const ui = api && support.rangeInput;
|
|
1108
1110
|
return {
|
|
1109
1111
|
api,
|
|
1110
1112
|
ui
|
|
@@ -1601,7 +1603,7 @@ function generateId(prefix) {
|
|
|
1601
1603
|
// Format string
|
|
1602
1604
|
function format(input, ...args) {
|
|
1603
1605
|
if (is.empty(input)) return input;
|
|
1604
|
-
return input.toString().replace(/{(\d+)}/g, (
|
|
1606
|
+
return input.toString().replace(/{(\d+)}/g, (_, i) => args[i].toString());
|
|
1605
1607
|
}
|
|
1606
1608
|
|
|
1607
1609
|
// Get percentage
|
|
@@ -2182,7 +2184,8 @@ const controls = {
|
|
|
2182
2184
|
const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);
|
|
2183
2185
|
const container = createElement('div', extend(attributes, {
|
|
2184
2186
|
class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.trim(),
|
|
2185
|
-
'aria-label': i18n.get(type, this.config)
|
|
2187
|
+
'aria-label': i18n.get(type, this.config),
|
|
2188
|
+
role: 'timer'
|
|
2186
2189
|
}), '00:00');
|
|
2187
2190
|
|
|
2188
2191
|
// Reference for updates
|
|
@@ -2196,7 +2199,7 @@ const controls = {
|
|
|
2196
2199
|
// Navigate through menus via arrow keys and space
|
|
2197
2200
|
on.call(this, menuItem, 'keydown keyup', event => {
|
|
2198
2201
|
// We only care about space and ⬆️ ⬇️️ ➡️
|
|
2199
|
-
if (!['
|
|
2202
|
+
if (![' ', 'ArrowUp', 'ArrowDown', 'ArrowRight'].includes(event.key)) {
|
|
2200
2203
|
return;
|
|
2201
2204
|
}
|
|
2202
2205
|
|
|
@@ -2211,11 +2214,11 @@ const controls = {
|
|
|
2211
2214
|
const isRadioButton = matches(menuItem, '[role="menuitemradio"]');
|
|
2212
2215
|
|
|
2213
2216
|
// Show the respective menu
|
|
2214
|
-
if (!isRadioButton && ['
|
|
2217
|
+
if (!isRadioButton && [' ', 'ArrowRight'].includes(event.key)) {
|
|
2215
2218
|
controls.showMenuPanel.call(this, type, true);
|
|
2216
2219
|
} else {
|
|
2217
2220
|
let target;
|
|
2218
|
-
if (event.key !== '
|
|
2221
|
+
if (event.key !== ' ') {
|
|
2219
2222
|
if (event.key === 'ArrowDown' || isRadioButton && event.key === 'ArrowRight') {
|
|
2220
2223
|
target = menuItem.nextElementSibling;
|
|
2221
2224
|
if (!is.element(target)) {
|
|
@@ -2280,7 +2283,7 @@ const controls = {
|
|
|
2280
2283
|
}
|
|
2281
2284
|
});
|
|
2282
2285
|
this.listeners.bind(menuItem, 'click keyup', event => {
|
|
2283
|
-
if (is.keyboardEvent(event) && event.key !== '
|
|
2286
|
+
if (is.keyboardEvent(event) && event.key !== ' ') {
|
|
2284
2287
|
return;
|
|
2285
2288
|
}
|
|
2286
2289
|
event.preventDefault();
|
|
@@ -2420,7 +2423,7 @@ const controls = {
|
|
|
2420
2423
|
}
|
|
2421
2424
|
|
|
2422
2425
|
// WebKit only
|
|
2423
|
-
if (!browser.
|
|
2426
|
+
if (!browser.isWebKit && !browser.isIPadOS) {
|
|
2424
2427
|
return;
|
|
2425
2428
|
}
|
|
2426
2429
|
|
|
@@ -2803,7 +2806,7 @@ const controls = {
|
|
|
2803
2806
|
toggleHidden(this.elements.settings.menu, !visible);
|
|
2804
2807
|
},
|
|
2805
2808
|
// Focus the first menu item in a given (or visible) menu
|
|
2806
|
-
focusFirstMenuItem(pane,
|
|
2809
|
+
focusFirstMenuItem(pane, focusVisible = false) {
|
|
2807
2810
|
if (this.elements.settings.popup.hidden) {
|
|
2808
2811
|
return;
|
|
2809
2812
|
}
|
|
@@ -2812,7 +2815,7 @@ const controls = {
|
|
|
2812
2815
|
target = Object.values(this.elements.settings.panels).find(p => !p.hidden);
|
|
2813
2816
|
}
|
|
2814
2817
|
const firstItem = target.querySelector('[role^="menuitem"]');
|
|
2815
|
-
setFocus.call(this, firstItem,
|
|
2818
|
+
setFocus.call(this, firstItem, focusVisible);
|
|
2816
2819
|
},
|
|
2817
2820
|
// Show/hide menu
|
|
2818
2821
|
toggleMenu(input) {
|
|
@@ -2888,7 +2891,7 @@ const controls = {
|
|
|
2888
2891
|
};
|
|
2889
2892
|
},
|
|
2890
2893
|
// Show a panel in the menu
|
|
2891
|
-
showMenuPanel(type = '',
|
|
2894
|
+
showMenuPanel(type = '', focusVisible = false) {
|
|
2892
2895
|
const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);
|
|
2893
2896
|
|
|
2894
2897
|
// Nothing to show, bail
|
|
@@ -2939,7 +2942,7 @@ const controls = {
|
|
|
2939
2942
|
toggleHidden(target, false);
|
|
2940
2943
|
|
|
2941
2944
|
// Focus the first item
|
|
2942
|
-
controls.focusFirstMenuItem.call(this, target,
|
|
2945
|
+
controls.focusFirstMenuItem.call(this, target, focusVisible);
|
|
2943
2946
|
},
|
|
2944
2947
|
// Set the download URL
|
|
2945
2948
|
setDownloadUrl() {
|
|
@@ -3066,7 +3069,7 @@ const controls = {
|
|
|
3066
3069
|
// Volume range control
|
|
3067
3070
|
// Ignored on iOS as it's handled globally
|
|
3068
3071
|
// https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html
|
|
3069
|
-
if (control === 'volume' && !browser.isIos) {
|
|
3072
|
+
if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {
|
|
3070
3073
|
// Set the attributes
|
|
3071
3074
|
const attributes = {
|
|
3072
3075
|
max: 1,
|
|
@@ -3858,8 +3861,7 @@ const defaults = {
|
|
|
3858
3861
|
autoplay: false,
|
|
3859
3862
|
// Only allow one media playing at once (vimeo only)
|
|
3860
3863
|
autopause: true,
|
|
3861
|
-
// Allow inline playback on iOS
|
|
3862
|
-
// TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
|
|
3864
|
+
// Allow inline playback on iOS
|
|
3863
3865
|
playsinline: true,
|
|
3864
3866
|
// Default time to skip when rewind/fast forward
|
|
3865
3867
|
seekTime: 10,
|
|
@@ -3889,7 +3891,7 @@ const defaults = {
|
|
|
3889
3891
|
// Sprite (for icons)
|
|
3890
3892
|
loadSprite: true,
|
|
3891
3893
|
iconPrefix: 'plyr',
|
|
3892
|
-
iconUrl: 'https://cdn.plyr.io/3.7.
|
|
3894
|
+
iconUrl: 'https://cdn.plyr.io/3.7.8/plyr.svg',
|
|
3893
3895
|
// Blank video (used to prevent errors on source change)
|
|
3894
3896
|
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
|
|
3895
3897
|
// Quality default
|
|
@@ -4122,7 +4124,6 @@ const defaults = {
|
|
|
4122
4124
|
marker: 'plyr__progress__marker',
|
|
4123
4125
|
hidden: 'plyr__sr-only',
|
|
4124
4126
|
hideControls: 'plyr--hide-controls',
|
|
4125
|
-
isIos: 'plyr--is-ios',
|
|
4126
4127
|
isTouch: 'plyr--is-touch',
|
|
4127
4128
|
uiSupported: 'plyr--full-ui',
|
|
4128
4129
|
noTransition: 'plyr--no-transition',
|
|
@@ -4150,7 +4151,6 @@ const defaults = {
|
|
|
4150
4151
|
supported: 'plyr--airplay-supported',
|
|
4151
4152
|
active: 'plyr--airplay-active'
|
|
4152
4153
|
},
|
|
4153
|
-
tabFocus: 'plyr__tab-focus',
|
|
4154
4154
|
previewThumbnails: {
|
|
4155
4155
|
// Tooltip thumbs
|
|
4156
4156
|
thumbContainer: 'plyr__preview-thumb',
|
|
@@ -4295,9 +4295,7 @@ class Console {
|
|
|
4295
4295
|
class Fullscreen {
|
|
4296
4296
|
constructor(player) {
|
|
4297
4297
|
_defineProperty$1(this, "onChange", () => {
|
|
4298
|
-
if (!this.
|
|
4299
|
-
return;
|
|
4300
|
-
}
|
|
4298
|
+
if (!this.supported) return;
|
|
4301
4299
|
|
|
4302
4300
|
// Update toggle button
|
|
4303
4301
|
const button = this.player.elements.buttons.fullscreen;
|
|
@@ -4314,8 +4312,8 @@ class Fullscreen {
|
|
|
4314
4312
|
// Store or restore scroll position
|
|
4315
4313
|
if (toggle) {
|
|
4316
4314
|
this.scrollPosition = {
|
|
4317
|
-
x: window.scrollX
|
|
4318
|
-
y: window.scrollY
|
|
4315
|
+
x: window.scrollX ?? 0,
|
|
4316
|
+
y: window.scrollY ?? 0
|
|
4319
4317
|
};
|
|
4320
4318
|
} else {
|
|
4321
4319
|
window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
|
|
@@ -4342,9 +4340,7 @@ class Fullscreen {
|
|
|
4342
4340
|
const hasProperty = is.string(viewport.content) && viewport.content.includes(property);
|
|
4343
4341
|
if (toggle) {
|
|
4344
4342
|
this.cleanupViewport = !hasProperty;
|
|
4345
|
-
if (!hasProperty) {
|
|
4346
|
-
viewport.content += `,${property}`;
|
|
4347
|
-
}
|
|
4343
|
+
if (!hasProperty) viewport.content += `,${property}`;
|
|
4348
4344
|
} else if (this.cleanupViewport) {
|
|
4349
4345
|
viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');
|
|
4350
4346
|
}
|
|
@@ -4353,11 +4349,10 @@ class Fullscreen {
|
|
|
4353
4349
|
// Toggle button and fire events
|
|
4354
4350
|
this.onChange();
|
|
4355
4351
|
});
|
|
4352
|
+
// Trap focus inside container
|
|
4356
4353
|
_defineProperty$1(this, "trapFocus", event => {
|
|
4357
|
-
// Bail if iOS, not active, not the tab key
|
|
4358
|
-
if (browser.isIos || !this.active || event.key !== 'Tab')
|
|
4359
|
-
return;
|
|
4360
|
-
}
|
|
4354
|
+
// Bail if iOS/iPadOS, not active, not the tab key
|
|
4355
|
+
if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;
|
|
4361
4356
|
|
|
4362
4357
|
// Get the current focused element
|
|
4363
4358
|
const focused = document.activeElement;
|
|
@@ -4374,28 +4369,22 @@ class Fullscreen {
|
|
|
4374
4369
|
event.preventDefault();
|
|
4375
4370
|
}
|
|
4376
4371
|
});
|
|
4372
|
+
// Update UI
|
|
4377
4373
|
_defineProperty$1(this, "update", () => {
|
|
4378
|
-
if (this.
|
|
4374
|
+
if (this.supported) {
|
|
4379
4375
|
let mode;
|
|
4380
|
-
if (this.forceFallback)
|
|
4381
|
-
mode = 'Fallback (forced)';
|
|
4382
|
-
} else if (Fullscreen.native) {
|
|
4383
|
-
mode = 'Native';
|
|
4384
|
-
} else {
|
|
4385
|
-
mode = 'Fallback';
|
|
4386
|
-
}
|
|
4376
|
+
if (this.forceFallback) mode = 'Fallback (forced)';else if (Fullscreen.nativeSupported) mode = 'Native';else mode = 'Fallback';
|
|
4387
4377
|
this.player.debug.log(`${mode} fullscreen enabled`);
|
|
4388
4378
|
} else {
|
|
4389
4379
|
this.player.debug.log('Fullscreen not supported and fallback disabled');
|
|
4390
4380
|
}
|
|
4391
4381
|
|
|
4392
4382
|
// Add styling hook to show button
|
|
4393
|
-
toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.
|
|
4383
|
+
toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);
|
|
4394
4384
|
});
|
|
4385
|
+
// Make an element fullscreen
|
|
4395
4386
|
_defineProperty$1(this, "enter", () => {
|
|
4396
|
-
if (!this.
|
|
4397
|
-
return;
|
|
4398
|
-
}
|
|
4387
|
+
if (!this.supported) return;
|
|
4399
4388
|
|
|
4400
4389
|
// iOS native fullscreen doesn't need the request step
|
|
4401
4390
|
if (browser.isIos && this.player.config.fullscreen.iosNative) {
|
|
@@ -4404,7 +4393,7 @@ class Fullscreen {
|
|
|
4404
4393
|
} else {
|
|
4405
4394
|
this.target.webkitEnterFullscreen();
|
|
4406
4395
|
}
|
|
4407
|
-
} else if (!Fullscreen.
|
|
4396
|
+
} else if (!Fullscreen.nativeSupported || this.forceFallback) {
|
|
4408
4397
|
this.toggleFallback(true);
|
|
4409
4398
|
} else if (!this.prefix) {
|
|
4410
4399
|
this.target.requestFullscreen({
|
|
@@ -4414,16 +4403,19 @@ class Fullscreen {
|
|
|
4414
4403
|
this.target[`${this.prefix}Request${this.property}`]();
|
|
4415
4404
|
}
|
|
4416
4405
|
});
|
|
4406
|
+
// Bail from fullscreen
|
|
4417
4407
|
_defineProperty$1(this, "exit", () => {
|
|
4418
|
-
if (!this.
|
|
4419
|
-
return;
|
|
4420
|
-
}
|
|
4408
|
+
if (!this.supported) return;
|
|
4421
4409
|
|
|
4422
4410
|
// iOS native fullscreen
|
|
4423
4411
|
if (browser.isIos && this.player.config.fullscreen.iosNative) {
|
|
4424
|
-
this.
|
|
4412
|
+
if (this.player.isVimeo) {
|
|
4413
|
+
this.player.embed.exitFullscreen();
|
|
4414
|
+
} else {
|
|
4415
|
+
this.target.webkitEnterFullscreen();
|
|
4416
|
+
}
|
|
4425
4417
|
silencePromise(this.player.play());
|
|
4426
|
-
} else if (!Fullscreen.
|
|
4418
|
+
} else if (!Fullscreen.nativeSupported || this.forceFallback) {
|
|
4427
4419
|
this.toggleFallback(false);
|
|
4428
4420
|
} else if (!this.prefix) {
|
|
4429
4421
|
(document.cancelFullScreen || document.exitFullscreen).call(document);
|
|
@@ -4432,12 +4424,9 @@ class Fullscreen {
|
|
|
4432
4424
|
document[`${this.prefix}${action}${this.property}`]();
|
|
4433
4425
|
}
|
|
4434
4426
|
});
|
|
4427
|
+
// Toggle state
|
|
4435
4428
|
_defineProperty$1(this, "toggle", () => {
|
|
4436
|
-
if (!this.active)
|
|
4437
|
-
this.enter();
|
|
4438
|
-
} else {
|
|
4439
|
-
this.exit();
|
|
4440
|
-
}
|
|
4429
|
+
if (!this.active) this.enter();else this.exit();
|
|
4441
4430
|
});
|
|
4442
4431
|
// Keep reference to parent
|
|
4443
4432
|
this.player = player;
|
|
@@ -4480,26 +4469,22 @@ class Fullscreen {
|
|
|
4480
4469
|
|
|
4481
4470
|
// Update the UI
|
|
4482
4471
|
this.update();
|
|
4483
|
-
|
|
4484
|
-
// this.toggle = this.toggle.bind(this);
|
|
4485
4472
|
}
|
|
4486
4473
|
|
|
4487
4474
|
// Determine if native supported
|
|
4488
|
-
static get
|
|
4475
|
+
static get nativeSupported() {
|
|
4489
4476
|
return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
|
|
4490
4477
|
}
|
|
4491
4478
|
|
|
4492
4479
|
// If we're actually using native
|
|
4493
|
-
get
|
|
4494
|
-
return Fullscreen.
|
|
4480
|
+
get useNative() {
|
|
4481
|
+
return Fullscreen.nativeSupported && !this.forceFallback;
|
|
4495
4482
|
}
|
|
4496
4483
|
|
|
4497
4484
|
// Get the prefix for handlers
|
|
4498
4485
|
static get prefix() {
|
|
4499
4486
|
// No prefix
|
|
4500
|
-
if (is.function(document.exitFullscreen))
|
|
4501
|
-
return '';
|
|
4502
|
-
}
|
|
4487
|
+
if (is.function(document.exitFullscreen)) return '';
|
|
4503
4488
|
|
|
4504
4489
|
// Check for fullscreen support by vendor prefix
|
|
4505
4490
|
let value = '';
|
|
@@ -4517,19 +4502,26 @@ class Fullscreen {
|
|
|
4517
4502
|
return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
|
|
4518
4503
|
}
|
|
4519
4504
|
|
|
4520
|
-
// Determine if fullscreen is
|
|
4521
|
-
get
|
|
4522
|
-
return
|
|
4505
|
+
// Determine if fullscreen is supported
|
|
4506
|
+
get supported() {
|
|
4507
|
+
return [
|
|
4508
|
+
// Fullscreen is enabled in config
|
|
4509
|
+
this.player.config.fullscreen.enabled,
|
|
4510
|
+
// Must be a video
|
|
4511
|
+
this.player.isVideo,
|
|
4512
|
+
// Either native is supported or fallback enabled
|
|
4513
|
+
Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,
|
|
4514
|
+
// YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline
|
|
4515
|
+
// must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback
|
|
4516
|
+
!this.player.isYouTube || Fullscreen.nativeSupported || !browser.isIos || this.player.config.playsinline && !this.player.config.fullscreen.iosNative].every(Boolean);
|
|
4523
4517
|
}
|
|
4524
4518
|
|
|
4525
4519
|
// Get active state
|
|
4526
4520
|
get active() {
|
|
4527
|
-
if (!this.
|
|
4528
|
-
return false;
|
|
4529
|
-
}
|
|
4521
|
+
if (!this.supported) return false;
|
|
4530
4522
|
|
|
4531
4523
|
// Fallback using classname
|
|
4532
|
-
if (!Fullscreen.
|
|
4524
|
+
if (!Fullscreen.nativeSupported || this.forceFallback) {
|
|
4533
4525
|
return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
|
|
4534
4526
|
}
|
|
4535
4527
|
const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];
|
|
@@ -4538,7 +4530,7 @@ class Fullscreen {
|
|
|
4538
4530
|
|
|
4539
4531
|
// Get target element
|
|
4540
4532
|
get target() {
|
|
4541
|
-
return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen
|
|
4533
|
+
return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen ?? this.player.elements.container;
|
|
4542
4534
|
}
|
|
4543
4535
|
}
|
|
4544
4536
|
|
|
@@ -4645,9 +4637,6 @@ const ui = {
|
|
|
4645
4637
|
// Check for airplay support
|
|
4646
4638
|
toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);
|
|
4647
4639
|
|
|
4648
|
-
// Add iOS class
|
|
4649
|
-
toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);
|
|
4650
|
-
|
|
4651
4640
|
// Add touch class
|
|
4652
4641
|
toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);
|
|
4653
4642
|
|
|
@@ -4826,6 +4815,7 @@ const ui = {
|
|
|
4826
4815
|
|
|
4827
4816
|
class Listeners {
|
|
4828
4817
|
constructor(_player) {
|
|
4818
|
+
// Device is touch enabled
|
|
4829
4819
|
_defineProperty$1(this, "firstTouch", () => {
|
|
4830
4820
|
const {
|
|
4831
4821
|
player
|
|
@@ -4838,62 +4828,7 @@ class Listeners {
|
|
|
4838
4828
|
// Add touch class
|
|
4839
4829
|
toggleClass(elements.container, player.config.classNames.isTouch, true);
|
|
4840
4830
|
});
|
|
4841
|
-
|
|
4842
|
-
const {
|
|
4843
|
-
player
|
|
4844
|
-
} = this;
|
|
4845
|
-
const {
|
|
4846
|
-
elements
|
|
4847
|
-
} = player;
|
|
4848
|
-
const {
|
|
4849
|
-
key,
|
|
4850
|
-
type,
|
|
4851
|
-
timeStamp
|
|
4852
|
-
} = event;
|
|
4853
|
-
clearTimeout(this.focusTimer);
|
|
4854
|
-
|
|
4855
|
-
// Ignore any key other than tab
|
|
4856
|
-
if (type === 'keydown' && key !== 'Tab') {
|
|
4857
|
-
return;
|
|
4858
|
-
}
|
|
4859
|
-
|
|
4860
|
-
// Store reference to event timeStamp
|
|
4861
|
-
if (type === 'keydown') {
|
|
4862
|
-
this.lastKeyDown = timeStamp;
|
|
4863
|
-
}
|
|
4864
|
-
|
|
4865
|
-
// Remove current classes
|
|
4866
|
-
const removeCurrent = () => {
|
|
4867
|
-
const className = player.config.classNames.tabFocus;
|
|
4868
|
-
const current = getElements.call(player, `.${className}`);
|
|
4869
|
-
toggleClass(current, className, false);
|
|
4870
|
-
};
|
|
4871
|
-
|
|
4872
|
-
// Determine if a key was pressed to trigger this event
|
|
4873
|
-
const wasKeyDown = timeStamp - this.lastKeyDown <= 20;
|
|
4874
|
-
|
|
4875
|
-
// Ignore focus events if a key was pressed prior
|
|
4876
|
-
if (type === 'focus' && !wasKeyDown) {
|
|
4877
|
-
return;
|
|
4878
|
-
}
|
|
4879
|
-
|
|
4880
|
-
// Remove all current
|
|
4881
|
-
removeCurrent();
|
|
4882
|
-
|
|
4883
|
-
// Delay the adding of classname until the focus has changed
|
|
4884
|
-
// This event fires before the focusin event
|
|
4885
|
-
if (type !== 'focusout') {
|
|
4886
|
-
this.focusTimer = setTimeout(() => {
|
|
4887
|
-
const focused = document.activeElement;
|
|
4888
|
-
|
|
4889
|
-
// Ignore if current focus element isn't inside the player
|
|
4890
|
-
if (!elements.container.contains(focused)) {
|
|
4891
|
-
return;
|
|
4892
|
-
}
|
|
4893
|
-
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
|
|
4894
|
-
}, 10);
|
|
4895
|
-
}
|
|
4896
|
-
});
|
|
4831
|
+
// Global window & document listeners
|
|
4897
4832
|
_defineProperty$1(this, "global", (toggle = true) => {
|
|
4898
4833
|
const {
|
|
4899
4834
|
player
|
|
@@ -4909,10 +4844,8 @@ class Listeners {
|
|
|
4909
4844
|
|
|
4910
4845
|
// Detect touch by events
|
|
4911
4846
|
once.call(player, document.body, 'touchstart', this.firstTouch);
|
|
4912
|
-
|
|
4913
|
-
// Tab focus detection
|
|
4914
|
-
toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
|
|
4915
4847
|
});
|
|
4848
|
+
// Container listeners
|
|
4916
4849
|
_defineProperty$1(this, "container", () => {
|
|
4917
4850
|
const {
|
|
4918
4851
|
player
|
|
@@ -5020,6 +4953,7 @@ class Listeners {
|
|
|
5020
4953
|
method.call(player, window, 'resize', resized);
|
|
5021
4954
|
});
|
|
5022
4955
|
});
|
|
4956
|
+
// Listen for media events
|
|
5023
4957
|
_defineProperty$1(this, "media", () => {
|
|
5024
4958
|
const {
|
|
5025
4959
|
player
|
|
@@ -5147,6 +5081,7 @@ class Listeners {
|
|
|
5147
5081
|
triggerEvent.call(player, elements.container, event.type, true, detail);
|
|
5148
5082
|
});
|
|
5149
5083
|
});
|
|
5084
|
+
// Run default and custom handlers
|
|
5150
5085
|
_defineProperty$1(this, "proxy", (event, defaultHandler, customHandlerKey) => {
|
|
5151
5086
|
const {
|
|
5152
5087
|
player
|
|
@@ -5165,6 +5100,7 @@ class Listeners {
|
|
|
5165
5100
|
defaultHandler.call(player, event);
|
|
5166
5101
|
}
|
|
5167
5102
|
});
|
|
5103
|
+
// Trigger custom and default handlers
|
|
5168
5104
|
_defineProperty$1(this, "bind", (element, type, defaultHandler, customHandlerKey, passive = true) => {
|
|
5169
5105
|
const {
|
|
5170
5106
|
player
|
|
@@ -5173,6 +5109,7 @@ class Listeners {
|
|
|
5173
5109
|
const hasCustomHandler = is.function(customHandler);
|
|
5174
5110
|
on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);
|
|
5175
5111
|
});
|
|
5112
|
+
// Listen for control events
|
|
5176
5113
|
_defineProperty$1(this, "controls", () => {
|
|
5177
5114
|
const {
|
|
5178
5115
|
player
|
|
@@ -5247,7 +5184,7 @@ class Listeners {
|
|
|
5247
5184
|
// We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
|
|
5248
5185
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
|
|
5249
5186
|
this.bind(elements.buttons.settings, 'keyup', event => {
|
|
5250
|
-
if (!['
|
|
5187
|
+
if (![' ', 'Enter'].includes(event.key)) {
|
|
5251
5188
|
return;
|
|
5252
5189
|
}
|
|
5253
5190
|
|
|
@@ -5371,7 +5308,7 @@ class Listeners {
|
|
|
5371
5308
|
});
|
|
5372
5309
|
|
|
5373
5310
|
// Polyfill for lower fill in <input type="range"> for webkit
|
|
5374
|
-
if (browser.
|
|
5311
|
+
if (browser.isWebKit) {
|
|
5375
5312
|
Array.from(getElements.call(player, 'input[type="range"]')).forEach(element => {
|
|
5376
5313
|
this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));
|
|
5377
5314
|
});
|
|
@@ -5472,7 +5409,6 @@ class Listeners {
|
|
|
5472
5409
|
this.lastKeyDown = null;
|
|
5473
5410
|
this.handleKey = this.handleKey.bind(this);
|
|
5474
5411
|
this.toggleMenu = this.toggleMenu.bind(this);
|
|
5475
|
-
this.setTabFocus = this.setTabFocus.bind(this);
|
|
5476
5412
|
this.firstTouch = this.firstTouch.bind(this);
|
|
5477
5413
|
}
|
|
5478
5414
|
|
|
@@ -5529,13 +5465,13 @@ class Listeners {
|
|
|
5529
5465
|
if (focused !== seek && matches(focused, editable)) {
|
|
5530
5466
|
return;
|
|
5531
5467
|
}
|
|
5532
|
-
if (event.key === '
|
|
5468
|
+
if (event.key === ' ' && matches(focused, 'button, [role^="menuitem"]')) {
|
|
5533
5469
|
return;
|
|
5534
5470
|
}
|
|
5535
5471
|
}
|
|
5536
5472
|
|
|
5537
5473
|
// Which keys should we prevent default
|
|
5538
|
-
const preventDefault = ['
|
|
5474
|
+
const preventDefault = [' ', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];
|
|
5539
5475
|
|
|
5540
5476
|
// If the key is found prevent default (e.g. prevent scrolling for arrows)
|
|
5541
5477
|
if (preventDefault.includes(key)) {
|
|
@@ -5557,7 +5493,7 @@ class Listeners {
|
|
|
5557
5493
|
seekByIncrement(parseInt(key, 10));
|
|
5558
5494
|
}
|
|
5559
5495
|
break;
|
|
5560
|
-
case '
|
|
5496
|
+
case ' ':
|
|
5561
5497
|
case 'k':
|
|
5562
5498
|
if (!repeat) {
|
|
5563
5499
|
silencePromise(player.togglePlay());
|
|
@@ -5610,8 +5546,6 @@ class Listeners {
|
|
|
5610
5546
|
toggleMenu(event) {
|
|
5611
5547
|
controls.toggleMenu.call(this.player, event);
|
|
5612
5548
|
}
|
|
5613
|
-
|
|
5614
|
-
// Device is touch enabled
|
|
5615
5549
|
}
|
|
5616
5550
|
|
|
5617
5551
|
var loadjs_umd = createCommonjsModule(function (module, exports) {
|
|
@@ -6017,7 +5951,7 @@ const vimeo = {
|
|
|
6017
5951
|
autoplay: player.autoplay,
|
|
6018
5952
|
muted: player.muted,
|
|
6019
5953
|
gesture: 'media',
|
|
6020
|
-
playsinline:
|
|
5954
|
+
playsinline: player.config.playsinline,
|
|
6021
5955
|
// hash has to be added to iframe-URL
|
|
6022
5956
|
...hashParam,
|
|
6023
5957
|
...frameParams
|
|
@@ -6168,7 +6102,7 @@ const vimeo = {
|
|
|
6168
6102
|
},
|
|
6169
6103
|
set(input) {
|
|
6170
6104
|
const toggle = is.boolean(input) ? input : false;
|
|
6171
|
-
player.embed.
|
|
6105
|
+
player.embed.setMuted(toggle ? true : player.config.muted).then(() => {
|
|
6172
6106
|
muted = toggle;
|
|
6173
6107
|
triggerEvent.call(player, player.media, 'volumechange');
|
|
6174
6108
|
});
|
|
@@ -6441,7 +6375,7 @@ const youtube = {
|
|
|
6441
6375
|
const posterSrc = s => `https://i.ytimg.com/vi/${videoId}/${s}default.jpg`;
|
|
6442
6376
|
|
|
6443
6377
|
// Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
|
|
6444
|
-
loadImage(posterSrc('maxres'), 121) //
|
|
6378
|
+
loadImage(posterSrc('maxres'), 121) // Highest quality and un-padded
|
|
6445
6379
|
.catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3
|
|
6446
6380
|
.catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists
|
|
6447
6381
|
.then(image => ui.setPoster.call(player, image.src)).then(src => {
|
|
@@ -6467,7 +6401,7 @@ const youtube = {
|
|
|
6467
6401
|
// Disable keyboard as we handle it
|
|
6468
6402
|
disablekb: 1,
|
|
6469
6403
|
// Allow iOS inline playback
|
|
6470
|
-
playsinline: !player.config.fullscreen.iosNative ? 1 : 0,
|
|
6404
|
+
playsinline: player.config.playsinline && !player.config.fullscreen.iosNative ? 1 : 0,
|
|
6471
6405
|
// Captions are flaky on YouTube
|
|
6472
6406
|
cc_load_policy: player.captions.active ? 1 : 0,
|
|
6473
6407
|
cc_lang_pref: player.config.captions.language,
|
|
@@ -6486,7 +6420,7 @@ const youtube = {
|
|
|
6486
6420
|
100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
|
|
6487
6421
|
101: 'The owner of the requested video does not allow it to be played in embedded players.',
|
|
6488
6422
|
150: 'The owner of the requested video does not allow it to be played in embedded players.'
|
|
6489
|
-
}[code] || 'An unknown error
|
|
6423
|
+
}[code] || 'An unknown error occurred';
|
|
6490
6424
|
player.media.error = {
|
|
6491
6425
|
code,
|
|
6492
6426
|
message
|
|
@@ -6798,6 +6732,9 @@ class Ads {
|
|
|
6798
6732
|
* @return {Ads}
|
|
6799
6733
|
*/
|
|
6800
6734
|
constructor(player) {
|
|
6735
|
+
/**
|
|
6736
|
+
* Load the IMA SDK
|
|
6737
|
+
*/
|
|
6801
6738
|
_defineProperty$1(this, "load", () => {
|
|
6802
6739
|
if (!this.enabled) {
|
|
6803
6740
|
return;
|
|
@@ -6815,6 +6752,9 @@ class Ads {
|
|
|
6815
6752
|
this.ready();
|
|
6816
6753
|
}
|
|
6817
6754
|
});
|
|
6755
|
+
/**
|
|
6756
|
+
* Get the ads instance ready
|
|
6757
|
+
*/
|
|
6818
6758
|
_defineProperty$1(this, "ready", () => {
|
|
6819
6759
|
// Double check we're enabled
|
|
6820
6760
|
if (!this.enabled) {
|
|
@@ -6836,6 +6776,14 @@ class Ads {
|
|
|
6836
6776
|
// Setup the IMA SDK
|
|
6837
6777
|
this.setupIMA();
|
|
6838
6778
|
});
|
|
6779
|
+
/**
|
|
6780
|
+
* In order for the SDK to display ads for our video, we need to tell it where to put them,
|
|
6781
|
+
* so here we define our ad container. This div is set up to render on top of the video player.
|
|
6782
|
+
* Using the code below, we tell the SDK to render ads within that div. We also provide a
|
|
6783
|
+
* handle to the content video player - the SDK will poll the current time of our player to
|
|
6784
|
+
* properly place mid-rolls. After we create the ad display container, we initialize it. On
|
|
6785
|
+
* mobile devices, this initialization is done as the result of a user action.
|
|
6786
|
+
*/
|
|
6839
6787
|
_defineProperty$1(this, "setupIMA", () => {
|
|
6840
6788
|
// Create the container for our advertisements
|
|
6841
6789
|
this.elements.container = createElement('div', {
|
|
@@ -6865,6 +6813,9 @@ class Ads {
|
|
|
6865
6813
|
// Request video ads to be pre-loaded
|
|
6866
6814
|
this.requestAds();
|
|
6867
6815
|
});
|
|
6816
|
+
/**
|
|
6817
|
+
* Request advertisements
|
|
6818
|
+
*/
|
|
6868
6819
|
_defineProperty$1(this, "requestAds", () => {
|
|
6869
6820
|
const {
|
|
6870
6821
|
container
|
|
@@ -6891,6 +6842,10 @@ class Ads {
|
|
|
6891
6842
|
this.onAdError(error);
|
|
6892
6843
|
}
|
|
6893
6844
|
});
|
|
6845
|
+
/**
|
|
6846
|
+
* Update the ad countdown
|
|
6847
|
+
* @param {Boolean} start
|
|
6848
|
+
*/
|
|
6894
6849
|
_defineProperty$1(this, "pollCountdown", (start = false) => {
|
|
6895
6850
|
if (!start) {
|
|
6896
6851
|
clearInterval(this.countdownTimer);
|
|
@@ -6904,6 +6859,10 @@ class Ads {
|
|
|
6904
6859
|
};
|
|
6905
6860
|
this.countdownTimer = setInterval(update, 100);
|
|
6906
6861
|
});
|
|
6862
|
+
/**
|
|
6863
|
+
* This method is called whenever the ads are ready inside the AdDisplayContainer
|
|
6864
|
+
* @param {Event} event - adsManagerLoadedEvent
|
|
6865
|
+
*/
|
|
6907
6866
|
_defineProperty$1(this, "onAdsManagerLoaded", event => {
|
|
6908
6867
|
// Load could occur after a source change (race condition)
|
|
6909
6868
|
if (!this.enabled) {
|
|
@@ -6954,6 +6913,12 @@ class Ads {
|
|
|
6954
6913
|
});
|
|
6955
6914
|
}
|
|
6956
6915
|
});
|
|
6916
|
+
/**
|
|
6917
|
+
* This is where all the event handling takes place. Retrieve the ad from the event. Some
|
|
6918
|
+
* events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
|
|
6919
|
+
* https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
|
|
6920
|
+
* @param {Event} event
|
|
6921
|
+
*/
|
|
6957
6922
|
_defineProperty$1(this, "onAdEvent", event => {
|
|
6958
6923
|
const {
|
|
6959
6924
|
container
|
|
@@ -7049,10 +7014,19 @@ class Ads {
|
|
|
7049
7014
|
break;
|
|
7050
7015
|
}
|
|
7051
7016
|
});
|
|
7017
|
+
/**
|
|
7018
|
+
* Any ad error handling comes through here
|
|
7019
|
+
* @param {Event} event
|
|
7020
|
+
*/
|
|
7052
7021
|
_defineProperty$1(this, "onAdError", event => {
|
|
7053
7022
|
this.cancel();
|
|
7054
7023
|
this.player.debug.warn('Ads error', event);
|
|
7055
7024
|
});
|
|
7025
|
+
/**
|
|
7026
|
+
* Setup hooks for Plyr and window events. This ensures
|
|
7027
|
+
* the mid- and post-roll launch at the correct time. And
|
|
7028
|
+
* resize the advertisement when the player resizes
|
|
7029
|
+
*/
|
|
7056
7030
|
_defineProperty$1(this, "listeners", () => {
|
|
7057
7031
|
const {
|
|
7058
7032
|
container
|
|
@@ -7088,6 +7062,9 @@ class Ads {
|
|
|
7088
7062
|
}
|
|
7089
7063
|
});
|
|
7090
7064
|
});
|
|
7065
|
+
/**
|
|
7066
|
+
* Initialize the adsManager and start playing advertisements
|
|
7067
|
+
*/
|
|
7091
7068
|
_defineProperty$1(this, "play", () => {
|
|
7092
7069
|
const {
|
|
7093
7070
|
container
|
|
@@ -7120,6 +7097,9 @@ class Ads {
|
|
|
7120
7097
|
}
|
|
7121
7098
|
}).catch(() => {});
|
|
7122
7099
|
});
|
|
7100
|
+
/**
|
|
7101
|
+
* Resume our video
|
|
7102
|
+
*/
|
|
7123
7103
|
_defineProperty$1(this, "resumeContent", () => {
|
|
7124
7104
|
// Hide the advertisement container
|
|
7125
7105
|
this.elements.container.style.zIndex = '';
|
|
@@ -7130,6 +7110,9 @@ class Ads {
|
|
|
7130
7110
|
// Play video
|
|
7131
7111
|
silencePromise(this.player.media.play());
|
|
7132
7112
|
});
|
|
7113
|
+
/**
|
|
7114
|
+
* Pause our video
|
|
7115
|
+
*/
|
|
7133
7116
|
_defineProperty$1(this, "pauseContent", () => {
|
|
7134
7117
|
// Show the advertisement container
|
|
7135
7118
|
this.elements.container.style.zIndex = 3;
|
|
@@ -7140,6 +7123,12 @@ class Ads {
|
|
|
7140
7123
|
// Pause our video.
|
|
7141
7124
|
this.player.media.pause();
|
|
7142
7125
|
});
|
|
7126
|
+
/**
|
|
7127
|
+
* Destroy the adsManager so we can grab new ads after this. If we don't then we're not
|
|
7128
|
+
* allowed to call new ads based on google policies, as they interpret this as an accidental
|
|
7129
|
+
* video requests. https://developers.google.com/interactive-
|
|
7130
|
+
* media-ads/docs/sdks/android/faq#8
|
|
7131
|
+
*/
|
|
7143
7132
|
_defineProperty$1(this, "cancel", () => {
|
|
7144
7133
|
// Pause our video
|
|
7145
7134
|
if (this.initialized) {
|
|
@@ -7152,6 +7141,9 @@ class Ads {
|
|
|
7152
7141
|
// Re-create our adsManager
|
|
7153
7142
|
this.loadAds();
|
|
7154
7143
|
});
|
|
7144
|
+
/**
|
|
7145
|
+
* Re-create our adsManager
|
|
7146
|
+
*/
|
|
7155
7147
|
_defineProperty$1(this, "loadAds", () => {
|
|
7156
7148
|
// Tell our adsManager to go bye bye
|
|
7157
7149
|
this.managerPromise.then(() => {
|
|
@@ -7172,6 +7164,11 @@ class Ads {
|
|
|
7172
7164
|
this.requestAds();
|
|
7173
7165
|
}).catch(() => {});
|
|
7174
7166
|
});
|
|
7167
|
+
/**
|
|
7168
|
+
* Handles callbacks after an ad event was invoked
|
|
7169
|
+
* @param {String} event - Event type
|
|
7170
|
+
* @param args
|
|
7171
|
+
*/
|
|
7175
7172
|
_defineProperty$1(this, "trigger", (event, ...args) => {
|
|
7176
7173
|
const handlers = this.events[event];
|
|
7177
7174
|
if (is.array(handlers)) {
|
|
@@ -7182,6 +7179,12 @@ class Ads {
|
|
|
7182
7179
|
});
|
|
7183
7180
|
}
|
|
7184
7181
|
});
|
|
7182
|
+
/**
|
|
7183
|
+
* Add event listeners
|
|
7184
|
+
* @param {String} event - Event type
|
|
7185
|
+
* @param {Function} callback - Callback for when event occurs
|
|
7186
|
+
* @return {Ads}
|
|
7187
|
+
*/
|
|
7185
7188
|
_defineProperty$1(this, "on", (event, callback) => {
|
|
7186
7189
|
if (!is.array(this.events[event])) {
|
|
7187
7190
|
this.events[event] = [];
|
|
@@ -7189,6 +7192,14 @@ class Ads {
|
|
|
7189
7192
|
this.events[event].push(callback);
|
|
7190
7193
|
return this;
|
|
7191
7194
|
});
|
|
7195
|
+
/**
|
|
7196
|
+
* Setup a safety timer for when the ad network doesn't respond for whatever reason.
|
|
7197
|
+
* The advertisement has 12 seconds to get its things together. We stop this timer when the
|
|
7198
|
+
* advertisement is playing, or when a user action is required to start, then we clear the
|
|
7199
|
+
* timer on ad ready
|
|
7200
|
+
* @param {Number} time
|
|
7201
|
+
* @param {String} from
|
|
7202
|
+
*/
|
|
7192
7203
|
_defineProperty$1(this, "startSafetyTimer", (time, from) => {
|
|
7193
7204
|
this.player.debug.log(`Safety timer invoked from: ${from}`);
|
|
7194
7205
|
this.safetyTimer = setTimeout(() => {
|
|
@@ -7196,6 +7207,10 @@ class Ads {
|
|
|
7196
7207
|
this.clearSafetyTimer('startSafetyTimer()');
|
|
7197
7208
|
}, time);
|
|
7198
7209
|
});
|
|
7210
|
+
/**
|
|
7211
|
+
* Clear our safety timer(s)
|
|
7212
|
+
* @param {String} from
|
|
7213
|
+
*/
|
|
7199
7214
|
_defineProperty$1(this, "clearSafetyTimer", from => {
|
|
7200
7215
|
if (!is.nullOrUndefined(this.safetyTimer)) {
|
|
7201
7216
|
this.player.debug.log(`Safety timer cleared from: ${from}`);
|
|
@@ -7234,11 +7249,6 @@ class Ads {
|
|
|
7234
7249
|
} = this;
|
|
7235
7250
|
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is.empty(config.publisherId) || is.url(config.tagUrl));
|
|
7236
7251
|
}
|
|
7237
|
-
|
|
7238
|
-
/**
|
|
7239
|
-
* Load the IMA SDK
|
|
7240
|
-
*/
|
|
7241
|
-
|
|
7242
7252
|
// Build the tag URL
|
|
7243
7253
|
get tagUrl() {
|
|
7244
7254
|
const {
|
|
@@ -7259,15 +7269,6 @@ class Ads {
|
|
|
7259
7269
|
const base = 'https://go.aniview.com/api/adserver6/vast/';
|
|
7260
7270
|
return `${base}?${buildUrlParams(params)}`;
|
|
7261
7271
|
}
|
|
7262
|
-
|
|
7263
|
-
/**
|
|
7264
|
-
* In order for the SDK to display ads for our video, we need to tell it where to put them,
|
|
7265
|
-
* so here we define our ad container. This div is set up to render on top of the video player.
|
|
7266
|
-
* Using the code below, we tell the SDK to render ads within that div. We also provide a
|
|
7267
|
-
* handle to the content video player - the SDK will poll the current time of our player to
|
|
7268
|
-
* properly place mid-rolls. After we create the ad display container, we initialize it. On
|
|
7269
|
-
* mobile devices, this initialization is done as the result of a user action.
|
|
7270
|
-
*/
|
|
7271
7272
|
}
|
|
7272
7273
|
|
|
7273
7274
|
/**
|
|
@@ -7366,9 +7367,13 @@ class PreviewThumbnails {
|
|
|
7366
7367
|
|
|
7367
7368
|
// Check to see if thumb container size was specified manually in CSS
|
|
7368
7369
|
this.determineContainerAutoSizing();
|
|
7370
|
+
|
|
7371
|
+
// Set up listeners
|
|
7372
|
+
this.listeners();
|
|
7369
7373
|
this.loaded = true;
|
|
7370
7374
|
});
|
|
7371
7375
|
});
|
|
7376
|
+
// Download VTT files and parse them
|
|
7372
7377
|
_defineProperty$1(this, "getThumbnails", () => {
|
|
7373
7378
|
return new Promise(resolve => {
|
|
7374
7379
|
const {
|
|
@@ -7404,6 +7409,7 @@ class PreviewThumbnails {
|
|
|
7404
7409
|
}
|
|
7405
7410
|
});
|
|
7406
7411
|
});
|
|
7412
|
+
// Process individual VTT file
|
|
7407
7413
|
_defineProperty$1(this, "getThumbnail", url => {
|
|
7408
7414
|
return new Promise(resolve => {
|
|
7409
7415
|
fetch(url).then(response => {
|
|
@@ -7510,6 +7516,9 @@ class PreviewThumbnails {
|
|
|
7510
7516
|
});
|
|
7511
7517
|
}
|
|
7512
7518
|
});
|
|
7519
|
+
/**
|
|
7520
|
+
* Setup hooks for Plyr and window events
|
|
7521
|
+
*/
|
|
7513
7522
|
_defineProperty$1(this, "listeners", () => {
|
|
7514
7523
|
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
|
|
7515
7524
|
this.player.on('play', () => {
|
|
@@ -7522,6 +7531,9 @@ class PreviewThumbnails {
|
|
|
7522
7531
|
this.lastTime = this.player.media.currentTime;
|
|
7523
7532
|
});
|
|
7524
7533
|
});
|
|
7534
|
+
/**
|
|
7535
|
+
* Create HTML elements for image containers
|
|
7536
|
+
*/
|
|
7525
7537
|
_defineProperty$1(this, "render", () => {
|
|
7526
7538
|
// Create HTML element: plyr__preview-thumbnail-container
|
|
7527
7539
|
this.elements.thumb.container = createElement('div', {
|
|
@@ -7597,6 +7609,7 @@ class PreviewThumbnails {
|
|
|
7597
7609
|
this.loadImage(qualityIndex);
|
|
7598
7610
|
}
|
|
7599
7611
|
});
|
|
7612
|
+
// Show the image that's currently specified in this.showingThumb
|
|
7600
7613
|
_defineProperty$1(this, "loadImage", (qualityIndex = 0) => {
|
|
7601
7614
|
const thumbNum = this.showingThumb;
|
|
7602
7615
|
const thumbnail = this.thumbnails[qualityIndex];
|
|
@@ -7650,6 +7663,7 @@ class PreviewThumbnails {
|
|
|
7650
7663
|
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
|
|
7651
7664
|
this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
|
|
7652
7665
|
});
|
|
7666
|
+
// Remove all preview images that aren't the designated current image
|
|
7653
7667
|
_defineProperty$1(this, "removeOldImages", currentImage => {
|
|
7654
7668
|
// Get a list of all images, convert it from a DOM list to an array
|
|
7655
7669
|
Array.from(this.currentImageContainer.children).forEach(image => {
|
|
@@ -7674,6 +7688,8 @@ class PreviewThumbnails {
|
|
|
7674
7688
|
}
|
|
7675
7689
|
});
|
|
7676
7690
|
});
|
|
7691
|
+
// Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
|
|
7692
|
+
// This will only preload the lowest quality
|
|
7677
7693
|
_defineProperty$1(this, "preloadNearby", (thumbNum, forward = true) => {
|
|
7678
7694
|
return new Promise(resolve => {
|
|
7679
7695
|
setTimeout(() => {
|
|
@@ -7719,6 +7735,7 @@ class PreviewThumbnails {
|
|
|
7719
7735
|
}, 300);
|
|
7720
7736
|
});
|
|
7721
7737
|
});
|
|
7738
|
+
// If user has been hovering current image for half a second, look for a higher quality one
|
|
7722
7739
|
_defineProperty$1(this, "getHigherQuality", (currentQualityIndex, previewImage, frame, thumbFilename) => {
|
|
7723
7740
|
if (currentQualityIndex < this.thumbnails.length - 1) {
|
|
7724
7741
|
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
|
|
@@ -7760,6 +7777,7 @@ class PreviewThumbnails {
|
|
|
7760
7777
|
this.sizeSpecifiedInCSS = true;
|
|
7761
7778
|
}
|
|
7762
7779
|
});
|
|
7780
|
+
// Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
|
|
7763
7781
|
_defineProperty$1(this, "setThumbContainerSizeAndPos", () => {
|
|
7764
7782
|
const {
|
|
7765
7783
|
imageContainer
|
|
@@ -7796,6 +7814,7 @@ class PreviewThumbnails {
|
|
|
7796
7814
|
// The arrow can follow the cursor
|
|
7797
7815
|
container.style.setProperty('--preview-arrow-offset', `${position - clamped}px`);
|
|
7798
7816
|
});
|
|
7817
|
+
// Can't use 100% width, in case the video is a different aspect ratio to the video container
|
|
7799
7818
|
_defineProperty$1(this, "setScrubbingContainerSize", () => {
|
|
7800
7819
|
const {
|
|
7801
7820
|
width,
|
|
@@ -7807,6 +7826,7 @@ class PreviewThumbnails {
|
|
|
7807
7826
|
this.elements.scrubbing.container.style.width = `${width}px`;
|
|
7808
7827
|
this.elements.scrubbing.container.style.height = `${height}px`;
|
|
7809
7828
|
});
|
|
7829
|
+
// Sprites need to be offset to the correct location
|
|
7810
7830
|
_defineProperty$1(this, "setImageSizeAndOffset", (previewImage, frame) => {
|
|
7811
7831
|
if (!this.usingSprites) return;
|
|
7812
7832
|
|
|
@@ -8031,6 +8051,9 @@ const source = {
|
|
|
8031
8051
|
// Plyr instance
|
|
8032
8052
|
class Plyr {
|
|
8033
8053
|
constructor(target, options) {
|
|
8054
|
+
/**
|
|
8055
|
+
* Play the media, or play the advertisement (if they are not blocked)
|
|
8056
|
+
*/
|
|
8034
8057
|
_defineProperty$1(this, "play", () => {
|
|
8035
8058
|
if (!is.function(this.media.play)) {
|
|
8036
8059
|
return null;
|
|
@@ -8044,12 +8067,19 @@ class Plyr {
|
|
|
8044
8067
|
// Return the promise (for HTML5)
|
|
8045
8068
|
return this.media.play();
|
|
8046
8069
|
});
|
|
8070
|
+
/**
|
|
8071
|
+
* Pause the media
|
|
8072
|
+
*/
|
|
8047
8073
|
_defineProperty$1(this, "pause", () => {
|
|
8048
8074
|
if (!this.playing || !is.function(this.media.pause)) {
|
|
8049
8075
|
return null;
|
|
8050
8076
|
}
|
|
8051
8077
|
return this.media.pause();
|
|
8052
8078
|
});
|
|
8079
|
+
/**
|
|
8080
|
+
* Toggle playback based on current status
|
|
8081
|
+
* @param {Boolean} input
|
|
8082
|
+
*/
|
|
8053
8083
|
_defineProperty$1(this, "togglePlay", input => {
|
|
8054
8084
|
// Toggle based on current state if nothing passed
|
|
8055
8085
|
const toggle = is.boolean(input) ? input : !this.playing;
|
|
@@ -8058,6 +8088,9 @@ class Plyr {
|
|
|
8058
8088
|
}
|
|
8059
8089
|
return this.pause();
|
|
8060
8090
|
});
|
|
8091
|
+
/**
|
|
8092
|
+
* Stop playback
|
|
8093
|
+
*/
|
|
8061
8094
|
_defineProperty$1(this, "stop", () => {
|
|
8062
8095
|
if (this.isHTML5) {
|
|
8063
8096
|
this.pause();
|
|
@@ -8066,28 +8099,55 @@ class Plyr {
|
|
|
8066
8099
|
this.media.stop();
|
|
8067
8100
|
}
|
|
8068
8101
|
});
|
|
8102
|
+
/**
|
|
8103
|
+
* Restart playback
|
|
8104
|
+
*/
|
|
8069
8105
|
_defineProperty$1(this, "restart", () => {
|
|
8070
8106
|
this.currentTime = 0;
|
|
8071
8107
|
});
|
|
8108
|
+
/**
|
|
8109
|
+
* Rewind
|
|
8110
|
+
* @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
|
|
8111
|
+
*/
|
|
8072
8112
|
_defineProperty$1(this, "rewind", seekTime => {
|
|
8073
8113
|
this.currentTime -= is.number(seekTime) ? seekTime : this.config.seekTime;
|
|
8074
8114
|
});
|
|
8115
|
+
/**
|
|
8116
|
+
* Fast forward
|
|
8117
|
+
* @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
|
|
8118
|
+
*/
|
|
8075
8119
|
_defineProperty$1(this, "forward", seekTime => {
|
|
8076
8120
|
this.currentTime += is.number(seekTime) ? seekTime : this.config.seekTime;
|
|
8077
8121
|
});
|
|
8122
|
+
/**
|
|
8123
|
+
* Increase volume
|
|
8124
|
+
* @param {Boolean} step - How much to decrease by (between 0 and 1)
|
|
8125
|
+
*/
|
|
8078
8126
|
_defineProperty$1(this, "increaseVolume", step => {
|
|
8079
8127
|
const volume = this.media.muted ? 0 : this.volume;
|
|
8080
8128
|
this.volume = volume + (is.number(step) ? step : 0);
|
|
8081
8129
|
});
|
|
8130
|
+
/**
|
|
8131
|
+
* Decrease volume
|
|
8132
|
+
* @param {Boolean} step - How much to decrease by (between 0 and 1)
|
|
8133
|
+
*/
|
|
8082
8134
|
_defineProperty$1(this, "decreaseVolume", step => {
|
|
8083
8135
|
this.increaseVolume(-step);
|
|
8084
8136
|
});
|
|
8137
|
+
/**
|
|
8138
|
+
* Trigger the airplay dialog
|
|
8139
|
+
* TODO: update player with state, support, enabled
|
|
8140
|
+
*/
|
|
8085
8141
|
_defineProperty$1(this, "airplay", () => {
|
|
8086
8142
|
// Show dialog if supported
|
|
8087
8143
|
if (support.airplay) {
|
|
8088
8144
|
this.media.webkitShowPlaybackTargetPicker();
|
|
8089
8145
|
}
|
|
8090
8146
|
});
|
|
8147
|
+
/**
|
|
8148
|
+
* Toggle the player controls
|
|
8149
|
+
* @param {Boolean} [toggle] - Whether to show the controls
|
|
8150
|
+
*/
|
|
8091
8151
|
_defineProperty$1(this, "toggleControls", toggle => {
|
|
8092
8152
|
// Don't toggle if missing UI support or if it's audio
|
|
8093
8153
|
if (this.supported.ui && !this.isAudio) {
|
|
@@ -8112,15 +8172,37 @@ class Plyr {
|
|
|
8112
8172
|
}
|
|
8113
8173
|
return false;
|
|
8114
8174
|
});
|
|
8175
|
+
/**
|
|
8176
|
+
* Add event listeners
|
|
8177
|
+
* @param {String} event - Event type
|
|
8178
|
+
* @param {Function} callback - Callback for when event occurs
|
|
8179
|
+
*/
|
|
8115
8180
|
_defineProperty$1(this, "on", (event, callback) => {
|
|
8116
8181
|
on.call(this, this.elements.container, event, callback);
|
|
8117
8182
|
});
|
|
8183
|
+
/**
|
|
8184
|
+
* Add event listeners once
|
|
8185
|
+
* @param {String} event - Event type
|
|
8186
|
+
* @param {Function} callback - Callback for when event occurs
|
|
8187
|
+
*/
|
|
8118
8188
|
_defineProperty$1(this, "once", (event, callback) => {
|
|
8119
8189
|
once.call(this, this.elements.container, event, callback);
|
|
8120
8190
|
});
|
|
8191
|
+
/**
|
|
8192
|
+
* Remove event listeners
|
|
8193
|
+
* @param {String} event - Event type
|
|
8194
|
+
* @param {Function} callback - Callback for when event occurs
|
|
8195
|
+
*/
|
|
8121
8196
|
_defineProperty$1(this, "off", (event, callback) => {
|
|
8122
8197
|
off(this.elements.container, event, callback);
|
|
8123
8198
|
});
|
|
8199
|
+
/**
|
|
8200
|
+
* Destroy an instance
|
|
8201
|
+
* Event listeners are removed when elements are removed
|
|
8202
|
+
* http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
|
|
8203
|
+
* @param {Function} callback - Callback for when destroy is complete
|
|
8204
|
+
* @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)
|
|
8205
|
+
*/
|
|
8124
8206
|
_defineProperty$1(this, "destroy", (callback, soft = false) => {
|
|
8125
8207
|
if (!this.ready) {
|
|
8126
8208
|
return;
|
|
@@ -8219,6 +8301,10 @@ class Plyr {
|
|
|
8219
8301
|
setTimeout(done, 200);
|
|
8220
8302
|
}
|
|
8221
8303
|
});
|
|
8304
|
+
/**
|
|
8305
|
+
* Check for support for a mime type (HTML5 only)
|
|
8306
|
+
* @param {String} type - Mime type
|
|
8307
|
+
*/
|
|
8222
8308
|
_defineProperty$1(this, "supports", type => support.mime.call(this, type));
|
|
8223
8309
|
this.timers = {};
|
|
8224
8310
|
|
|
@@ -8416,7 +8502,7 @@ class Plyr {
|
|
|
8416
8502
|
}
|
|
8417
8503
|
|
|
8418
8504
|
// Check for support again but with type
|
|
8419
|
-
this.supported = support.check(this.type, this.provider
|
|
8505
|
+
this.supported = support.check(this.type, this.provider);
|
|
8420
8506
|
|
|
8421
8507
|
// If no support for even API, bail
|
|
8422
8508
|
if (!this.supported.api) {
|
|
@@ -8436,9 +8522,7 @@ class Plyr {
|
|
|
8436
8522
|
|
|
8437
8523
|
// Wrap media
|
|
8438
8524
|
if (!is.element(this.elements.container)) {
|
|
8439
|
-
this.elements.container = createElement('div'
|
|
8440
|
-
tabindex: 0
|
|
8441
|
-
});
|
|
8525
|
+
this.elements.container = createElement('div');
|
|
8442
8526
|
wrap(this.media, this.elements.container);
|
|
8443
8527
|
}
|
|
8444
8528
|
|
|
@@ -8517,11 +8601,6 @@ class Plyr {
|
|
|
8517
8601
|
get isAudio() {
|
|
8518
8602
|
return this.type === types.audio;
|
|
8519
8603
|
}
|
|
8520
|
-
|
|
8521
|
-
/**
|
|
8522
|
-
* Play the media, or play the advertisement (if they are not blocked)
|
|
8523
|
-
*/
|
|
8524
|
-
|
|
8525
8604
|
/**
|
|
8526
8605
|
* Get playing state
|
|
8527
8606
|
*/
|
|
@@ -8549,12 +8628,6 @@ class Plyr {
|
|
|
8549
8628
|
get ended() {
|
|
8550
8629
|
return Boolean(this.media.ended);
|
|
8551
8630
|
}
|
|
8552
|
-
|
|
8553
|
-
/**
|
|
8554
|
-
* Toggle playback based on current status
|
|
8555
|
-
* @param {Boolean} input
|
|
8556
|
-
*/
|
|
8557
|
-
|
|
8558
8631
|
/**
|
|
8559
8632
|
* Seek to a time
|
|
8560
8633
|
* @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
|
|
@@ -8676,12 +8749,6 @@ class Plyr {
|
|
|
8676
8749
|
get volume() {
|
|
8677
8750
|
return Number(this.media.volume);
|
|
8678
8751
|
}
|
|
8679
|
-
|
|
8680
|
-
/**
|
|
8681
|
-
* Increase volume
|
|
8682
|
-
* @param {Boolean} step - How much to decrease by (between 0 and 1)
|
|
8683
|
-
*/
|
|
8684
|
-
|
|
8685
8752
|
/**
|
|
8686
8753
|
* Set muted state
|
|
8687
8754
|
* @param {Boolean} mute
|
|
@@ -9095,7 +9162,7 @@ class Plyr {
|
|
|
9095
9162
|
}
|
|
9096
9163
|
|
|
9097
9164
|
/**
|
|
9098
|
-
* Sets the preview
|
|
9165
|
+
* Sets the preview thumbnails for the current source
|
|
9099
9166
|
*/
|
|
9100
9167
|
setPreviewThumbnails(thumbnailSource) {
|
|
9101
9168
|
if (this.previewThumbnails && this.previewThumbnails.loaded) {
|
|
@@ -9109,20 +9176,13 @@ class Plyr {
|
|
|
9109
9176
|
this.previewThumbnails = new PreviewThumbnails(this);
|
|
9110
9177
|
}
|
|
9111
9178
|
}
|
|
9112
|
-
|
|
9113
|
-
/**
|
|
9114
|
-
* Trigger the airplay dialog
|
|
9115
|
-
* TODO: update player with state, support, enabled
|
|
9116
|
-
*/
|
|
9117
|
-
|
|
9118
9179
|
/**
|
|
9119
9180
|
* Check for support
|
|
9120
9181
|
* @param {String} type - Player type (audio/video)
|
|
9121
9182
|
* @param {String} provider - Provider (html5/youtube/vimeo)
|
|
9122
|
-
* @param {Boolean} inline - Where player has `playsinline` sttribute
|
|
9123
9183
|
*/
|
|
9124
|
-
static supported(type, provider
|
|
9125
|
-
return support.check(type, provider
|
|
9184
|
+
static supported(type, provider) {
|
|
9185
|
+
return support.check(type, provider);
|
|
9126
9186
|
}
|
|
9127
9187
|
|
|
9128
9188
|
/**
|