pageflow 17.0.5 → 17.1.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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +362 -35
  3. data/README.md +0 -1
  4. data/admins/pageflow/accounts.rb +16 -14
  5. data/admins/pageflow/entry.rb +68 -20
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +4 -4
  9. data/admins/pageflow/revisions.rb +5 -5
  10. data/admins/pageflow/site_root_entry.rb +64 -0
  11. data/admins/pageflow/sites.rb +12 -3
  12. data/admins/pageflow/translations.rb +75 -0
  13. data/admins/pageflow/user.rb +21 -35
  14. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  15. data/app/assets/javascripts/pageflow/dist/ui.js +2865 -257
  16. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  17. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +2 -1
  18. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +6 -0
  19. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
  20. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +7 -1
  21. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -1
  22. data/app/assets/stylesheets/pageflow/editor/files.scss +28 -16
  23. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +24 -0
  24. data/app/assets/stylesheets/pageflow/editor/info_box.scss +11 -3
  25. data/app/assets/stylesheets/pageflow/editor/list.scss +6 -4
  26. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  27. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  28. data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
  29. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  30. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  31. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
  32. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +8 -0
  33. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  34. data/app/assets/stylesheets/pageflow/ui/properties.scss +5 -0
  35. data/app/assets/stylesheets/pageflow/ui.scss +1 -0
  36. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  37. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  38. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  39. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  40. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  41. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  42. data/app/controllers/pageflow/application_controller.rb +19 -19
  43. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  44. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  45. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  46. data/app/controllers/pageflow/editor/entries_controller.rb +2 -1
  47. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  48. data/app/controllers/pageflow/editor/file_import_controller.rb +3 -3
  49. data/app/controllers/pageflow/editor/files_controller.rb +7 -6
  50. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  51. data/app/controllers/pageflow/entries_controller.rb +77 -17
  52. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  53. data/app/controllers/pageflow/files_controller.rb +1 -0
  54. data/app/controllers/pageflow/pages_controller.rb +4 -2
  55. data/app/controllers/pageflow/revisions_controller.rb +2 -1
  56. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  57. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  58. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  59. data/app/helpers/pageflow/admin/entries_helper.rb +1 -1
  60. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  61. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  62. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  63. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  64. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  65. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  66. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  67. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  68. data/app/helpers/pageflow/admin/widgets_helper.rb +3 -3
  69. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  70. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  71. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  72. data/app/helpers/pageflow/common_entry_seed_helper.rb +2 -4
  73. data/app/helpers/pageflow/editor/config_helper.rb +1 -1
  74. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  75. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  76. data/app/helpers/pageflow/entries_helper.rb +58 -34
  77. data/app/helpers/pageflow/entry_json_seed_helper.rb +3 -2
  78. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  79. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  80. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  81. data/app/helpers/pageflow/files_helper.rb +5 -4
  82. data/app/helpers/pageflow/folders_helper.rb +8 -5
  83. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  84. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  85. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  86. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  87. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  88. data/app/helpers/pageflow/overview_helper.rb +1 -1
  89. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  90. data/app/helpers/pageflow/pages_helper.rb +29 -15
  91. data/app/helpers/pageflow/public_i18n_helper.rb +1 -1
  92. data/app/helpers/pageflow/quota_helper.rb +4 -4
  93. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  94. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  95. data/app/helpers/pageflow/sites_helper.rb +3 -3
  96. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  97. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  98. data/app/helpers/pageflow/structured_data_helper.rb +1 -1
  99. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  100. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  101. data/app/helpers/pageflow/themes_helper.rb +1 -1
  102. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  103. data/app/helpers/pageflow/widgets_helper.rb +7 -6
  104. data/app/inputs/pageflow_permalink_input.rb +3 -2
  105. data/app/jobs/pageflow/application_job.rb +1 -0
  106. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  107. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  108. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  109. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  110. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  111. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  112. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  113. data/app/mailers/pageflow/user_mailer.rb +1 -0
  114. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +13 -1
  115. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  116. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  117. data/app/models/concerns/pageflow/output_source.rb +3 -3
  118. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  119. data/app/models/concerns/pageflow/reusable_file.rb +23 -23
  120. data/app/models/concerns/pageflow/serialization_blacklist.rb +1 -1
  121. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  122. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  123. data/app/models/concerns/pageflow/translatable.rb +62 -0
  124. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  125. data/app/models/pageflow/account.rb +6 -5
  126. data/app/models/pageflow/account_member_query.rb +1 -1
  127. data/app/models/pageflow/account_role_query.rb +1 -1
  128. data/app/models/pageflow/application_query.rb +1 -1
  129. data/app/models/pageflow/application_record.rb +1 -1
  130. data/app/models/pageflow/audio_file.rb +4 -4
  131. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  132. data/app/models/pageflow/authentication_token.rb +2 -2
  133. data/app/models/pageflow/chapter.rb +6 -1
  134. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  135. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  136. data/app/models/pageflow/customized_theme.rb +6 -6
  137. data/app/models/pageflow/draft_entry.rb +37 -9
  138. data/app/models/pageflow/edit_lock.rb +19 -21
  139. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  140. data/app/models/pageflow/entries_feed.rb +2 -2
  141. data/app/models/pageflow/entry.rb +44 -30
  142. data/app/models/pageflow/entry_at_revision.rb +5 -1
  143. data/app/models/pageflow/entry_duplicate.rb +8 -5
  144. data/app/models/pageflow/entry_publication.rb +2 -2
  145. data/app/models/pageflow/entry_role_query.rb +4 -4
  146. data/app/models/pageflow/entry_template.rb +4 -4
  147. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  148. data/app/models/pageflow/entry_translation_group.rb +42 -0
  149. data/app/models/pageflow/file_reuse.rb +2 -2
  150. data/app/models/pageflow/file_usage.rb +10 -3
  151. data/app/models/pageflow/folder.rb +2 -2
  152. data/app/models/pageflow/home_button.rb +7 -7
  153. data/app/models/pageflow/image_file.rb +20 -5
  154. data/app/models/pageflow/image_file_url_templates.rb +1 -1
  155. data/app/models/pageflow/invitation_form.rb +2 -1
  156. data/app/models/pageflow/managed_user_query.rb +1 -1
  157. data/app/models/pageflow/membership.rb +5 -5
  158. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  159. data/app/models/pageflow/null_user.rb +1 -1
  160. data/app/models/pageflow/overview_button.rb +1 -1
  161. data/app/models/pageflow/page.rb +7 -3
  162. data/app/models/pageflow/permalink.rb +23 -2
  163. data/app/models/pageflow/permalink_directory.rb +7 -0
  164. data/app/models/pageflow/permalink_redirect.rb +7 -0
  165. data/app/models/pageflow/positioned_file.rb +5 -5
  166. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  167. data/app/models/pageflow/potential_memberships.rb +5 -4
  168. data/app/models/pageflow/published_entry.rb +62 -11
  169. data/app/models/pageflow/revision.rb +24 -15
  170. data/app/models/pageflow/roles.rb +14 -18
  171. data/app/models/pageflow/site.rb +36 -3
  172. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  173. data/app/models/pageflow/sitemaps.rb +10 -1
  174. data/app/models/pageflow/storyline.rb +5 -2
  175. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  176. data/app/models/pageflow/text_track_file.rb +1 -1
  177. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  178. data/app/models/pageflow/theme_customization_file.rb +3 -2
  179. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  180. data/app/models/pageflow/url_template.rb +1 -1
  181. data/app/models/pageflow/used_file.rb +7 -3
  182. data/app/models/pageflow/user_name_query.rb +2 -2
  183. data/app/models/pageflow/video_file.rb +22 -15
  184. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  185. data/app/models/pageflow/widget.rb +4 -3
  186. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  187. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  188. data/app/policies/pageflow/account_policy.rb +3 -1
  189. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  190. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  191. data/app/policies/pageflow/application_policy.rb +2 -0
  192. data/app/policies/pageflow/entry_policy.rb +7 -1
  193. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  194. data/app/policies/pageflow/file_policy.rb +4 -7
  195. data/app/policies/pageflow/folder_policy.rb +18 -8
  196. data/app/policies/pageflow/membership_policy.rb +6 -4
  197. data/app/policies/pageflow/site_policy.rb +10 -3
  198. data/app/policies/pageflow/user_policy.rb +6 -4
  199. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  200. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  201. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  202. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  203. data/app/views/admin/entries/_form.html.erb +2 -1
  204. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  205. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  206. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  207. data/app/views/admin/sites/_fields.html.erb +14 -1
  208. data/app/views/admin/translations/_form.html.erb +31 -0
  209. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  210. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  211. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  212. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  213. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  214. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  215. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  216. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  217. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  218. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  219. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  220. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  221. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  222. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  223. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  224. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  225. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  226. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  227. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  228. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  229. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  230. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  231. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  232. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  233. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -1
  234. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  235. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  236. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  237. data/app/views/pageflow/editor/files/_file.json.jbuilder +5 -13
  238. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  239. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  240. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  241. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -3
  242. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  243. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  244. data/app/views/pageflow/files/_file.json.jbuilder +3 -3
  245. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  246. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  247. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  248. data/config/initializers/active_admin_patches.rb +3 -6
  249. data/config/initializers/admin_resource_tabs.rb +3 -0
  250. data/config/initializers/paperclip.rb +1 -0
  251. data/config/initializers/symmetric_encryption.rb +1 -1
  252. data/config/initializers/zencoder.rb +24 -13
  253. data/config/locales/de.yml +110 -4
  254. data/config/locales/en.yml +109 -7
  255. data/config/routes.rb +15 -13
  256. data/config/spring.rb +2 -1
  257. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  258. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  259. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  260. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  261. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  262. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  263. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  264. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  265. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  266. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  267. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  268. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  269. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  270. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  271. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  272. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  273. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  274. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  275. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  276. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  277. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  278. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +3912 -1486
  279. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +468 -1161
  280. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +28125 -22
  281. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +26589 -19
  282. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  283. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  284. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  285. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  286. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  287. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  288. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  289. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  290. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  291. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  292. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +2 -2
  293. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
  294. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -1
  295. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +2 -2
  296. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +1 -0
  297. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +2 -1
  298. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +60 -6
  299. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +16 -2
  300. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +21 -23
  301. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +16 -1
  302. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  303. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +12 -0
  304. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  305. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +19 -1
  306. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  307. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  308. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +2 -0
  309. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +17 -9
  310. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  311. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +25 -5
  312. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  313. data/entry_types/scrolled/config/locales/de.yml +614 -45
  314. data/entry_types/scrolled/config/locales/en.yml +586 -47
  315. data/entry_types/scrolled/config/routes.rb +18 -8
  316. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  317. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  318. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  319. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  320. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  321. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  322. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  323. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +16 -4
  324. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  325. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -4
  326. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +24 -22
  327. data/entry_types/scrolled/lib/pageflow_scrolled.rb +1 -1
  328. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +6 -5
  329. data/entry_types/scrolled/package/config/webpack.js +22 -0
  330. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  331. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1529 -0
  332. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  333. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +59 -0
  334. data/entry_types/scrolled/package/contentElements-editor.js +2075 -321
  335. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  336. data/entry_types/scrolled/package/contentElements-frontend.js +1019 -643
  337. data/entry_types/scrolled/package/editor.js +2086 -1091
  338. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-ebd22921.js → FloatingPortalRootProvider-51914be7.js} +1200 -1258
  339. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-9f76033e.js} +7 -8
  340. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +1932 -0
  341. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-788e9cdb.js +39 -0
  342. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-0345ce57.js} +36 -63
  343. data/entry_types/scrolled/package/frontend/{Viewer-1ecf3375.js → Viewer-cdc549cc.js} +15 -22
  344. data/entry_types/scrolled/package/frontend/{Wavesurfer-7d9cf1b7.js → Wavesurfer-1cdc3925.js} +54 -74
  345. data/entry_types/scrolled/package/frontend/{components-024a9893.js → components-96660ffd.js} +1791 -841
  346. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-eb670c2f.js} +11 -18
  347. data/entry_types/scrolled/package/frontend/index.css +1 -1
  348. data/entry_types/scrolled/package/frontend/index.js +517 -903
  349. data/entry_types/scrolled/package/frontend/{createSuper-d0f30da3.js → inherits-539844a6.js} +40 -56
  350. data/entry_types/scrolled/package/frontend/{useContentElementEditorState-4f4c3cf6.js → useContentElementEditorState-77fe6c79.js} +7 -8
  351. data/entry_types/scrolled/package/frontend/usePhonePlatform-c2ba875d.js +8 -0
  352. data/entry_types/scrolled/package/frontend-server.js +0 -1
  353. data/entry_types/scrolled/package/package.json +18 -10
  354. data/entry_types/scrolled/package/testHelpers.js +306 -70
  355. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  356. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  357. data/entry_types/scrolled/package/widgets/consentBar.js +47 -66
  358. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  359. data/entry_types/scrolled/package/widgets/defaultNavigation.js +177 -207
  360. data/entry_types/scrolled/package/widgets/excursionDialog.css +1 -0
  361. data/entry_types/scrolled/package/widgets/excursionDialog.js +109 -0
  362. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  363. data/entry_types/scrolled/package/widgets/excursionSheet.js +262 -0
  364. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  365. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +6 -9
  366. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  367. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +48 -0
  368. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  369. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +144 -0
  370. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  371. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +26 -9
  372. data/entry_types/scrolled/package/widgets-server.js +1 -0
  373. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  374. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  375. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  376. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  377. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  378. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  379. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  380. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  381. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  382. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  383. data/lib/generators/pageflow/resque/resque_generator.rb +6 -4
  384. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  385. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  386. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  387. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  388. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  389. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  390. data/lib/pageflow/ability_mixin.rb +25 -15
  391. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  392. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  393. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  394. data/lib/pageflow/additional_headers.rb +27 -0
  395. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  396. data/lib/pageflow/admin/tabs.rb +1 -1
  397. data/lib/pageflow/built_in_file_type.rb +1 -1
  398. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  399. data/lib/pageflow/built_in_widget_type.rb +2 -2
  400. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  401. data/lib/pageflow/configuration.rb +141 -18
  402. data/lib/pageflow/cutoff_modes.rb +39 -0
  403. data/lib/pageflow/editor_controller.rb +6 -10
  404. data/lib/pageflow/engine.rb +4 -5
  405. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  406. data/lib/pageflow/entry_export_import/entry_serialization.rb +5 -4
  407. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  408. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +1 -1
  409. data/lib/pageflow/entry_export_import.rb +3 -3
  410. data/lib/pageflow/entry_types.rb +2 -2
  411. data/lib/pageflow/feature.rb +1 -1
  412. data/lib/pageflow/features.rb +4 -6
  413. data/lib/pageflow/file_importers.rb +4 -4
  414. data/lib/pageflow/file_type.rb +3 -3
  415. data/lib/pageflow/file_types.rb +3 -3
  416. data/lib/pageflow/global_config_api.rb +5 -6
  417. data/lib/pageflow/help_entries.rb +7 -7
  418. data/lib/pageflow/help_entry.rb +1 -1
  419. data/lib/pageflow/hooks.rb +1 -1
  420. data/lib/pageflow/nested_revision_component.rb +9 -27
  421. data/lib/pageflow/news_item_api.rb +1 -1
  422. data/lib/pageflow/page_type.rb +2 -3
  423. data/lib/pageflow/page_types.rb +3 -3
  424. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  425. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  426. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  427. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  428. data/lib/pageflow/plugin.rb +1 -2
  429. data/lib/pageflow/quota.rb +9 -5
  430. data/lib/pageflow/quotas.rb +1 -1
  431. data/lib/pageflow/rails_version.rb +1 -0
  432. data/lib/pageflow/react.rb +1 -1
  433. data/lib/pageflow/revision_component.rb +8 -40
  434. data/lib/pageflow/revision_components.rb +16 -6
  435. data/lib/pageflow/seeds.rb +12 -16
  436. data/lib/pageflow/theme.rb +1 -1
  437. data/lib/pageflow/theme_customizations.rb +10 -10
  438. data/lib/pageflow/themes.rb +3 -3
  439. data/lib/pageflow/user_mixin.rb +6 -6
  440. data/lib/pageflow/version.rb +1 -1
  441. data/lib/pageflow/widget_type.rb +4 -4
  442. data/lib/pageflow/widget_types.rb +9 -9
  443. data/lib/pageflow/zencoder_api.rb +32 -42
  444. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  445. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  446. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  447. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  448. data/lib/pageflow.rb +7 -2
  449. data/lib/tasks/pageflow_tasks.rake +1 -1
  450. data/package/editor.js +954 -868
  451. data/package/frontend.js +113 -387
  452. data/package/package.json +2 -1
  453. data/package/testHelpers.js +10 -56
  454. data/package/ui.js +209 -251
  455. data/spec/factories/accounts.rb +37 -22
  456. data/spec/factories/audio_files.rb +2 -2
  457. data/spec/factories/authentication_tokens.rb +4 -4
  458. data/spec/factories/chapters.rb +4 -4
  459. data/spec/factories/draft_entries.rb +14 -6
  460. data/spec/factories/edit_locks.rb +1 -1
  461. data/spec/factories/entries.rb +28 -19
  462. data/spec/factories/entry_translation_groups.rb +6 -0
  463. data/spec/factories/file_usages.rb +2 -1
  464. data/spec/factories/folders.rb +1 -1
  465. data/spec/factories/image_files.rb +2 -2
  466. data/spec/factories/pages.rb +3 -3
  467. data/spec/factories/published_entries.rb +26 -8
  468. data/spec/factories/revisions.rb +1 -1
  469. data/spec/factories/sites.rb +6 -0
  470. data/spec/factories/test_multi_attachment_files.rb +1 -1
  471. data/spec/factories/text_track_files.rb +1 -1
  472. data/spec/factories/uploadable_files.rb +1 -1
  473. data/spec/factories/users.rb +6 -6
  474. data/spec/factories/video_files.rb +2 -2
  475. data/spec/factories/widgets.rb +1 -1
  476. data/spec/fixtures/7x15_rotated.jpg +0 -0
  477. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  478. metadata +98 -45
  479. data/config/initializers/revision_components.rb +0 -5
  480. data/config/locales/twitter_to_x.de.yml +0 -6
  481. data/config/locales/twitter_to_x.en.yml +0 -6
  482. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  483. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  484. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  485. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  486. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  487. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  488. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
@@ -1,8 +1,11 @@
1
- import React, { useEffect } from 'react';
2
- import { render } from '@testing-library/react';
1
+ import React, { useEffect, useState, useContext } from 'react';
2
+ import { DndProvider } from 'react-dnd';
3
+ import { HTML5Backend } from 'react-dnd-html5-backend';
4
+ import BackboneEvents from 'backbone-events-standalone';
5
+ import { render, act } from '@testing-library/react';
6
+ import { RootProviders, useEntryStateDispatch, ContentElementLifecycleContext, ContentElementEditorStateContext, PhonePlatformContext, ContentElementAttributesProvider, ContentElementEditorCommandEmitterContext } from 'pageflow-scrolled/frontend';
3
7
  import { renderHook } from '@testing-library/react-hooks/dom';
4
8
  import { Consent } from 'pageflow/frontend';
5
- import { RootProviders, useEntryStateDispatch } from 'pageflow-scrolled/frontend';
6
9
 
7
10
  function _defineProperty(obj, key, value) {
8
11
  if (key in obj) {
@@ -73,6 +76,7 @@ function _objectSpread2(target) {
73
76
  * @param {Array} [options.videoFiles] - Array of objects with video file attributes of entry.
74
77
  * @param {Array} [options.audioFiles] - Array of objects with audio file attributes of entry.
75
78
  * @param {Array} [options.textTrackFiles] - Array of objects with text track file attributes of entry.
79
+ * @param {Array} [options.storylines] - Array of objects with storyline attributes of entry.
76
80
  * @param {Array} [options.chapters] - Array of objects with chapter attributes of entry.
77
81
  * @param {Array} [options.sections] - Array of objects with section attributes of entry.
78
82
  * @param {Array} [options.contentElements] - Array of objects with content element attributes of entry.
@@ -81,37 +85,43 @@ function _objectSpread2(target) {
81
85
  */
82
86
  function normalizeSeed() {
83
87
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
84
- imageFileUrlTemplates = _ref.imageFileUrlTemplates,
85
- fileUrlTemplates = _ref.fileUrlTemplates,
86
- fileModelTypes = _ref.fileModelTypes,
87
- prettyUrl = _ref.prettyUrl,
88
- shareUrlTemplates = _ref.shareUrlTemplates,
89
- defaultFileRights = _ref.defaultFileRights,
90
- legalInfo = _ref.legalInfo,
91
- themeOptions = _ref.themeOptions,
92
- themeAssets = _ref.themeAssets,
93
- entry = _ref.entry,
94
- imageFiles = _ref.imageFiles,
95
- videoFiles = _ref.videoFiles,
96
- audioFiles = _ref.audioFiles,
97
- textTrackFiles = _ref.textTrackFiles,
98
- chapters = _ref.chapters,
99
- sections = _ref.sections,
100
- contentElements = _ref.contentElements,
101
- widgets = _ref.widgets,
102
- additionalSeedData = _ref.additionalSeedData,
103
- consentVendors = _ref.consentVendors,
104
- contentElementConsentVendors = _ref.contentElementConsentVendors,
105
- fileLicenses = _ref.fileLicenses;
106
-
88
+ imageFileUrlTemplates = _ref.imageFileUrlTemplates,
89
+ fileUrlTemplates = _ref.fileUrlTemplates,
90
+ fileModelTypes = _ref.fileModelTypes,
91
+ prettyUrl = _ref.prettyUrl,
92
+ shareUrlTemplates = _ref.shareUrlTemplates,
93
+ defaultFileRights = _ref.defaultFileRights,
94
+ legalInfo = _ref.legalInfo,
95
+ themeOptions = _ref.themeOptions,
96
+ themeAssets = _ref.themeAssets,
97
+ entry = _ref.entry,
98
+ imageFiles = _ref.imageFiles,
99
+ videoFiles = _ref.videoFiles,
100
+ audioFiles = _ref.audioFiles,
101
+ textTrackFiles = _ref.textTrackFiles,
102
+ storylines = _ref.storylines,
103
+ chapters = _ref.chapters,
104
+ sections = _ref.sections,
105
+ contentElements = _ref.contentElements,
106
+ widgets = _ref.widgets,
107
+ additionalSeedData = _ref.additionalSeedData,
108
+ consentVendors = _ref.consentVendors,
109
+ contentElementConsentVendors = _ref.contentElementConsentVendors,
110
+ cutOff = _ref.cutOff,
111
+ fileLicenses = _ref.fileLicenses,
112
+ entryTranslations = _ref.entryTranslations;
107
113
  var entries = entry ? [entry] : [{}];
108
- var normalizedEntries = normalizeCollection(entries);
114
+ var normalizedEntries = normalizeCollection(entries, {
115
+ locale: 'en',
116
+ configuration: {}
117
+ });
109
118
  var normalizedContentElements = normalizeCollection(contentElements, {
110
119
  typeName: 'textBlock',
111
120
  configuration: {}
112
121
  });
113
122
  var normalizedSections = normalizeSections(sections, normalizedContentElements);
114
123
  var normalizedChapters = normalizeChapters(chapters, normalizedSections);
124
+ var normalizedStorylines = normalizeStorylines(storylines, normalizedChapters);
115
125
  return {
116
126
  config: {
117
127
  fileUrlTemplates: _objectSpread2({
@@ -139,7 +149,9 @@ function normalizeSeed() {
139
149
  },
140
150
  consentVendors: consentVendors || [],
141
151
  contentElementConsentVendors: contentElementConsentVendors || {},
142
- fileLicenses: fileLicenses || {}
152
+ cutOff: cutOff,
153
+ fileLicenses: fileLicenses || {},
154
+ entryTranslations: entryTranslations || []
143
155
  },
144
156
  collections: {
145
157
  entries: normalizedEntries,
@@ -166,6 +178,7 @@ function normalizeSeed() {
166
178
  parentFileType: null,
167
179
  configuration: {}
168
180
  }),
181
+ storylines: normalizedStorylines,
169
182
  chapters: normalizedChapters,
170
183
  sections: normalizedSections,
171
184
  contentElements: normalizedContentElements,
@@ -173,7 +186,6 @@ function normalizeSeed() {
173
186
  }
174
187
  };
175
188
  }
176
-
177
189
  function normalizeSections() {
178
190
  var sections = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
179
191
  var contentElements = arguments.length > 1 ? arguments[1] : undefined;
@@ -185,7 +197,6 @@ function normalizeSections() {
185
197
  }
186
198
  }
187
199
  };
188
-
189
200
  if (contentElements.length && !sections.length) {
190
201
  contentElements.forEach(function (contentElement) {
191
202
  return contentElement.sectionId = 10;
@@ -195,7 +206,6 @@ function normalizeSections() {
195
206
  permaId: 1
196
207
  }, sectionDefaults)];
197
208
  }
198
-
199
209
  return normalizeCollection(sections, sectionDefaults).map(function (section) {
200
210
  return _objectSpread2(_objectSpread2({}, section), {}, {
201
211
  configuration: _objectSpread2({
@@ -204,14 +214,12 @@ function normalizeSections() {
204
214
  });
205
215
  });
206
216
  }
207
-
208
217
  function normalizeChapters() {
209
218
  var chapters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
210
219
  var sections = arguments.length > 1 ? arguments[1] : undefined;
211
220
  var chapterDefaults = {
212
221
  configuration: {}
213
222
  };
214
-
215
223
  if (sections.length && !chapters.length) {
216
224
  sections.forEach(function (section) {
217
225
  return section.chapterId = 100;
@@ -221,26 +229,42 @@ function normalizeChapters() {
221
229
  permaId: 10
222
230
  }, chapterDefaults)];
223
231
  }
224
-
225
232
  return normalizeCollection(chapters, chapterDefaults);
226
233
  }
227
-
234
+ function normalizeStorylines() {
235
+ var storylines = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
236
+ var chapters = arguments.length > 1 ? arguments[1] : undefined;
237
+ if (!storylines.length) {
238
+ chapters.forEach(function (chapter) {
239
+ return chapter.storylineId = 1000;
240
+ });
241
+ return [{
242
+ id: 1000,
243
+ permaId: 100,
244
+ configuration: {
245
+ main: true
246
+ }
247
+ }];
248
+ }
249
+ return normalizeCollection(storylines, {
250
+ configuration: {}
251
+ });
252
+ }
228
253
  function normalizeShareUrlTemplates(shareUrlTemplates) {
229
254
  if (shareUrlTemplates) {
230
255
  return shareUrlTemplates;
231
256
  } else {
232
257
  return {
233
- email: 'mailto:?body=%{url}',
234
- facebook: 'http://www.facebook.com/sharer/sharer.php?u=%{url}',
235
- google: 'https://plus.google.com/share?url=%{url}',
236
- linked_in: 'https://www.linkedin.com/shareArticle?mini=true&url=%{url}',
237
- telegram: 'tg://msg?text=%{url}',
238
- twitter: 'https://x.com/intent/post?url=%{url}',
239
- whats_app: 'WhatsApp://send?text=%{url}'
258
+ email: 'mailto:?body=%<url>s',
259
+ facebook: 'http://www.facebook.com/sharer/sharer.php?u=%<url>s',
260
+ google: 'https://plus.google.com/share?url=%<url>s',
261
+ linked_in: 'https://www.linkedin.com/shareArticle?mini=true&url=%<url>s',
262
+ telegram: 'tg://msg?text=%<url>s',
263
+ twitter: 'https://x.com/intent/post?url=%<url>s',
264
+ whats_app: 'WhatsApp://send?text=%<url>s'
240
265
  };
241
266
  }
242
267
  }
243
-
244
268
  function normalizeLegalInfo(legalInfo) {
245
269
  if (legalInfo) {
246
270
  return legalInfo;
@@ -261,10 +285,9 @@ function normalizeLegalInfo(legalInfo) {
261
285
  };
262
286
  }
263
287
  }
264
-
265
288
  function normalizeTheme(_ref2) {
266
289
  var themeAssets = _ref2.themeAssets,
267
- themeOptions = _ref2.themeOptions;
290
+ themeOptions = _ref2.themeOptions;
268
291
  return {
269
292
  assets: _objectSpread2({
270
293
  icons: {}
@@ -274,7 +297,6 @@ function normalizeTheme(_ref2) {
274
297
  }, themeOptions)
275
298
  };
276
299
  }
277
-
278
300
  function normalizeWidgets() {
279
301
  var widgets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
280
302
  return widgets.map(function (widget) {
@@ -284,7 +306,6 @@ function normalizeWidgets() {
284
306
  }, widget);
285
307
  });
286
308
  }
287
-
288
309
  function normalizeCollection() {
289
310
  var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
290
311
  var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -330,6 +351,67 @@ function _objectWithoutProperties(source, excluded) {
330
351
  return target;
331
352
  }
332
353
 
354
+ function _arrayWithHoles(arr) {
355
+ if (Array.isArray(arr)) return arr;
356
+ }
357
+
358
+ function _iterableToArrayLimit(arr, i) {
359
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
360
+ var _arr = [];
361
+ var _n = true;
362
+ var _d = false;
363
+ var _e = undefined;
364
+
365
+ try {
366
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
367
+ _arr.push(_s.value);
368
+
369
+ if (i && _arr.length === i) break;
370
+ }
371
+ } catch (err) {
372
+ _d = true;
373
+ _e = err;
374
+ } finally {
375
+ try {
376
+ if (!_n && _i["return"] != null) _i["return"]();
377
+ } finally {
378
+ if (_d) throw _e;
379
+ }
380
+ }
381
+
382
+ return _arr;
383
+ }
384
+
385
+ function _arrayLikeToArray(arr, len) {
386
+ if (len == null || len > arr.length) len = arr.length;
387
+
388
+ for (var i = 0, arr2 = new Array(len); i < len; i++) {
389
+ arr2[i] = arr[i];
390
+ }
391
+
392
+ return arr2;
393
+ }
394
+
395
+ function _unsupportedIterableToArray(o, minLen) {
396
+ if (!o) return;
397
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
398
+ var n = Object.prototype.toString.call(o).slice(8, -1);
399
+ if (n === "Object" && o.constructor) n = o.constructor.name;
400
+ if (n === "Map" || n === "Set") return Array.from(n);
401
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
402
+ }
403
+
404
+ function _nonIterableRest() {
405
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
406
+ }
407
+
408
+ function _slicedToArray(arr, i) {
409
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
410
+ }
411
+
412
+ var _excluded = ["seed", "setup", "wrapper", "consent"],
413
+ _excluded2 = ["seed", "setup", "wrapper"];
414
+
333
415
  /**
334
416
  * Render a component that depends on entry state. Accepts all options
335
417
  * supported by [`render` of
@@ -366,20 +448,17 @@ function _objectWithoutProperties(source, excluded) {
366
448
  * function. The normalized seed constructed from the `seed` option
367
449
  * is passed as a second parameter.
368
450
  */
369
-
370
451
  function renderInEntry(ui) {
371
452
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
372
- seed = _ref.seed,
373
- setup = _ref.setup,
374
- wrapper = _ref.wrapper,
375
- _ref$consent = _ref.consent,
376
- consent = _ref$consent === void 0 ? Consent.create() : _ref$consent,
377
- options = _objectWithoutProperties(_ref, ["seed", "setup", "wrapper", "consent"]);
378
-
453
+ seed = _ref.seed,
454
+ setup = _ref.setup,
455
+ wrapper = _ref.wrapper,
456
+ _ref$consent = _ref.consent,
457
+ consent = _ref$consent === void 0 ? Consent.create() : _ref$consent,
458
+ options = _objectWithoutProperties(_ref, _excluded);
379
459
  options = _objectSpread2({
380
460
  wrapper: createWrapper(seed, setup, wrapper, consent)
381
461
  }, options);
382
-
383
462
  if (typeof ui === 'function') {
384
463
  // Evaluate `ui` inside a React component to allow using hooks in
385
464
  // the test. We also could have used `ui` as a React component
@@ -398,7 +477,6 @@ function renderInEntry(ui) {
398
477
  var ui = _ref2.ui;
399
478
  return ui();
400
479
  };
401
-
402
480
  var result = render( /*#__PURE__*/React.createElement(HooksWrapper, {
403
481
  ui: ui
404
482
  }), options);
@@ -413,6 +491,7 @@ function renderInEntry(ui) {
413
491
  return render(ui, options);
414
492
  }
415
493
  }
494
+
416
495
  /**
417
496
  * Render a hook that depends on entry state. Accepts all options
418
497
  * supported by [`renderHook` of
@@ -426,27 +505,22 @@ function renderInEntry(ui) {
426
505
  * @param {Object} [options.seed] - Seed data for entry state. Passed through {@link normalizeSeed}.
427
506
  * @param {Function} [options.setup] - See {@link renderInEntry}.
428
507
  */
429
-
430
508
  function renderHookInEntry(callback) {
431
509
  var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
432
- seed = _ref3.seed,
433
- setup = _ref3.setup,
434
- wrapper = _ref3.wrapper,
435
- options = _objectWithoutProperties(_ref3, ["seed", "setup", "wrapper"]);
436
-
510
+ seed = _ref3.seed,
511
+ setup = _ref3.setup,
512
+ wrapper = _ref3.wrapper,
513
+ options = _objectWithoutProperties(_ref3, _excluded2);
437
514
  return renderHook(callback, _objectSpread2({
438
515
  wrapper: createWrapper(seed, setup, wrapper)
439
516
  }, options));
440
517
  }
441
-
442
518
  function createWrapper(seed, setup, originalWrapper, consent) {
443
519
  var normalizedSeed = normalizeSeed(seed);
444
-
445
520
  var OriginalWrapper = originalWrapper || function Noop(_ref4) {
446
521
  var children = _ref4.children;
447
522
  return children;
448
523
  };
449
-
450
524
  return function Wrapper(_ref5) {
451
525
  var children = _ref5.children;
452
526
  return /*#__PURE__*/React.createElement(RootProviders, {
@@ -458,11 +532,10 @@ function createWrapper(seed, setup, originalWrapper, consent) {
458
532
  }, /*#__PURE__*/React.createElement(OriginalWrapper, null, children)));
459
533
  };
460
534
  }
461
-
462
535
  function Dispatcher(_ref6) {
463
536
  var children = _ref6.children,
464
- seed = _ref6.seed,
465
- callback = _ref6.callback;
537
+ seed = _ref6.seed,
538
+ callback = _ref6.callback;
466
539
  var dispatch = useEntryStateDispatch();
467
540
  useEffect(function () {
468
541
  if (callback) {
@@ -472,4 +545,167 @@ function Dispatcher(_ref6) {
472
545
  return children;
473
546
  }
474
547
 
475
- export { normalizeSeed, renderHookInEntry, renderInEntry };
548
+ var _excluded$1 = ["lifecycleContext", "wrapper"];
549
+
550
+ /**
551
+ * Takes the same options as {@link renderInEntry} but returns
552
+ * additional helper function to the return value of the
553
+ * {@link `useContentElementLifecycle`} hook:
554
+ *
555
+ * const {simulateScrollPosition} = renderInEntry(...)
556
+ * simulateScrollPosition('near viewport')
557
+ * // => Turns `shouldLoad` and `shouldPrepare` to true
558
+ */
559
+ function renderInEntryWithContentElementLifecycle(ui, options) {
560
+ return renderInEntryWithScrollPositionLifecycle(ui, _objectSpread2({
561
+ lifecycleContext: ContentElementLifecycleContext
562
+ }, options));
563
+ }
564
+ function renderInEntryWithScrollPositionLifecycle(ui) {
565
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
566
+ lifecycleContext = _ref.lifecycleContext,
567
+ wrapper = _ref.wrapper,
568
+ options = _objectWithoutProperties(_ref, _excluded$1);
569
+ var emitter = createEmitter();
570
+ return withSimulateScrollPositionHelper(emitter, renderInEntry(ui, _objectSpread2({
571
+ wrapper: createScrollPositionProvider(lifecycleContext, emitter, wrapper)
572
+ }, options)));
573
+ }
574
+ function createScrollPositionProvider(Context, emitter, originalWrapper) {
575
+ var OriginalWrapper = originalWrapper || function Noop(_ref2) {
576
+ var children = _ref2.children;
577
+ return children;
578
+ };
579
+ return function ScrollPositionProvider(_ref3) {
580
+ var children = _ref3.children;
581
+ var _useState = useState({
582
+ shouldLoad: false,
583
+ shouldPrepare: false,
584
+ isVisible: false,
585
+ isActive: false
586
+ }),
587
+ _useState2 = _slicedToArray(_useState, 2),
588
+ value = _useState2[0],
589
+ setValue = _useState2[1];
590
+ useEffect(function () {
591
+ function handle(scrollPosition) {
592
+ switch (scrollPosition) {
593
+ case 'near viewport':
594
+ setValue({
595
+ shouldLoad: true,
596
+ shouldPrepare: true,
597
+ isVisible: false,
598
+ isActive: false
599
+ });
600
+ break;
601
+ case 'in viewport':
602
+ setValue({
603
+ shouldLoad: true,
604
+ shouldPrepare: true,
605
+ isVisible: true,
606
+ isActive: false
607
+ });
608
+ break;
609
+ case 'center of viewport':
610
+ setValue({
611
+ shouldLoad: true,
612
+ shouldPrepare: true,
613
+ isVisible: true,
614
+ isActive: true
615
+ });
616
+ break;
617
+ default:
618
+ setValue({
619
+ isVisible: false,
620
+ isActive: false
621
+ });
622
+ break;
623
+ }
624
+ }
625
+ emitter.on('scroll', handle);
626
+ return function () {
627
+ return emitter.off('scroll', handle);
628
+ };
629
+ });
630
+ return /*#__PURE__*/React.createElement(OriginalWrapper, null, /*#__PURE__*/React.createElement(Context.Provider, {
631
+ value: value
632
+ }, children));
633
+ };
634
+ }
635
+ var allowedScrollPositions = ['outside viewport', 'near viewport', 'in viewport', 'center of viewport'];
636
+ function withSimulateScrollPositionHelper(emitter, result) {
637
+ return _objectSpread2(_objectSpread2({}, result), {}, {
638
+ simulateScrollPosition: function simulateScrollPosition(scrollPosition) {
639
+ if (!allowedScrollPositions.includes(scrollPosition)) {
640
+ throw new Error("Invalid scrollPosition '".concat(scrollPosition, "'. ") + "Allowed values: ".concat(allowedScrollPositions.join(', ')));
641
+ }
642
+ act(function () {
643
+ emitter.trigger('scroll', scrollPosition);
644
+ });
645
+ }
646
+ });
647
+ }
648
+ function createEmitter() {
649
+ return _objectSpread2({}, BackboneEvents);
650
+ }
651
+
652
+ var _excluded$2 = ["editorState", "phonePlatform", "wrapper"];
653
+
654
+ /**
655
+ * Provide context as if component was rendered inside of a content element.
656
+ *
657
+ * Returns two additionals functions to control content element scroll
658
+ * lifecycle and editor commands: `simulateScrollPosition` and `triggerEditorCommand`.
659
+ *
660
+ * @param {Function} callback - React component or function returning a React component.
661
+ * @param {Object} [options] - Supports all options supported by {@link `renderInEntry`}.
662
+ * @param {Object} [options.editorState] - Fake result of `useContentElementEditorState`.
663
+ * @param {Object} [options.phonePlatform] - Fake result of `usePhonePlatform`.
664
+ *
665
+ * @example
666
+ *
667
+ * const {getByRole, simulateScrollPosition, triggerEditorCommand} =
668
+ * renderInContentElement(<MyContentElement />, {
669
+ * seed: {...}
670
+ * });
671
+ * simulateScrollPosition('near viewport');
672
+ * triggerEditorCommand({type: 'HIGHLIGHT'});
673
+ */
674
+ function renderInContentElement(ui) {
675
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
676
+ editorState = _ref.editorState,
677
+ _ref$phonePlatform = _ref.phonePlatform,
678
+ phonePlatform = _ref$phonePlatform === void 0 ? false : _ref$phonePlatform,
679
+ OriginalWrapper = _ref.wrapper,
680
+ options = _objectWithoutProperties(_ref, _excluded$2);
681
+ var emitter = Object.assign({}, BackboneEvents);
682
+ function Wrapper(_ref2) {
683
+ var children = _ref2.children;
684
+ var defaultEditorState = useContext(ContentElementEditorStateContext);
685
+ return /*#__PURE__*/React.createElement(PhonePlatformContext.Provider, {
686
+ value: phonePlatform
687
+ }, /*#__PURE__*/React.createElement(DndProvider, {
688
+ backend: HTML5Backend
689
+ }, /*#__PURE__*/React.createElement(ContentElementAttributesProvider, {
690
+ id: 42
691
+ }, /*#__PURE__*/React.createElement(ContentElementEditorCommandEmitterContext.Provider, {
692
+ value: emitter
693
+ }, /*#__PURE__*/React.createElement(ContentElementEditorStateContext.Provider, {
694
+ value: _objectSpread2(_objectSpread2({}, defaultEditorState), editorState)
695
+ }, OriginalWrapper ? /*#__PURE__*/React.createElement(OriginalWrapper, {
696
+ children: children
697
+ }) : children)))));
698
+ }
699
+ return _objectSpread2(_objectSpread2({}, renderInEntryWithScrollPositionLifecycle(ui, _objectSpread2({
700
+ lifecycleContext: ContentElementLifecycleContext,
701
+ wrapper: Wrapper
702
+ }, options))), {}, {
703
+ triggerEditorCommand: function triggerEditorCommand(command) {
704
+ act(function () {
705
+ emitter.trigger("command:42", command);
706
+ });
707
+ }
708
+ });
709
+ }
710
+
711
+ export { normalizeSeed, renderHookInEntry, renderInContentElement, renderInEntry, renderInEntryWithContentElementLifecycle, renderInEntryWithScrollPositionLifecycle };
@@ -0,0 +1,18 @@
1
+ .translucentWidgetSurface {
2
+ color: var(--theme-widget-on-surface-color);
3
+ }
4
+
5
+ .translucentWidgetSurface::before {
6
+ content: "";
7
+ position: absolute;
8
+ top: 0;
9
+ left: 0;
10
+ right: 0;
11
+ bottom: 0;
12
+ z-index: -1;
13
+ --translucent-widget-surface-color:
14
+ color-mix(in srgb,
15
+ var(--theme-widget-surface-color) var(--theme-widget-surface-opacity), transparent);
16
+ background-color: var(--translucent-widget-surface-color, var(--theme-widget-surface-color));
17
+ backdrop-filter: blur(var(--theme-widget-surface-backdrop-blur));
18
+ }
@@ -1 +1 @@
1
- .Toggle-module_toggle__2N5XY{border:none;background:transparent;padding:0;position:absolute;top:3px;right:40px;cursor:pointer}.Toggle-module_toggle__2N5XY svg{display:block;fill:var(--theme-widget-on-surface-color);color:var(--theme-widget-surface-color)}.Toggle-module_toggle__2N5XY[aria-checked=true] svg{fill:var(--theme-widget-primary-color);color:var(--theme-widget-on-primary-color)}.ConsentBar-module_bar__YiYoC{position:fixed;bottom:0;left:0;width:100%;box-sizing:border-box;z-index:10;padding:10px 20px;font-family:var(--theme-widget-font-family);font-size:15px;background-color:var(--theme-widget-surface-color);color:var(--theme-widget-on-surface-color)}.ConsentBar-module_text__2GSPP{margin-top:10px;margin-bottom:10px}.ConsentBar-module_text__2GSPP a{color:var(--theme-accent-color)}.ConsentBar-module_button__2LVnY{border:none;border-radius:3px;margin:10px 5px 5px;padding:10px 15px;font:inherit;cursor:pointer;background-color:var(--theme-widget-secondary-color)}.ConsentBar-module_acceptAllButton__1rSdh{background-color:var(--theme-widget-primary-color);color:var(--theme-widget-on-primary-color)}.ConsentBar-module_configureButton__1VBqX{margin-left:0}.ConsentBar-module_configureButton__1VBqX svg{fill:currentColor;margin-right:6px;margin-bottom:1px;vertical-align:bottom}.ConsentBar-module_vendorsBox__Jckbl h3{margin:.5em 0;font-size:1em}.ConsentBar-module_vendorList__3Z4jU{overflow:auto;max-height:40vh;padding-right:5px;margin:5px 0}.ConsentBar-module_vendor__2hPAk{position:relative;margin-bottom:5px;padding:8px 0;min-height:20px}.ConsentBar-module_vendor__2hPAk p{font-size:13px}.ConsentBar-module_vendor__2hPAk a{color:inherit}.ConsentBar-module_expandVendor__hSkAD{border:none;background:transparent;position:absolute;right:5px;top:3px;padding:0;cursor:pointer}.ConsentBar-module_expandVendor__hSkAD svg{fill:currentColor;display:block}.ConsentBar-module_expandVendor__hSkAD:active svg,.ConsentBar-module_expandVendor__hSkAD:focus svg,.ConsentBar-module_expandVendor__hSkAD:hover svg{fill:var(--theme-widget-primary-color)}@media (max-width:780px){.ConsentBar-module_button__2LVnY{display:block;width:100%;margin:10px 0}}@media (min-width:781px){.ConsentBar-module_vendorsBox__Jckbl{position:absolute;bottom:100%;right:5px;margin-bottom:5px;max-width:400px;width:90%;box-sizing:border-box;padding:10px 20px;background-color:inherit;color:inherit;border-radius:5px}.ConsentBar-module_saveButton__16b97{float:right}.ConsentBar-module_decisionButtons__I4T8q{float:right;display:inline-block;white-space:nowrap}}
1
+ .Toggle-module_toggle__2N5XY{border:none;background:transparent;padding:0;position:absolute;top:3px;right:40px;cursor:pointer}.Toggle-module_toggle__2N5XY svg{display:block;fill:var(--theme-widget-on-surface-color);color:var(--theme-widget-surface-color)}.Toggle-module_toggle__2N5XY[aria-checked=true] svg{fill:var(--theme-widget-primary-color);color:var(--theme-widget-on-primary-color)}.widgets-module_translucentWidgetSurface__2WEIa{color:var(--theme-widget-on-surface-color)}.widgets-module_translucentWidgetSurface__2WEIa:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;--translucent-widget-surface-color:color-mix(in srgb,var(--theme-widget-surface-color) var(--theme-widget-surface-opacity),transparent);background-color:var(--translucent-widget-surface-color,var(--theme-widget-surface-color));-webkit-backdrop-filter:blur(var(--theme-widget-surface-backdrop-blur));backdrop-filter:blur(var(--theme-widget-surface-backdrop-blur))}.ConsentBar-module_bar__YiYoC{position:fixed;bottom:0;left:0;width:100%;box-sizing:border-box;z-index:10;padding:10px 20px;font-family:var(--theme-widget-font-family);font-size:15px}.ConsentBar-module_text__2GSPP{margin-top:10px;margin-bottom:10px}.ConsentBar-module_text__2GSPP a{color:var(--theme-accent-color)}.ConsentBar-module_button__2LVnY{border:none;border-radius:5px;margin:10px 5px 5px;padding:10px 15px;font:inherit;cursor:pointer;background-color:transparent;--translucent-widget-border-color:color-mix(in srgb,currentColor,transparent);border:1px solid var(--translucent-widget-border-color,currentColor);color:inherit}.ConsentBar-module_acceptAllButton__1rSdh{background-color:var(--theme-widget-primary-color);border-color:var(--theme-widget-primary-color);color:var(--theme-widget-on-primary-color)}.ConsentBar-module_configureButton__1VBqX{margin-left:0}.ConsentBar-module_configureButton__1VBqX svg{fill:currentColor;margin-right:6px;margin-bottom:1px;vertical-align:bottom}.ConsentBar-module_vendorsBox__Jckbl h3{margin:.5em 0;font-size:1em}.ConsentBar-module_vendorList__3Z4jU{overflow:auto;max-height:40vh;padding-right:5px;margin:5px 0}.ConsentBar-module_vendor__2hPAk{position:relative;margin-bottom:5px;padding:8px 0;min-height:20px}.ConsentBar-module_vendor__2hPAk p{font-size:13px}.ConsentBar-module_vendor__2hPAk a{color:inherit}.ConsentBar-module_expandVendor__hSkAD{border:none;background:transparent;color:inherit;position:absolute;right:5px;top:3px;padding:0;cursor:pointer}.ConsentBar-module_expandVendor__hSkAD svg{fill:currentColor;display:block}.ConsentBar-module_expandVendor__hSkAD:active svg,.ConsentBar-module_expandVendor__hSkAD:focus svg,.ConsentBar-module_expandVendor__hSkAD:hover svg{fill:var(--theme-widget-primary-color)}@media (max-width:780px){.ConsentBar-module_button__2LVnY{display:block;width:100%;margin:10px 0}}@media (min-width:781px){.ConsentBar-module_vendorsBox__Jckbl{position:absolute;bottom:100%;right:5px;margin-bottom:5px;max-width:400px;width:90%;box-sizing:border-box;padding:10px 20px;background-color:var(--theme-widget-surface-color);color:var(--theme-widget-on-surface-color);border-radius:5px}.ConsentBar-module_saveButton__16b97{float:right}.ConsentBar-module_decisionButtons__I4T8q{float:right;display:inline-block;white-space:nowrap}}