@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.
Files changed (209) hide show
  1. package/README.md +23 -7
  2. package/dist/.DS_Store +0 -0
  3. package/dist/css/demo.css +13 -43
  4. package/dist/css/demo.min.css +3 -3
  5. package/dist/css/demo.rtl.css +13 -43
  6. package/dist/css/demo.rtl.min.css +3 -3
  7. package/dist/css/tabler-flags.css +5 -3
  8. package/dist/css/tabler-flags.min.css +3 -3
  9. package/dist/css/tabler-flags.rtl.css +5 -3
  10. package/dist/css/tabler-flags.rtl.min.css +3 -3
  11. package/dist/css/tabler-payments.css +12 -2
  12. package/dist/css/tabler-payments.min.css +3 -3
  13. package/dist/css/tabler-payments.rtl.css +12 -2
  14. package/dist/css/tabler-payments.rtl.min.css +3 -3
  15. package/dist/css/tabler-social.css +10 -0
  16. package/dist/css/tabler-social.min.css +8 -0
  17. package/dist/css/tabler-social.rtl.css +10 -0
  18. package/dist/css/tabler-social.rtl.min.css +8 -0
  19. package/dist/css/tabler-vendors.css +114 -38
  20. package/dist/css/tabler-vendors.min.css +3 -3
  21. package/dist/css/tabler-vendors.rtl.css +114 -38
  22. package/dist/css/tabler-vendors.rtl.min.css +3 -3
  23. package/dist/css/tabler.css +3831 -2185
  24. package/dist/css/tabler.min.css +7 -3
  25. package/dist/css/tabler.rtl.css +3831 -2186
  26. package/dist/css/tabler.rtl.min.css +7 -3
  27. package/dist/img/payments/epayco-dark.svg +1 -0
  28. package/dist/img/payments/epayco.svg +1 -0
  29. package/dist/js/demo-theme.js +9 -6
  30. package/dist/js/demo-theme.min.js +3 -3
  31. package/dist/js/demo.js +16 -16
  32. package/dist/js/demo.min.js +2 -2
  33. package/dist/js/tabler.esm.js +2115 -2970
  34. package/dist/js/tabler.esm.min.js +6 -6
  35. package/dist/js/tabler.js +2115 -2970
  36. package/dist/js/tabler.min.js +6 -6
  37. package/dist/libs/apexcharts/dist/apexcharts.amd.js +1 -1
  38. package/dist/libs/apexcharts/dist/apexcharts.common.js +5 -5
  39. package/dist/libs/apexcharts/dist/apexcharts.esm.js +5 -5
  40. package/dist/libs/apexcharts/dist/apexcharts.js +3010 -2741
  41. package/dist/libs/apexcharts/dist/apexcharts.min.js +5 -5
  42. package/dist/libs/bootstrap/dist/js/bootstrap.bundle.js +228 -228
  43. package/dist/libs/bootstrap/dist/js/bootstrap.bundle.js.map +1 -1
  44. package/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js +3 -3
  45. package/dist/libs/bootstrap/dist/js/bootstrap.bundle.min.js.map +1 -1
  46. package/dist/libs/bootstrap/dist/js/bootstrap.esm.js +196 -195
  47. package/dist/libs/bootstrap/dist/js/bootstrap.esm.js.map +1 -1
  48. package/dist/libs/bootstrap/dist/js/bootstrap.esm.min.js +3 -3
  49. package/dist/libs/bootstrap/dist/js/bootstrap.esm.min.js.map +1 -1
  50. package/dist/libs/bootstrap/dist/js/bootstrap.js +197 -196
  51. package/dist/libs/bootstrap/dist/js/bootstrap.js.map +1 -1
  52. package/dist/libs/bootstrap/dist/js/bootstrap.min.js +3 -3
  53. package/dist/libs/bootstrap/dist/js/bootstrap.min.js.map +1 -1
  54. package/dist/libs/countup.js/dist/countUp.d.ts +8 -3
  55. package/dist/libs/countup.js/dist/countUp.js +26 -8
  56. package/dist/libs/countup.js/dist/countUp.min.js +1 -1
  57. package/dist/libs/countup.js/dist/countUp.umd.js +1 -293
  58. package/dist/libs/countup.js/dist/requestAnimationFrame.polyfill.js +26 -0
  59. package/dist/libs/fslightbox/README.md +39 -33
  60. package/dist/libs/fslightbox/index.js +1 -1
  61. package/dist/libs/fslightbox/package.json +10 -44
  62. package/dist/libs/jsvectormap/dist/js/jsvectormap.js +517 -857
  63. package/dist/libs/jsvectormap/dist/js/jsvectormap.min.js +1 -1
  64. package/dist/libs/nouislider/dist/nouislider.d.ts +2 -0
  65. package/dist/libs/nouislider/dist/nouislider.js +28 -0
  66. package/dist/libs/nouislider/dist/nouislider.min.js +1 -1
  67. package/dist/libs/nouislider/dist/nouislider.min.mjs +1 -1
  68. package/dist/libs/nouislider/dist/nouislider.mjs +28 -0
  69. package/dist/libs/plyr/dist/plyr.css +1 -1
  70. package/dist/libs/plyr/dist/plyr.js +289 -229
  71. package/dist/libs/plyr/dist/plyr.min.js +1 -1
  72. package/dist/libs/plyr/dist/plyr.min.js.map +1 -1
  73. package/dist/libs/plyr/dist/plyr.min.mjs +1 -1
  74. package/dist/libs/plyr/dist/plyr.min.mjs.map +1 -1
  75. package/dist/libs/plyr/dist/plyr.mjs +289 -229
  76. package/dist/libs/plyr/dist/plyr.polyfilled.js +289 -229
  77. package/dist/libs/plyr/dist/plyr.polyfilled.min.js +1 -1
  78. package/dist/libs/plyr/dist/plyr.polyfilled.min.js.map +1 -1
  79. package/dist/libs/plyr/dist/plyr.polyfilled.min.mjs +1 -1
  80. package/dist/libs/plyr/dist/plyr.polyfilled.min.mjs.map +1 -1
  81. package/dist/libs/plyr/dist/plyr.polyfilled.mjs +289 -229
  82. package/dist/libs/star-rating.js/dist/star-rating.cjs.js +481 -0
  83. package/dist/libs/star-rating.js/dist/star-rating.css +220 -0
  84. package/dist/libs/star-rating.js/dist/star-rating.esm.js +479 -0
  85. package/dist/libs/star-rating.js/dist/star-rating.esm.min.js +1 -0
  86. package/dist/libs/star-rating.js/dist/star-rating.js +491 -0
  87. package/dist/libs/star-rating.js/dist/star-rating.min.css +8 -0
  88. package/dist/libs/star-rating.js/dist/star-rating.min.js +8 -0
  89. package/dist/libs/tinymce/CHANGELOG.md +112 -0
  90. package/dist/libs/tinymce/composer.json +1 -1
  91. package/dist/libs/tinymce/icons/default/icons.js +4 -0
  92. package/dist/libs/tinymce/icons/default/icons.min.js +1 -1
  93. package/dist/libs/tinymce/models/dom/model.js +79 -23
  94. package/dist/libs/tinymce/models/dom/model.min.js +2 -2
  95. package/dist/libs/tinymce/package.json +1 -1
  96. package/dist/libs/tinymce/plugins/advlist/plugin.js +34 -28
  97. package/dist/libs/tinymce/plugins/advlist/plugin.min.js +2 -2
  98. package/dist/libs/tinymce/plugins/anchor/plugin.js +1 -1
  99. package/dist/libs/tinymce/plugins/anchor/plugin.min.js +1 -1
  100. package/dist/libs/tinymce/plugins/autolink/plugin.js +1 -1
  101. package/dist/libs/tinymce/plugins/autolink/plugin.min.js +1 -1
  102. package/dist/libs/tinymce/plugins/autoresize/plugin.js +46 -11
  103. package/dist/libs/tinymce/plugins/autoresize/plugin.min.js +2 -2
  104. package/dist/libs/tinymce/plugins/autosave/plugin.js +1 -1
  105. package/dist/libs/tinymce/plugins/autosave/plugin.min.js +1 -1
  106. package/dist/libs/tinymce/plugins/charmap/plugin.js +1 -1
  107. package/dist/libs/tinymce/plugins/charmap/plugin.min.js +1 -1
  108. package/dist/libs/tinymce/plugins/code/plugin.js +1 -1
  109. package/dist/libs/tinymce/plugins/code/plugin.min.js +1 -1
  110. package/dist/libs/tinymce/plugins/codesample/plugin.js +1 -1
  111. package/dist/libs/tinymce/plugins/codesample/plugin.min.js +1 -1
  112. package/dist/libs/tinymce/plugins/directionality/plugin.js +1 -1
  113. package/dist/libs/tinymce/plugins/directionality/plugin.min.js +1 -1
  114. package/dist/libs/tinymce/plugins/emoticons/plugin.js +1 -1
  115. package/dist/libs/tinymce/plugins/emoticons/plugin.min.js +1 -1
  116. package/dist/libs/tinymce/plugins/fullscreen/plugin.js +1 -1
  117. package/dist/libs/tinymce/plugins/fullscreen/plugin.min.js +1 -1
  118. package/dist/libs/tinymce/plugins/help/plugin.js +12 -4
  119. package/dist/libs/tinymce/plugins/help/plugin.min.js +2 -2
  120. package/dist/libs/tinymce/plugins/image/plugin.js +1 -1
  121. package/dist/libs/tinymce/plugins/image/plugin.min.js +1 -1
  122. package/dist/libs/tinymce/plugins/importcss/plugin.js +1 -1
  123. package/dist/libs/tinymce/plugins/importcss/plugin.min.js +1 -1
  124. package/dist/libs/tinymce/plugins/insertdatetime/plugin.js +1 -1
  125. package/dist/libs/tinymce/plugins/insertdatetime/plugin.min.js +1 -1
  126. package/dist/libs/tinymce/plugins/link/plugin.js +21 -7
  127. package/dist/libs/tinymce/plugins/link/plugin.min.js +2 -2
  128. package/dist/libs/tinymce/plugins/lists/plugin.js +132 -50
  129. package/dist/libs/tinymce/plugins/lists/plugin.min.js +2 -2
  130. package/dist/libs/tinymce/plugins/media/plugin.js +7 -2
  131. package/dist/libs/tinymce/plugins/media/plugin.min.js +2 -2
  132. package/dist/libs/tinymce/plugins/nonbreaking/plugin.js +1 -1
  133. package/dist/libs/tinymce/plugins/nonbreaking/plugin.min.js +1 -1
  134. package/dist/libs/tinymce/plugins/pagebreak/plugin.js +1 -1
  135. package/dist/libs/tinymce/plugins/pagebreak/plugin.min.js +1 -1
  136. package/dist/libs/tinymce/plugins/preview/plugin.js +1 -1
  137. package/dist/libs/tinymce/plugins/preview/plugin.min.js +1 -1
  138. package/dist/libs/tinymce/plugins/quickbars/plugin.js +21 -13
  139. package/dist/libs/tinymce/plugins/quickbars/plugin.min.js +2 -2
  140. package/dist/libs/tinymce/plugins/save/plugin.js +1 -1
  141. package/dist/libs/tinymce/plugins/save/plugin.min.js +1 -1
  142. package/dist/libs/tinymce/plugins/searchreplace/plugin.js +56 -43
  143. package/dist/libs/tinymce/plugins/searchreplace/plugin.min.js +2 -2
  144. package/dist/libs/tinymce/plugins/table/plugin.js +73 -55
  145. package/dist/libs/tinymce/plugins/table/plugin.min.js +2 -2
  146. package/dist/libs/tinymce/plugins/template/plugin.js +17 -14
  147. package/dist/libs/tinymce/plugins/template/plugin.min.js +2 -2
  148. package/dist/libs/tinymce/plugins/visualblocks/plugin.js +1 -1
  149. package/dist/libs/tinymce/plugins/visualblocks/plugin.min.js +1 -1
  150. package/dist/libs/tinymce/plugins/visualchars/plugin.js +58 -7
  151. package/dist/libs/tinymce/plugins/visualchars/plugin.min.js +2 -2
  152. package/dist/libs/tinymce/plugins/wordcount/plugin.js +1 -1
  153. package/dist/libs/tinymce/plugins/wordcount/plugin.min.js +1 -1
  154. package/dist/libs/tinymce/skins/ui/oxide/skin.css +454 -6
  155. package/dist/libs/tinymce/skins/ui/oxide/skin.min.css +1 -1
  156. package/dist/libs/tinymce/skins/ui/oxide-dark/skin.css +454 -6
  157. package/dist/libs/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
  158. package/dist/libs/tinymce/skins/ui/tinymce-5/skin.css +455 -6
  159. package/dist/libs/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
  160. package/dist/libs/tinymce/skins/ui/tinymce-5-dark/skin.css +454 -5
  161. package/dist/libs/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  162. package/dist/libs/tinymce/themes/silver/theme.js +4374 -3074
  163. package/dist/libs/tinymce/themes/silver/theme.min.js +2 -2
  164. package/dist/libs/tinymce/tinymce.d.ts +305 -236
  165. package/dist/libs/tinymce/tinymce.js +1957 -1597
  166. package/dist/libs/tinymce/tinymce.min.js +2 -2
  167. package/package.json +63 -42
  168. package/src/js/demo-theme.js +13 -10
  169. package/src/js/demo.js +18 -15
  170. package/src/js/tabler.esm.js +7 -8
  171. package/src/js/tabler.js +12 -12
  172. package/src/scss/_bootstrap-components.scss +33 -33
  173. package/src/scss/_bootstrap-config.scss +6 -6
  174. package/src/scss/_bootstrap-override.scss +8 -12
  175. package/src/scss/_config.scss +2 -1
  176. package/src/scss/_core.scss +1 -1
  177. package/src/scss/_debug.scss +41 -30
  178. package/src/scss/_utilities.scss +21 -19
  179. package/src/scss/_variables-dark.scss +17 -0
  180. package/src/scss/_variables.scss +233 -169
  181. package/src/scss/demo/_examples.scss +0 -16
  182. package/src/scss/demo.scss +36 -25
  183. package/src/scss/layout/_core.scss +0 -1
  184. package/src/scss/layout/_dark.scss +47 -162
  185. package/src/scss/layout/_navbar.scss +19 -99
  186. package/src/scss/layout/_page.scss +9 -6
  187. package/src/scss/layout/_root.scss +21 -7
  188. package/src/scss/mixins/_functions.scss +2 -6
  189. package/src/scss/mixins/_mixins.scss +0 -32
  190. package/src/scss/tabler-social.scss +1 -0
  191. package/src/scss/tabler-vendors.scss +1 -0
  192. package/src/scss/tabler.scss +0 -1
  193. package/src/scss/ui/_avatars.scss +1 -1
  194. package/src/scss/ui/_buttons.scss +1 -1
  195. package/src/scss/ui/_dropdowns.scss +1 -3
  196. package/src/scss/ui/_grid.scss +2 -18
  197. package/src/scss/ui/_payments.scss +1 -1
  198. package/src/scss/ui/_status.scss +0 -10
  199. package/src/scss/ui/_tables.scss +12 -26
  200. package/src/scss/ui/_timeline.scss +3 -3
  201. package/src/scss/utils/_colors.scss +6 -2
  202. package/src/scss/vendor/_apexcharts.scss +16 -0
  203. package/src/scss/vendor/_jsvectormap.scss +1 -1
  204. package/src/scss/vendor/_nouislider.scss +1 -1
  205. package/src/scss/vendor/_stars-rating.scss +20 -0
  206. package/src/scss/vendor/_tinymce.scss +5 -7
  207. package/src/scss/vendor/_tom-select.scss +43 -2
  208. package/dist/libs/countup.js/dist/countUp.withPolyfill.min.js +0 -1
  209. 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 browser = {
792
- isIE: Boolean(window.document.documentMode),
793
- isEdge: /Edge/g.test(navigator.userAgent),
794
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent),
795
- isIPhone: /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1,
796
- isIos: /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1
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
- // Inaert an element after another
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, tabFocus = false) {
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, playsinline) {
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 && (type !== 'video' || !browser.isIPhone || canPlayInline);
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, (match, i) => args[i].toString());
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 (!['Space', 'ArrowUp', 'ArrowDown', 'ArrowRight'].includes(event.key)) {
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 && ['Space', 'ArrowRight'].includes(event.key)) {
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 !== 'Space') {
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 !== 'Space') {
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.isWebkit) {
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, tabFocus = false) {
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, tabFocus);
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 = '', tabFocus = false) {
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, tabFocus);
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 (this effects YouTube/Vimeo - HTML5 requires the attribute present)
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.3/plyr.svg',
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.enabled) {
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 || 0,
4318
- y: window.scrollY || 0
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.enabled) {
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.enabled);
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.enabled) {
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.native || this.forceFallback) {
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.enabled) {
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.target.webkitExitFullscreen();
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.native || this.forceFallback) {
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 native() {
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 usingNative() {
4494
- return Fullscreen.native && !this.forceFallback;
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 enabled
4521
- get enabled() {
4522
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
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.enabled) {
4528
- return false;
4529
- }
4521
+ if (!this.supported) return false;
4530
4522
 
4531
4523
  // Fallback using classname
4532
- if (!Fullscreen.native || this.forceFallback) {
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 || this.player.elements.container;
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
- _defineProperty$1(this, "setTabFocus", event => {
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 (!['Space', 'Enter'].includes(event.key)) {
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.isWebkit) {
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 === 'Space' && matches(focused, 'button, [role^="menuitem"]')) {
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 = ['Space', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];
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 'Space':
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: !this.config.fullscreen.iosNative,
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.setVolume(toggle ? 0 : player.config.volume).then(() => {
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) // Higest quality and unpadded
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 occured';
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, this.config.playsinline);
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 thubmnails for the current source
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, inline) {
9125
- return support.check(type, provider, inline);
9184
+ static supported(type, provider) {
9185
+ return support.check(type, provider);
9126
9186
  }
9127
9187
 
9128
9188
  /**