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,1129 +0,0 @@
1
- import React, { useReducer, useMemo, useCallback, createContext as createContext$1, useContext } from 'react';
2
- import { createContext, useContextSelector } from 'use-context-selector';
3
- import { createSelectorCreator, defaultMemoize, createSelector } from 'reselect';
4
- import slugify from 'slugify';
5
- import I18n from 'i18n-js';
6
-
7
- function _arrayWithHoles(arr) {
8
- if (Array.isArray(arr)) return arr;
9
- }
10
-
11
- function _iterableToArrayLimit(arr, i) {
12
- if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
13
- var _arr = [];
14
- var _n = true;
15
- var _d = false;
16
- var _e = undefined;
17
-
18
- try {
19
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
20
- _arr.push(_s.value);
21
-
22
- if (i && _arr.length === i) break;
23
- }
24
- } catch (err) {
25
- _d = true;
26
- _e = err;
27
- } finally {
28
- try {
29
- if (!_n && _i["return"] != null) _i["return"]();
30
- } finally {
31
- if (_d) throw _e;
32
- }
33
- }
34
-
35
- return _arr;
36
- }
37
-
38
- function _arrayLikeToArray(arr, len) {
39
- if (len == null || len > arr.length) len = arr.length;
40
-
41
- for (var i = 0, arr2 = new Array(len); i < len; i++) {
42
- arr2[i] = arr[i];
43
- }
44
-
45
- return arr2;
46
- }
47
-
48
- function _unsupportedIterableToArray(o, minLen) {
49
- if (!o) return;
50
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
51
- var n = Object.prototype.toString.call(o).slice(8, -1);
52
- if (n === "Object" && o.constructor) n = o.constructor.name;
53
- if (n === "Map" || n === "Set") return Array.from(n);
54
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
55
- }
56
-
57
- function _nonIterableRest() {
58
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
59
- }
60
-
61
- function _slicedToArray(arr, i) {
62
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
63
- }
64
-
65
- function _defineProperty(obj, key, value) {
66
- if (key in obj) {
67
- Object.defineProperty(obj, key, {
68
- value: value,
69
- enumerable: true,
70
- configurable: true,
71
- writable: true
72
- });
73
- } else {
74
- obj[key] = value;
75
- }
76
-
77
- return obj;
78
- }
79
-
80
- function ownKeys(object, enumerableOnly) {
81
- var keys = Object.keys(object);
82
-
83
- if (Object.getOwnPropertySymbols) {
84
- var symbols = Object.getOwnPropertySymbols(object);
85
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
86
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
87
- });
88
- keys.push.apply(keys, symbols);
89
- }
90
-
91
- return keys;
92
- }
93
-
94
- function _objectSpread2(target) {
95
- for (var i = 1; i < arguments.length; i++) {
96
- var source = arguments[i] != null ? arguments[i] : {};
97
-
98
- if (i % 2) {
99
- ownKeys(Object(source), true).forEach(function (key) {
100
- _defineProperty(target, key, source[key]);
101
- });
102
- } else if (Object.getOwnPropertyDescriptors) {
103
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
104
- } else {
105
- ownKeys(Object(source)).forEach(function (key) {
106
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
107
- });
108
- }
109
- }
110
-
111
- return target;
112
- }
113
-
114
- function _objectWithoutPropertiesLoose(source, excluded) {
115
- if (source == null) return {};
116
- var target = {};
117
- var sourceKeys = Object.keys(source);
118
- var key, i;
119
-
120
- for (i = 0; i < sourceKeys.length; i++) {
121
- key = sourceKeys[i];
122
- if (excluded.indexOf(key) >= 0) continue;
123
- target[key] = source[key];
124
- }
125
-
126
- return target;
127
- }
128
-
129
- function _objectWithoutProperties(source, excluded) {
130
- if (source == null) return {};
131
- var target = _objectWithoutPropertiesLoose(source, excluded);
132
- var key, i;
133
-
134
- if (Object.getOwnPropertySymbols) {
135
- var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
136
-
137
- for (i = 0; i < sourceSymbolKeys.length; i++) {
138
- key = sourceSymbolKeys[i];
139
- if (excluded.indexOf(key) >= 0) continue;
140
- if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
141
- target[key] = source[key];
142
- }
143
- }
144
-
145
- return target;
146
- }
147
-
148
- function _arrayWithoutHoles(arr) {
149
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
150
- }
151
-
152
- function _iterableToArray(iter) {
153
- if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
154
- }
155
-
156
- function _nonIterableSpread() {
157
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
158
- }
159
-
160
- function _toConsumableArray(arr) {
161
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
162
- }
163
-
164
- var PREFIX = 'PAGEFLOW_SCROLLED_COLLECTION';
165
- var RESET = "".concat(PREFIX, "_RESET");
166
- var ADD = "".concat(PREFIX, "_ADD");
167
- var CHANGE = "".concat(PREFIX, "_CHANGE");
168
- var PATCH_CONFIGURATION = "".concat(PREFIX, "_PATCH_CONFIGURATION");
169
- var REMOVE = "".concat(PREFIX, "_REMOVE");
170
- var SORT = "".concat(PREFIX, "_SORT");
171
- function useCollections() {
172
- var seed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
173
-
174
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
175
- keyAttribute = _ref.keyAttribute;
176
-
177
- return useReducer(reducer, Object.keys(seed).reduce(function (result, key) {
178
- result[key] = init(seed[key], keyAttribute);
179
- return result;
180
- }, {}));
181
- }
182
-
183
- function reducer(state, action) {
184
- var collectionName = action.payload.collectionName;
185
- var keyAttribute = action.payload.keyAttribute;
186
-
187
- switch (action.type) {
188
- case RESET:
189
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, init(action.payload.items, keyAttribute)));
190
-
191
- case ADD:
192
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
193
- order: action.payload.order,
194
- items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, action.payload.attributes[keyAttribute], action.payload.attributes))
195
- }));
196
-
197
- case CHANGE:
198
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
199
- order: state[collectionName].order,
200
- items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, action.payload.attributes[keyAttribute], action.payload.attributes))
201
- }));
202
-
203
- case PATCH_CONFIGURATION:
204
- var key = action.payload.key;
205
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
206
- order: state[collectionName].order,
207
- items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, key, _objectSpread2(_objectSpread2({}, state[collectionName].items[key]), {}, {
208
- configuration: _objectSpread2(_objectSpread2({}, state[collectionName].items[key].configuration), action.payload.configuration)
209
- })))
210
- }));
211
-
212
- case REMOVE:
213
- var clonedItems = _objectSpread2({}, state[collectionName].items);
214
-
215
- delete clonedItems[action.payload.key];
216
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
217
- order: action.payload.order,
218
- items: clonedItems
219
- }));
220
-
221
- case SORT:
222
- return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
223
- order: action.payload.order,
224
- items: state[collectionName].items
225
- }));
226
-
227
- default:
228
- return state;
229
- }
230
- }
231
-
232
- function init(items) {
233
- var keyAttribute = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'id';
234
- items = items.filter(function (item) {
235
- return item[keyAttribute];
236
- });
237
- return {
238
- order: items.map(function (item) {
239
- return item[keyAttribute];
240
- }),
241
- items: items.reduce(function (result, item) {
242
- result[item[keyAttribute]] = item;
243
- return result;
244
- }, {})
245
- };
246
- }
247
-
248
- function updateConfiguration(_ref2) {
249
- var dispatch = _ref2.dispatch,
250
- name = _ref2.name,
251
- key = _ref2.key,
252
- configuration = _ref2.configuration;
253
- dispatch({
254
- type: PATCH_CONFIGURATION,
255
- payload: {
256
- collectionName: name,
257
- key: key,
258
- configuration: configuration
259
- }
260
- });
261
- }
262
- function getItem(state, collectionName, key) {
263
- if (state[collectionName]) {
264
- return state[collectionName].items[key];
265
- }
266
- }
267
- function createMultipleItemsSelector(collectionNames, filter) {
268
- return createSelector.apply(void 0, _toConsumableArray(collectionNames.map(function (collectionName) {
269
- return function (collections) {
270
- return collections[collectionName];
271
- };
272
- })).concat([function () {
273
- for (var _len = arguments.length, collections = new Array(_len), _key = 0; _key < _len; _key++) {
274
- collections[_key] = arguments[_key];
275
- }
276
-
277
- return collectionNames.reduce(function (result, collectionName, index) {
278
- result[collectionName] = toOrderedItems(collections[index]);
279
- return result;
280
- }, {});
281
- }]));
282
- }
283
- function createItemsSelector(collectionName, filter) {
284
- if (filter) {
285
- var itemsSelector = createItemsSelector(collectionName);
286
- return createShallowEqualArraysSelector(function (collections) {
287
- return itemsSelector(collections).filter(filter);
288
- }, function (items) {
289
- return items;
290
- });
291
- }
292
-
293
- return createSelector(function (collections) {
294
- return collections[collectionName];
295
- }, toOrderedItems);
296
- }
297
-
298
- function toOrderedItems(collection) {
299
- if (collection) {
300
- var items = collection.items;
301
- return collection.order.map(function (key) {
302
- return items[key];
303
- });
304
- } else {
305
- return [];
306
- }
307
- }
308
-
309
- var createShallowEqualArraysSelector = createSelectorCreator(defaultMemoize, shallowEqualArrays);
310
-
311
- function shallowEqualArrays(a, b) {
312
- return a.length === b.length && a.every(function (item, index) {
313
- return item === b[index];
314
- });
315
- }
316
-
317
- var Context = createContext();
318
- function EntryStateProvider(_ref) {
319
- var seed = _ref.seed,
320
- children = _ref.children;
321
-
322
- var _useCollections = useCollections(seed.collections, {
323
- keyAttribute: 'permaId'
324
- }),
325
- _useCollections2 = _slicedToArray(_useCollections, 2),
326
- collections = _useCollections2[0],
327
- dispatch = _useCollections2[1];
328
-
329
- var value = useMemo(function () {
330
- return {
331
- entryState: {
332
- collections: collections,
333
- config: seed.config
334
- },
335
- dispatch: dispatch
336
- };
337
- }, [collections, dispatch, seed]);
338
- return /*#__PURE__*/React.createElement(Context.Provider, {
339
- value: value
340
- }, children);
341
- }
342
-
343
- function useEntryState() {
344
- var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (entryState) {
345
- return entryState;
346
- };
347
- return useContextSelector(Context, function (value) {
348
- return selector(value.entryState);
349
- });
350
- }
351
-
352
- function useEntryStateDispatch() {
353
- return useContextSelector(Context, function (value) {
354
- return value.dispatch;
355
- });
356
- }
357
- function useEntryStateConfig() {
358
- return useEntryState(function (entryState) {
359
- return entryState.config;
360
- });
361
- }
362
- function useEntryStateCollectionItem(collectionName, key) {
363
- return useEntryState(function (entryState) {
364
- return getItem(entryState.collections, collectionName, key);
365
- });
366
- }
367
- function useEntryStateCollectionItems(collectionName, filter) {
368
- var itemsSelector = useMemo(function () {
369
- return createItemsSelector(collectionName, filter);
370
- }, [collectionName, filter]);
371
- return useEntryState(function (entryState) {
372
- return itemsSelector(entryState.collections);
373
- });
374
- }
375
- function useMultipleEntryStateCollectionItems(collectionNames) {
376
- var multipleItemsSelector = useMemo(function () {
377
- return createMultipleItemsSelector(collectionNames);
378
- }, [collectionNames]);
379
- return useEntryState(function (entryState) {
380
- return multipleItemsSelector(entryState.collections);
381
- });
382
- }
383
-
384
- /**
385
- * Returns data generated by a Ruby lambda registered server
386
- * side via `config.additional_frontend_seed_data.register`.
387
- *
388
- * @example
389
- *
390
- * const data = useAdditionalSeedData('someSeed');
391
- */
392
-
393
- function useAdditionalSeedData(name) {
394
- var config = useEntryStateConfig();
395
-
396
- if (!config.additionalSeedData[name]) {
397
- throw new Error("Could not find additional seed data with name '".concat(name, "'."));
398
- }
399
-
400
- return config.additionalSeedData[name];
401
- }
402
-
403
- function useContentElementConsentVendor(_ref) {
404
- var contentElementId = _ref.contentElementId;
405
- var config = useEntryStateConfig();
406
- var vendorName = config.contentElementConsentVendors[contentElementId];
407
- return config.consentVendors.find(function (vendor) {
408
- return vendor.name === vendorName;
409
- });
410
- }
411
-
412
- /**
413
- * Returns a nested data structure representing the metadata of the entry.
414
- *
415
- * @example
416
- *
417
- * const metaData = useEntryMetadata();
418
- * metaData // =>
419
- * {
420
- * id: 5,
421
- * locale: 'en',
422
- * shareProviders: {email: false, facebook: true},
423
- * share_url: 'http://test.host/test',
424
- * credits: 'Credits: Pageflow'
425
- * }
426
- */
427
-
428
- function useEntryMetadata() {
429
- var entries = useEntryStateCollectionItems('entries');
430
- return useMemo(function () {
431
- return entries[0];
432
- }, [entries]);
433
- }
434
-
435
- /**
436
- * Returns a list of attributes (iconName, name and url) of all configured share
437
- * providers of the entry. The url provides a %{url} placeholder where the link
438
- * can be inserted. iconName can be passed to ThemeIcon to render a theme
439
- * specific icon.
440
- *
441
- * @example
442
- *
443
- * const shareProviders = useShareProviders(options);
444
- * shareProviders // =>
445
- * [
446
- * {
447
- * iconName: 'facebook',
448
- * name: 'Facebook',
449
- * url: http://www.facebook.com/sharer/sharer.php?u=%{url}
450
- * },
451
- * {
452
- * iconName: 'twitter',
453
- * name: 'Twitter',
454
- * url: https://x.com/intent/post?url=%{url}
455
- * }
456
- * ]
457
- */
458
-
459
- function useShareProviders(_ref) {
460
- var isPhonePlatform = _ref.isPhonePlatform;
461
- var config = useEntryStateConfig();
462
- var entryMetadata = useEntryMetadata();
463
- var shareProviders = (entryMetadata === null || entryMetadata === void 0 ? void 0 : entryMetadata.shareProviders) || {};
464
- var urlTemplates = config.shareUrlTemplates;
465
- return useMemo(function () {
466
- var sharing = {
467
- email: {
468
- iconName: 'email',
469
- name: 'Mail',
470
- url: urlTemplates.email
471
- },
472
- facebook: {
473
- iconName: 'facebook',
474
- name: 'Facebook',
475
- url: urlTemplates.facebook
476
- },
477
- linked_in: {
478
- iconName: 'linkedIn',
479
- name: 'LinkedIn',
480
- url: urlTemplates.linked_in
481
- },
482
- telegram: {
483
- iconName: 'telegram',
484
- name: 'Telegram',
485
- url: urlTemplates.telegram
486
- },
487
- twitter: {
488
- iconName: 'twitter',
489
- name: 'X',
490
- url: urlTemplates.twitter
491
- },
492
- whats_app: {
493
- iconName: 'whatsApp',
494
- name: 'WhatsApp',
495
- url: urlTemplates.whats_app
496
- }
497
- };
498
- return activeShareProviders(shareProviders, isPhonePlatform).map(function (provider) {
499
- var config = sharing[provider];
500
- return {
501
- name: config.name,
502
- iconName: config.iconName,
503
- url: config.url
504
- };
505
- });
506
- }, [shareProviders, isPhonePlatform, urlTemplates]);
507
- }
508
-
509
- function activeShareProviders(shareProvidersConfig, isPhonePlatform) {
510
- var providers = filterShareProviders(shareProvidersConfig, isPhonePlatform);
511
- return providers.filter(function (provider) {
512
- return shareProvidersConfig[provider] !== false;
513
- });
514
- }
515
-
516
- function filterShareProviders(shareProvidersConfig, isPhonePlatform) {
517
- if (!isPhonePlatform) {
518
- return Object.keys(shareProvidersConfig).filter(function (provider) {
519
- return provider !== 'telegram' && provider !== 'whats_app';
520
- });
521
- }
522
-
523
- return Object.keys(shareProvidersConfig);
524
- }
525
- /**
526
- * Returns the share url of the entry.
527
- *
528
- * @example
529
- *
530
- * const shareUrl = useShareUrl();
531
- * shareUrl // => "http://test.host/test"
532
- */
533
-
534
-
535
- function useShareUrl() {
536
- var entryMetadata = useEntryMetadata();
537
- var config = useEntryStateConfig();
538
-
539
- if (entryMetadata) {
540
- return entryMetadata.shareUrl ? entryMetadata.shareUrl : config.prettyUrl;
541
- } else {
542
- return config.shareUrl;
543
- }
544
- }
545
-
546
- /**
547
- * Returns a nested data structure representing the chapters and sections
548
- * of the entry.
549
- *
550
- * @private
551
- *
552
- * @example
553
- *
554
- * const structure = useEntryStructure();
555
- * structure // =>
556
- * [
557
- * {
558
- * permaId: 5,
559
- * title: 'Chapter 1',
560
- * summary: 'An introductory chapter',
561
- * sections: [
562
- * {
563
- * id: 1,
564
- * permaId: 101,
565
- * chapterId: 3,
566
- * sectionIndex: 0,
567
- * transition: 'scroll',
568
- *
569
- * // references to parent chapter
570
- * chapter: { ... },
571
- *
572
- * // references to adjacent section objects
573
- * previousSection: { ... },
574
- * nextSection: { ... },
575
- * }
576
- * ],
577
- * }
578
- * ]
579
- */
580
-
581
- function useEntryStructure() {
582
- var chapters = useChapters();
583
- var sections = useEntryStateCollectionItems('sections');
584
- return useMemo(function () {
585
- var linkedSections = sections.map(function (section) {
586
- return sectionData(section);
587
- });
588
- linkedSections.forEach(function (section, index) {
589
- section.sectionIndex = index;
590
- section.previousSection = linkedSections[index - 1];
591
- section.nextSection = linkedSections[index + 1];
592
- });
593
- return chapters.map(function (chapter) {
594
- var chapterSections = linkedSections.filter(function (item) {
595
- return item.chapterId === chapter.id;
596
- });
597
- chapterSections.forEach(function (section) {
598
- return section.chapter = chapter;
599
- });
600
- return _objectSpread2(_objectSpread2({}, chapter), {}, {
601
- sections: chapterSections
602
- });
603
- });
604
- }, [chapters, sections]);
605
- }
606
- /**
607
- * Returns an array of sections each with a chapter property containing
608
- * data about the parent chapter.
609
- *
610
- * @private
611
- *
612
- * @example
613
- *
614
- * const sections = useSectionsWithChapter();
615
- * sections // =>
616
- * [
617
- * {
618
- * id: 1,
619
- * permaId: 101,
620
- * chapterId: 3,
621
- * transition: 'scroll',
622
- * chapter: {
623
- * id: 3,
624
- * permaId: 5,
625
- * title: 'Chapter 1',
626
- * summary: 'An introductory chapter',
627
- * chapterSlug: 'chapter-1'
628
- * },
629
- * }
630
- * ]
631
- */
632
-
633
- function useSectionsWithChapter() {
634
- var chapters = useChapters();
635
- var sections = useEntryStateCollectionItems('sections');
636
- var chaptersById = useMemo(function () {
637
- return chapters.reduce(function (result, chapter) {
638
- result[chapter.id] = chapter;
639
- return result;
640
- }, {});
641
- }, [chapters]);
642
- return useMemo(function () {
643
- return sections.map(function (section, sectionIndex) {
644
- return _objectSpread2(_objectSpread2({
645
- sectionIndex: sectionIndex
646
- }, sectionData(section)), {}, {
647
- chapter: chaptersById[section.chapterId]
648
- });
649
- });
650
- }, [chaptersById, sections]);
651
- }
652
- /**
653
- * Returns a nested data structure representing the content elements
654
- * of section.
655
- *
656
- * @param {Object} options
657
- * @param {number} options.sectionPermaId
658
- *
659
- * @private
660
- *
661
- * @example
662
- *
663
- * const section = useSection({sectionPermaId: 4});
664
- * section // =>
665
- * {
666
- * id: 100,
667
- * permaId: 4,
668
- * chapterId: 1,
669
- * transition: 'scroll'
670
- * }
671
- */
672
-
673
- function useSection(_ref) {
674
- var sectionPermaId = _ref.sectionPermaId;
675
- var section = useEntryStateCollectionItem('sections', sectionPermaId);
676
- return sectionData(section);
677
- }
678
-
679
- function sectionData(section) {
680
- return section && _objectSpread2({
681
- permaId: section.permaId,
682
- id: section.id,
683
- chapterId: section.chapterId
684
- }, section.configuration);
685
- }
686
-
687
- function useSectionContentElements(_ref2) {
688
- var sectionId = _ref2.sectionId,
689
- layout = _ref2.layout;
690
- var filterBySectionId = useCallback(function (contentElement) {
691
- return contentElement.sectionId === sectionId;
692
- }, [sectionId]);
693
- var contentElements = useEntryStateCollectionItems('contentElements', filterBySectionId);
694
- return contentElements.map(function (contentElement) {
695
- var position = getPosition(contentElement, layout);
696
- return {
697
- id: contentElement.id,
698
- permaId: contentElement.permaId,
699
- type: contentElement.typeName,
700
- position: position,
701
- width: getWidth(contentElement, position),
702
- standAlone: contentElement.configuration.position === 'standAlone',
703
- props: contentElement.configuration
704
- };
705
- });
706
- }
707
- var supportedPositions = {
708
- center: ['inline', 'left', 'right'],
709
- centerRagged: ['inline', 'left', 'right'],
710
- left: ['inline', 'sticky'],
711
- right: ['inline', 'sticky']
712
- };
713
-
714
- function getPosition(contentElement, layout) {
715
- var position = contentElement.configuration.position;
716
- return supportedPositions[layout || 'left'].includes(position) ? position : 'inline';
717
- }
718
-
719
- var legacyPositionWidths = {
720
- wide: 2,
721
- full: 3
722
- };
723
- var clampedWidthPositions = ['sticky', 'left', 'right'];
724
-
725
- function getWidth(contentElement, position) {
726
- var width = typeof contentElement.configuration.width === 'number' ? contentElement.configuration.width : legacyPositionWidths[contentElement.configuration.position] || 0;
727
-
728
- if (clampedWidthPositions.includes(position)) {
729
- return Math.min(Math.max(width || 0, -2), 2);
730
- } else {
731
- return width;
732
- }
733
- }
734
-
735
- function useChapter(_ref3) {
736
- var permaId = _ref3.permaId;
737
- var chapters = useChapters();
738
- return useMemo(function () {
739
- return chapters.find(function (chapter) {
740
- return chapter.permaId === permaId;
741
- });
742
- }, [chapters, permaId]);
743
- }
744
- function useChapters() {
745
- var chapters = useEntryStateCollectionItems('chapters');
746
- return useMemo(function () {
747
- var chapterSlugs = {};
748
- return chapters.map(function (chapter, index) {
749
- var chapterSlug = chapter.configuration.title;
750
-
751
- if (chapterSlug) {
752
- chapterSlug = slugify(chapterSlug, {
753
- lower: true,
754
- locale: 'de',
755
- strict: true
756
- });
757
-
758
- if (chapterSlugs[chapterSlug]) {
759
- chapterSlug = chapterSlug + '-' + chapter.permaId; //append permaId if chapter reference is not unique
760
- }
761
-
762
- chapterSlugs[chapterSlug] = chapter;
763
- } else {
764
- chapterSlug = 'chapter-' + chapter.permaId;
765
- }
766
-
767
- return {
768
- id: chapter.id,
769
- permaId: chapter.permaId,
770
- index: index,
771
- title: chapter.configuration.title,
772
- summary: chapter.configuration.summary,
773
- chapterSlug: chapterSlug
774
- };
775
- });
776
- }, [chapters]);
777
- }
778
-
779
- function extendFile(collectionName, file, config) {
780
- return addModelType(collectionName, expandUrls(collectionName, file, config.fileUrlTemplates), config.fileModelTypes);
781
- }
782
-
783
- function addModelType(collectionName, file, modelTypes) {
784
- if (!file) {
785
- return null;
786
- }
787
-
788
- if (!modelTypes[collectionName]) {
789
- throw new Error("Could not find model type for collection name ".concat(collectionName));
790
- }
791
-
792
- return _objectSpread2(_objectSpread2({}, file), {}, {
793
- modelType: modelTypes[collectionName]
794
- });
795
- }
796
-
797
- function expandUrls(collectionName, file, urlTemplates) {
798
- if (!file) {
799
- return null;
800
- }
801
-
802
- if (!urlTemplates[collectionName]) {
803
- throw new Error("No file url templates found for ".concat(collectionName));
804
- }
805
-
806
- var variants = file.variants ? ['original'].concat(_toConsumableArray(file.variants)) : Object.keys(urlTemplates[collectionName]);
807
- var urls = variants.reduce(function (result, variant) {
808
- var url = getFileUrl(collectionName, file, variant, urlTemplates);
809
-
810
- if (url) {
811
- result[variant] = url;
812
- }
813
-
814
- return result;
815
- }, {});
816
- return _objectSpread2({
817
- urls: urls
818
- }, file);
819
- }
820
-
821
- function getFileUrl(collectionName, file, quality, urlTemplates) {
822
- var templates = urlTemplates[collectionName];
823
- var template = templates[quality];
824
-
825
- if (template) {
826
- return template.replace(':id_partition', idPartition(file.id)).replace(':basename', file.basename).replace(':extension', file.extension).replace(':processed_extension', file.processedExtension).replace(':pageflow_hls_qualities', function () {
827
- return hlsQualities(file);
828
- });
829
- }
830
- }
831
-
832
- function idPartition(id) {
833
- return partition(pad(id, 9));
834
- }
835
-
836
- function partition(string, separator) {
837
- return string.replace(/./g, function (c, i, a) {
838
- return i && (a.length - i) % 3 === 0 ? '/' + c : c;
839
- });
840
- }
841
-
842
- function pad(string, size) {
843
- return (Array(size).fill(0).join('') + string).slice(-size);
844
- }
845
-
846
- function hlsQualities(file) {
847
- return ['low', 'medium', 'high', 'fullhd', '4k'].filter(function (quality) {
848
- return file.variants.includes(quality);
849
- }).join(',');
850
- }
851
-
852
- /**
853
- * Look up a file by its collection and perma id.
854
- *
855
- * @param {Object} options
856
- * @param {String} options.collectionName - Collection name of file type to look for (in camel case).
857
- * @param {String} options.permaId - Perma id of file look up
858
- *
859
- * @example
860
- * const imageFile = useFile({collectionName: 'imageFiles', permaId: 5});
861
- * imageFile // =>
862
- * {
863
- * id: 102,
864
- * permaId: 5,
865
- * width: 1000,
866
- * height: 500,
867
- * urls: {
868
- * large: 'https://...'
869
- * },
870
- * configuration: {
871
- * alt: '...'
872
- * }
873
- * }
874
- */
875
-
876
- function useFile(_ref) {
877
- var collectionName = _ref.collectionName,
878
- permaId = _ref.permaId;
879
- var file = useEntryStateCollectionItem(collectionName, permaId);
880
- return extendFile(collectionName, file, useEntryStateConfig());
881
- }
882
-
883
- function useFileWithInlineRights(_ref) {
884
- var configuration = _ref.configuration,
885
- collectionName = _ref.collectionName,
886
- propertyName = _ref.propertyName;
887
- var file = useFile({
888
- collectionName: collectionName,
889
- permaId: configuration[propertyName]
890
- });
891
- var config = useEntryStateConfig();
892
- return file && _objectSpread2(_objectSpread2({}, file), {}, {
893
- license: file.configuration.license && config.fileLicenses[file.configuration.license],
894
- inlineRights: file.configuration.rights_display === 'inline' && !configuration[propertyName === 'id' ? 'inlineRightsHidden' : "".concat(propertyName.replace('Id', ''), "InlineRightsHidden")]
895
- });
896
- }
897
-
898
- function useNestedFiles(_ref) {
899
- var collectionName = _ref.collectionName,
900
- parent = _ref.parent;
901
- var config = useEntryStateConfig();
902
- var files = useEntryStateCollectionItems(collectionName, function (file) {
903
- return parent && file.parentFileId === parent.id && file.parentFileModelType === parent.modelType;
904
- });
905
- return files.map(function (file) {
906
- return extendFile(collectionName, file, config);
907
- });
908
- }
909
-
910
- function getFileUrlTemplateHost(seed, collectionName, variant) {
911
- var hlsUrlTemplate = seed.config.fileUrlTemplates[collectionName][variant];
912
- return hlsUrlTemplate.split('//')[1].split('/')[0];
913
- }
914
-
915
- /**
916
- * Returns a collection of rights and source urls of all files
917
- * used in the entry. If none of the files has a rights attribute
918
- * configured, it falls back to the default file rights of the
919
- * entry's site, otherwise returns an empty array.
920
- *
921
- * @example
922
- *
923
- * const fileRights = useFileRights();
924
- * fileRights // => [{text: 'author of image 1', urls: ['https://example.com/source-url']}]
925
- */
926
-
927
- function useFileRights() {
928
- var _config$defaultFileRi;
929
-
930
- var config = useEntryStateConfig();
931
- var fileCollectionNames = Object.keys(config.fileModelTypes);
932
- var files = useMultipleEntryStateCollectionItems(fileCollectionNames);
933
- var defaultFileRights = (_config$defaultFileRi = config.defaultFileRights) === null || _config$defaultFileRi === void 0 ? void 0 : _config$defaultFileRi.trim();
934
- var items = {};
935
- Object.keys(files).forEach(function (key) {
936
- return files[key].filter(function (file) {
937
- return file.configuration.rights_display !== 'inline';
938
- }).forEach(function (file) {
939
- var _file$rights;
940
-
941
- var text = ((_file$rights = file.rights) === null || _file$rights === void 0 ? void 0 : _file$rights.trim()) || defaultFileRights;
942
-
943
- if (text) {
944
- var _file$configuration$s;
945
-
946
- items[text] = items[text] || {
947
- text: text,
948
- urls: new Set()
949
- };
950
-
951
- if ((_file$configuration$s = file.configuration.source_url) === null || _file$configuration$s === void 0 ? void 0 : _file$configuration$s.trim()) {
952
- items[text].urls.add(file.configuration.source_url);
953
- }
954
- }
955
- });
956
- });
957
- return Object.values(items).map(function (item) {
958
- return _objectSpread2(_objectSpread2({}, item), {}, {
959
- urls: Array.from(item.urls).sort()
960
- });
961
- }).sort(function (a, b) {
962
- return a.text.localeCompare(b.text);
963
- });
964
- }
965
- /**
966
- * Returns a nested data structure representing the legal info of the entry.
967
- * Each legal info is separated into label and url to use in links.
968
- * Both label and url can be blank, depending on the configuration.
969
- *
970
- * @example
971
- *
972
- * const legalInfo = useLegalInfo();
973
- * legalInfo // =>
974
- * {
975
- * imprint: {
976
- * label: '',
977
- * url: ''
978
- * },
979
- * copyright: {
980
- * label: '',
981
- * url: ''
982
- * },
983
- * privacy: {
984
- * label: '',
985
- * url: ''
986
- * }
987
- * }
988
- */
989
-
990
- function useLegalInfo() {
991
- var config = useEntryStateConfig();
992
- return config.legalInfo;
993
- }
994
- /**
995
- * Returns the credits string (rich text) of the entry.
996
- *
997
- * @example
998
- *
999
- * const credits = useCredits();
1000
- * credits // => "Credits: <a href="http://pageflow.com">pageflow.com</a>"
1001
- */
1002
-
1003
- function useCredits() {
1004
- var entryMetadata = useEntryMetadata();
1005
- var credits = '';
1006
-
1007
- if (entryMetadata) {
1008
- credits = entryMetadata.credits;
1009
- }
1010
-
1011
- return credits;
1012
- }
1013
-
1014
- var qualities = ['medium', 'fullhd', '4k'];
1015
- function useAvailableQualities(file) {
1016
- if (!file) {
1017
- return [];
1018
- }
1019
-
1020
- return ['auto'].concat(_toConsumableArray(qualities.filter(function (name) {
1021
- return file.variants.includes(name);
1022
- })));
1023
- }
1024
-
1025
- /**
1026
- * Returns an object containing theme asset paths.
1027
- *
1028
- * @example
1029
- *
1030
- * const theme = useTheme();
1031
- * theme // =>
1032
- * {
1033
- * assets: {
1034
- * logoDesktop: 'path/to/logoDesktop.svg',
1035
- * logoMobile: 'path/to/logoMobile.svg'
1036
- * },
1037
- * options: {
1038
- * // options passed to `themes.register` in `pageflow.rb` initializer
1039
- * // with camleized keys.
1040
- * }
1041
- * }
1042
- */
1043
-
1044
- function useTheme() {
1045
- var config = useEntryStateConfig();
1046
- return config.theme;
1047
- }
1048
-
1049
- function useWidget(_ref) {
1050
- var role = _ref.role;
1051
- var widgets = useEntryStateCollectionItems('widgets');
1052
- return useMemo(function () {
1053
- return widgets.find(function (widget) {
1054
- return widget.role === role && widget.typeName;
1055
- });
1056
- }, [role, widgets]);
1057
- }
1058
-
1059
- function updateContentElementConfiguration(_ref) {
1060
- var dispatch = _ref.dispatch,
1061
- permaId = _ref.permaId,
1062
- configuration = _ref.configuration;
1063
- updateConfiguration({
1064
- dispatch: dispatch,
1065
- name: 'contentElements',
1066
- key: permaId,
1067
- configuration: configuration
1068
- });
1069
- }
1070
-
1071
- var LocaleContext = createContext$1('en');
1072
- function setupI18n(_ref) {
1073
- var defaultLocale = _ref.defaultLocale,
1074
- locale = _ref.locale,
1075
- translations = _ref.translations;
1076
- I18n.defaultLocale = defaultLocale;
1077
- I18n.locale = locale;
1078
- I18n.translations = translations;
1079
- }
1080
- function LocaleProvider(_ref2) {
1081
- var children = _ref2.children;
1082
-
1083
- var _ref3 = useEntryMetadata() || {},
1084
- locale = _ref3.locale;
1085
-
1086
- return /*#__PURE__*/React.createElement(LocaleContext.Provider, {
1087
- value: locale
1088
- }, children);
1089
- }
1090
- function useLocale() {
1091
- return useContext(LocaleContext);
1092
- }
1093
- /**
1094
- * Use translations in frontend elements. Uses the configured locale
1095
- * of the current entry by default. Note that only translation keys
1096
- * from the `pageflow_scrolled.public` scope are universally
1097
- * available.
1098
- *
1099
- * to render translations for inline editing controls in the editor
1100
- * preview, you can pass `"ui"` as `locale` option and use
1101
- * translations from the `pageflow_scrolled.inline_editing` scope.
1102
- *
1103
- * @param {Object} [options]
1104
- * @param {string} [locale="entry"] -
1105
- * Pass `"ui"` to use the locale of the editor interface instead.
1106
- *
1107
- * @example
1108
- * const {t} = useI18n();
1109
- * t('pageflow_scrolled.public.some.key')
1110
- *
1111
- * const {t} = useI18n({locale: 'ui'});
1112
- * t('pageflow_scrolled.inline_editing.some.key')
1113
- */
1114
-
1115
- function useI18n() {
1116
- var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
1117
- scope = _ref4.locale;
1118
-
1119
- var locale = useLocale();
1120
- return {
1121
- t: function t(key, options) {
1122
- return I18n.t(key, _objectSpread2(_objectSpread2({}, options), {}, {
1123
- locale: scope !== 'ui' && locale
1124
- }));
1125
- }
1126
- };
1127
- }
1128
-
1129
- export { useShareProviders as A, useShareUrl as B, useLocale as C, updateContentElementConfiguration as D, EntryStateProvider as E, _unsupportedIterableToArray as F, LocaleProvider as L, _slicedToArray as _, _objectSpread2 as a, _defineProperty as b, useEntryMetadata as c, useNestedFiles as d, _objectWithoutProperties as e, useWidget as f, useTheme as g, useFileWithInlineRights as h, useFile as i, useSectionContentElements as j, useAdditionalSeedData as k, useSectionsWithChapter as l, useContentElementConsentVendor as m, _toConsumableArray as n, useChapter as o, useEntryStateDispatch as p, useSection as q, useEntryStructure as r, getFileUrlTemplateHost as s, useAvailableQualities as t, useI18n as u, setupI18n as v, useChapters as w, useCredits as x, useFileRights as y, useLegalInfo as z };