pageflow 17.1.0 → 17.2.0

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 (302) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +319 -345
  3. data/README.md +3 -4
  4. data/admins/pageflow/accounts.rb +6 -6
  5. data/admins/pageflow/entry.rb +10 -8
  6. data/admins/pageflow/membership.rb +11 -11
  7. data/admins/pageflow/translations.rb +5 -5
  8. data/app/assets/images/pageflow/admin/icons/comment.svg +1 -0
  9. data/app/assets/javascripts/pageflow/dist/ui.js +1350 -630
  10. data/app/assets/javascripts/pageflow/editor/vendor.js +0 -1
  11. data/app/assets/javascripts/pageflow/ui.js +0 -1
  12. data/app/assets/stylesheets/pageflow/admin/entry_comments_indicator.scss +45 -0
  13. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +8 -1
  14. data/app/assets/stylesheets/pageflow/admin.scss +1 -0
  15. data/app/assets/stylesheets/pageflow/animations/spin.scss +9 -0
  16. data/app/assets/stylesheets/pageflow/animations.scss +1 -0
  17. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +21 -5
  18. data/app/assets/stylesheets/pageflow/editor/base.scss +9 -1
  19. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +13 -1
  20. data/app/assets/stylesheets/pageflow/editor/edit_configuration_view.scss +5 -0
  21. data/app/assets/stylesheets/pageflow/editor/file_folders.scss +127 -0
  22. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +0 -1
  23. data/app/assets/stylesheets/pageflow/editor/file_meta_data_overlay.scss +45 -0
  24. data/app/assets/stylesheets/pageflow/editor/file_preview.scss +138 -0
  25. data/app/assets/stylesheets/pageflow/editor/file_references.scss +68 -0
  26. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +1 -1
  27. data/app/assets/stylesheets/pageflow/editor/file_stage_icons.scss +17 -0
  28. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +25 -32
  29. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +31 -48
  30. data/app/assets/stylesheets/pageflow/editor/file_type_pills.scss +73 -0
  31. data/app/assets/stylesheets/pageflow/editor/files.scss +230 -50
  32. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +142 -14
  33. data/app/assets/stylesheets/pageflow/editor/folder_breadcrumb.scss +40 -0
  34. data/app/assets/stylesheets/pageflow/editor/info_box.scss +12 -0
  35. data/app/assets/stylesheets/pageflow/editor/inputs/edit_defaults_button.scss +15 -0
  36. data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
  37. data/app/assets/stylesheets/pageflow/editor/list.scss +88 -38
  38. data/app/assets/stylesheets/pageflow/editor/manage_files.scss +9 -0
  39. data/app/assets/stylesheets/pageflow/editor/menu.scss +14 -0
  40. data/app/assets/stylesheets/pageflow/editor/move_to_folder_dialog.scss +83 -0
  41. data/app/assets/stylesheets/pageflow/mixins/pageflow.scss +9 -5
  42. data/app/assets/stylesheets/pageflow/ui/color_picker.scss +230 -0
  43. data/app/assets/stylesheets/pageflow/ui/forms.scss +34 -4
  44. data/app/assets/stylesheets/pageflow/ui/functions.scss +12 -2
  45. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +9 -16
  46. data/app/assets/stylesheets/pageflow/ui/input/text_area_input.scss +15 -0
  47. data/app/assets/stylesheets/pageflow/ui/overrides.scss +8 -0
  48. data/app/assets/stylesheets/pageflow/ui/properties.scss +29 -0
  49. data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -3
  50. data/app/assets/stylesheets/pageflow/ui.scss +4 -2
  51. data/app/controllers/pageflow/editor/entries_controller.rb +1 -0
  52. data/app/controllers/pageflow/editor/file_folders_controller.rb +80 -0
  53. data/app/controllers/pageflow/editor/file_import_controller.rb +1 -0
  54. data/app/controllers/pageflow/editor/files_controller.rb +15 -6
  55. data/app/controllers/pageflow/editor/oembeds_controller.rb +21 -0
  56. data/app/controllers/pageflow/entries_controller.rb +17 -13
  57. data/app/controllers/pageflow/review/comment_thread_reads_controller.rb +30 -0
  58. data/app/controllers/pageflow/review/comment_threads_controller.rb +60 -0
  59. data/app/controllers/pageflow/review/comments_controller.rb +53 -0
  60. data/app/controllers/pageflow/revisions_controller.rb +4 -1
  61. data/app/helpers/pageflow/admin/entries_helper.rb +40 -0
  62. data/app/helpers/pageflow/admin/widgets_helper.rb +2 -2
  63. data/app/helpers/pageflow/common_entry_seed_helper.rb +5 -3
  64. data/app/helpers/pageflow/editor/config_helper.rb +3 -1
  65. data/app/helpers/pageflow/entries_helper.rb +24 -42
  66. data/app/helpers/pageflow/entry_json_seed_helper.rb +4 -4
  67. data/app/helpers/pageflow/public_i18n_helper.rb +9 -8
  68. data/app/helpers/pageflow/structured_data_helper.rb +4 -1
  69. data/app/helpers/pageflow/themes_helper.rb +1 -3
  70. data/app/helpers/pageflow/widgets_helper.rb +2 -1
  71. data/app/inputs/pageflow_permalink_input.rb +6 -2
  72. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +11 -4
  73. data/app/models/concerns/pageflow/reusable_file.rb +1 -1
  74. data/app/models/concerns/pageflow/serialization_blacklist.rb +2 -4
  75. data/app/models/concerns/pageflow/translated_attributes.rb +101 -0
  76. data/app/models/concerns/pageflow/uploadable_file.rb +1 -1
  77. data/app/models/pageflow/comment.rb +30 -0
  78. data/app/models/pageflow/comment_thread.rb +65 -0
  79. data/app/models/pageflow/comment_thread_read.rb +22 -0
  80. data/app/models/pageflow/customized_theme.rb +3 -2
  81. data/app/models/pageflow/draft_entry.rb +20 -8
  82. data/app/models/pageflow/entry.rb +2 -0
  83. data/app/models/pageflow/entry_at_revision.rb +9 -1
  84. data/app/models/pageflow/entry_comment_summary.rb +114 -0
  85. data/app/models/pageflow/file_folder.rb +74 -0
  86. data/app/models/pageflow/file_reuse.rb +3 -2
  87. data/app/models/pageflow/file_usage.rb +8 -0
  88. data/app/models/pageflow/image_file.rb +24 -20
  89. data/app/models/pageflow/image_file_url_templates.rb +3 -3
  90. data/app/models/pageflow/legal_info.rb +38 -0
  91. data/app/models/pageflow/nested_revision_component_copy.rb +1 -1
  92. data/app/models/pageflow/permalink.rb +1 -0
  93. data/app/models/pageflow/revision.rb +6 -2
  94. data/app/models/pageflow/site.rb +10 -0
  95. data/app/models/pageflow/used_file.rb +8 -2
  96. data/app/models/pageflow/widget.rb +2 -2
  97. data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +0 -1
  98. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +4 -2
  99. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  100. data/app/views/pageflow/editor/entries/seed.json.erb +1 -0
  101. data/app/views/pageflow/editor/file_folders/_file_folder.json.jbuilder +5 -0
  102. data/app/views/pageflow/editor/file_folders/create.json.jbuilder +1 -0
  103. data/app/views/pageflow/editor/file_folders/index.json.jbuilder +3 -0
  104. data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -1
  105. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +3 -0
  106. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +3 -0
  107. data/app/views/pageflow/files/_file.json.jbuilder +2 -0
  108. data/app/views/pageflow/image_files/_image_file.json.jbuilder +0 -1
  109. data/app/views/pageflow/review/comment_threads/_comment_thread.json.jbuilder +20 -0
  110. data/app/views/pageflow/review/comment_threads/create.json.jbuilder +2 -0
  111. data/app/views/pageflow/review/comment_threads/index.json.jbuilder +13 -0
  112. data/app/views/pageflow/review/comments/_comment.json.jbuilder +13 -0
  113. data/app/views/pageflow/review/comments/create.json.jbuilder +1 -0
  114. data/app/views/pageflow/structured_data/_entry.json.jbuilder +2 -3
  115. data/app/views/pageflow/video_files/_video_file.json.jbuilder +0 -1
  116. data/config/locales/de.yml +152 -14
  117. data/config/locales/en.yml +150 -14
  118. data/config/routes.rb +14 -0
  119. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  120. data/db/migrate/20251015000000_add_structured_data_type_name_to_revisions.rb +5 -0
  121. data/db/migrate/20251029142849_convert_legacy_social_embeds_to_unified_social_embed.rb +38 -0
  122. data/db/migrate/20251119083347_fix_main_storyline_positions.rb +16 -0
  123. data/db/migrate/20251119083348_ensure_scrolled_entries_have_excursion_storyline.rb +15 -0
  124. data/db/migrate/20260303000000_add_layout_version_to_revisions.rb +6 -0
  125. data/db/migrate/20260323000000_create_comment_threads_and_comments.rb +30 -0
  126. data/db/migrate/20260414000000_add_subject_range_to_comment_threads.rb +5 -0
  127. data/db/migrate/20260415000000_add_section_perma_id_to_comment_threads.rb +5 -0
  128. data/db/migrate/20260727000000_add_quote_to_comments.rb +5 -0
  129. data/db/migrate/20260728000000_create_file_folders.rb +17 -0
  130. data/db/migrate/20260805000000_add_attribute_translations_to_sites.rb +5 -0
  131. data/db/migrate/20260806000000_add_edited_at_to_comments.rb +5 -0
  132. data/db/migrate/20260810000000_create_pageflow_scrolled_lottie_files.rb +24 -0
  133. data/db/migrate/20260817000000_create_comment_thread_reads.rb +16 -0
  134. data/db/migrate/20260819000000_add_unread_comments_since_at_to_users.rb +18 -0
  135. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +8665 -3890
  136. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +979 -3571
  137. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +20199 -28120
  138. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +18652 -26584
  139. data/entry_types/scrolled/app/assets/stylesheets/pageflow_scrolled/ui.scss +2 -0
  140. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +33 -3
  141. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -3
  142. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +21 -1
  143. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +3 -3
  144. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +7 -5
  145. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +5 -2
  146. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +13 -5
  147. data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +28 -13
  148. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +26 -11
  149. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +2 -2
  150. data/entry_types/scrolled/app/helpers/pageflow_scrolled/sprockets_helper.rb +16 -0
  151. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +174 -3
  152. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +49 -7
  153. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file.rb +6 -0
  154. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file_url_templates.rb +16 -0
  155. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +1 -0
  156. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +13 -12
  157. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +30 -10
  158. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +9 -0
  159. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +1 -1
  160. data/entry_types/scrolled/config/configuration_schemas/pageflow-scrolled.json +414 -0
  161. data/entry_types/scrolled/config/locales/de.yml +512 -65
  162. data/entry_types/scrolled/config/locales/en.yml +518 -52
  163. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +2 -2
  164. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +51 -6
  165. data/entry_types/scrolled/lib/pageflow_scrolled/configuration_schemas.rb +91 -0
  166. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +2 -1
  167. data/entry_types/scrolled/lib/pageflow_scrolled/entry_file_reference_locations.rb +71 -0
  168. data/entry_types/scrolled/lib/pageflow_scrolled/entry_structured_data_types/faq_page.rb +58 -0
  169. data/entry_types/scrolled/lib/pageflow_scrolled/file_reference_locations.rb +69 -0
  170. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +205 -22
  171. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +2 -4
  172. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +56 -36
  173. data/entry_types/scrolled/lib/pageflow_scrolled/theme_options_default_scale.rb +35 -0
  174. data/entry_types/scrolled/lib/pageflow_scrolled.rb +13 -0
  175. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +19 -1
  176. data/entry_types/scrolled/package/config/configurationSchemas.js +70 -0
  177. data/entry_types/scrolled/package/config/rollup/configurationSchemas.js +19 -0
  178. data/entry_types/scrolled/package/config/webpack.js +72 -0
  179. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -1
  180. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1181 -915
  181. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.css +1 -0
  182. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.js +219 -0
  183. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.css +1 -0
  184. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.js +244 -0
  185. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.css +1 -0
  186. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.js +823 -0
  187. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +71 -21
  188. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.css +1 -0
  189. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.js +277 -0
  190. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.css +1 -0
  191. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.js +244 -0
  192. data/entry_types/scrolled/package/contentElements-editor.js +1915 -1097
  193. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  194. data/entry_types/scrolled/package/contentElements-frontend.js +3093 -1679
  195. data/entry_types/scrolled/package/editor.css +1 -0
  196. data/entry_types/scrolled/package/editor.js +8667 -4077
  197. data/entry_types/scrolled/package/entryState.js +1600 -0
  198. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-20c600de.js +1979 -0
  199. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-58189220.js +2538 -0
  200. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-9f76033e.js → PhonePlatformContext-035a99fa.js} +7 -12
  201. data/entry_types/scrolled/package/frontend/PhonePlatformContext-9da43797.js +33 -0
  202. data/entry_types/scrolled/package/frontend/Placeholder.module-bf0966b4.js +5267 -0
  203. data/entry_types/scrolled/package/frontend/Placeholder.module-d22a9335.js +4180 -0
  204. data/entry_types/scrolled/package/frontend/ThemeIcon-ab834849.js +754 -0
  205. data/entry_types/scrolled/package/frontend/ThemeIcon-f6cb3a8f.js +773 -0
  206. data/entry_types/scrolled/package/frontend/{ToggleFullscreenCornerButton-788e9cdb.js → ToggleFullscreenCornerButton-30fd1124.js} +6 -6
  207. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-61c25224.js +72 -0
  208. data/entry_types/scrolled/package/frontend/Viewer-1074fd59.js +147 -0
  209. data/entry_types/scrolled/package/frontend/Viewer-1482ca34.js +480 -0
  210. data/entry_types/scrolled/package/frontend/Viewer-70504231.js +210 -0
  211. data/entry_types/scrolled/package/frontend/{Viewer-0345ce57.js → Viewer-cc8d4072.js} +84 -92
  212. data/entry_types/scrolled/package/frontend/Wavesurfer-656e3c36.js +302 -0
  213. data/entry_types/scrolled/package/frontend/Wavesurfer-b753b838.js +385 -0
  214. data/entry_types/scrolled/package/frontend/commenting.css +1 -0
  215. data/entry_types/scrolled/package/frontend/extensions-167ae143.js +1455 -0
  216. data/entry_types/scrolled/package/frontend/extensions-2318f92b.js +5918 -0
  217. data/entry_types/scrolled/package/frontend/extensions-a461fd13.js +4890 -0
  218. data/entry_types/scrolled/package/frontend/extensions-c98269fd.js +1982 -0
  219. data/entry_types/scrolled/package/frontend/i18n-493cd2a6.js +93 -0
  220. data/entry_types/scrolled/package/frontend/i18n-e06cac14.js +100 -0
  221. data/entry_types/scrolled/package/frontend/{index-eb670c2f.js → index-2e5546f7.js} +36 -44
  222. data/entry_types/scrolled/package/frontend/index-de2b418d.js +130 -0
  223. data/entry_types/scrolled/package/frontend/index.css +1 -1
  224. data/entry_types/scrolled/package/frontend/index.js +1870 -875
  225. data/entry_types/scrolled/package/frontend/inlineEditing.css +1 -0
  226. data/entry_types/scrolled/package/frontend/useContentElementEditorState-a084912e.js +25 -0
  227. data/entry_types/scrolled/package/frontend/useDelayedBoolean-a387d85b.js +24 -0
  228. data/entry_types/scrolled/package/frontend/{usePhonePlatform-c2ba875d.js → usePhonePlatform-4ecb96d4.js} +1 -1
  229. data/entry_types/scrolled/package/frontend/usePhonePlatform-ce9ff08d.js +8 -0
  230. data/entry_types/scrolled/package/frontend-server.js +20 -209
  231. data/entry_types/scrolled/package/package.json +5 -3
  232. data/entry_types/scrolled/package/review.css +1 -0
  233. data/entry_types/scrolled/package/review.js +3306 -0
  234. data/entry_types/scrolled/package/testHelpers.js +836 -359
  235. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  236. data/entry_types/scrolled/package/widgets/consentBar.js +269 -290
  237. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  238. data/entry_types/scrolled/package/widgets/defaultNavigation.js +911 -352
  239. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -1
  240. data/entry_types/scrolled/package/widgets/excursionSheet.js +87 -124
  241. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  242. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +62 -29
  243. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +32 -13
  244. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -1
  245. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +56 -100
  246. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  247. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +33 -28
  248. data/entry_types/scrolled/package/widgets-server.js +1 -0
  249. data/entry_types/scrolled/spec/factories/lottie_files.rb +29 -0
  250. data/entry_types/scrolled/spec/fixtures/animation.lottie +0 -0
  251. data/entry_types/scrolled/spec/fixtures/font.woff +0 -0
  252. data/entry_types/scrolled/spec/fixtures/font.woff2 +0 -0
  253. data/lib/generators/pageflow/resque/resque_generator.rb +0 -2
  254. data/lib/pageflow/configuration.rb +49 -7
  255. data/lib/pageflow/deprecation.rb +19 -0
  256. data/lib/pageflow/engine.rb +1 -1
  257. data/lib/pageflow/entries_controller_env_helper.rb +32 -2
  258. data/lib/pageflow/entry_export_import/entry_serialization.rb +4 -4
  259. data/lib/pageflow/entry_export_import/page_type_versions.rb +2 -2
  260. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +10 -0
  261. data/lib/pageflow/entry_export_import/revision_serialization.rb +3 -0
  262. data/lib/pageflow/entry_structured_data_types.rb +43 -0
  263. data/lib/pageflow/entry_type_configuration.rb +1 -0
  264. data/lib/pageflow/file_type.rb +2 -2
  265. data/lib/pageflow/file_types.rb +1 -1
  266. data/lib/pageflow/oembed_providers.rb +42 -0
  267. data/lib/pageflow/primary_domain_entry_redirect.rb +6 -0
  268. data/lib/pageflow/rails_version.rb +13 -2
  269. data/lib/pageflow/themes.rb +41 -0
  270. data/lib/pageflow/user_mixin.rb +12 -0
  271. data/lib/pageflow/version.rb +1 -1
  272. data/lib/pageflow.rb +1 -0
  273. data/package/config/eslint-rules/documented-in-toc.js +125 -0
  274. data/package/config/jest/index.js +0 -1
  275. data/package/config/webpack.js +0 -1
  276. data/package/config/webpack5.js +0 -1
  277. data/package/editor.js +4378 -1897
  278. data/package/frontend.js +647 -886
  279. data/package/package.json +2 -1
  280. data/package/review.js +384 -0
  281. data/package/testHelpers.js +248 -188
  282. data/package/ui.js +1346 -630
  283. data/package/vendor/stubs/wysihtml5.js +2 -0
  284. data/spec/factories/comment_thread_reads.rb +10 -0
  285. data/spec/factories/comment_threads.rb +10 -0
  286. data/spec/factories/comments.rb +9 -0
  287. data/spec/factories/file_folders.rb +8 -0
  288. data/spec/factories/published_entries.rb +2 -0
  289. metadata +188 -67
  290. data/app/assets/stylesheets/pageflow/editor/select_button.scss +0 -51
  291. data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +0 -55
  292. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-51914be7.js +0 -5439
  293. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +0 -1932
  294. data/entry_types/scrolled/package/frontend/Viewer-cdc549cc.js +0 -147
  295. data/entry_types/scrolled/package/frontend/Wavesurfer-1cdc3925.js +0 -313
  296. data/entry_types/scrolled/package/frontend/components-96660ffd.js +0 -3803
  297. data/entry_types/scrolled/package/frontend/inherits-539844a6.js +0 -99
  298. data/entry_types/scrolled/package/frontend/useContentElementEditorState-77fe6c79.js +0 -51
  299. data/entry_types/scrolled/package/widgets/excursionDialog.css +0 -1
  300. data/entry_types/scrolled/package/widgets/excursionDialog.js +0 -109
  301. data/lib/generators/pageflow/resque/templates/resque_enqueue_after_commit_patch.rb +0 -25
  302. data/package/vendor/jquery.minicolors.js +0 -1108
data/package/frontend.js CHANGED
@@ -1,240 +1,84 @@
1
- import 'core-js/modules/es.array.from';
2
- import 'core-js/modules/es.array.includes';
3
- import 'core-js/modules/es.array.iterator';
4
- import 'core-js/modules/es.object.assign';
5
- import 'core-js/modules/es.object.entries';
6
- import 'core-js/modules/es.object.keys';
7
- import 'core-js/modules/es.object.to-string';
8
- import 'core-js/modules/es.promise';
9
- import 'core-js/modules/es.promise.finally';
10
- import 'core-js/modules/es.string.iterator';
11
- import 'core-js/modules/esnext.aggregate-error';
12
- import 'core-js/modules/esnext.promise.all-settled';
13
- import 'core-js/modules/esnext.promise.any';
14
- import 'core-js/modules/esnext.promise.try';
15
- import 'core-js/modules/web.dom-collections.iterator';
16
- import 'classlist.js';
17
1
  import BackboneEvents from 'backbone-events-standalone';
18
2
  import VideoJS from 'video.js';
19
3
 
20
- function _defineProperty(obj, key, value) {
21
- if (key in obj) {
22
- Object.defineProperty(obj, key, {
23
- value: value,
24
- enumerable: true,
25
- configurable: true,
26
- writable: true
27
- });
28
- } else {
29
- obj[key] = value;
4
+ class Persistence {
5
+ constructor({
6
+ cookies
7
+ }) {
8
+ this.cookies = cookies;
30
9
  }
31
-
32
- return obj;
33
- }
34
-
35
- function ownKeys(object, enumerableOnly) {
36
- var keys = Object.keys(object);
37
-
38
- if (Object.getOwnPropertySymbols) {
39
- var symbols = Object.getOwnPropertySymbols(object);
40
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
41
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
10
+ store(vendors, signal) {
11
+ const vendorsByCookieName = vendors.reduce((sorted, vendor) => {
12
+ const cookieName = vendor.cookieName;
13
+ sorted[cookieName] = sorted[cookieName] || [];
14
+ sorted[cookieName].push(vendor);
15
+ return sorted;
16
+ }, {});
17
+ Object.entries(vendorsByCookieName).forEach(([cookieName, vendors]) => {
18
+ const cookieDomain = vendors[0].cookieDomain;
19
+ this.setCookie(cookieName, JSON.stringify(vendors.reduce((result, vendor) => {
20
+ result[vendor.cookieKey || vendor.name] = signal === 'accepted' ? true : signal === 'denied' ? false : signal[vendor.name];
21
+ return result;
22
+ }, {})), cookieDomain);
42
23
  });
43
- keys.push.apply(keys, symbols);
44
24
  }
45
-
46
- return keys;
47
- }
48
-
49
- function _objectSpread2(target) {
50
- for (var i = 1; i < arguments.length; i++) {
51
- var source = arguments[i] != null ? arguments[i] : {};
52
-
53
- if (i % 2) {
54
- ownKeys(Object(source), true).forEach(function (key) {
55
- _defineProperty(target, key, source[key]);
56
- });
57
- } else if (Object.getOwnPropertyDescriptors) {
58
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
59
- } else {
60
- ownKeys(Object(source)).forEach(function (key) {
61
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
62
- });
63
- }
64
- }
65
-
66
- return target;
67
- }
68
-
69
- function _classCallCheck(instance, Constructor) {
70
- if (!(instance instanceof Constructor)) {
71
- throw new TypeError("Cannot call a class as a function");
72
- }
73
- }
74
-
75
- function _defineProperties(target, props) {
76
- for (var i = 0; i < props.length; i++) {
77
- var descriptor = props[i];
78
- descriptor.enumerable = descriptor.enumerable || false;
79
- descriptor.configurable = true;
80
- if ("value" in descriptor) descriptor.writable = true;
81
- Object.defineProperty(target, descriptor.key, descriptor);
82
- }
83
- }
84
-
85
- function _createClass(Constructor, protoProps, staticProps) {
86
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
87
- if (staticProps) _defineProperties(Constructor, staticProps);
88
- return Constructor;
89
- }
90
-
91
- function _arrayWithHoles(arr) {
92
- if (Array.isArray(arr)) return arr;
93
- }
94
-
95
- function _iterableToArrayLimit(arr, i) {
96
- if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
97
- var _arr = [];
98
- var _n = true;
99
- var _d = false;
100
- var _e = undefined;
101
-
102
- try {
103
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
104
- _arr.push(_s.value);
105
-
106
- if (i && _arr.length === i) break;
107
- }
108
- } catch (err) {
109
- _d = true;
110
- _e = err;
111
- } finally {
112
- try {
113
- if (!_n && _i["return"] != null) _i["return"]();
114
- } finally {
115
- if (_d) throw _e;
116
- }
117
- }
118
-
119
- return _arr;
120
- }
121
-
122
- function _arrayLikeToArray(arr, len) {
123
- if (len == null || len > arr.length) len = arr.length;
124
-
125
- for (var i = 0, arr2 = new Array(len); i < len; i++) {
126
- arr2[i] = arr[i];
25
+ update(vendor, signal) {
26
+ const content = this.cookies.getItem(vendor.cookieName);
27
+ const flags = content ? JSON.parse(content) : {};
28
+ this.setCookie(vendor.cookieName, JSON.stringify({
29
+ ...flags,
30
+ [vendor.cookieKey || vendor.name]: signal
31
+ }), vendor.cookieDomain);
32
+ }
33
+ read(vendor) {
34
+ const content = this.cookies.getItem(vendor.cookieName);
35
+ const flags = content ? JSON.parse(content) : {};
36
+ const flag = flags[vendor.cookieKey || vendor.name];
37
+ return flag === true ? 'accepted' : flag === false ? 'denied' : 'undecided';
38
+ }
39
+ setCookie(name, value, domain) {
40
+ if (domain && !window.location.hostname.match(new RegExp(`${domain}$`))) {
41
+ domain = null;
42
+ }
43
+ this.cookies.setItem(name, value, {
44
+ path: '/',
45
+ domain,
46
+ expires: Infinity,
47
+ // Ensure cookie can be read iframe embed
48
+ sameSite: 'None',
49
+ secure: true
50
+ });
127
51
  }
128
-
129
- return arr2;
130
52
  }
131
53
 
132
- function _unsupportedIterableToArray(o, minLen) {
133
- if (!o) return;
134
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
135
- var n = Object.prototype.toString.call(o).slice(8, -1);
136
- if (n === "Object" && o.constructor) n = o.constructor.name;
137
- if (n === "Map" || n === "Set") return Array.from(n);
138
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
139
- }
140
-
141
- function _nonIterableRest() {
142
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
143
- }
144
-
145
- function _slicedToArray(arr, i) {
146
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
147
- }
148
-
149
- var Persistence = /*#__PURE__*/function () {
150
- function Persistence(_ref) {
151
- var cookies = _ref.cookies;
152
- _classCallCheck(this, Persistence);
153
- this.cookies = cookies;
154
- }
155
- _createClass(Persistence, [{
156
- key: "store",
157
- value: function store(vendors, signal) {
158
- var _this = this;
159
- var vendorsByCookieName = vendors.reduce(function (sorted, vendor) {
160
- var cookieName = vendor.cookieName;
161
- sorted[cookieName] = sorted[cookieName] || [];
162
- sorted[cookieName].push(vendor);
163
- return sorted;
164
- }, {});
165
- Object.entries(vendorsByCookieName).forEach(function (_ref2) {
166
- var _ref3 = _slicedToArray(_ref2, 2),
167
- cookieName = _ref3[0],
168
- vendors = _ref3[1];
169
- var cookieDomain = vendors[0].cookieDomain;
170
- _this.setCookie(cookieName, JSON.stringify(vendors.reduce(function (result, vendor) {
171
- result[vendor.cookieKey || vendor.name] = signal === 'accepted' ? true : signal === 'denied' ? false : signal[vendor.name];
172
- return result;
173
- }, {})), cookieDomain);
174
- });
175
- }
176
- }, {
177
- key: "update",
178
- value: function update(vendor, signal) {
179
- var content = this.cookies.getItem(vendor.cookieName);
180
- var flags = content ? JSON.parse(content) : {};
181
- this.setCookie(vendor.cookieName, JSON.stringify(_objectSpread2(_objectSpread2({}, flags), {}, _defineProperty({}, vendor.cookieKey || vendor.name, signal))), vendor.cookieDomain);
182
- }
183
- }, {
184
- key: "read",
185
- value: function read(vendor) {
186
- var content = this.cookies.getItem(vendor.cookieName);
187
- var flags = content ? JSON.parse(content) : {};
188
- var flag = flags[vendor.cookieKey || vendor.name];
189
- return flag === true ? 'accepted' : flag === false ? 'denied' : 'undecided';
190
- }
191
- }, {
192
- key: "setCookie",
193
- value: function setCookie(name, value, domain) {
194
- if (domain && !window.location.hostname.match(new RegExp("".concat(domain, "$")))) {
195
- domain = null;
196
- }
197
- this.cookies.setItem(name, value, {
198
- path: '/',
199
- domain: domain,
200
- expires: Infinity,
201
- // Ensure cookie can be read iframe embed
202
- sameSite: 'None',
203
- secure: true
204
- });
205
- }
206
- }]);
207
- return Persistence;
208
- }();
209
-
210
54
  // https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
211
- var cookies = {
212
- getItem: function getItem(sKey) {
55
+ const cookies = {
56
+ getItem: function (sKey) {
213
57
  if (!sKey) {
214
58
  return null;
215
59
  }
216
60
  // eslint-disable-next-line no-useless-escape
217
61
  return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
218
62
  },
219
- setItem: function setItem() {
220
- document.cookie = setItemCookieString.apply(void 0, arguments);
63
+ setItem(...args) {
64
+ document.cookie = setItemCookieString(...args);
221
65
  return true;
222
66
  },
223
- removeItem: function removeItem(sKey, sPath, sDomain) {
67
+ removeItem: function (sKey, sPath, sDomain) {
224
68
  if (!this.hasItem(sKey)) {
225
69
  return false;
226
70
  }
227
71
  document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
228
72
  return true;
229
73
  },
230
- hasItem: function hasItem(sKey) {
74
+ hasItem: function (sKey) {
231
75
  if (!sKey) {
232
76
  return false;
233
77
  }
234
78
  // eslint-disable-next-line no-useless-escape
235
79
  return new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(document.cookie);
236
80
  },
237
- keys: function keys() {
81
+ keys: function () {
238
82
  // eslint-disable-next-line no-useless-escape
239
83
  var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
240
84
  for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {
@@ -249,19 +93,20 @@ function setItemCookieString(key, value, expiresOrOptions, path, domain, secure)
249
93
  } else {
250
94
  return setItemCookieStringWithOptions(key, value, {
251
95
  expires: expiresOrOptions,
252
- path: path,
253
- domain: domain,
254
- secure: secure
96
+ path,
97
+ domain,
98
+ secure
255
99
  });
256
100
  }
257
101
  }
258
- function setItemCookieStringWithOptions(key, value, _ref) {
259
- var expires = _ref.expires,
260
- path = _ref.path,
261
- domain = _ref.domain,
262
- secure = _ref.secure,
263
- sameSite = _ref.sameSite;
264
- var expiresPart = "";
102
+ function setItemCookieStringWithOptions(key, value, {
103
+ expires,
104
+ path,
105
+ domain,
106
+ secure,
107
+ sameSite
108
+ }) {
109
+ let expiresPart = "";
265
110
  if (expires) {
266
111
  switch (expires.constructor) {
267
112
  case Number:
@@ -278,284 +123,242 @@ function setItemCookieStringWithOptions(key, value, _ref) {
278
123
  return encodeURIComponent(key) + "=" + encodeURIComponent(value) + expiresPart + (domain ? "; domain=" + domain : "") + (path ? "; path=" + path : "") + (sameSite ? "; SameSite=" + sameSite : "") + (secure ? "; Secure" : "");
279
124
  }
280
125
 
281
- var supportedParadigms = ['external opt-out', 'opt-in', 'lazy opt-in', 'skip'];
282
- var Consent = /*#__PURE__*/function () {
283
- function Consent(_ref) {
284
- var _this = this;
285
- var cookies = _ref.cookies,
286
- inEditor = _ref.inEditor;
287
- _classCallCheck(this, Consent);
288
- this.requestedPromise = new Promise(function (resolve) {
289
- _this.requestedPromiseResolve = resolve;
126
+ const supportedParadigms = ['external opt-out', 'opt-in', 'lazy opt-in', 'skip'];
127
+ class Consent {
128
+ constructor({
129
+ cookies,
130
+ inEditor
131
+ }) {
132
+ this.requestedPromise = new Promise(resolve => {
133
+ this.requestedPromiseResolve = resolve;
290
134
  });
291
135
  this.vendors = [];
292
136
  this.persistence = new Persistence({
293
- cookies: cookies
137
+ cookies
294
138
  });
295
- this.emitter = _objectSpread2({}, BackboneEvents);
139
+ this.emitter = {
140
+ ...BackboneEvents
141
+ };
296
142
  this.inEditor = inEditor;
297
143
  }
298
- _createClass(Consent, [{
299
- key: "registerVendor",
300
- value: function registerVendor(name, _ref2) {
301
- var displayName = _ref2.displayName,
302
- description = _ref2.description,
303
- paradigm = _ref2.paradigm,
304
- cookieName = _ref2.cookieName,
305
- cookieKey = _ref2.cookieKey,
306
- cookieDomain = _ref2.cookieDomain;
307
- if (this.vendorRegistrationClosed) {
308
- throw new Error("Vendor ".concat(name, " has been registered after ") + 'registration has been closed.');
309
- }
310
- if (!name.match(/^[a-z0-9-_]+$/i)) {
311
- throw new Error("Invalid vendor name '".concat(name, "'. ") + 'Only letters, numbers, hyphens and underscores are allowed.');
312
- }
313
- if (supportedParadigms.indexOf(paradigm) < 0) {
314
- throw new Error("unknown paradigm ".concat(paradigm));
315
- }
316
- this.vendors.push({
317
- displayName: displayName,
318
- description: description,
319
- name: name,
320
- paradigm: paradigm,
321
- cookieName: cookieName || 'pageflow_consent',
322
- cookieKey: cookieKey,
323
- cookieDomain: cookieDomain
324
- });
325
- }
326
- }, {
327
- key: "closeVendorRegistration",
328
- value: function closeVendorRegistration() {
329
- var _this2 = this;
330
- this.vendorRegistrationClosed = true;
331
- if (!this.getUndecidedOptInVendors().length) {
144
+ registerVendor(name, {
145
+ displayName,
146
+ description,
147
+ paradigm,
148
+ cookieName,
149
+ cookieKey,
150
+ cookieDomain
151
+ }) {
152
+ if (this.vendorRegistrationClosed) {
153
+ throw new Error(`Vendor ${name} has been registered after ` + 'registration has been closed.');
154
+ }
155
+ if (!name.match(/^[a-z0-9-_]+$/i)) {
156
+ throw new Error(`Invalid vendor name '${name}'. ` + 'Only letters, numbers, hyphens and underscores are allowed.');
157
+ }
158
+ if (supportedParadigms.indexOf(paradigm) < 0) {
159
+ throw new Error(`unknown paradigm ${paradigm}`);
160
+ }
161
+ this.vendors.push({
162
+ displayName,
163
+ description,
164
+ name,
165
+ paradigm,
166
+ cookieName: cookieName || 'pageflow_consent',
167
+ cookieKey,
168
+ cookieDomain
169
+ });
170
+ }
171
+ closeVendorRegistration() {
172
+ this.vendorRegistrationClosed = true;
173
+ if (!this.getUndecidedOptInVendors().length) {
174
+ this.triggerDecisionEvents();
175
+ return;
176
+ }
177
+ const vendors = this.getRequestedVendors();
178
+ this.requestedPromiseResolve({
179
+ vendors: this.withState(vendors),
180
+ acceptAll: () => {
181
+ this.persistence.store(vendors, 'accepted');
182
+ this.triggerDecisionEvents();
183
+ },
184
+ denyAll: () => {
185
+ this.persistence.store(vendors, 'denied');
186
+ this.triggerDecisionEvents();
187
+ },
188
+ save: vendorConsent => {
189
+ this.persistence.store(vendors, vendorConsent);
332
190
  this.triggerDecisionEvents();
333
- return;
334
191
  }
335
- var vendors = this.getRequestedVendors();
336
- this.requestedPromiseResolve({
337
- vendors: this.withState(vendors),
338
- acceptAll: function acceptAll() {
339
- _this2.persistence.store(vendors, 'accepted');
340
- _this2.triggerDecisionEvents();
341
- },
342
- denyAll: function denyAll() {
343
- _this2.persistence.store(vendors, 'denied');
344
- _this2.triggerDecisionEvents();
345
- },
346
- save: function save(vendorConsent) {
347
- _this2.persistence.store(vendors, vendorConsent);
348
- _this2.triggerDecisionEvents();
192
+ });
193
+ }
194
+ relevantVendors({
195
+ include: additionalVendorNames
196
+ } = {}) {
197
+ return this.withState(this.vendors.filter(vendor => {
198
+ return (additionalVendorNames === null || additionalVendorNames === void 0 ? void 0 : additionalVendorNames.includes(vendor.name)) || vendor.paradigm === 'opt-in' || vendor.paradigm === 'external opt-out' || vendor.paradigm === 'lazy opt-in' && this.persistence.read(vendor) !== 'undecided';
199
+ }), {
200
+ applyDefaults: true
201
+ });
202
+ }
203
+ require(vendorName) {
204
+ if (this.inEditor) {
205
+ return Promise.resolve('fulfilled');
206
+ }
207
+ const vendor = this.findVendor(vendorName, 'require consent for');
208
+ switch (vendor.paradigm) {
209
+ case 'opt-in':
210
+ case 'lazy opt-in':
211
+ if (this.getUndecidedOptInVendors().length) {
212
+ return new Promise(resolve => {
213
+ this.emitter.once(`${vendor.name}:accepted`, () => resolve('fulfilled'));
214
+ this.emitter.once(`${vendor.name}:denied`, () => resolve('failed'));
215
+ });
349
216
  }
350
- });
351
- }
352
- }, {
353
- key: "relevantVendors",
354
- value: function relevantVendors() {
355
- var _this3 = this;
356
- var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
357
- additionalVendorNames = _ref3.include;
358
- return this.withState(this.vendors.filter(function (vendor) {
359
- return (additionalVendorNames === null || additionalVendorNames === void 0 ? void 0 : additionalVendorNames.includes(vendor.name)) || vendor.paradigm === 'opt-in' || vendor.paradigm === 'external opt-out' || vendor.paradigm === 'lazy opt-in' && _this3.persistence.read(vendor) !== 'undecided';
360
- }), {
361
- applyDefaults: true
362
- });
363
- }
364
- }, {
365
- key: "require",
366
- value: function require(vendorName) {
367
- var _this4 = this;
368
- if (this.inEditor) {
369
- return Promise.resolve('fulfilled');
370
- }
371
- var vendor = this.findVendor(vendorName, 'require consent for');
372
- switch (vendor.paradigm) {
373
- case 'opt-in':
374
- case 'lazy opt-in':
375
- if (this.getUndecidedOptInVendors().length) {
376
- return new Promise(function (resolve) {
377
- _this4.emitter.once("".concat(vendor.name, ":accepted"), function () {
378
- return resolve('fulfilled');
379
- });
380
- _this4.emitter.once("".concat(vendor.name, ":denied"), function () {
381
- return resolve('failed');
382
- });
383
- });
384
- }
385
- if (this.persistence.read(vendor) === 'accepted') {
386
- return Promise.resolve('fulfilled');
387
- } else {
388
- return Promise.resolve('failed');
389
- }
390
- case 'external opt-out':
391
- if (this.persistence.read(vendor) === 'denied') {
392
- return Promise.resolve('failed');
393
- }
217
+ if (this.persistence.read(vendor) === 'accepted') {
394
218
  return Promise.resolve('fulfilled');
395
- case 'skip':
396
- return Promise.resolve('fulfilled');
397
- default:
398
- // should not be used
399
- return null;
400
- }
401
- }
402
- }, {
403
- key: "requireAccepted",
404
- value: function requireAccepted(vendorName) {
405
- var _this5 = this;
406
- if (this.inEditor) {
407
- return Promise.resolve('fulfilled');
408
- }
409
- var vendor = this.findVendor(vendorName, 'require consent for');
410
- if (vendor.paradigm === 'opt-in' || vendor.paradigm === 'lazy opt-in') {
411
- if (this.getUndecidedOptInVendors().length || this.persistence.read(vendor) !== 'accepted') {
412
- return new Promise(function (resolve) {
413
- _this5.emitter.once("".concat(vendor.name, ":accepted"), function () {
414
- return resolve('fulfilled');
415
- });
416
- });
219
+ } else {
220
+ return Promise.resolve('failed');
221
+ }
222
+ case 'external opt-out':
223
+ if (this.persistence.read(vendor) === 'denied') {
224
+ return Promise.resolve('failed');
417
225
  }
418
226
  return Promise.resolve('fulfilled');
419
- } else {
420
- return this.require(vendorName);
421
- }
422
- }
423
- }, {
424
- key: "requested",
425
- value: function requested() {
426
- return this.requestedPromise;
427
- }
428
- }, {
429
- key: "accept",
430
- value: function accept(vendorName) {
431
- var vendor = this.findVendor(vendorName, 'accept');
432
- this.persistence.update(vendor, true);
433
- this.emitter.trigger("".concat(vendor.name, ":accepted"));
434
- }
435
- }, {
436
- key: "deny",
437
- value: function deny(vendorName) {
438
- var vendor = this.findVendor(vendorName, 'deny');
439
- this.persistence.update(vendor, false);
440
- }
441
- }, {
442
- key: "getRequestedVendors",
443
- value: function getRequestedVendors() {
444
- return this.vendors.filter(function (vendor) {
445
- return vendor.paradigm !== 'skip';
446
- });
447
- }
448
- }, {
449
- key: "getUndecidedOptInVendors",
450
- value: function getUndecidedOptInVendors() {
451
- var _this6 = this;
452
- return this.vendors.filter(function (vendor) {
453
- return vendor.paradigm === 'opt-in' && _this6.persistence.read(vendor) === 'undecided';
454
- });
227
+ case 'skip':
228
+ return Promise.resolve('fulfilled');
229
+ default:
230
+ // should not be used
231
+ return null;
455
232
  }
456
- }, {
457
- key: "triggerDecisionEvents",
458
- value: function triggerDecisionEvents() {
459
- var _this7 = this;
460
- this.vendors.filter(function (vendor) {
461
- return vendor.paradigm !== 'skip';
462
- }).forEach(function (vendor) {
463
- _this7.emitter.trigger("".concat(vendor.name, ":").concat(_this7.persistence.read(vendor)));
464
- });
233
+ }
234
+ requireAccepted(vendorName) {
235
+ if (this.inEditor) {
236
+ return Promise.resolve('fulfilled');
465
237
  }
466
- }, {
467
- key: "findVendor",
468
- value: function findVendor(vendorName, actionForErrorMessage) {
469
- var vendor = this.vendors.find(function (vendor) {
470
- return vendor.name === vendorName;
471
- });
472
- if (!vendor) {
473
- throw new Error("Cannot ".concat(actionForErrorMessage, " unknown vendor \"").concat(vendorName, "\". ") + 'Consider using consent.registerVendor.');
474
- }
475
- return vendor;
476
- }
477
- }, {
478
- key: "withState",
479
- value: function withState(vendors) {
480
- var _this8 = this;
481
- var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
482
- applyDefaults = _ref4.applyDefaults;
483
- return vendors.map(function (vendor) {
484
- var state = _this8.persistence.read(vendor);
485
- return _objectSpread2(_objectSpread2({}, vendor), {}, {
486
- state: state === 'undecided' && applyDefaults ? _this8.getDefaultState(vendor) : state
238
+ const vendor = this.findVendor(vendorName, 'require consent for');
239
+ if (vendor.paradigm === 'opt-in' || vendor.paradigm === 'lazy opt-in') {
240
+ if (this.getUndecidedOptInVendors().length || this.persistence.read(vendor) !== 'accepted') {
241
+ return new Promise(resolve => {
242
+ this.emitter.once(`${vendor.name}:accepted`, () => resolve('fulfilled'));
487
243
  });
488
- });
489
- }
490
- }, {
491
- key: "getDefaultState",
492
- value: function getDefaultState(vendor) {
493
- if (vendor.paradigm === 'external opt-out') {
494
- return 'accepted';
495
244
  }
496
- return 'undecided';
245
+ return Promise.resolve('fulfilled');
246
+ } else {
247
+ return this.require(vendorName);
497
248
  }
498
- }]);
499
- return Consent;
500
- }();
249
+ }
250
+ requested() {
251
+ return this.requestedPromise;
252
+ }
253
+ accept(vendorName) {
254
+ const vendor = this.findVendor(vendorName, 'accept');
255
+ this.persistence.update(vendor, true);
256
+ this.emitter.trigger(`${vendor.name}:accepted`);
257
+ }
258
+ deny(vendorName) {
259
+ const vendor = this.findVendor(vendorName, 'deny');
260
+ this.persistence.update(vendor, false);
261
+ }
262
+ getRequestedVendors() {
263
+ return this.vendors.filter(vendor => {
264
+ return vendor.paradigm !== 'skip';
265
+ });
266
+ }
267
+ getUndecidedOptInVendors() {
268
+ return this.vendors.filter(vendor => {
269
+ return vendor.paradigm === 'opt-in' && this.persistence.read(vendor) === 'undecided';
270
+ });
271
+ }
272
+ triggerDecisionEvents() {
273
+ this.vendors.filter(vendor => {
274
+ return vendor.paradigm !== 'skip';
275
+ }).forEach(vendor => {
276
+ this.emitter.trigger(`${vendor.name}:${this.persistence.read(vendor)}`);
277
+ });
278
+ }
279
+ findVendor(vendorName, actionForErrorMessage) {
280
+ const vendor = this.vendors.find(vendor => vendor.name === vendorName);
281
+ if (!vendor) {
282
+ throw new Error(`Cannot ${actionForErrorMessage} unknown vendor "${vendorName}". ` + 'Consider using consent.registerVendor.');
283
+ }
284
+ return vendor;
285
+ }
286
+ withState(vendors, {
287
+ applyDefaults
288
+ } = {}) {
289
+ return vendors.map(vendor => {
290
+ const state = this.persistence.read(vendor);
291
+ return {
292
+ ...vendor,
293
+ state: state === 'undecided' && applyDefaults ? this.getDefaultState(vendor) : state
294
+ };
295
+ });
296
+ }
297
+ getDefaultState(vendor) {
298
+ if (vendor.paradigm === 'external opt-out') {
299
+ return 'accepted';
300
+ }
301
+ return 'undecided';
302
+ }
303
+ }
501
304
  Consent.create = function () {
502
- var inEditor = typeof PAGEFLOW_EDITOR !== 'undefined' && PAGEFLOW_EDITOR;
305
+ const inEditor = typeof PAGEFLOW_EDITOR !== 'undefined' && PAGEFLOW_EDITOR;
503
306
  return new Consent({
504
- cookies: cookies,
505
- inEditor: inEditor
307
+ cookies,
308
+ inEditor
506
309
  });
507
310
  };
508
311
 
509
- var log = function log(text, options) {
312
+ const log = function (text, options) {
510
313
  if (window.console && (debugMode() || options && options.force)) {
511
314
  window.console.log(text);
512
315
  }
513
316
  };
514
- var debugMode = function debugMode() {
317
+ const debugMode = function () {
515
318
  return window.location.href.indexOf('debug=true') >= 0;
516
319
  };
517
320
 
518
- var state = typeof window !== 'undefined' && window.pageflow || {};
321
+ const state = typeof window !== 'undefined' && window.pageflow || {};
519
322
 
520
- var assetUrls = state.assetUrls || {};
323
+ const assetUrls = state.assetUrls || {};
521
324
 
522
- var events = Object.assign({}, BackboneEvents);
325
+ const events = Object.assign({}, BackboneEvents);
523
326
 
524
327
  /**
525
328
  * Detect browser via user agent. Use only if feature detection is not
526
329
  * an option.
527
330
  */
528
- var Agent = function Agent(userAgent) {
331
+ const Agent = function (userAgent) {
529
332
  return {
530
- matchesSilk: function matchesSilk() {
333
+ matchesSilk: function () {
531
334
  return matches(/\bSilk\b/);
532
335
  },
533
- matchesDesktopSafari: function matchesDesktopSafari(options) {
336
+ matchesDesktopSafari: function (options) {
534
337
  if (options) {
535
338
  return this.matchesSafari() && !this.matchesMobilePlatform() && matchesMinVersion(/Version\/(\d+)/i, options.minVersion);
536
339
  } else {
537
340
  return this.matchesSafari() && !this.matchesMobilePlatform();
538
341
  }
539
342
  },
540
- matchesDesktopSafari9: function matchesDesktopSafari9() {
343
+ matchesDesktopSafari9: function () {
541
344
  return this.matchesSafari9() && !this.matchesMobilePlatform();
542
345
  },
543
- matchesDesktopSafari10: function matchesDesktopSafari10() {
346
+ matchesDesktopSafari10: function () {
544
347
  return this.matchesSafari10() && !this.matchesMobilePlatform();
545
348
  },
546
- matchesSafari9: function matchesSafari9() {
349
+ matchesSafari9: function () {
547
350
  return this.matchesSafari() && matches(/Version\/9/i);
548
351
  },
549
- matchesSafari10: function matchesSafari10() {
352
+ matchesSafari10: function () {
550
353
  return this.matchesSafari() && matches(/Version\/10/i);
551
354
  },
552
- matchesSafari11: function matchesSafari11() {
355
+ matchesSafari11: function () {
553
356
  return this.matchesSafari() && matches(/Version\/11/i);
554
357
  },
555
- matchesSafari11AndAbove: function matchesSafari11AndAbove() {
358
+ matchesSafari11AndAbove: function () {
556
359
  return this.matchesSafari() && matchesMinVersion(/Version\/(\d+)/i, 11);
557
360
  },
558
- matchesSafari: function matchesSafari() {
361
+ matchesSafari: function () {
559
362
  // - Chrome also reports to be a Safari
560
363
  // - Safari does not report to be a Chrome
561
364
  // - Edge also reports to be a Safari, but also reports to be Chrome
@@ -565,20 +368,14 @@ var Agent = function Agent(userAgent) {
565
368
  * Returns true on iOS Safari.
566
369
  * @return {boolean}
567
370
  */
568
- matchesMobileSafari: function matchesMobileSafari() {
569
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
570
- osVersions = _ref.osVersions;
371
+ matchesMobileSafari: function ({
372
+ osVersions
373
+ } = {}) {
571
374
  var deviceMatchers = [/iPod/i, /iPad/i, /iPhone/i];
572
375
  if (osVersions) {
573
- return deviceMatchers.some(function (matcher) {
574
- return userAgent.match(matcher);
575
- }) && osVersions.some(function (osVersion) {
576
- return userAgent.includes(osVersion.replace('.', '_'));
577
- });
376
+ return deviceMatchers.some(matcher => userAgent.match(matcher)) && osVersions.some(osVersion => userAgent.includes(osVersion.replace('.', '_')));
578
377
  } else {
579
- return matchesiPadSafari13AndAbove() || deviceMatchers.some(function (matcher) {
580
- return userAgent.match(matcher);
581
- }) && !window.MSStream // IE exclusion from being detected as an iOS device;
378
+ return matchesiPadSafari13AndAbove() || deviceMatchers.some(matcher => userAgent.match(matcher)) && !window.MSStream // IE exclusion from being detected as an iOS device;
582
379
  ;
583
380
  }
584
381
  },
@@ -586,14 +383,14 @@ var Agent = function Agent(userAgent) {
586
383
  * Returns true on Android.
587
384
  * @return {boolean}
588
385
  */
589
- matchesAndroid: function matchesAndroid() {
386
+ matchesAndroid: function () {
590
387
  return matches(/Android/i);
591
388
  },
592
389
  /**
593
390
  * Returns true on iOS or Android.
594
391
  * @return {boolean}
595
392
  */
596
- matchesMobilePlatform: function matchesMobilePlatform() {
393
+ matchesMobilePlatform: function () {
597
394
  var matchers = [/iPod/i, /iPad/i, /iPhone/i, /Android/i, /Silk/i, /IEMobile/i];
598
395
  return matchers.some(function (matcher) {
599
396
  return userAgent.match(matcher);
@@ -603,31 +400,31 @@ var Agent = function Agent(userAgent) {
603
400
  * Returns true on Internet Explorser version 9, 10 and 11.
604
401
  * @return {boolean}
605
402
  */
606
- matchesIEUpTo11: function matchesIEUpTo11() {
403
+ matchesIEUpTo11: function () {
607
404
  return userAgent.match(/Trident\//);
608
405
  },
609
406
  /**
610
407
  * Returns true in InApp browser of Facebook app.
611
408
  * @return {boolean}
612
409
  */
613
- matchesFacebookInAppBrowser: function matchesFacebookInAppBrowser() {
410
+ matchesFacebookInAppBrowser: function () {
614
411
  return userAgent.match(/FBAN/) && userAgent.match(/FBAV/);
615
412
  },
616
- matchesDesktopChrome: function matchesDesktopChrome(options) {
413
+ matchesDesktopChrome: function (options) {
617
414
  if (options) {
618
415
  return this.matchesChrome() && !this.matchesMobilePlatform() && matchesMinVersion(/Chrome\/(\d+)/i, options.minVersion);
619
416
  } else {
620
417
  return this.matchesChrome() && !this.matchesMobilePlatform();
621
418
  }
622
419
  },
623
- matchesDesktopFirefox: function matchesDesktopFirefox(options) {
420
+ matchesDesktopFirefox: function (options) {
624
421
  if (options) {
625
422
  return this.matchesFirefox() && !this.matchesMobilePlatform() && matchesMinVersion(/Firefox\/(\d+)/i, options.minVersion);
626
423
  } else {
627
424
  return this.matchesFirefox() && !this.matchesMobilePlatform();
628
425
  }
629
426
  },
630
- matchesDesktopEdge: function matchesDesktopEdge(options) {
427
+ matchesDesktopEdge: function (options) {
631
428
  if (options) {
632
429
  return this.matchesEdge() && !this.matchesMobilePlatform() && matchesMinVersion(/Edg\/(\d+)/i, options.minVersion);
633
430
  } else {
@@ -638,7 +435,7 @@ var Agent = function Agent(userAgent) {
638
435
  * Returns true on Google Chrome.
639
436
  * @return {boolean}
640
437
  */
641
- matchesChrome: function matchesChrome() {
438
+ matchesChrome: function () {
642
439
  // - Edge also reports to be a Chrome
643
440
  return matches(/Chrome\//i) && !matches(/Edg/i);
644
441
  },
@@ -646,14 +443,14 @@ var Agent = function Agent(userAgent) {
646
443
  * Returns true on Firefox.
647
444
  * @return {boolean}
648
445
  */
649
- matchesFirefox: function matchesFirefox() {
446
+ matchesFirefox: function () {
650
447
  return matches(/Firefox\//i) && !matches(/Seamonkey/i);
651
448
  },
652
449
  /**
653
450
  * Returns true on Microsoft Edge.
654
451
  * @return {boolean}
655
452
  */
656
- matchesEdge: function matchesEdge() {
453
+ matchesEdge: function () {
657
454
  return matches(/Edg\//i);
658
455
  }
659
456
  };
@@ -674,19 +471,19 @@ var Agent = function Agent(userAgent) {
674
471
  return agent.matchesSafari() && navigator.maxTouchPoints > 1 && navigator.platform === 'MacIntel';
675
472
  }
676
473
  };
677
- var agent = new Agent(typeof navigator !== 'undefined' ? navigator.userAgent : 'ssr');
474
+ const agent = new Agent(typeof navigator !== 'undefined' ? navigator.userAgent : 'ssr');
678
475
 
679
476
  /**
680
477
  * Browser feature detection.
681
478
  *
682
479
  * @since 0.9
683
480
  */
684
- var browser = function () {
481
+ const browser = function () {
685
482
  var tests = {},
686
483
  results = {},
687
484
  featureDetectionComplete = false;
688
- var readyPromiseResolve;
689
- var readyPromise = new Promise(function (resolve, reject) {
485
+ let readyPromiseResolve;
486
+ let readyPromise = new Promise(function (resolve, reject) {
690
487
  readyPromiseResolve = resolve;
691
488
  });
692
489
  return {
@@ -701,7 +498,7 @@ var browser = function () {
701
498
  * `false` or a promise that resolves to `true` or `false`.
702
499
  * @memberof pageflow.browser
703
500
  */
704
- feature: function feature(name, test) {
501
+ feature: function (name, test) {
705
502
  var s = name.replace(/ /g, '_');
706
503
  this.off[s] = function () {
707
504
  window.localStorage['override ' + name] = 'off';
@@ -731,7 +528,7 @@ var browser = function () {
731
528
  * @return [Boolean]
732
529
  * @memberof pageflow.browser
733
530
  */
734
- has: function has(name) {
531
+ has: function (name) {
735
532
  if (!featureDetectionComplete) {
736
533
  throw 'Feature detection has not finished yet.';
737
534
  }
@@ -746,14 +543,14 @@ var browser = function () {
746
543
  * @return Promise
747
544
  * @memberof pageflow.browser
748
545
  */
749
- ready: function ready() {
546
+ ready: function () {
750
547
  return readyPromise;
751
548
  },
752
549
  /** @api private */
753
- detectFeatures: function detectFeatures() {
550
+ detectFeatures: function () {
754
551
  var promises = {};
755
- var asyncHas = function asyncHas(name) {
756
- var runTest = function runTest() {
552
+ var asyncHas = function (name) {
553
+ var runTest = function () {
757
554
  var value,
758
555
  underscoredName = name.replace(/ /g, '_');
759
556
  if (debugMode() && location.href.indexOf('&has=' + underscoredName) >= 0) {
@@ -772,7 +569,7 @@ var browser = function () {
772
569
  return tests[name](asyncHas);
773
570
  }
774
571
  };
775
- promises[name] = promises[name] || Promise.all([runTest()]).then(function (a) {
572
+ promises[name] = promises[name] || Promise.all([runTest()]).then(a => {
776
573
  return a[0];
777
574
  });
778
575
  return promises[name];
@@ -785,9 +582,7 @@ var browser = function () {
785
582
  asyncHas.all = function /* arguments */
786
583
  () {
787
584
  return Promise.all(arguments).then(function (results) {
788
- return results.every(function (result) {
789
- return result;
790
- });
585
+ return results.every(result => result);
791
586
  });
792
587
  };
793
588
  Promise.all(Object.keys(tests).map(function (name) {
@@ -797,7 +592,7 @@ var browser = function () {
797
592
  document.body.classList.toggle('has_no_' + cssClassName, !result);
798
593
  results[name] = !!result;
799
594
  });
800
- })).then(function () {
595
+ })).then(() => {
801
596
  featureDetectionComplete = true;
802
597
  readyPromiseResolve();
803
598
  });
@@ -935,12 +730,11 @@ browser.Agent = Agent;
935
730
  * @alias pageflow.features
936
731
  * @since 0.9
937
732
  */
938
- var Features = /*#__PURE__*/function () {
733
+ class Features {
939
734
  /** @lends pageflow.features */
940
735
 
941
736
  /** @api private */
942
- function Features() {
943
- _classCallCheck(this, Features);
737
+ constructor() {
944
738
  this.registry = {};
945
739
  this.enabledFeatureNames = [];
946
740
  }
@@ -949,66 +743,56 @@ var Features = /*#__PURE__*/function () {
949
743
  * `pageflow.features` has been renamed to `pageflow.browser`.
950
744
  * @deprecated
951
745
  */
952
- _createClass(Features, [{
953
- key: "has",
954
- value: function has( /* arguments */
955
- ) {
956
- return browser.has.apply(browser, arguments);
957
- }
746
+ has( /* arguments */
747
+ ) {
748
+ return browser.has.apply(browser, arguments);
749
+ }
958
750
 
959
- /**
960
- * Register a function to configure a feature when it is active.
961
- *
962
- * @param {String} scope - Name of the scope the passed function
963
- * shall be called in.
964
- * @param name [String] Name of the feature
965
- * @param fn [Function] Function to call when the given feature
966
- * is activate.
967
- */
968
- }, {
969
- key: "register",
970
- value: function register(scope, name, fn) {
971
- this.registry[scope] = this.registry[scope] || {};
972
- this.registry[scope][name] = this.registry[scope][name] || [];
973
- this.registry[scope][name].push(fn);
974
- }
751
+ /**
752
+ * Register a function to configure a feature when it is active.
753
+ *
754
+ * @param {String} scope - Name of the scope the passed function
755
+ * shall be called in.
756
+ * @param name [String] Name of the feature
757
+ * @param fn [Function] Function to call when the given feature
758
+ * is activate.
759
+ */
760
+ register(scope, name, fn) {
761
+ this.registry[scope] = this.registry[scope] || {};
762
+ this.registry[scope][name] = this.registry[scope][name] || [];
763
+ this.registry[scope][name].push(fn);
764
+ }
975
765
 
976
- /**
977
- * Check if a feature as been enabled.
978
- *
979
- * @param name [String]
980
- * @return [Boolean]
981
- */
982
- }, {
983
- key: "isEnabled",
984
- value: function isEnabled(name) {
985
- return this.enabledFeatureNames.includes(name);
986
- }
766
+ /**
767
+ * Check if a feature as been enabled.
768
+ *
769
+ * @param name [String]
770
+ * @return [Boolean]
771
+ */
772
+ isEnabled(name) {
773
+ return this.enabledFeatureNames.includes(name);
774
+ }
987
775
 
988
- /** @api private */
989
- }, {
990
- key: "enable",
991
- value: function enable(scope, names) {
992
- var fns = this.registry[scope] || {};
993
- this.enabledFeatureNames = this.enabledFeatureNames.concat(names);
994
- names.forEach(function (name) {
995
- (fns[name] || []).forEach(function (fn) {
996
- fn();
997
- });
776
+ /** @api private */
777
+ enable(scope, names) {
778
+ var fns = this.registry[scope] || {};
779
+ this.enabledFeatureNames = this.enabledFeatureNames.concat(names);
780
+ names.forEach(function (name) {
781
+ (fns[name] || []).forEach(function (fn) {
782
+ fn();
998
783
  });
999
- }
1000
- }]);
1001
- return Features;
1002
- }();
1003
- var features = new Features();
784
+ });
785
+ }
786
+ }
787
+ const features = new Features();
1004
788
 
1005
- var handleFailedPlay = function handleFailedPlay(player, options) {
789
+ const handleFailedPlay = function (player, options) {
1006
790
  var originalPlay = player.play;
1007
791
  player.play = function /* arguments */
1008
792
  () {
1009
793
  var result = originalPlay.apply(player, arguments);
1010
- if (result && typeof result["catch"] !== 'undefined') {
1011
- return result["catch"](function (e) {
794
+ if (result && typeof result.catch !== 'undefined') {
795
+ return result.catch(function (e) {
1012
796
  if (e.name === 'NotAllowedError' && options.hasAutoplaySupport) {
1013
797
  if (options.fallbackToMutedAutoplay) {
1014
798
  player.muted(true);
@@ -1029,7 +813,7 @@ var handleFailedPlay = function handleFailedPlay(player, options) {
1029
813
  };
1030
814
  };
1031
815
 
1032
- var asyncPlay = function asyncPlay(player) {
816
+ const asyncPlay = function (player) {
1033
817
  var originalPlay = player.play;
1034
818
  var originalPause = player.pause;
1035
819
  var intendingToPlay = false;
@@ -1075,18 +859,18 @@ var asyncPlay = function asyncPlay(player) {
1075
859
  }
1076
860
  };
1077
861
 
1078
- var hooks = function hooks(player, _hooks) {
862
+ const hooks = function (player, hooks) {
1079
863
  var originalPlay = player.play;
1080
- player.updateHooks = function (newHooks) {
1081
- _hooks = newHooks;
864
+ player.updateHooks = newHooks => {
865
+ hooks = newHooks;
1082
866
  };
1083
867
  player.play = function /* args */
1084
868
  () {
1085
869
  var args = arguments;
1086
870
  player.trigger('beforeplay');
1087
871
  player.intendToPlay();
1088
- if (_hooks.before) {
1089
- return Promise.all([_hooks.before()]).then(function () {
872
+ if (hooks.before) {
873
+ return Promise.all([hooks.before()]).then(function () {
1090
874
  return player.ifIntendingToPlay().then(function () {
1091
875
  return originalPlay.apply(player, args);
1092
876
  });
@@ -1099,16 +883,16 @@ var hooks = function hooks(player, _hooks) {
1099
883
  player.off('pause', player.afterHookListener);
1100
884
  player.off('ended', player.afterHookListener);
1101
885
  }
1102
- player.afterHookListener = function () {
1103
- if (_hooks.after) {
1104
- _hooks.after();
886
+ player.afterHookListener = () => {
887
+ if (hooks.after) {
888
+ hooks.after();
1105
889
  }
1106
890
  };
1107
891
  player.on('pause', player.afterHookListener);
1108
892
  player.on('ended', player.afterHookListener);
1109
893
  };
1110
894
 
1111
- var volumeBinding = function volumeBinding(player, settings, options) {
895
+ const volumeBinding = function (player, settings, options) {
1112
896
  options = options || {};
1113
897
  var originalPlay = player.play;
1114
898
  var originalPause = player.pause;
@@ -1176,13 +960,13 @@ var volumeBinding = function volumeBinding(player, settings, options) {
1176
960
  *
1177
961
  * @since 12.1
1178
962
  */
1179
- var audioContext = {
963
+ const audioContext = {
1180
964
  /**
1181
965
  * @returns [AudioContext]
1182
966
  * Returns `null` if web audio API is not supported or creating
1183
967
  * the context fails.
1184
968
  */
1185
- get: function get() {
969
+ get: function () {
1186
970
  var AudioContext = window.AudioContext || window.webkitAudioContext;
1187
971
  if (typeof this._audioContext === 'undefined') {
1188
972
  try {
@@ -1198,7 +982,7 @@ var audioContext = {
1198
982
  }
1199
983
  };
1200
984
 
1201
- var webAudio = function webAudio(player, audioContext) {
985
+ const webAudio = function (player, audioContext) {
1202
986
  var gainNode;
1203
987
  var currentResolve;
1204
988
  var currentTimeout;
@@ -1312,16 +1096,16 @@ var webAudio = function webAudio(player, audioContext) {
1312
1096
  }
1313
1097
  };
1314
1098
 
1315
- var noop = function noop(player) {
1099
+ const noop = function (player) {
1316
1100
  player.fadeVolume = function (value, duration) {
1317
1101
  return Promise.resolve();
1318
1102
  };
1319
1103
  };
1320
1104
 
1321
- var interval = function interval(player) {
1322
- var originalVolume = player.volume;
1323
- var fadeVolumeResolve;
1324
- var fadeVolumeInterval;
1105
+ const interval = function (player) {
1106
+ const originalVolume = player.volume;
1107
+ let fadeVolumeResolve;
1108
+ let fadeVolumeInterval;
1325
1109
  player.volume = function (value) {
1326
1110
  if (typeof value !== 'undefined') {
1327
1111
  cancelFadeVolume();
@@ -1331,10 +1115,10 @@ var interval = function interval(player) {
1331
1115
  player.fadeVolume = function (value, duration) {
1332
1116
  cancelFadeVolume();
1333
1117
  return new Promise(function (resolve, reject) {
1334
- var resolution = 10;
1335
- var startValue = volume();
1336
- var steps = duration / resolution;
1337
- var leap = (value - startValue) / steps;
1118
+ const resolution = 10;
1119
+ const startValue = volume();
1120
+ const steps = duration / resolution;
1121
+ const leap = (value - startValue) / steps;
1338
1122
  if (value === startValue) {
1339
1123
  resolve();
1340
1124
  } else {
@@ -1371,7 +1155,7 @@ var interval = function interval(player) {
1371
1155
  }
1372
1156
  };
1373
1157
 
1374
- var volumeFading = function volumeFading(player) {
1158
+ const volumeFading = function (player) {
1375
1159
  if (!browser.has('volume control support')) {
1376
1160
  return noop(player);
1377
1161
  } else if (browser.has('audio context volume fading support') && audioContext.get() && player.getMediaElement) {
@@ -1385,7 +1169,7 @@ volumeFading.interval = interval;
1385
1169
  volumeFading.noop = noop;
1386
1170
  volumeFading.webAudio = webAudio;
1387
1171
 
1388
- var loadWaiting = function loadWaiting(player) {
1172
+ const loadWaiting = function (player) {
1389
1173
  var originalFadeVolume = player.fadeVolume;
1390
1174
  player.fadeVolume = function /* args */
1391
1175
  () {
@@ -1396,78 +1180,68 @@ var loadWaiting = function loadWaiting(player) {
1396
1180
  };
1397
1181
  };
1398
1182
 
1399
- var Settings = /*#__PURE__*/function () {
1400
- function Settings() {
1401
- _classCallCheck(this, Settings);
1183
+ class Settings {
1184
+ constructor() {
1402
1185
  this.attributes = {
1403
1186
  volume: 1
1404
1187
  };
1405
1188
  this.initialize();
1406
1189
  }
1407
- _createClass(Settings, [{
1408
- key: "get",
1409
- value: function get(attributeName) {
1410
- return this.attributes[attributeName];
1411
- }
1412
- }, {
1413
- key: "set",
1414
- value: function set(key, value) {
1415
- var attrs;
1416
- if (typeof key === 'object') {
1417
- attrs = key;
1418
- } else {
1419
- (attrs = {})[key] = value;
1420
- }
1421
- for (var attr in attrs) {
1422
- this.attributes[attr] = attrs[attr];
1423
- this.trigger('change:' + attr);
1424
- }
1425
- this.trigger('change');
1426
- }
1427
- }, {
1428
- key: "toJSON",
1429
- value: function toJSON() {
1430
- return _objectSpread2({}, this.attributes);
1431
- }
1432
- }, {
1433
- key: "initialize",
1434
- value: function initialize() {
1435
- var storage = this.getLocalStorage();
1436
- if (storage) {
1437
- if (storage['pageflow.settings']) {
1438
- try {
1439
- this.set(JSON.parse(storage['pageflow.settings']));
1440
- } catch (e) {
1441
- log(e);
1442
- }
1190
+ get(attributeName) {
1191
+ return this.attributes[attributeName];
1192
+ }
1193
+ set(key, value) {
1194
+ let attrs;
1195
+ if (typeof key === 'object') {
1196
+ attrs = key;
1197
+ } else {
1198
+ (attrs = {})[key] = value;
1199
+ }
1200
+ for (const attr in attrs) {
1201
+ this.attributes[attr] = attrs[attr];
1202
+ this.trigger('change:' + attr);
1203
+ }
1204
+ this.trigger('change');
1205
+ }
1206
+ toJSON() {
1207
+ return {
1208
+ ...this.attributes
1209
+ };
1210
+ }
1211
+ initialize() {
1212
+ const storage = this.getLocalStorage();
1213
+ if (storage) {
1214
+ if (storage['pageflow.settings']) {
1215
+ try {
1216
+ this.set(JSON.parse(storage['pageflow.settings']));
1217
+ } catch (e) {
1218
+ log(e);
1443
1219
  }
1444
- this.on('change', function () {
1445
- storage['pageflow.settings'] = JSON.stringify(this.attributes);
1446
- });
1447
1220
  }
1221
+ this.on('change', function () {
1222
+ storage['pageflow.settings'] = JSON.stringify(this.attributes);
1223
+ });
1448
1224
  }
1449
- }, {
1450
- key: "getLocalStorage",
1451
- value: function getLocalStorage() {
1452
- try {
1453
- return window.localStorage;
1454
- } catch (e) {
1455
- // Safari throws SecurityError when accessing window.localStorage
1456
- // if cookies/website data are disabled.
1457
- return null;
1458
- }
1225
+ }
1226
+ getLocalStorage() {
1227
+ try {
1228
+ return window.localStorage;
1229
+ } catch (e) {
1230
+ // Safari throws SecurityError when accessing window.localStorage
1231
+ // if cookies/website data are disabled.
1232
+ return null;
1459
1233
  }
1460
- }]);
1461
- return Settings;
1462
- }();
1234
+ }
1235
+ }
1463
1236
  Object.assign(Settings.prototype, BackboneEvents);
1464
- var settings = new Settings();
1237
+ const settings = new Settings();
1465
1238
 
1466
- var mediaPlayer = {
1467
- enhance: function enhance(player, options) {
1468
- handleFailedPlay(player, _objectSpread2({
1469
- hasAutoplaySupport: browser.has('autoplay support')
1470
- }, options));
1239
+ const mediaPlayer = {
1240
+ enhance: function (player, options) {
1241
+ handleFailedPlay(player, {
1242
+ hasAutoplaySupport: browser.has('autoplay support'),
1243
+ ...options
1244
+ });
1471
1245
  asyncPlay(player);
1472
1246
  if (options.hooks) {
1473
1247
  hooks(player, options.hooks);
@@ -1504,7 +1278,7 @@ function throttle(func, timeFrame) {
1504
1278
  };
1505
1279
  }
1506
1280
 
1507
- var mediaEvents = function mediaEvents(player, context) {
1281
+ const mediaEvents = function (player, context) {
1508
1282
  function triggerMediaEvent(name) {
1509
1283
  events.trigger('media:' + name, {
1510
1284
  fileName: player.currentSrc,
@@ -1518,6 +1292,12 @@ var mediaEvents = function mediaEvents(player, context) {
1518
1292
  player.on('play', function () {
1519
1293
  triggerMediaEvent('play');
1520
1294
  });
1295
+ player.on('seeking', function () {
1296
+ triggerMediaEvent('seeking');
1297
+ });
1298
+ player.on('seeked', function () {
1299
+ triggerMediaEvent('seeked');
1300
+ });
1521
1301
  player.on('timeupdate', function () {
1522
1302
  triggerMediaEvent('timeupdate');
1523
1303
  });
@@ -1535,7 +1315,7 @@ var mediaEvents = function mediaEvents(player, context) {
1535
1315
  // Prevent audio play back when browser enters background on mobile
1536
1316
  // device. Use the face that timeupdate events continue to fire while
1537
1317
  // intervals no longer executed when the browser is in the background.
1538
- var pauseInBackground = function pauseInBackground(player) {
1318
+ const pauseInBackground = function (player) {
1539
1319
  var interval;
1540
1320
  var lastInterval;
1541
1321
  var resolution = 100;
@@ -1569,7 +1349,7 @@ var pauseInBackground = function pauseInBackground(player) {
1569
1349
  *
1570
1350
  * @api private
1571
1351
  */
1572
- var seekWithInvalidStateHandling = function seekWithInvalidStateHandling(player) {
1352
+ const seekWithInvalidStateHandling = function (player) {
1573
1353
  var originalSeek = player.seek;
1574
1354
  player.seek = function (time) {
1575
1355
  return retryOnProgress(function () {
@@ -1597,7 +1377,7 @@ var seekWithInvalidStateHandling = function seekWithInvalidStateHandling(player)
1597
1377
  }
1598
1378
  };
1599
1379
 
1600
- var rewindMethod = function rewindMethod(player) {
1380
+ const rewindMethod = function (player) {
1601
1381
  /**
1602
1382
  * Seek to beginning of file. If already at the beginning do
1603
1383
  * nothing.
@@ -1615,7 +1395,7 @@ var rewindMethod = function rewindMethod(player) {
1615
1395
  };
1616
1396
  };
1617
1397
 
1618
- var getMediaElementMethod = function getMediaElementMethod(player) {
1398
+ const getMediaElementMethod = function (player) {
1619
1399
  player.getMediaElement = function () {
1620
1400
  return player.audio.audio;
1621
1401
  };
@@ -1635,19 +1415,19 @@ var getMediaElementMethod = function getMediaElementMethod(player) {
1635
1415
  *
1636
1416
  * @class
1637
1417
  */
1638
- var AudioPlayer = function AudioPlayer(sources, options) {
1418
+ const AudioPlayer = function (sources, options) {
1639
1419
  options = options || {};
1640
1420
  var codecMapping = {
1641
1421
  vorbis: 'audio/ogg',
1642
1422
  mp4: 'audio/mp4',
1643
1423
  mp3: 'audio/mpeg'
1644
1424
  };
1645
- var readyResolve;
1646
- var readyPromise = new Promise(function (resolve) {
1425
+ let readyResolve;
1426
+ let readyPromise = new Promise(function (resolve) {
1647
1427
  readyResolve = resolve;
1648
1428
  });
1649
- var loadedResolve;
1650
- var loadedPromise = new Promise(function (resolve) {
1429
+ let loadedResolve;
1430
+ let loadedPromise = new Promise(function (resolve) {
1651
1431
  loadedResolve = resolve;
1652
1432
  });
1653
1433
  var audio = new Audio5js({
@@ -1668,9 +1448,10 @@ var AudioPlayer = function AudioPlayer(sources, options) {
1668
1448
  if (options.pauseInBackground && browser.has('mobile platform')) {
1669
1449
  pauseInBackground(audio);
1670
1450
  }
1671
- mediaPlayer.enhance(audio, _objectSpread2({
1672
- loadWaiting: true
1673
- }, options));
1451
+ mediaPlayer.enhance(audio, {
1452
+ loadWaiting: true,
1453
+ ...options
1454
+ });
1674
1455
  seekWithInvalidStateHandling(audio);
1675
1456
  rewindMethod(audio);
1676
1457
  getMediaElementMethod(audio);
@@ -1716,16 +1497,17 @@ AudioPlayer.fromAudioTag = function (element, options) {
1716
1497
  src: this.getAttribute('src'),
1717
1498
  type: this.getAttribute('type')
1718
1499
  };
1719
- }).get(), _objectSpread2({
1720
- tag: element[0]
1721
- }, options));
1500
+ }).get(), {
1501
+ tag: element[0],
1502
+ ...options
1503
+ });
1722
1504
  };
1723
1505
  AudioPlayer.fromScriptTag = function (element, options) {
1724
1506
  var sources = element.length ? JSON.parse(element.text()) : [];
1725
1507
  return new AudioPlayer(sources, options);
1726
1508
  };
1727
1509
 
1728
- var Null = function Null() {
1510
+ const Null = function () {
1729
1511
  this.playAndFadeIn = function () {
1730
1512
  return Promise.resolve();
1731
1513
  };
@@ -1759,34 +1541,18 @@ AudioPlayer.seekWithInvalidStateHandling = seekWithInvalidStateHandling;
1759
1541
  AudioPlayer.rewindMethod = rewindMethod;
1760
1542
  AudioPlayer.pauseInBackground = pauseInBackground;
1761
1543
 
1762
- function _arrayWithoutHoles(arr) {
1763
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
1764
- }
1765
-
1766
- function _iterableToArray(iter) {
1767
- if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
1768
- }
1769
-
1770
- function _nonIterableSpread() {
1771
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
1772
- }
1773
-
1774
- function _toConsumableArray(arr) {
1775
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
1776
- }
1777
-
1778
1544
  if (typeof window !== 'undefined') {
1779
1545
  window.VIDEOJS_NO_DYNAMIC_STYLE = true;
1780
1546
  }
1781
1547
 
1782
- var filterSources = function filterSources(playerElement) {
1548
+ const filterSources = function (playerElement) {
1783
1549
  if (playerElement.tagName.toLowerCase() !== 'video') {
1784
1550
  return playerElement;
1785
1551
  }
1786
1552
  var changed = false;
1787
1553
  if (browser.has('mp4 support only')) {
1788
1554
  // keep only mp4 source
1789
- playerElement.querySelectorAll('source').forEach(function (source) {
1555
+ playerElement.querySelectorAll('source').forEach(source => {
1790
1556
  if (source.type !== 'video/mp4') {
1791
1557
  playerElement.removeChild(source);
1792
1558
  }
@@ -1794,7 +1560,7 @@ var filterSources = function filterSources(playerElement) {
1794
1560
  changed = true;
1795
1561
  } else if (browser.has('mse and native hls support')) {
1796
1562
  // remove dash source to ensure hls is used
1797
- var dashSource = playerElement.querySelector('source[type="application/dash+xml"]');
1563
+ const dashSource = playerElement.querySelector('source[type="application/dash+xml"]');
1798
1564
  if (dashSource) {
1799
1565
  playerElement.removeChild(dashSource);
1800
1566
  changed = true;
@@ -1811,7 +1577,7 @@ var filterSources = function filterSources(playerElement) {
1811
1577
  }
1812
1578
  };
1813
1579
 
1814
- var useSlimPlayerControlsDuringPhonePlayback = function useSlimPlayerControlsDuringPhonePlayback(player) {
1580
+ const useSlimPlayerControlsDuringPhonePlayback = function (player) {
1815
1581
  var originalPlay = player.play;
1816
1582
  player.play = function () {
1817
1583
  if (browser.has('phone platform') && !browser.has('native video player')) {
@@ -1826,8 +1592,8 @@ var useSlimPlayerControlsDuringPhonePlayback = function useSlimPlayerControlsDur
1826
1592
  };
1827
1593
  };
1828
1594
 
1829
- var prebuffering = function prebuffering(player) {
1830
- var prebufferPromiseReject;
1595
+ const prebuffering = function (player) {
1596
+ let prebufferPromiseReject;
1831
1597
  player.isBufferedAhead = function (delta, silent) {
1832
1598
  // video.js only gives us one time range starting from 0 here. We
1833
1599
  // still ask for the last time range to be on the safe side.
@@ -1845,15 +1611,15 @@ var prebuffering = function prebuffering(player) {
1845
1611
  };
1846
1612
  player.prebuffer = function (options) {
1847
1613
  options = options || {};
1848
- var delta = options.secondsToBuffer || 10;
1849
- var secondsToWait = options.secondsToWait || 3;
1850
- var interval = 200;
1851
- var maxCount = secondsToWait * 1000 / interval;
1852
- var count = 0;
1614
+ const delta = options.secondsToBuffer || 10;
1615
+ const secondsToWait = options.secondsToWait || 3;
1616
+ const interval = 200;
1617
+ const maxCount = secondsToWait * 1000 / interval;
1618
+ let count = 0;
1853
1619
  if (browser.has('prebuffering support')) {
1854
1620
  if (!player.isBufferedAhead(delta) && !player.prebufferPromise) {
1855
1621
  log('prebuffering video ' + player.src());
1856
- player.prebufferPromise = new Promise(function (resolve, reject) {
1622
+ player.prebufferPromise = new Promise((resolve, reject) => {
1857
1623
  prebufferPromiseReject = reject;
1858
1624
  wait();
1859
1625
  function wait() {
@@ -1893,7 +1659,7 @@ var prebuffering = function prebuffering(player) {
1893
1659
  });
1894
1660
  };
1895
1661
 
1896
- var cueSettingsMethods = function cueSettingsMethods(player) {
1662
+ const cueSettingsMethods = function (player) {
1897
1663
  /**
1898
1664
  * Specify the display position of text tracks. This method can also
1899
1665
  * be used to make VideoJS reposition the text tracks after the
@@ -1951,7 +1717,7 @@ var cueSettingsMethods = function cueSettingsMethods(player) {
1951
1717
  };
1952
1718
  };
1953
1719
 
1954
- var getMediaElementMethod$1 = function getMediaElementMethod(player) {
1720
+ const getMediaElementMethod$1 = function (player) {
1955
1721
  player.getMediaElement = function () {
1956
1722
  var tech = player.tech({
1957
1723
  IWillNotUseThisInPlugins: true
@@ -1960,26 +1726,35 @@ var getMediaElementMethod$1 = function getMediaElementMethod(player) {
1960
1726
  };
1961
1727
  };
1962
1728
 
1963
- var mediaEvents$1 = function mediaEvents(player, context) {
1729
+ const mediaEvents$1 = function (player, context) {
1964
1730
  player.updateMediaEventsContext = function (newContext) {
1965
1731
  context = newContext;
1966
1732
  };
1967
- function triggerMediaEvent(name) {
1733
+ player.triggerMediaAllocate = function () {
1968
1734
  if (context) {
1969
- events.trigger('media:' + name, {
1970
- fileName: player.previousSrc || player.currentSrc(),
1971
- context: context,
1972
- currentTime: player.currentTime(),
1973
- duration: player.duration(),
1974
- volume: player.volume(),
1975
- altText: player.getMediaElement().getAttribute('alt'),
1976
- bitrate: 3500000
1735
+ events.trigger('media:allocate', {
1736
+ ...mediaEventPayload(),
1737
+ element: player.getMediaElement()
1977
1738
  });
1978
1739
  }
1979
- }
1740
+ };
1741
+ player.triggerMediaRelease = function () {
1742
+ if (context) {
1743
+ events.trigger('media:release', {
1744
+ ...mediaEventPayload(),
1745
+ element: player.getMediaElement()
1746
+ });
1747
+ }
1748
+ };
1980
1749
  player.on('play', function () {
1981
1750
  triggerMediaEvent('play');
1982
1751
  });
1752
+ player.on('seeking', function () {
1753
+ triggerMediaEvent('seeking');
1754
+ });
1755
+ player.on('seeked', function () {
1756
+ triggerMediaEvent('seeked');
1757
+ });
1983
1758
  player.on('timeupdate', function () {
1984
1759
  triggerMediaEvent('timeupdate');
1985
1760
  });
@@ -1992,9 +1767,25 @@ var mediaEvents$1 = function mediaEvents(player, context) {
1992
1767
  player.on('ended', function () {
1993
1768
  triggerMediaEvent('ended');
1994
1769
  });
1770
+ function triggerMediaEvent(name) {
1771
+ if (context) {
1772
+ events.trigger('media:' + name, mediaEventPayload());
1773
+ }
1774
+ }
1775
+ function mediaEventPayload() {
1776
+ return {
1777
+ fileName: player.previousSrc || player.currentSrc(),
1778
+ context: context,
1779
+ currentTime: player.currentTime(),
1780
+ duration: player.duration(),
1781
+ volume: player.volume(),
1782
+ altText: player.getMediaElement().getAttribute('alt'),
1783
+ bitrate: 3500000
1784
+ };
1785
+ }
1995
1786
  };
1996
1787
 
1997
- var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
1788
+ const bufferUnderrunWaiting = function (player) {
1998
1789
  var originalPause = player.pause;
1999
1790
  player.pause = function () {
2000
1791
  cancelWaiting();
@@ -2023,7 +1814,7 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
2023
1814
  player.trigger('bufferunderruncontinue');
2024
1815
  player.play();
2025
1816
  }
2026
- }, function () {});
1817
+ }, () => {});
2027
1818
  }
2028
1819
  function cancelWaiting() {
2029
1820
  if (player.waitingOnUnderrun) {
@@ -2051,7 +1842,7 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
2051
1842
  }
2052
1843
  };
2053
1844
 
2054
- var rewindMethod$1 = function rewindMethod(player) {
1845
+ const rewindMethod$1 = function (player) {
2055
1846
  /**
2056
1847
  * Seek to beginning of file. If already at the beginning do
2057
1848
  * nothing.
@@ -2069,7 +1860,7 @@ var rewindMethod$1 = function rewindMethod(player) {
2069
1860
  };
2070
1861
  };
2071
1862
 
2072
- var VideoPlayer = function VideoPlayer(element, options) {
1863
+ const VideoPlayer = function (element, options) {
2073
1864
  options = options || {};
2074
1865
  element = filterSources(element);
2075
1866
  var player = VideoJS(element, options);
@@ -2097,9 +1888,9 @@ VideoPlayer.mediaEvents = mediaEvents$1;
2097
1888
  VideoPlayer.cueSettingsMethods = cueSettingsMethods;
2098
1889
  VideoPlayer.bufferUnderrunWaiting = bufferUnderrunWaiting;
2099
1890
 
2100
- var createMediaPlayer = function createMediaPlayer(options) {
2101
- var isAudio = options.tagName == 'AUDIO';
2102
- var player = new VideoPlayer(options.mediaElement, {
1891
+ const createMediaPlayer = function (options) {
1892
+ let isAudio = options.tagName == 'AUDIO';
1893
+ const player = new VideoPlayer(options.mediaElement, {
2103
1894
  controlBar: false,
2104
1895
  loadingSpinner: false,
2105
1896
  bigPlayButton: false,
@@ -2125,7 +1916,7 @@ var createMediaPlayer = function createMediaPlayer(options) {
2125
1916
  context: null
2126
1917
  });
2127
1918
  player.textTrackSettings = {
2128
- getValues: function getValues() {
1919
+ getValues() {
2129
1920
  return {};
2130
1921
  }
2131
1922
  };
@@ -2157,9 +1948,9 @@ var createMediaPlayer = function createMediaPlayer(options) {
2157
1948
  * limitations under the License.
2158
1949
  */
2159
1950
 
2160
- var BLANK_AUDIO_SRC = 'data:audio/wav;base64,UklGRjIAAABXQVZFZm10IBA' + 'AAAABAAEAIlYAAESsAAACABAAZGF0YRAAAAAAAAAAAAAAAAAAAAAAAA==';
2161
- var BLANK_VIDEO_SRC = 'data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAG' + 'lzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARw' + 'AAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIE' + 'guMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3' + 'd3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYm' + 'xvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3' + 'JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbG' + 'lzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV' + '9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3Rocm' + 'VhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb2' + '5zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbn' + 'RfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcm' + 'M9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcH' + 'N0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYW' + 'xfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8m' + 'KAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4G' + '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' + 'AAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAA' + 'AAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAA' + 'AAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAA' + 'AAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZA' + 'AAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAA' + 'AAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAA' + 'AAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAA' + 'IAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAA' + 'AACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAA' + 'EAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAA' + 'AAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAA' + 'IAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAA' + 'AAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAAD' + 'MAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAA' + 'kAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAA' + 'AAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAA' + 'AEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ' + '0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAA' + 'AAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYX' + 'ZmNTUuMzMuMTAw';
2162
- var blankSources = {
1951
+ const BLANK_AUDIO_SRC = 'data:audio/wav;base64,UklGRjIAAABXQVZFZm10IBA' + 'AAAABAAEAIlYAAESsAAACABAAZGF0YRAAAAAAAAAAAAAAAAAAAAAAAA==';
1952
+ const BLANK_VIDEO_SRC = 'data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAG' + 'lzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARw' + 'AAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIE' + 'guMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3' + 'd3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYm' + 'xvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3' + 'JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbG' + 'lzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV' + '9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3Rocm' + 'VhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb2' + '5zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbn' + 'RfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcm' + 'M9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcH' + 'N0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYW' + 'xfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8m' + 'KAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4G' + 'SAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC' + '/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC' + '/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgC' + 'vAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAh' + 'kAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQ' + 'AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAA' + 'AAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAA' + 'BAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobW' + 'RpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZG' + 'UAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAA' + 'AAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAA' + 'AAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAA' + 'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFW' + 'dCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAA' + 'AAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2' + 'MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAA' + 'AACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAA' + 'oAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAA' + 'AAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABC' + 'UAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAA' + 'AFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAA' + 'AAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAA' + 'AAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAA' + 'AAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAA' + 'AAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAA' + 'AAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZA' + 'AAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAA' + 'AAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAA' + 'AAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAA' + 'IAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAA' + 'AACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAA' + 'EAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAA' + 'AAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAA' + 'IAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAA' + 'AAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAAD' + 'MAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAA' + 'kAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAA' + 'AAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAA' + 'AEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ' + '0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAA' + 'AAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYX' + 'ZmNTUuMzMuMTAw';
1953
+ const blankSources = {
2163
1954
  audio: {
2164
1955
  src: BLANK_AUDIO_SRC,
2165
1956
  type: 'audio/wav'
@@ -2171,221 +1962,191 @@ var blankSources = {
2171
1962
  };
2172
1963
 
2173
1964
  /** @const @enum {string} */
2174
- var MediaType = {
1965
+ const MediaType = {
2175
1966
  AUDIO: 'audio',
2176
1967
  VIDEO: 'video'
2177
1968
  };
2178
- var elId = 0;
1969
+ let elId = 0;
2179
1970
 
2180
1971
  /**
2181
1972
  * Media pool class handles the pool of Videojs media players
2182
1973
  */
2183
- var MediaPool = /*#__PURE__*/function () {
2184
- function MediaPool() {
2185
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
2186
- playerCount: 4
2187
- };
2188
- _classCallCheck(this, MediaPool);
1974
+ class MediaPool {
1975
+ constructor(options = {
1976
+ playerCount: 4
1977
+ }) {
2189
1978
  this.playerCount = options.playerCount;
2190
1979
  this.allocatedPlayers = {};
2191
1980
  this.unAllocatedPlayers = {};
2192
- this.mediaFactory_ = _defineProperty(_defineProperty({}, MediaType.AUDIO, function () {
2193
- var audioEl = document.createElement('audio');
2194
- audioEl.setAttribute('crossorigin', 'anonymous');
2195
- return audioEl;
2196
- }), MediaType.VIDEO, function () {
2197
- var videoEl = document.createElement('video');
2198
- videoEl.setAttribute('crossorigin', 'anonymous');
2199
- return videoEl;
2200
- });
2201
- }
2202
- _createClass(MediaPool, [{
2203
- key: "allocatePlayer",
2204
- value: function allocatePlayer(_ref) {
2205
- var playerType = _ref.playerType,
2206
- playerId = _ref.playerId,
2207
- playsInline = _ref.playsInline,
2208
- mediaEventsContextData = _ref.mediaEventsContextData,
2209
- hooks = _ref.hooks,
2210
- poster = _ref.poster,
2211
- _ref$loop = _ref.loop,
2212
- loop = _ref$loop === void 0 ? false : _ref$loop,
2213
- _ref$controls = _ref.controls,
2214
- controls = _ref$controls === void 0 ? false : _ref$controls,
2215
- altText = _ref.altText,
2216
- onRelease = _ref.onRelease;
2217
- var player = undefined;
2218
- if (!this.unAllocatedPlayers[playerType]) {
2219
- this.populateMediaPool_();
2220
- }
2221
- if (this.unAllocatedPlayers[playerType].length == 0) {
2222
- this.freeOnePlayer(playerType);
2223
- }
2224
- player = this.unAllocatedPlayers[playerType].pop();
2225
- if (player) {
2226
- player.pause();
2227
- player.getMediaElement().loop = loop;
2228
- player.getMediaElement().setAttribute('alt', altText);
2229
- player.poster(poster);
2230
- player.controls(controls);
2231
- if (playsInline) {
2232
- player.playsinline(true);
2233
- }
2234
- player.updateHooks(hooks || {});
2235
- player.updateMediaEventsContext(mediaEventsContextData);
2236
- this.allocatedPlayers[playerType].push(player);
2237
- player.playerId = playerId || this.allocatedPlayers[playerType].length;
2238
- player.releaseCallback = onRelease;
2239
- player.previousSrc = null;
2240
- return player;
2241
- } else {
2242
- console.log('no player found for allocation');
1981
+ this.mediaFactory_ = {
1982
+ [MediaType.AUDIO]: () => {
1983
+ const audioEl = document.createElement('audio');
1984
+ audioEl.setAttribute('crossorigin', 'anonymous');
1985
+ return audioEl;
1986
+ },
1987
+ [MediaType.VIDEO]: () => {
1988
+ const videoEl = document.createElement('video');
1989
+ videoEl.setAttribute('crossorigin', 'anonymous');
1990
+ return videoEl;
2243
1991
  }
2244
- }
2245
- }, {
2246
- key: "freeOnePlayer",
2247
- value: function freeOnePlayer(type) {
2248
- this.unAllocatePlayer(this.allocatedPlayers[type][0]); // free up the first allocated player
2249
- }
2250
- }, {
2251
- key: "unAllocatePlayer",
2252
- value: function unAllocatePlayer(player) {
2253
- if (player) {
2254
- var type = this.getMediaTypeFromEl(player.el());
2255
- this.allocatedPlayers[type] = this.allocatedPlayers[type].filter(function (p) {
2256
- return p != player;
2257
- });
2258
- player.previousSrc = player.currentSrc();
2259
- player.controls(false);
2260
- player.getMediaElement().loop = false;
2261
- player.playsinline(false);
2262
- player.src(blankSources[type]);
2263
- player.poster('');
2264
- clearTextTracks(player);
2265
- this.unAllocatedPlayers[type].push(player);
2266
- if (player.releaseCallback) {
2267
- player.releaseCallback();
2268
- player.releaseCallback = null;
2269
- }
2270
- player.pause();
1992
+ };
1993
+ }
1994
+ allocatePlayer({
1995
+ playerType,
1996
+ playerId,
1997
+ playsInline,
1998
+ mediaEventsContextData,
1999
+ hooks,
2000
+ poster,
2001
+ loop = false,
2002
+ controls = false,
2003
+ altText,
2004
+ onRelease
2005
+ }) {
2006
+ let player = undefined;
2007
+ if (!this.unAllocatedPlayers[playerType]) {
2008
+ this.populateMediaPool_();
2009
+ }
2010
+ if (this.unAllocatedPlayers[playerType].length == 0) {
2011
+ this.freeOnePlayer(playerType);
2012
+ }
2013
+ player = this.unAllocatedPlayers[playerType].pop();
2014
+ if (player) {
2015
+ player.pause();
2016
+ player.getMediaElement().loop = loop;
2017
+ player.getMediaElement().setAttribute('alt', altText);
2018
+ player.poster(poster);
2019
+ player.controls(controls);
2020
+ if (playsInline) {
2021
+ player.playsinline(true);
2271
2022
  }
2023
+ player.updateHooks(hooks || {});
2024
+ player.updateMediaEventsContext(mediaEventsContextData);
2025
+ this.allocatedPlayers[playerType].push(player);
2026
+ player.playerId = playerId || this.allocatedPlayers[playerType].length;
2027
+ player.releaseCallback = onRelease;
2028
+ player.previousSrc = null;
2029
+ player.triggerMediaAllocate();
2030
+ return player;
2031
+ } else {
2032
+ console.log('no player found for allocation');
2272
2033
  }
2273
- }, {
2274
- key: "blessAll",
2275
- value: function blessAll(value) {
2276
- var _this = this;
2277
- if (this.unAllocatedPlayers[MediaType.AUDIO] == undefined || this.unAllocatedPlayers[MediaType.VIDEO] == undefined) {
2278
- this.populateMediaPool_();
2034
+ }
2035
+ freeOnePlayer(type) {
2036
+ this.unAllocatePlayer(this.allocatedPlayers[type][0]); // free up the first allocated player
2037
+ }
2038
+ unAllocatePlayer(player) {
2039
+ if (player) {
2040
+ player.triggerMediaRelease();
2041
+ let type = this.getMediaTypeFromEl(player.el());
2042
+ this.allocatedPlayers[type] = this.allocatedPlayers[type].filter(p => p != player);
2043
+ player.previousSrc = player.currentSrc();
2044
+ player.controls(false);
2045
+ player.getMediaElement().loop = false;
2046
+ player.playsinline(false);
2047
+ player.src(blankSources[type]);
2048
+ player.poster('');
2049
+ clearTextTracks(player);
2050
+ this.unAllocatedPlayers[type].push(player);
2051
+ if (player.releaseCallback) {
2052
+ player.releaseCallback();
2053
+ player.releaseCallback = null;
2279
2054
  }
2280
- this.forEachMediaType(function (key) {
2281
- _this.allPlayersForType(MediaType[key]).forEach(function (player) {
2282
- player.muted(value);
2283
- });
2284
- });
2055
+ player.pause();
2285
2056
  }
2286
- }, {
2287
- key: "allPlayersForType",
2288
- value: function allPlayersForType(type) {
2289
- if (this.unAllocatedPlayers[type]) {
2290
- return [].concat(_toConsumableArray(this.unAllocatedPlayers[type]), _toConsumableArray(this.allocatedPlayers[type]));
2291
- }
2292
- return [];
2293
- }
2294
- }, {
2295
- key: "getMediaTypeFromEl",
2296
- value: function getMediaTypeFromEl(mediaElement) {
2297
- var tagName = mediaElement.tagName.toLowerCase();
2298
- if (tagName == 'div') {
2299
- tagName = mediaElement.children[0].tagName.toLowerCase();
2300
- }
2301
- return this.getMediaType(tagName);
2302
- }
2303
- }, {
2304
- key: "getMediaType",
2305
- value: function getMediaType(tagName) {
2306
- switch (tagName) {
2307
- case 'audio':
2308
- return MediaType.AUDIO;
2309
- case 'video':
2310
- return MediaType.VIDEO;
2311
- }
2057
+ }
2058
+ blessAll(value) {
2059
+ if (this.unAllocatedPlayers[MediaType.AUDIO] == undefined || this.unAllocatedPlayers[MediaType.VIDEO] == undefined) {
2060
+ this.populateMediaPool_();
2312
2061
  }
2313
- }, {
2314
- key: "forEachMediaType",
2315
- value: function forEachMediaType(callbackFn) {
2316
- Object.keys(MediaType).forEach(callbackFn.bind(this));
2317
- }
2318
- }, {
2319
- key: "createPlayer_",
2320
- value: function createPlayer_(type, mediaEl) {
2321
- mediaEl.setAttribute('pool-element', elId++);
2322
- if (!this.unAllocatedPlayers[type]) {
2323
- this.unAllocatedPlayers[type] = [];
2324
- this.allocatedPlayers[type] = [];
2325
- }
2326
- var player = createMediaPlayer({
2327
- mediaElement: mediaEl,
2328
- tagName: type
2062
+ this.forEachMediaType(key => {
2063
+ this.allPlayersForType(MediaType[key]).forEach(player => {
2064
+ player.muted(value);
2329
2065
  });
2330
- mediaEl.setAttribute('src', blankSources[type].src);
2331
- player.muted(true);
2332
- this.unAllocatedPlayers[type].push(player);
2333
- return player;
2066
+ });
2067
+ }
2068
+ allPlayersForType(type) {
2069
+ if (this.unAllocatedPlayers[type]) {
2070
+ return [...this.unAllocatedPlayers[type], ...this.allocatedPlayers[type]];
2334
2071
  }
2335
- }, {
2336
- key: "initializeMediaPool_",
2337
- value: function initializeMediaPool_(type, mediaElSeed) {
2338
- var playerCount = typeof this.playerCount === 'function' ? this.playerCount(type) : this.playerCount;
2339
- while (this.allPlayersForType(type).length < playerCount) {
2340
- this.createPlayer_(type, mediaElSeed.cloneNode(true));
2341
- }
2072
+ return [];
2073
+ }
2074
+ getMediaTypeFromEl(mediaElement) {
2075
+ let tagName = mediaElement.tagName.toLowerCase();
2076
+ if (tagName == 'div') {
2077
+ tagName = mediaElement.children[0].tagName.toLowerCase();
2342
2078
  }
2343
- }, {
2344
- key: "populateMediaPool_",
2345
- value: function populateMediaPool_() {
2346
- var _this2 = this;
2347
- this.forEachMediaType(function (key) {
2348
- var type = MediaType[key];
2349
- var mediaEl = _this2.mediaFactory_[type].call(_this2);
2350
- _this2.initializeMediaPool_(type, mediaEl);
2351
- });
2079
+ return this.getMediaType(tagName);
2080
+ }
2081
+ getMediaType(tagName) {
2082
+ switch (tagName) {
2083
+ case 'audio':
2084
+ return MediaType.AUDIO;
2085
+ case 'video':
2086
+ return MediaType.VIDEO;
2352
2087
  }
2353
- }]);
2354
- return MediaPool;
2355
- }();
2088
+ }
2089
+ forEachMediaType(callbackFn) {
2090
+ Object.keys(MediaType).forEach(callbackFn.bind(this));
2091
+ }
2092
+ createPlayer_(type, mediaEl) {
2093
+ mediaEl.setAttribute('pool-element', elId++);
2094
+ if (!this.unAllocatedPlayers[type]) {
2095
+ this.unAllocatedPlayers[type] = [];
2096
+ this.allocatedPlayers[type] = [];
2097
+ }
2098
+ let player = createMediaPlayer({
2099
+ mediaElement: mediaEl,
2100
+ tagName: type
2101
+ });
2102
+ mediaEl.setAttribute('src', blankSources[type].src);
2103
+ player.muted(true);
2104
+ this.unAllocatedPlayers[type].push(player);
2105
+ return player;
2106
+ }
2107
+ initializeMediaPool_(type, mediaElSeed) {
2108
+ const playerCount = typeof this.playerCount === 'function' ? this.playerCount(type) : this.playerCount;
2109
+ while (this.allPlayersForType(type).length < playerCount) {
2110
+ this.createPlayer_(type, mediaElSeed.cloneNode(true));
2111
+ }
2112
+ }
2113
+ populateMediaPool_() {
2114
+ this.forEachMediaType(key => {
2115
+ let type = MediaType[key];
2116
+ let mediaEl = this.mediaFactory_[type].call(this);
2117
+ this.initializeMediaPool_(type, mediaEl);
2118
+ });
2119
+ }
2120
+ }
2356
2121
  function clearTextTracks(player) {
2357
- var tracks = player.textTracks();
2358
- var i = tracks.length;
2122
+ const tracks = player.textTracks();
2123
+ let i = tracks.length;
2359
2124
  while (i--) {
2360
2125
  player.removeRemoteTextTrack(tracks[i]);
2361
2126
  }
2362
2127
  }
2363
2128
 
2364
- var media = {
2129
+ const media = {
2365
2130
  playerPool: new MediaPool({
2366
- playerCount: function playerCount() {
2367
- return features.isEnabled('large_player_pool') ? 10 : 4;
2368
- }
2131
+ playerCount: () => features.isEnabled('large_player_pool') ? 10 : 4
2369
2132
  }),
2370
2133
  muteState: true,
2371
2134
  get muted() {
2372
2135
  return this.muteState;
2373
2136
  },
2374
- mute: function mute(value) {
2137
+ mute: function (value) {
2375
2138
  this.muteState = value;
2376
2139
  this.playerPool.blessAll(value);
2377
2140
  this.trigger('change:muted', value);
2378
2141
  },
2379
- getPlayer: function getPlayer(fileSource, options) {
2142
+ getPlayer: function (fileSource, options) {
2380
2143
  options.playerType = options.tagName || MediaType.VIDEO;
2381
- var player = this.playerPool.allocatePlayer(options);
2144
+ let player = this.playerPool.allocatePlayer(options);
2382
2145
  if (player) {
2383
2146
  player.muted(this.muteState);
2384
2147
  player.src(fileSource);
2385
2148
  if (options.textTrackSources) {
2386
- options.textTrackSources.forEach(function (track) {
2387
- return player.addRemoteTextTrack(track, true);
2388
- });
2149
+ options.textTrackSources.forEach(track => player.addRemoteTextTrack(track, true));
2389
2150
  }
2390
2151
  if (browser.has('video scaling bug fixed by load')) {
2391
2152
  player.load();
@@ -2393,7 +2154,7 @@ var media = {
2393
2154
  return player;
2394
2155
  }
2395
2156
  },
2396
- releasePlayer: function releasePlayer(player) {
2157
+ releasePlayer: function (player) {
2397
2158
  if (player) {
2398
2159
  this.playerPool.unAllocatePlayer(player);
2399
2160
  }
@@ -2406,7 +2167,7 @@ Object.assign(media, BackboneEvents);
2406
2167
  *
2407
2168
  * @class
2408
2169
  */
2409
- var MultiPlayer = function MultiPlayer(pool, options) {
2170
+ const MultiPlayer = function (pool, options) {
2410
2171
  if (options.crossFade && options.playFromBeginning) {
2411
2172
  throw 'pageflow.Audio.MultiPlayer: The options crossFade and playFromBeginning can not be used together at the moment.';
2412
2173
  }
@@ -2501,12 +2262,12 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2501
2262
  }
2502
2263
  }
2503
2264
  function startEventPropagation(player, id) {
2504
- var playCallback = function playCallback() {
2265
+ let playCallback = function () {
2505
2266
  that.trigger('play', {
2506
2267
  audioFileId: id
2507
2268
  });
2508
2269
  };
2509
- var pauseCallback = function pauseCallback() {
2270
+ let pauseCallback = function () {
2510
2271
  that.trigger('pause', {
2511
2272
  audioFileId: id
2512
2273
  });
@@ -2514,17 +2275,17 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2514
2275
  player._stopMultiPlayerEventPropagation();
2515
2276
  }
2516
2277
  };
2517
- var timeUpdateCallback = function timeUpdateCallback() {
2278
+ let timeUpdateCallback = function () {
2518
2279
  that.trigger('timeupdate', {
2519
2280
  audioFileId: id
2520
2281
  });
2521
2282
  };
2522
- var endedCallback = function endedCallback() {
2283
+ let endedCallback = function () {
2523
2284
  that.trigger('ended', {
2524
2285
  audioFileId: id
2525
2286
  });
2526
2287
  };
2527
- var playFailedCallback = function playFailedCallback() {
2288
+ let playFailedCallback = function () {
2528
2289
  that.trigger('playfailed', {
2529
2290
  audioFileId: id
2530
2291
  });
@@ -2545,16 +2306,16 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2545
2306
  };
2546
2307
  Object.assign(MultiPlayer.prototype, BackboneEvents);
2547
2308
 
2548
- var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2549
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
2550
- playerOptions = _ref.playerOptions;
2309
+ const PlayerSourceIDMap = function (media, {
2310
+ playerOptions
2311
+ } = {}) {
2551
2312
  return {
2552
2313
  current: undefined,
2553
2314
  previous: undefined,
2554
- mapSources: function mapSources(id, sources) {
2315
+ mapSources: function (id, sources) {
2555
2316
  this[id] = sources;
2556
2317
  },
2557
- get: function get(sourceID) {
2318
+ get: function (sourceID) {
2558
2319
  if (!this[sourceID]) {
2559
2320
  return new AudioPlayer.Null();
2560
2321
  }
@@ -2562,7 +2323,7 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2562
2323
  return this.current;
2563
2324
  }
2564
2325
  if (this.previous && this.previous.playerId === sourceID) {
2565
- var holder = this.current;
2326
+ let holder = this.current;
2566
2327
  this.current = this.previous;
2567
2328
  this.previous = holder;
2568
2329
  } else {
@@ -2570,17 +2331,18 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2570
2331
  media.releasePlayer(this.previous);
2571
2332
  }
2572
2333
  this.previous = this.current;
2573
- this.current = media.getPlayer(this[sourceID], _objectSpread2({
2334
+ this.current = media.getPlayer(this[sourceID], {
2574
2335
  filePermaId: sourceID,
2575
- playerId: sourceID
2576
- }, playerOptions));
2336
+ playerId: sourceID,
2337
+ ...playerOptions
2338
+ });
2577
2339
  }
2578
2340
  return this.current;
2579
2341
  }
2580
2342
  };
2581
2343
  };
2582
2344
 
2583
- var PlayerPool = function PlayerPool(audio, options) {
2345
+ const PlayerPool = function (audio, options) {
2584
2346
  this.players = {};
2585
2347
  this.get = function (audioFileId) {
2586
2348
  this.players[audioFileId] = this.players[audioFileId] || audio.createPlayer(audioFileId, options);
@@ -2596,7 +2358,7 @@ var PlayerPool = function PlayerPool(audio, options) {
2596
2358
  * @alias pageflow.audio
2597
2359
  * @member
2598
2360
  */
2599
- var Audio = function Audio(options) {
2361
+ const Audio = function (options) {
2600
2362
  this.getSources = options.getSources || function (audioFileId) {
2601
2363
  return options.audioFiles[audioFileId] || '';
2602
2364
  };
@@ -2617,9 +2379,10 @@ var Audio = function Audio(options) {
2617
2379
  this.createPlayer = function (audioFileId, options) {
2618
2380
  var sources = this.getSources(removeSuffix(audioFileId));
2619
2381
  if (sources) {
2620
- return new AudioPlayer(sources, _objectSpread2({
2621
- volumeFading: true
2622
- }, options));
2382
+ return new AudioPlayer(sources, {
2383
+ volumeFading: true,
2384
+ ...options
2385
+ });
2623
2386
  } else {
2624
2387
  return new AudioPlayer.Null();
2625
2388
  }
@@ -2659,10 +2422,10 @@ Audio.setup = function (options) {
2659
2422
 
2660
2423
  Audio.PlayerPool = PlayerPool;
2661
2424
 
2662
- var isEventAdded = false;
2663
- var callbacks = [];
2664
- var muteInBackground = function muteInBackground() {
2665
- callbacks.forEach(function (cb) {
2425
+ let isEventAdded = false;
2426
+ let callbacks = [];
2427
+ let muteInBackground = () => {
2428
+ callbacks.forEach(cb => {
2666
2429
  cb(document.visibilityState);
2667
2430
  });
2668
2431
  };
@@ -2673,14 +2436,12 @@ function documentHiddenState(callback) {
2673
2436
  document.addEventListener('visibilitychange', muteInBackground, false);
2674
2437
  }
2675
2438
  return {
2676
- removeCallback: function removeCallback() {
2677
- callbacks = callbacks.filter(function (c) {
2678
- return c !== callback;
2679
- });
2439
+ removeCallback: () => {
2440
+ callbacks = callbacks.filter(c => c !== callback);
2680
2441
  }
2681
2442
  };
2682
2443
  }
2683
2444
 
2684
- var consent = Consent.create();
2445
+ const consent = Consent.create();
2685
2446
 
2686
2447
  export { Audio, AudioPlayer, Consent, Features, MediaPool, MediaType, MultiPlayer, PlayerSourceIDMap, VideoPlayer, assetUrls, audioContext, blankSources, browser, consent, cookies, debugMode, documentHiddenState, events, features, log, media, mediaPlayer, setItemCookieString, settings };