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
@@ -0,0 +1,1529 @@
1
+ import { useI18n, ThemeIcon, paletteColor, useContentElementLifecycle, useFile, Image, useContentElementConfigurationUpdate, useContentElementEditorState, useDarkBackground, useFileWithInlineRights, useFloatingPortalRoot, utils, InlineFileRights, Text, EditableInlineText, EditableText, LinkButton, usePortraitOrientation, usePhonePlatform, useContentElementEditorCommandSubscription, useIsomorphicLayoutEffect, FullscreenViewer, contentElementWidths, ContentElementBox, ContentElementFigure, FitViewport, ToggleFullscreenCornerButton, frontend } from 'pageflow-scrolled/frontend';
2
+ import React, { useRef, useMemo, useState, useCallback, useEffect } from 'react';
3
+ import { FloatingPortal, useTransitionStyles, useFloating, offset, shift, flip, arrow, autoUpdate, useRole, useDismiss, useInteractions, CompositeItem, FloatingFocusManager, FloatingArrow, Composite } from '@floating-ui/react';
4
+ import classNames from 'classnames';
5
+
6
+ function _arrayWithHoles(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+
10
+ function _iterableToArrayLimit(arr, i) {
11
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _e = undefined;
16
+
17
+ try {
18
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
19
+ _arr.push(_s.value);
20
+
21
+ if (i && _arr.length === i) break;
22
+ }
23
+ } catch (err) {
24
+ _d = true;
25
+ _e = err;
26
+ } finally {
27
+ try {
28
+ if (!_n && _i["return"] != null) _i["return"]();
29
+ } finally {
30
+ if (_d) throw _e;
31
+ }
32
+ }
33
+
34
+ return _arr;
35
+ }
36
+
37
+ function _arrayLikeToArray(arr, len) {
38
+ if (len == null || len > arr.length) len = arr.length;
39
+
40
+ for (var i = 0, arr2 = new Array(len); i < len; i++) {
41
+ arr2[i] = arr[i];
42
+ }
43
+
44
+ return arr2;
45
+ }
46
+
47
+ function _unsupportedIterableToArray(o, minLen) {
48
+ if (!o) return;
49
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
50
+ var n = Object.prototype.toString.call(o).slice(8, -1);
51
+ if (n === "Object" && o.constructor) n = o.constructor.name;
52
+ if (n === "Map" || n === "Set") return Array.from(n);
53
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
54
+ }
55
+
56
+ function _nonIterableRest() {
57
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
58
+ }
59
+
60
+ function _slicedToArray(arr, i) {
61
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
62
+ }
63
+
64
+ function _defineProperty(obj, key, value) {
65
+ if (key in obj) {
66
+ Object.defineProperty(obj, key, {
67
+ value: value,
68
+ enumerable: true,
69
+ configurable: true,
70
+ writable: true
71
+ });
72
+ } else {
73
+ obj[key] = value;
74
+ }
75
+
76
+ return obj;
77
+ }
78
+
79
+ var styles = {"button":"PagerButton-module_button__1WPOu","icon":"PagerButton-module_icon__346kq","disabled":"PagerButton-module_disabled__1SbjV","visuallyHidden":"PagerButton-module_visuallyHidden__1Hrir"};
80
+
81
+ var size = 40;
82
+ function PagerButton(_ref) {
83
+ var direction = _ref.direction,
84
+ disabled = _ref.disabled,
85
+ onClick = _ref.onClick;
86
+ var _useI18n = useI18n(),
87
+ t = _useI18n.t;
88
+ return /*#__PURE__*/React.createElement("button", {
89
+ className: classNames(styles.button, _defineProperty({}, styles.disabled, disabled)),
90
+ tabIndex: "-1",
91
+ onClick: onClick
92
+ }, /*#__PURE__*/React.createElement("div", {
93
+ className: styles.icon
94
+ }, /*#__PURE__*/React.createElement(ThemeIcon, {
95
+ name: direction === 'left' ? 'arrowLeft' : 'arrowRight',
96
+ width: size,
97
+ height: size
98
+ }), /*#__PURE__*/React.createElement("span", {
99
+ className: styles.visuallyHidden
100
+ }, t(direction === 'left' ? 'pageflow_scrolled.public.previous' : 'pageflow_scrolled.public.next'))));
101
+ }
102
+ function insidePagerButton(element) {
103
+ return !!element.closest(".".concat(styles.button));
104
+ }
105
+
106
+ var styles$1 = {"outer":"Pager-module_outer__2CrMo","customMargin":"Pager-module_customMargin__1qTs3","left":"Pager-module_left__2UmsW","right":"Pager-module_right__2Qn5W","center":"Pager-module_center__1nzq4"};
107
+
108
+ function Pager(_ref) {
109
+ var areas = _ref.areas,
110
+ customMargin = _ref.customMargin,
111
+ panZoomEnabled = _ref.panZoomEnabled,
112
+ hideButtons = _ref.hideButtons,
113
+ activeIndex = _ref.activeIndex,
114
+ activateArea = _ref.activateArea,
115
+ children = _ref.children;
116
+ return /*#__PURE__*/React.createElement("div", {
117
+ className: classNames(styles$1.outer, _defineProperty({}, styles$1.customMargin, customMargin))
118
+ }, renderScrollButtons(), /*#__PURE__*/React.createElement("div", {
119
+ className: styles$1.center
120
+ }, children));
121
+ function renderScrollButtons() {
122
+ if (!panZoomEnabled) {
123
+ return null;
124
+ }
125
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
126
+ className: styles$1.left
127
+ }, /*#__PURE__*/React.createElement(PagerButton, {
128
+ direction: "left",
129
+ disabled: activeIndex === -1 || hideButtons,
130
+ onClick: function onClick() {
131
+ if (activeIndex >= 0) {
132
+ activateArea(activeIndex - 1);
133
+ }
134
+ }
135
+ })), /*#__PURE__*/React.createElement("div", {
136
+ className: styles$1.right
137
+ }, /*#__PURE__*/React.createElement(PagerButton, {
138
+ direction: "right",
139
+ disabled: activeIndex >= areas.length || hideButtons,
140
+ onClick: function onClick() {
141
+ if (activeIndex < areas.length) {
142
+ activateArea(activeIndex + 1);
143
+ }
144
+ }
145
+ })));
146
+ }
147
+ }
148
+
149
+ var styles$2 = {"scroller":"Scroller-module_scroller__b_jkV","sticky":"Scroller-module_sticky__1nSEO","inner":"Scroller-module_inner__XTNms","step":"Scroller-module_step__1ar7Q"};
150
+
151
+ var Scroller = React.forwardRef(function Scroller(_ref, ref) {
152
+ var areas = _ref.areas,
153
+ disabled = _ref.disabled,
154
+ setStepRef = _ref.setStepRef,
155
+ children = _ref.children;
156
+ if (disabled) {
157
+ return children;
158
+ }
159
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
160
+ ref: ref,
161
+ className: styles$2.scroller
162
+ }, Array.from({
163
+ length: areas.length + 2
164
+ }, function (_, index) {
165
+ return /*#__PURE__*/React.createElement("div", {
166
+ key: index,
167
+ ref: setStepRef(index),
168
+ className: styles$2.step
169
+ });
170
+ }), /*#__PURE__*/React.createElement("div", {
171
+ className: styles$2.sticky
172
+ }, /*#__PURE__*/React.createElement("div", {
173
+ className: styles$2.inner
174
+ }, children))));
175
+ });
176
+
177
+ var styles$3 = {"area":"Area-module_area__2uQD0","clip":"Area-module_clip__TgtiP","outline":"Area-module_outline__bRQqm","noPointerEvents":"Area-module_noPointerEvents__kLM1Z","hidden":"Area-module_hidden__2SAnU","highlighted":"Area-module_highlighted__2hdr1"};
178
+
179
+ function Area(_ref) {
180
+ var area = _ref.area,
181
+ noPointerEvents = _ref.noPointerEvents,
182
+ highlighted = _ref.highlighted,
183
+ outlined = _ref.outlined,
184
+ outlineHidden = _ref.outlineHidden,
185
+ className = _ref.className,
186
+ children = _ref.children,
187
+ onMouseEnter = _ref.onMouseEnter,
188
+ onMouseLeave = _ref.onMouseLeave,
189
+ onClick = _ref.onClick;
190
+ return /*#__PURE__*/React.createElement("div", {
191
+ className: classNames(styles$3.area, className, _defineProperty(_defineProperty({}, styles$3.highlighted, highlighted), styles$3.noPointerEvents, noPointerEvents))
192
+ }, /*#__PURE__*/React.createElement("div", {
193
+ className: styles$3.clip,
194
+ style: {
195
+ clipPath: polygon(area.outline)
196
+ },
197
+ tabIndex: "-1",
198
+ onClick: onClick,
199
+ onMouseEnter: onMouseEnter,
200
+ onMouseLeave: onMouseLeave
201
+ }), children, outlined && /*#__PURE__*/React.createElement(Outline, {
202
+ points: area.outline,
203
+ color: areaColor(area),
204
+ hidden: outlineHidden
205
+ }));
206
+ }
207
+ function areaColor(area) {
208
+ return paletteColor(area.color);
209
+ }
210
+ function Outline(_ref2) {
211
+ var points = _ref2.points,
212
+ color = _ref2.color,
213
+ hidden = _ref2.hidden;
214
+ return /*#__PURE__*/React.createElement("svg", {
215
+ className: classNames(styles$3.outline, _defineProperty({}, styles$3.hidden, hidden)),
216
+ xmlns: "http://www.w3.org/2000/svg",
217
+ viewBox: "0 0 100 100",
218
+ preserveAspectRatio: "none"
219
+ }, /*#__PURE__*/React.createElement("polygon", {
220
+ points: points.map(function (coords) {
221
+ return coords.map(function (coord) {
222
+ return coord;
223
+ }).join(',');
224
+ }).join(' '),
225
+ style: {
226
+ stroke: color
227
+ }
228
+ }));
229
+ }
230
+ function polygon(points) {
231
+ return "polygon(".concat(points.map(function (coords) {
232
+ return coords.map(function (coord) {
233
+ return "".concat(coord, "%");
234
+ }).join(' ');
235
+ }).join(', '), ")");
236
+ }
237
+
238
+ function _objectWithoutPropertiesLoose(source, excluded) {
239
+ if (source == null) return {};
240
+ var target = {};
241
+ var sourceKeys = Object.keys(source);
242
+ var key, i;
243
+
244
+ for (i = 0; i < sourceKeys.length; i++) {
245
+ key = sourceKeys[i];
246
+ if (excluded.indexOf(key) >= 0) continue;
247
+ target[key] = source[key];
248
+ }
249
+
250
+ return target;
251
+ }
252
+
253
+ function _objectWithoutProperties(source, excluded) {
254
+ if (source == null) return {};
255
+ var target = _objectWithoutPropertiesLoose(source, excluded);
256
+ var key, i;
257
+
258
+ if (Object.getOwnPropertySymbols) {
259
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
260
+
261
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
262
+ key = sourceSymbolKeys[i];
263
+ if (excluded.indexOf(key) >= 0) continue;
264
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
265
+ target[key] = source[key];
266
+ }
267
+ }
268
+
269
+ return target;
270
+ }
271
+
272
+ var styles$4 = {"area":"ImageArea-module_area__3rqgC","activeImageVisible":"ImageArea-module_activeImageVisible__oYKOK"};
273
+
274
+ var _excluded = ["panZoomEnabled", "activeImageVisible"];
275
+ function ImageArea(_ref) {
276
+ var panZoomEnabled = _ref.panZoomEnabled,
277
+ activeImageVisible = _ref.activeImageVisible,
278
+ props = _objectWithoutProperties(_ref, _excluded);
279
+ var _useContentElementLif = useContentElementLifecycle(),
280
+ shouldLoad = _useContentElementLif.shouldLoad;
281
+ var activeImageFile = useFile({
282
+ collectionName: 'imageFiles',
283
+ permaId: props.area.activeImage
284
+ });
285
+ var fallbackActiveImageFile = useFile({
286
+ collectionName: 'imageFiles',
287
+ permaId: props.area.fallbackActiveImage
288
+ });
289
+ return /*#__PURE__*/React.createElement(Area, Object.assign({}, props, {
290
+ className: classNames(styles$4.area, _defineProperty({}, styles$4.activeImageVisible, activeImageVisible))
291
+ }), /*#__PURE__*/React.createElement(Image, {
292
+ imageFile: activeImageFile || fallbackActiveImageFile,
293
+ load: shouldLoad,
294
+ variant: panZoomEnabled ? 'ultra' : 'large',
295
+ preferSvg: true
296
+ }));
297
+ }
298
+
299
+ var styles$5 = {"wrapper":"Indicator-module_wrapper__2b1Mj","indicator":"Indicator-module_indicator__2A3-l","inner":"Indicator-module_inner__2BgbL","hidden":"Indicator-module_hidden__3j1Re","outer":"Indicator-module_outer__36JWr"};
300
+
301
+ function Indicator(_ref) {
302
+ var area = _ref.area,
303
+ hidden = _ref.hidden,
304
+ panZoomTransform = _ref.panZoomTransform,
305
+ outerRef = _ref.outerRef;
306
+ return /*#__PURE__*/React.createElement("div", {
307
+ className: styles$5.wrapper,
308
+ ref: outerRef,
309
+ style: {
310
+ transform: panZoomTransform
311
+ }
312
+ }, /*#__PURE__*/React.createElement("div", {
313
+ className: classNames(styles$5.indicator, _defineProperty({}, styles$5.hidden, hidden)),
314
+ style: {
315
+ '--color': areaColor(area),
316
+ left: "".concat(area.indicatorPosition[0], "%"),
317
+ top: "".concat(area.indicatorPosition[1], "%")
318
+ }
319
+ }));
320
+ }
321
+
322
+ function ownKeys(object, enumerableOnly) {
323
+ var keys = Object.keys(object);
324
+
325
+ if (Object.getOwnPropertySymbols) {
326
+ var symbols = Object.getOwnPropertySymbols(object);
327
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
328
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
329
+ });
330
+ keys.push.apply(keys, symbols);
331
+ }
332
+
333
+ return keys;
334
+ }
335
+
336
+ function _objectSpread2(target) {
337
+ for (var i = 1; i < arguments.length; i++) {
338
+ var source = arguments[i] != null ? arguments[i] : {};
339
+
340
+ if (i % 2) {
341
+ ownKeys(Object(source), true).forEach(function (key) {
342
+ _defineProperty(target, key, source[key]);
343
+ });
344
+ } else if (Object.getOwnPropertyDescriptors) {
345
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
346
+ } else {
347
+ ownKeys(Object(source)).forEach(function (key) {
348
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
349
+ });
350
+ }
351
+ }
352
+
353
+ return target;
354
+ }
355
+
356
+ var TooltipPortal = FloatingPortal;
357
+
358
+ var useTooltipTransitionStyles = useTransitionStyles;
359
+
360
+ function _arrayWithoutHoles(arr) {
361
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
362
+ }
363
+
364
+ function _iterableToArray(iter) {
365
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
366
+ }
367
+
368
+ function _nonIterableSpread() {
369
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
370
+ }
371
+
372
+ function _toConsumableArray(arr) {
373
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
374
+ }
375
+
376
+ function getBoundingRect(area) {
377
+ var xCoords = area.map(function (point) {
378
+ return point[0];
379
+ });
380
+ var yCoords = area.map(function (point) {
381
+ return point[1];
382
+ });
383
+ var minX = Math.min.apply(Math, _toConsumableArray(xCoords));
384
+ var maxX = Math.max.apply(Math, _toConsumableArray(xCoords));
385
+ var minY = Math.min.apply(Math, _toConsumableArray(yCoords));
386
+ var maxY = Math.max.apply(Math, _toConsumableArray(yCoords));
387
+ return {
388
+ left: minX,
389
+ top: minY,
390
+ width: maxX - minX,
391
+ height: maxY - minY
392
+ };
393
+ }
394
+
395
+ function getTooltipInlineStyles(_ref) {
396
+ var area = _ref.area,
397
+ panZoomTransform = _ref.panZoomTransform;
398
+ var referencePositionInPercent = getReferencePositionInPercent({
399
+ area: area
400
+ });
401
+ return {
402
+ reference: {
403
+ left: "".concat(referencePositionInPercent.left, "%"),
404
+ top: "".concat(referencePositionInPercent.top, "%"),
405
+ height: "".concat(referencePositionInPercent.height, "%")
406
+ },
407
+ wrapper: {
408
+ transform: panZoomTransform
409
+ }
410
+ };
411
+ }
412
+ function getReferencePositionInPercent(_ref2) {
413
+ var area = _ref2.area;
414
+ var referenceType = area.tooltipReference;
415
+ var indicatorRect = getIndicatorRect(area.indicatorPosition);
416
+ if (referenceType === 'area') {
417
+ var boundingRect = getBoundingRect(area.outline);
418
+ return {
419
+ top: boundingRect.top,
420
+ height: boundingRect.height,
421
+ left: indicatorRect.left
422
+ };
423
+ } else {
424
+ return indicatorRect;
425
+ }
426
+ }
427
+ function getIndicatorRect(indicatorPosition) {
428
+ return {
429
+ left: indicatorPosition[0],
430
+ top: indicatorPosition[1],
431
+ height: 0
432
+ };
433
+ }
434
+
435
+ var styles$6 = {"darkContentSurfaceColor":"var(--theme-dark-content-surface-color, #101010)","lightContentSurfaceColor":"var(--theme-light-content-surface-color, #fff)","darkContentTextColor":"var(--theme-dark-content-text-color, #222)","lightContentTextColor":"var(--theme-light-content-text-color, #fff)","darkContentLinkColor":"var(--theme-dark-content-link-color, var(--theme-content-link-color, currentColor))","lightContentLinkColor":"var(--theme-light-content-link-color, var(--theme-content-link-color, currentColor))","compositeItem":"Tooltip-module_compositeItem__3QnpM","wrapper":"Tooltip-module_wrapper__3J6qG","reference":"Tooltip-module_reference__1qjnL","box":"Tooltip-module_box__2MGMl","paddingForScrollButtons":"Tooltip-module_paddingForScrollButtons__3wFKp","light":"Tooltip-module_light__3H6Ii scope-darkContent","dark":"Tooltip-module_dark__2nDMy scope-lightContent","maxWidth-wide":"Tooltip-module_maxWidth-wide__3Vik_","maxWidth-narrow":"Tooltip-module_maxWidth-narrow__foMG0","maxWidth-veryNarrow":"Tooltip-module_maxWidth-veryNarrow__1yS6L","align-center":"Tooltip-module_align-center__jRtdN","align-right":"Tooltip-module_align-right__2ezWZ","minWidth":"Tooltip-module_minWidth__2iAip","imageWrapper":"Tooltip-module_imageWrapper__1BCEJ","textWrapper":"Tooltip-module_textWrapper__Hc0qY","link":"Tooltip-module_link__1xE5O"};
436
+
437
+ var arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];
438
+ function Tooltip(_ref) {
439
+ var _tooltipTexts$area$id6, _tooltipTexts$area$id7, _tooltipLinks$area$id, _tooltipLinks$area$id2, _tooltipTexts$area$id8;
440
+ var area = _ref.area,
441
+ panZoomTransform = _ref.panZoomTransform,
442
+ contentElementId = _ref.contentElementId,
443
+ configuration = _ref.configuration,
444
+ visible = _ref.visible,
445
+ active = _ref.active,
446
+ imageFile = _ref.imageFile,
447
+ containerRect = _ref.containerRect,
448
+ keepInViewport = _ref.keepInViewport,
449
+ floatingStrategy = _ref.floatingStrategy,
450
+ aboveNavigationWidgets = _ref.aboveNavigationWidgets,
451
+ wrapperRef = _ref.wrapperRef,
452
+ onMouseEnter = _ref.onMouseEnter,
453
+ onMouseLeave = _ref.onMouseLeave,
454
+ onClick = _ref.onClick,
455
+ onDismiss = _ref.onDismiss;
456
+ var _useI18n = useI18n(),
457
+ translateWithEntryLocale = _useI18n.t;
458
+ var _useI18n2 = useI18n({
459
+ locale: 'ui'
460
+ }),
461
+ t = _useI18n2.t;
462
+ var updateConfiguration = useContentElementConfigurationUpdate();
463
+ var _useContentElementEdi = useContentElementEditorState(),
464
+ isEditable = _useContentElementEdi.isEditable;
465
+ var darkBackground = useDarkBackground();
466
+ var light = configuration.invertTooltips ? !darkBackground : darkBackground;
467
+ var tooltipImageFile = useFileWithInlineRights({
468
+ configuration: area,
469
+ collectionName: 'imageFiles',
470
+ propertyName: 'tooltipImage'
471
+ });
472
+ var inlineStyles = getTooltipInlineStyles({
473
+ area: area,
474
+ panZoomTransform: panZoomTransform
475
+ });
476
+ var tooltipTexts = configuration.tooltipTexts || {};
477
+ var tooltipLinks = configuration.tooltipLinks || {};
478
+ var referenceType = area.tooltipReference;
479
+ var position = area.tooltipPosition;
480
+ var maxWidth = area.tooltipMaxWidth;
481
+ var arrowRef = useRef();
482
+ var _useFloating = useFloating({
483
+ open: containerRect.width > 0 && visible,
484
+ onOpenChange: function onOpenChange(open) {
485
+ return !open && onDismiss();
486
+ },
487
+ strategy: floatingStrategy || 'absolute',
488
+ placement: position === 'above' ? 'top' : 'bottom',
489
+ middleware: [offset(referenceType === 'area' ? 7 : 20), shift(keepInViewport ? {
490
+ crossAxis: true,
491
+ padding: {
492
+ left: 40,
493
+ right: 40
494
+ }
495
+ } : {
496
+ padding: {
497
+ left: -5,
498
+ right: -5
499
+ },
500
+ boundary: wrapperRef.current
501
+ }), keepInViewport && flip(), arrow({
502
+ element: arrowRef,
503
+ padding: 5
504
+ })],
505
+ whileElementsMounted: autoUpdate
506
+ }),
507
+ refs = _useFloating.refs,
508
+ floatingStyles = _useFloating.floatingStyles,
509
+ context = _useFloating.context;
510
+ var role = useRole(context, {
511
+ role: 'label'
512
+ });
513
+ var dismiss = useDismiss(context, {
514
+ outsidePressEvent: 'mousedown',
515
+ outsidePress: function outsidePress(event) {
516
+ return !insidePagerButton(event.target);
517
+ }
518
+ });
519
+ var _useInteractions = useInteractions([role, dismiss]),
520
+ getReferenceProps = _useInteractions.getReferenceProps,
521
+ getFloatingProps = _useInteractions.getFloatingProps;
522
+ var _useTooltipTransition = useTooltipTransitionStyles(context),
523
+ isMounted = _useTooltipTransition.isMounted,
524
+ transitionStyles = _useTooltipTransition.styles;
525
+ var floatingPortalRoot = useFloatingPortalRoot();
526
+ function handleTextChange(propertyName, value) {
527
+ updateConfiguration({
528
+ tooltipTexts: _objectSpread2(_objectSpread2({}, tooltipTexts), {}, _defineProperty({}, area.id, _objectSpread2(_objectSpread2({}, tooltipTexts[area.id]), {}, _defineProperty({}, propertyName, value))))
529
+ });
530
+ }
531
+ function handleLinkChange(value) {
532
+ var _tooltipTexts$area$id;
533
+ if (utils.isBlankEditableTextValue((_tooltipTexts$area$id = tooltipTexts[area.id]) === null || _tooltipTexts$area$id === void 0 ? void 0 : _tooltipTexts$area$id.link)) {
534
+ handleTextChange('link', [{
535
+ type: 'heading',
536
+ children: [{
537
+ text: translateWithEntryLocale('pageflow_scrolled.public.more')
538
+ }]
539
+ }]);
540
+ }
541
+ updateConfiguration({
542
+ tooltipLinks: _objectSpread2(_objectSpread2({}, tooltipLinks), {}, _defineProperty({}, area.id, value))
543
+ });
544
+ }
545
+ function handleKeyDown(event) {
546
+ if (arrowKeys.includes(event.key) && isEditable) {
547
+ event.stopPropagation();
548
+ event.preventDefault();
549
+ }
550
+ }
551
+ function presentOrEditing(propertyName) {
552
+ var _tooltipTexts$area$id2, _tooltipTexts$area$id3, _tooltipTexts$area$id4, _tooltipTexts$area$id5;
553
+ return !utils.isBlankEditableTextValue((_tooltipTexts$area$id2 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id2 === void 0 ? void 0 : _tooltipTexts$area$id2[propertyName]) || isEditable && active || isEditable && utils.isBlankEditableTextValue((_tooltipTexts$area$id3 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id3 === void 0 ? void 0 : _tooltipTexts$area$id3.title) && utils.isBlankEditableTextValue((_tooltipTexts$area$id4 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id4 === void 0 ? void 0 : _tooltipTexts$area$id4.description) && utils.isBlankEditableTextValue((_tooltipTexts$area$id5 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id5 === void 0 ? void 0 : _tooltipTexts$area$id5.link);
554
+ }
555
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(CompositeItem, {
556
+ render: /*#__PURE__*/React.createElement("div", {
557
+ className: styles$6.compositeItem
558
+ })
559
+ }, /*#__PURE__*/React.createElement("div", {
560
+ className: styles$6.wrapper,
561
+ style: inlineStyles.wrapper
562
+ }, /*#__PURE__*/React.createElement("div", Object.assign({
563
+ ref: refs.setReference,
564
+ className: styles$6.reference,
565
+ style: inlineStyles.reference
566
+ }, getReferenceProps())))), isMounted && /*#__PURE__*/React.createElement(TooltipPortal, {
567
+ id: aboveNavigationWidgets && 'floating-ui-above-navigation-widgets',
568
+ root: floatingPortalRoot
569
+ }, /*#__PURE__*/React.createElement(FloatingFocusManager, {
570
+ context: context,
571
+ modal: false,
572
+ initialFocus: -1,
573
+ returnFocus: false
574
+ }, /*#__PURE__*/React.createElement("div", {
575
+ style: transitionStyles
576
+ }, /*#__PURE__*/React.createElement("div", Object.assign({
577
+ ref: refs.setFloating,
578
+ style: floatingStyles,
579
+ className: classNames(styles$6.box, styles$6["maxWidth-".concat(maxWidth)], styles$6["align-".concat(area.tooltipTextAlign)], light ? styles$6.light : styles$6.dark, _defineProperty(_defineProperty({}, styles$6.paddingForScrollButtons, keepInViewport), styles$6.minWidth, presentOrEditing('link'))),
580
+ onMouseEnter: onMouseEnter,
581
+ onMouseLeave: onMouseLeave,
582
+ onClick: onClick
583
+ }, getFloatingProps()), /*#__PURE__*/React.createElement(FloatingArrow, {
584
+ ref: arrowRef,
585
+ context: context,
586
+ strokeWidth: 1
587
+ }), tooltipImageFile && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
588
+ className: styles$6.imageWrapper
589
+ }, /*#__PURE__*/React.createElement(Image, {
590
+ imageFile: tooltipImageFile,
591
+ variant: 'medium',
592
+ fill: false,
593
+ width: tooltipImageFile.width,
594
+ height: tooltipImageFile.height,
595
+ preferSvg: true
596
+ }), /*#__PURE__*/React.createElement(InlineFileRights, {
597
+ context: "insideElement",
598
+ items: [{
599
+ file: tooltipImageFile,
600
+ label: 'image'
601
+ }]
602
+ }), /*#__PURE__*/React.createElement(InlineFileRights, {
603
+ context: "afterElement",
604
+ items: [{
605
+ file: tooltipImageFile,
606
+ label: 'image'
607
+ }]
608
+ }))), /*#__PURE__*/React.createElement("div", {
609
+ className: styles$6.textWrapper,
610
+ onKeyDown: handleKeyDown
611
+ }, presentOrEditing('title') && /*#__PURE__*/React.createElement("h3", {
612
+ id: "hotspots-tooltip-title-".concat(contentElementId, "-").concat(area.id)
613
+ }, /*#__PURE__*/React.createElement(Text, {
614
+ inline: true,
615
+ scaleCategory: "hotspotsTooltipTitle"
616
+ }, /*#__PURE__*/React.createElement(EditableInlineText, {
617
+ value: (_tooltipTexts$area$id6 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id6 === void 0 ? void 0 : _tooltipTexts$area$id6.title,
618
+ onChange: function onChange(value) {
619
+ return handleTextChange('title', value);
620
+ },
621
+ placeholder: t('pageflow_scrolled.inline_editing.type_heading')
622
+ }))), presentOrEditing('description') && /*#__PURE__*/React.createElement(EditableText, {
623
+ value: (_tooltipTexts$area$id7 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id7 === void 0 ? void 0 : _tooltipTexts$area$id7.description,
624
+ onChange: function onChange(value) {
625
+ return handleTextChange('description', value);
626
+ },
627
+ scaleCategory: "hotspotsTooltipDescription",
628
+ placeholder: t('pageflow_scrolled.inline_editing.type_text')
629
+ }), presentOrEditing('link') && /*#__PURE__*/React.createElement(LinkButton, {
630
+ className: styles$6.link,
631
+ scaleCategory: "hotspotsTooltipLink",
632
+ href: (_tooltipLinks$area$id = tooltipLinks[area.id]) === null || _tooltipLinks$area$id === void 0 ? void 0 : _tooltipLinks$area$id.href,
633
+ openInNewTab: (_tooltipLinks$area$id2 = tooltipLinks[area.id]) === null || _tooltipLinks$area$id2 === void 0 ? void 0 : _tooltipLinks$area$id2.openInNewTab,
634
+ value: (_tooltipTexts$area$id8 = tooltipTexts[area.id]) === null || _tooltipTexts$area$id8 === void 0 ? void 0 : _tooltipTexts$area$id8.link,
635
+ onTextChange: function onTextChange(value) {
636
+ return handleTextChange('link', value);
637
+ },
638
+ onLinkChange: function onLinkChange(value) {
639
+ return handleLinkChange(value);
640
+ }
641
+ })))))));
642
+ }
643
+
644
+ function useHotspotsConfiguration(configuration) {
645
+ var defaultImageFile = useFileWithInlineRights({
646
+ configuration: configuration,
647
+ collectionName: 'imageFiles',
648
+ propertyName: 'image'
649
+ });
650
+ var portraitImageFile = useFileWithInlineRights({
651
+ configuration: configuration,
652
+ collectionName: 'imageFiles',
653
+ propertyName: 'portraitImage'
654
+ });
655
+ var portraitOrientation = usePortraitOrientation();
656
+ var portraitMode = !!(portraitOrientation && portraitImageFile);
657
+ var imageFile = portraitMode ? portraitImageFile : defaultImageFile;
658
+ return {
659
+ panZoomEnabled: usePanZoomEnabled(configuration),
660
+ areas: useAreas(configuration, portraitMode),
661
+ imageFile: imageFile,
662
+ portraitMode: portraitMode
663
+ };
664
+ }
665
+ function useAreas(configuration, portraitMode) {
666
+ return useMemo(function () {
667
+ return (configuration.areas || []).map(function (area) {
668
+ if (portraitMode) {
669
+ return applyAreaDefaults(_objectSpread2(_objectSpread2({}, area), {}, {
670
+ outline: area.portraitOutline,
671
+ zoom: area.portraitZoom,
672
+ activeImage: area.portraitActiveImage,
673
+ fallbackActiveImage: area.activeImage,
674
+ indicatorPosition: area.portraitIndicatorPosition,
675
+ color: area.portraitColor || area.color,
676
+ tooltipReference: area.portraitTooltipReference,
677
+ tooltipPosition: area.portraitTooltipPosition,
678
+ tooltipMaxWidth: area.portraitTooltipMaxWidth
679
+ }));
680
+ } else {
681
+ return applyAreaDefaults(area);
682
+ }
683
+ });
684
+ }, [configuration.areas, portraitMode]);
685
+ }
686
+ function applyAreaDefaults(area) {
687
+ var _area$outline;
688
+ return _objectSpread2(_objectSpread2({}, area), {}, {
689
+ outline: ((_area$outline = area.outline) === null || _area$outline === void 0 ? void 0 : _area$outline.length) ? area.outline : [[50, 50]],
690
+ zoom: area.zoom || 0,
691
+ indicatorPosition: area.indicatorPosition || [50, 50]
692
+ });
693
+ }
694
+ function usePanZoomEnabled(configuration) {
695
+ var isPhonePlatform = usePhonePlatform();
696
+ return configuration.enablePanZoom === 'always' || configuration.enablePanZoom === 'phonePlatform' && isPhonePlatform;
697
+ }
698
+
699
+ function useHotspotsEditorCommandSubscriptions(_ref) {
700
+ var setHighlightedIndex = _ref.setHighlightedIndex,
701
+ activateArea = _ref.activateArea;
702
+ useContentElementEditorCommandSubscription(function (command) {
703
+ if (command.type === 'HIGHLIGHT_AREA') {
704
+ setHighlightedIndex(command.index);
705
+ } else if (command.type === 'RESET_AREA_HIGHLIGHT') {
706
+ setHighlightedIndex(-1);
707
+ } else if (command.type === 'SET_ACTIVE_AREA') {
708
+ activateArea(command.index);
709
+ }
710
+ });
711
+ }
712
+
713
+ function useHotspotsState(_ref) {
714
+ var areas = _ref.areas,
715
+ initialActiveArea = _ref.initialActiveArea;
716
+ var _useContentElementEdi = useContentElementEditorState(),
717
+ setTransientState = _useContentElementEdi.setTransientState,
718
+ select = _useContentElementEdi.select,
719
+ isSelected = _useContentElementEdi.isSelected;
720
+ var _useState = useState(typeof initialActiveArea === 'undefined' ? -1 : initialActiveArea),
721
+ _useState2 = _slicedToArray(_useState, 2),
722
+ activeIndex = _useState2[0],
723
+ setActiveIndexState = _useState2[1];
724
+ var _useState3 = useState(-1),
725
+ _useState4 = _slicedToArray(_useState3, 2),
726
+ hoveredIndex = _useState4[0],
727
+ setHoveredIndex = _useState4[1];
728
+ var _useState5 = useState(-1),
729
+ _useState6 = _slicedToArray(_useState5, 2),
730
+ highlightedIndex = _useState6[0],
731
+ setHighlightedIndex = _useState6[1];
732
+ var setActiveIndex = useCallback(function (index) {
733
+ var _areas$index;
734
+ setTransientState({
735
+ activeAreaId: (_areas$index = areas[index]) === null || _areas$index === void 0 ? void 0 : _areas$index.id
736
+ });
737
+ setActiveIndexState(function (activeIndex) {
738
+ if (activeIndex !== index && index >= 0 && isSelected) {
739
+ select();
740
+ }
741
+ return index;
742
+ });
743
+ }, [setActiveIndexState, setTransientState, areas, select, isSelected]);
744
+ return {
745
+ activeIndex: activeIndex,
746
+ hoveredIndex: hoveredIndex,
747
+ highlightedIndex: highlightedIndex,
748
+ setActiveIndex: setActiveIndex,
749
+ setHoveredIndex: setHoveredIndex,
750
+ setHighlightedIndex: setHighlightedIndex
751
+ };
752
+ }
753
+
754
+ function useContentRect(_ref) {
755
+ var enabled = _ref.enabled;
756
+ var _useState = useState({
757
+ width: 0,
758
+ height: 0
759
+ }),
760
+ _useState2 = _slicedToArray(_useState, 2),
761
+ contentRect = _useState2[0],
762
+ setContentRect = _useState2[1];
763
+ var ref = useRef();
764
+ useEffect(function () {
765
+ if (!enabled) {
766
+ return;
767
+ }
768
+ var current = ref.current;
769
+ var resizeObserver = new ResizeObserver(function (entries) {
770
+ requestAnimationFrame(function () {
771
+ setContentRect(entries[entries.length - 1].contentRect);
772
+ });
773
+ });
774
+ resizeObserver.observe(current);
775
+ return function () {
776
+ resizeObserver.unobserve(current);
777
+ };
778
+ }, [enabled]);
779
+ return [contentRect, ref];
780
+ }
781
+
782
+ var fullRect = {
783
+ left: 0,
784
+ top: 0,
785
+ width: 100,
786
+ height: 100
787
+ };
788
+ function getInitialTransform(_ref) {
789
+ var containerWidth = _ref.containerWidth,
790
+ containerHeight = _ref.containerHeight,
791
+ imageFileWidth = _ref.imageFileWidth,
792
+ imageFileHeight = _ref.imageFileHeight,
793
+ areasBoundingRect = _ref.areasBoundingRect,
794
+ _ref$indicatorPositio = _ref.indicatorPositions,
795
+ indicatorPositions = _ref$indicatorPositio === void 0 ? [] : _ref$indicatorPositio,
796
+ _ref$containerSafeAre = _ref.containerSafeAreaMargin,
797
+ containerSafeAreaMargin = _ref$containerSafeAre === void 0 ? 0 : _ref$containerSafeAre;
798
+ var baseImageWidth = imageFileWidth * containerHeight / imageFileHeight;
799
+ var baseImageHeight = containerHeight;
800
+ var scaleCover = getScaleToCoverContainerWithRect({
801
+ baseImageWidth: baseImageWidth,
802
+ baseImageHeight: baseImageHeight,
803
+ containerWidth: containerWidth,
804
+ containerHeight: containerHeight,
805
+ rect: fullRect
806
+ });
807
+ var scaleContainMotif = getScaleToContainRectInContainer({
808
+ baseImageWidth: baseImageWidth,
809
+ baseImageHeight: baseImageHeight,
810
+ containerWidth: containerWidth * (1 - 2 * containerSafeAreaMargin / 100),
811
+ containerHeight: containerHeight,
812
+ rect: areasBoundingRect
813
+ });
814
+ var scale = Math.min(scaleCover, scaleContainMotif);
815
+ var _center = center({
816
+ baseImageWidth: baseImageWidth,
817
+ baseImageHeight: baseImageHeight,
818
+ containerWidth: containerWidth,
819
+ containerHeight: containerHeight,
820
+ scale: scale,
821
+ unbounded: scaleContainMotif < scaleCover,
822
+ rect: areasBoundingRect
823
+ }),
824
+ _center2 = _slicedToArray(_center, 2),
825
+ translateX = _center2[0],
826
+ translateY = _center2[1];
827
+ return {
828
+ wrapper: {
829
+ x: translateX,
830
+ y: translateY,
831
+ scale: scale
832
+ },
833
+ indicators: transformIndicators({
834
+ indicatorPositions: indicatorPositions,
835
+ baseImageWidth: baseImageWidth,
836
+ baseImageHeight: baseImageHeight,
837
+ translateX: translateX,
838
+ translateY: translateY,
839
+ scale: scale
840
+ })
841
+ };
842
+ }
843
+ function getPanZoomStepTransform(_ref2) {
844
+ var containerWidth = _ref2.containerWidth,
845
+ containerHeight = _ref2.containerHeight,
846
+ imageFileWidth = _ref2.imageFileWidth,
847
+ imageFileHeight = _ref2.imageFileHeight,
848
+ areaOutline = _ref2.areaOutline,
849
+ areaZoom = _ref2.areaZoom,
850
+ _ref2$indicatorPositi = _ref2.indicatorPositions,
851
+ indicatorPositions = _ref2$indicatorPositi === void 0 ? [] : _ref2$indicatorPositi,
852
+ initialScale = _ref2.initialScale;
853
+ var areaRect = getBoundingRect(areaOutline);
854
+ var baseImageWidth = imageFileWidth * containerHeight / imageFileHeight;
855
+ var baseImageHeight = containerHeight;
856
+ var scale = getAreaScale({
857
+ baseImageWidth: baseImageWidth,
858
+ baseImageHeight: baseImageHeight,
859
+ containerWidth: containerWidth,
860
+ containerHeight: containerHeight,
861
+ areaRect: areaRect,
862
+ areaZoom: areaZoom,
863
+ initialScale: initialScale
864
+ });
865
+ var _center3 = center({
866
+ baseImageWidth: baseImageWidth,
867
+ baseImageHeight: baseImageHeight,
868
+ containerWidth: containerWidth,
869
+ containerHeight: containerHeight,
870
+ rect: areaRect,
871
+ scale: scale
872
+ }),
873
+ _center4 = _slicedToArray(_center3, 2),
874
+ translateX = _center4[0],
875
+ translateY = _center4[1];
876
+ return {
877
+ wrapper: {
878
+ x: translateX,
879
+ y: translateY,
880
+ scale: scale
881
+ },
882
+ indicators: transformIndicators({
883
+ indicatorPositions: indicatorPositions,
884
+ baseImageWidth: baseImageWidth,
885
+ baseImageHeight: baseImageHeight,
886
+ translateX: translateX,
887
+ translateY: translateY,
888
+ scale: scale
889
+ })
890
+ };
891
+ }
892
+ function transformIndicators(_ref3) {
893
+ var indicatorPositions = _ref3.indicatorPositions,
894
+ baseImageWidth = _ref3.baseImageWidth,
895
+ baseImageHeight = _ref3.baseImageHeight,
896
+ translateX = _ref3.translateX,
897
+ translateY = _ref3.translateY,
898
+ scale = _ref3.scale;
899
+ return indicatorPositions.map(function (indicatorPosition) {
900
+ return {
901
+ x: translateX + baseImageWidth * indicatorPosition[0] / 100 * (scale - 1),
902
+ y: translateY + baseImageHeight * indicatorPosition[1] / 100 * (scale - 1)
903
+ };
904
+ });
905
+ }
906
+ function getAreaScale(_ref4) {
907
+ var containerWidth = _ref4.containerWidth,
908
+ containerHeight = _ref4.containerHeight,
909
+ baseImageWidth = _ref4.baseImageWidth,
910
+ baseImageHeight = _ref4.baseImageHeight,
911
+ areaRect = _ref4.areaRect,
912
+ areaZoom = _ref4.areaZoom,
913
+ _ref4$initialScale = _ref4.initialScale,
914
+ initialScale = _ref4$initialScale === void 0 ? 1 : _ref4$initialScale;
915
+ var scale = getScaleToContainRectInContainer({
916
+ containerWidth: containerWidth,
917
+ containerHeight: containerHeight,
918
+ baseImageWidth: baseImageWidth,
919
+ baseImageHeight: baseImageHeight,
920
+ rect: areaRect
921
+ });
922
+ return (100 - areaZoom) / 100 * initialScale + areaZoom / 100 * scale;
923
+ }
924
+ function getScaleToCoverContainerWithRect(_ref5) {
925
+ var containerWidth = _ref5.containerWidth,
926
+ containerHeight = _ref5.containerHeight,
927
+ baseImageWidth = _ref5.baseImageWidth,
928
+ baseImageHeight = _ref5.baseImageHeight,
929
+ rect = _ref5.rect;
930
+ var _getScalesToFit = getScalesToFit({
931
+ containerWidth: containerWidth,
932
+ containerHeight: containerHeight,
933
+ baseImageWidth: baseImageWidth,
934
+ baseImageHeight: baseImageHeight,
935
+ rect: rect
936
+ }),
937
+ _getScalesToFit2 = _slicedToArray(_getScalesToFit, 2),
938
+ scaleX = _getScalesToFit2[0],
939
+ scaleY = _getScalesToFit2[1];
940
+ return Math.max(scaleX, scaleY);
941
+ }
942
+ function getScaleToContainRectInContainer(_ref6) {
943
+ var containerWidth = _ref6.containerWidth,
944
+ containerHeight = _ref6.containerHeight,
945
+ baseImageWidth = _ref6.baseImageWidth,
946
+ baseImageHeight = _ref6.baseImageHeight,
947
+ rect = _ref6.rect;
948
+ var _getScalesToFit3 = getScalesToFit({
949
+ containerWidth: containerWidth,
950
+ containerHeight: containerHeight,
951
+ baseImageWidth: baseImageWidth,
952
+ baseImageHeight: baseImageHeight,
953
+ rect: rect
954
+ }),
955
+ _getScalesToFit4 = _slicedToArray(_getScalesToFit3, 2),
956
+ scaleX = _getScalesToFit4[0],
957
+ scaleY = _getScalesToFit4[1];
958
+ return Math.min(scaleX, scaleY);
959
+ }
960
+ function getScalesToFit(_ref7) {
961
+ var containerWidth = _ref7.containerWidth,
962
+ containerHeight = _ref7.containerHeight,
963
+ baseImageWidth = _ref7.baseImageWidth,
964
+ baseImageHeight = _ref7.baseImageHeight,
965
+ rect = _ref7.rect;
966
+ var baseRectWidth = rect.width / 100 * baseImageWidth;
967
+ var baseRectHeight = rect.height / 100 * baseImageHeight;
968
+ return [containerWidth / baseRectWidth, containerHeight / baseRectHeight];
969
+ }
970
+ function center(_ref8) {
971
+ var baseImageWidth = _ref8.baseImageWidth,
972
+ baseImageHeight = _ref8.baseImageHeight,
973
+ containerWidth = _ref8.containerWidth,
974
+ containerHeight = _ref8.containerHeight,
975
+ unbounded = _ref8.unbounded,
976
+ rect = _ref8.rect,
977
+ scale = _ref8.scale;
978
+ var displayImageWidth = baseImageWidth * scale;
979
+ var displayImageHeight = baseImageHeight * scale;
980
+ var displayRectWidth = rect.width / 100 * displayImageWidth;
981
+ var displayRectLeft = rect.left / 100 * displayImageWidth;
982
+ var displayRectHeight = rect.height / 100 * displayImageHeight;
983
+ var displayRectTop = rect.top / 100 * displayImageHeight;
984
+ var translateX;
985
+ var translateY;
986
+ if (displayImageWidth < containerWidth) {
987
+ translateX = (containerWidth - displayImageWidth) / 2;
988
+ } else {
989
+ translateX = (containerWidth - displayRectWidth) / 2 - displayRectLeft;
990
+ if (!unbounded) {
991
+ translateX = Math.min(0, Math.max(containerWidth - displayImageWidth, translateX));
992
+ }
993
+ }
994
+ if (displayImageHeight < containerHeight) {
995
+ translateY = (containerHeight - displayImageHeight) / 2;
996
+ } else {
997
+ translateY = (containerHeight - displayRectHeight) / 2 - displayRectTop;
998
+ if (!unbounded) {
999
+ translateY = Math.min(0, Math.max(containerHeight - displayImageHeight, translateY));
1000
+ }
1001
+ }
1002
+ return [translateX, translateY];
1003
+ }
1004
+
1005
+ function usePanZoomTransforms(_ref) {
1006
+ var containerRect = _ref.containerRect,
1007
+ imageFile = _ref.imageFile,
1008
+ areas = _ref.areas,
1009
+ initialTransformEnabled = _ref.initialTransformEnabled,
1010
+ panZoomEnabled = _ref.panZoomEnabled;
1011
+ var imageFileWidth = imageFile === null || imageFile === void 0 ? void 0 : imageFile.width;
1012
+ var imageFileHeight = imageFile === null || imageFile === void 0 ? void 0 : imageFile.height;
1013
+ var containerWidth = containerRect.width;
1014
+ var containerHeight = containerRect.height;
1015
+ return useMemo(function () {
1016
+ if (!panZoomEnabled && !initialTransformEnabled || !containerWidth || !containerHeight || !imageFileWidth || !imageFileHeight) {
1017
+ return nullTransforms;
1018
+ }
1019
+ var indicatorPositions = areas.map(function (area) {
1020
+ return area.indicatorPosition;
1021
+ });
1022
+ var areasBoundingRect = getBoundingRect(areas.flatMap(function (area) {
1023
+ return area.outline;
1024
+ }));
1025
+ var initialTransform = initialTransformEnabled ? getInitialTransform({
1026
+ areasBoundingRect: areasBoundingRect,
1027
+ imageFileWidth: imageFileWidth,
1028
+ imageFileHeight: imageFileHeight,
1029
+ containerWidth: containerWidth,
1030
+ containerHeight: containerHeight,
1031
+ indicatorPositions: indicatorPositions,
1032
+ containerSafeAreaMargin: getContainerSafeAreaMargin({
1033
+ panZoomEnabled: panZoomEnabled,
1034
+ areasBoundingRect: areasBoundingRect
1035
+ })
1036
+ }) : nullTransform;
1037
+ var initialTransformString = toString(initialTransform.wrapper);
1038
+ var areaTransformStrings = [];
1039
+ var tooltipTransformStrings = [];
1040
+ areas.forEach(function (area, index) {
1041
+ if (panZoomEnabled) {
1042
+ var _initialTransform$wra;
1043
+ var transform = getPanZoomStepTransform({
1044
+ areaOutline: area.outline,
1045
+ areaZoom: area.zoom,
1046
+ initialScale: ((_initialTransform$wra = initialTransform.wrapper) === null || _initialTransform$wra === void 0 ? void 0 : _initialTransform$wra.scale) || 1,
1047
+ imageFileWidth: imageFileWidth,
1048
+ imageFileHeight: imageFileHeight,
1049
+ containerWidth: containerWidth,
1050
+ containerHeight: containerHeight,
1051
+ indicatorPositions: indicatorPositions
1052
+ });
1053
+ var transformString = toString(transform.wrapper);
1054
+ areaTransformStrings.push({
1055
+ wrapper: transformString,
1056
+ indicators: transform.indicators.map(toString)
1057
+ });
1058
+ tooltipTransformStrings.push(transformString);
1059
+ } else {
1060
+ tooltipTransformStrings.push(initialTransformString);
1061
+ }
1062
+ });
1063
+ return {
1064
+ initial: {
1065
+ wrapper: initialTransformString,
1066
+ indicators: initialTransform.indicators.map(toString),
1067
+ tooltips: tooltipTransformStrings
1068
+ },
1069
+ areas: areaTransformStrings
1070
+ };
1071
+ }, [panZoomEnabled, initialTransformEnabled, containerWidth, containerHeight, imageFileWidth, imageFileHeight, areas]);
1072
+ }
1073
+ var pagerButtonsMargin = 8;
1074
+ function getContainerSafeAreaMargin(_ref2) {
1075
+ var panZoomEnabled = _ref2.panZoomEnabled,
1076
+ areasBoundingRect = _ref2.areasBoundingRect;
1077
+ return panZoomEnabled && insideSafeArea(areasBoundingRect) ? pagerButtonsMargin : 0;
1078
+ }
1079
+ function insideSafeArea(rect) {
1080
+ return rect.left >= pagerButtonsMargin && rect.left + rect.width <= 100 - pagerButtonsMargin;
1081
+ }
1082
+ function toString(transform) {
1083
+ return transform && "translate(".concat(transform.x, "px, ").concat(transform.y, "px) scale(").concat(transform.scale || 1, ")");
1084
+ }
1085
+ var nullTransforms = {
1086
+ initial: {
1087
+ indicators: [],
1088
+ tooltips: []
1089
+ },
1090
+ areas: []
1091
+ };
1092
+ var nullTransform = {
1093
+ indicators: []
1094
+ };
1095
+
1096
+ function useIntersectionObserver(_ref) {
1097
+ var threshold = _ref.threshold,
1098
+ onVisibleIndexChange = _ref.onVisibleIndexChange,
1099
+ enabled = _ref.enabled;
1100
+ var containerRef = useRef();
1101
+ var childRefs = useRef([]);
1102
+ var observerRef = useRef();
1103
+ useEffect(function () {
1104
+ if (!enabled) {
1105
+ return;
1106
+ }
1107
+ var observer = observerRef.current = new IntersectionObserver(function (entries) {
1108
+ var containerElement = containerRef.current;
1109
+ if (!containerElement) {
1110
+ return;
1111
+ }
1112
+ var found = false;
1113
+ entries.forEach(function (entry) {
1114
+ var entryIndex = Array.from(containerElement.children).findIndex(function (child) {
1115
+ return child === entry.target;
1116
+ });
1117
+ if (entry.isIntersecting && entry.intersectionRatio >= threshold) {
1118
+ found = true;
1119
+ onVisibleIndexChange(entryIndex);
1120
+ }
1121
+ });
1122
+ if (!found) {
1123
+ onVisibleIndexChange(-1);
1124
+ }
1125
+ }, {
1126
+ root: containerRef.current,
1127
+ threshold: threshold
1128
+ });
1129
+ childRefs.current.forEach(function (child) {
1130
+ if (child) {
1131
+ observer.observe(child);
1132
+ }
1133
+ });
1134
+ return function () {
1135
+ observer.disconnect();
1136
+ };
1137
+ }, [enabled, threshold, onVisibleIndexChange]);
1138
+ var setChildRef = function setChildRef(index) {
1139
+ return function (ref) {
1140
+ if (observerRef.current) {
1141
+ if (ref) {
1142
+ observerRef.current.observe(ref);
1143
+ } else {
1144
+ observerRef.current.unobserve(childRefs.current[index]);
1145
+ }
1146
+ }
1147
+ childRefs.current[index] = ref;
1148
+ };
1149
+ };
1150
+ return [containerRef, setChildRef];
1151
+ }
1152
+
1153
+ function useScrollPanZoom(_ref) {
1154
+ var panZoomTransforms = _ref.panZoomTransforms,
1155
+ enabled = _ref.enabled,
1156
+ onChange = _ref.onChange;
1157
+ var wrapperRef = useRef();
1158
+ var scrollerAreasRef = useRef();
1159
+ var indicatorRefs = useRef([]);
1160
+ var onVisibleIndexChange = useCallback(function (index) {
1161
+ return onChange(index - 1);
1162
+ }, [onChange]);
1163
+ var _useIntersectionObser = useIntersectionObserver({
1164
+ enabled: enabled,
1165
+ threshold: 0.7,
1166
+ onVisibleIndexChange: onVisibleIndexChange
1167
+ }),
1168
+ _useIntersectionObser2 = _slicedToArray(_useIntersectionObser, 2),
1169
+ scrollerRef = _useIntersectionObser2[0],
1170
+ setStepRef = _useIntersectionObser2[1];
1171
+ var steps = useMemo(function () {
1172
+ if (!enabled || !panZoomTransforms.areas.length) {
1173
+ return;
1174
+ }
1175
+ return [panZoomTransforms.initial].concat(_toConsumableArray(panZoomTransforms.areas), [panZoomTransforms.initial]);
1176
+ }, [panZoomTransforms, enabled]);
1177
+ var scrollFromToArea = useCallback(function (from, to) {
1178
+ var scroller = scrollerRef.current;
1179
+ var step = scroller.children[to + 1];
1180
+ scroller.scrollTo(Math.abs(scroller.offsetLeft - step.offsetLeft), 0);
1181
+ if (!steps) {
1182
+ return;
1183
+ }
1184
+ wrapperRef.current.animate([keyframe(steps[from + 1].wrapper), keyframe(steps[to + 1].wrapper)], {
1185
+ duration: 200
1186
+ });
1187
+ panZoomTransforms.areas.forEach(function (_, index) {
1188
+ indicatorRefs.current[index].animate([keyframe(steps[from + 1].indicators[index]), keyframe(steps[to + 1].indicators[index])], {
1189
+ duration: 200
1190
+ });
1191
+ });
1192
+ }, [scrollerRef, steps, panZoomTransforms]);
1193
+ useIsomorphicLayoutEffect(function () {
1194
+ if (!steps) {
1195
+ return;
1196
+ }
1197
+ var scrollTimeline = new window.ScrollTimeline({
1198
+ source: scrollerRef.current,
1199
+ axis: 'inline'
1200
+ });
1201
+ var animations = [];
1202
+ [wrapperRef.current, scrollerAreasRef.current].forEach(function (element) {
1203
+ return animations.push(element.animate(steps.map(function (step) {
1204
+ return keyframe(step.wrapper);
1205
+ }), {
1206
+ fill: 'both',
1207
+ timeline: scrollTimeline
1208
+ }));
1209
+ });
1210
+ panZoomTransforms.areas.forEach(function (_, index) {
1211
+ animations.push(indicatorRefs.current[index].animate(steps.map(function (step) {
1212
+ return keyframe(step.indicators[index]);
1213
+ }), {
1214
+ fill: 'both',
1215
+ timeline: scrollTimeline
1216
+ }));
1217
+ });
1218
+ return function () {
1219
+ return animations.forEach(function (animation) {
1220
+ return animation.cancel();
1221
+ });
1222
+ };
1223
+ }, [panZoomTransforms, steps]);
1224
+ var setIndicatorRef = function setIndicatorRef(index) {
1225
+ return function (ref) {
1226
+ indicatorRefs.current[index] = ref;
1227
+ };
1228
+ };
1229
+ return {
1230
+ panZoomRefs: {
1231
+ wrapper: wrapperRef,
1232
+ scroller: scrollerRef,
1233
+ scrollerAreas: scrollerAreasRef,
1234
+ setStep: setStepRef,
1235
+ setIndicator: setIndicatorRef
1236
+ },
1237
+ scrollFromToArea: scrollFromToArea
1238
+ };
1239
+ }
1240
+ function keyframe(transform) {
1241
+ return {
1242
+ transform: transform || 'translate(0px, 0px)',
1243
+ easing: 'ease'
1244
+ };
1245
+ }
1246
+
1247
+ var styles$7 = {"tooltipsWrapper":"Hotspots-module_tooltipsWrapper__3EEZA","clip":"Hotspots-module_clip__2wfxm","stack":"Hotspots-module_stack__3Vpw6","letterboxBackground":"Hotspots-module_letterboxBackground__3GNSI","wrapper":"Hotspots-module_wrapper__1TvVX","compositeItem":"Hotspots-module_compositeItem__BZtU-"};
1248
+
1249
+ function Hotspots(_ref) {
1250
+ var contentElementId = _ref.contentElementId,
1251
+ contentElementWidth = _ref.contentElementWidth,
1252
+ customMargin = _ref.customMargin,
1253
+ configuration = _ref.configuration,
1254
+ _ref$sectionProps = _ref.sectionProps,
1255
+ sectionProps = _ref$sectionProps === void 0 ? {} : _ref$sectionProps;
1256
+ return /*#__PURE__*/React.createElement(FullscreenViewer, {
1257
+ contentElementId: contentElementId,
1258
+ renderChildren: function renderChildren(_ref2) {
1259
+ var enterFullscreen = _ref2.enterFullscreen;
1260
+ return /*#__PURE__*/React.createElement(HotspotsImage, {
1261
+ contentElementId: contentElementId,
1262
+ contentElementWidth: contentElementWidth,
1263
+ customMargin: customMargin,
1264
+ configuration: configuration,
1265
+ isIntersecting: sectionProps.isIntersecting,
1266
+ displayFullscreenToggle: contentElementWidth !== contentElementWidths.full && configuration.enableFullscreen,
1267
+ keepTooltipsInViewport: configuration.position === 'backdrop',
1268
+ onFullscreenEnter: enterFullscreen,
1269
+ floatingStrategy: configuration.position === 'standAlone' || configuration.position === 'backdrop' ? 'fixed' : 'absolute'
1270
+ }, function (children) {
1271
+ return /*#__PURE__*/React.createElement(ContentElementBox, null, /*#__PURE__*/React.createElement(ContentElementFigure, {
1272
+ configuration: configuration
1273
+ }, /*#__PURE__*/React.createElement("div", {
1274
+ className: styles$7.clip
1275
+ }, children)));
1276
+ });
1277
+ },
1278
+ renderFullscreenChildren: function renderFullscreenChildren() {
1279
+ return /*#__PURE__*/React.createElement(HotspotsImage, {
1280
+ contentElementId: contentElementId,
1281
+ contentElementWidth: contentElementWidth,
1282
+ configuration: configuration,
1283
+ displayFullscreenToggle: false,
1284
+ keepTooltipsInViewport: true,
1285
+ tooltipsAboveNavigationWidgets: true
1286
+ });
1287
+ }
1288
+ });
1289
+ }
1290
+ function HotspotsImage(_ref3) {
1291
+ var contentElementId = _ref3.contentElementId,
1292
+ contentElementWidth = _ref3.contentElementWidth,
1293
+ customMargin = _ref3.customMargin,
1294
+ configuration = _ref3.configuration,
1295
+ keepTooltipsInViewport = _ref3.keepTooltipsInViewport,
1296
+ floatingStrategy = _ref3.floatingStrategy,
1297
+ tooltipsAboveNavigationWidgets = _ref3.tooltipsAboveNavigationWidgets,
1298
+ isIntersecting = _ref3.isIntersecting,
1299
+ displayFullscreenToggle = _ref3.displayFullscreenToggle,
1300
+ onFullscreenEnter = _ref3.onFullscreenEnter,
1301
+ _ref3$children = _ref3.children,
1302
+ children = _ref3$children === void 0 ? function (children) {
1303
+ return children;
1304
+ } : _ref3$children;
1305
+ var _useHotspotsConfigura = useHotspotsConfiguration(configuration),
1306
+ imageFile = _useHotspotsConfigura.imageFile,
1307
+ areas = _useHotspotsConfigura.areas,
1308
+ panZoomEnabled = _useHotspotsConfigura.panZoomEnabled;
1309
+ var _useHotspotsState = useHotspotsState({
1310
+ areas: areas,
1311
+ initialActiveArea: configuration.initialActiveArea
1312
+ }),
1313
+ activeIndex = _useHotspotsState.activeIndex,
1314
+ hoveredIndex = _useHotspotsState.hoveredIndex,
1315
+ highlightedIndex = _useHotspotsState.highlightedIndex,
1316
+ setActiveIndex = _useHotspotsState.setActiveIndex,
1317
+ setHoveredIndex = _useHotspotsState.setHoveredIndex,
1318
+ setHighlightedIndex = _useHotspotsState.setHighlightedIndex;
1319
+ var _useContentElementLif = useContentElementLifecycle(),
1320
+ shouldLoad = _useContentElementLif.shouldLoad;
1321
+ var _useContentElementEdi = useContentElementEditorState(),
1322
+ isEditable = _useContentElementEdi.isEditable,
1323
+ isSelected = _useContentElementEdi.isSelected;
1324
+ var aspectRatio = imageFile ? "".concat(imageFile.width, " / ").concat(imageFile.height) : '3 / 4';
1325
+ var _useContentRect = useContentRect({
1326
+ enabled: shouldLoad
1327
+ }),
1328
+ _useContentRect2 = _slicedToArray(_useContentRect, 2),
1329
+ containerRect = _useContentRect2[0],
1330
+ containerRef = _useContentRect2[1];
1331
+ var panZoomTransforms = usePanZoomTransforms({
1332
+ containerRect: containerRect,
1333
+ imageFile: imageFile,
1334
+ areas: areas,
1335
+ initialTransformEnabled: configuration.position === 'backdrop',
1336
+ panZoomEnabled: panZoomEnabled
1337
+ });
1338
+ var _useScrollPanZoom = useScrollPanZoom({
1339
+ panZoomTransforms: panZoomTransforms,
1340
+ enabled: shouldLoad,
1341
+ onChange: setActiveIndex
1342
+ }),
1343
+ panZoomRefs = _useScrollPanZoom.panZoomRefs,
1344
+ scrollFromToArea = _useScrollPanZoom.scrollFromToArea;
1345
+ var scrollToArea = useCallback(function (index) {
1346
+ scrollFromToArea(activeIndex, index);
1347
+ }, [scrollFromToArea, activeIndex]);
1348
+ var activateArea = panZoomEnabled ? scrollToArea : setActiveIndex;
1349
+ useHotspotsEditorCommandSubscriptions({
1350
+ setHighlightedIndex: setHighlightedIndex,
1351
+ activateArea: activateArea
1352
+ });
1353
+ function renderVisibleAreas() {
1354
+ return areas.map(function (area, index) {
1355
+ return /*#__PURE__*/React.createElement(ImageArea, {
1356
+ key: index,
1357
+ area: area,
1358
+ panZoomEnabled: panZoomEnabled,
1359
+ activeImageVisible: activeIndex === index || !panZoomEnabled && activeIndex < 0 && hoveredIndex === index,
1360
+ outlined: isEditable && isSelected,
1361
+ outlineHidden: isIntersecting,
1362
+ highlighted: hoveredIndex === index || highlightedIndex === index || activeIndex === index
1363
+ });
1364
+ });
1365
+ }
1366
+ function renderClickableAreas() {
1367
+ return areas.map(function (area, index) {
1368
+ return /*#__PURE__*/React.createElement(Area, {
1369
+ key: index,
1370
+ area: area,
1371
+ noPointerEvents: panZoomEnabled && activeIndex >= 0 && activeIndex < areas.length,
1372
+ onMouseEnter: function onMouseEnter() {
1373
+ return setHoveredIndex(index);
1374
+ },
1375
+ onMouseLeave: function onMouseLeave() {
1376
+ return setHoveredIndex(-1);
1377
+ },
1378
+ onClick: function onClick() {
1379
+ if (!isEditable || isSelected) {
1380
+ activateArea(index);
1381
+ }
1382
+ }
1383
+ });
1384
+ });
1385
+ }
1386
+ function renderIndicators() {
1387
+ return areas.map(function (area, index) {
1388
+ return /*#__PURE__*/React.createElement(Indicator, {
1389
+ key: index,
1390
+ area: area,
1391
+ hidden: isIntersecting || panZoomEnabled && activeIndex >= 0 && activeIndex < areas.length && activeIndex !== index,
1392
+ panZoomTransform: panZoomTransforms.initial.indicators[index],
1393
+ outerRef: panZoomRefs.setIndicator(index)
1394
+ });
1395
+ });
1396
+ }
1397
+ function renderTooltips() {
1398
+ return areas.map(function (area, index) {
1399
+ return /*#__PURE__*/React.createElement(Tooltip, {
1400
+ key: index,
1401
+ area: area,
1402
+ contentElementId: contentElementId,
1403
+ containerRect: containerRect,
1404
+ imageFile: imageFile,
1405
+ panZoomTransform: panZoomTransforms.initial.tooltips[index],
1406
+ configuration: configuration,
1407
+ visible: !isIntersecting && (activeIndex === index || !panZoomEnabled && activeIndex < 0 && hoveredIndex === index),
1408
+ active: activeIndex === index,
1409
+ keepInViewport: keepTooltipsInViewport,
1410
+ aboveNavigationWidgets: tooltipsAboveNavigationWidgets,
1411
+ wrapperRef: containerRef,
1412
+ floatingStrategy: floatingStrategy,
1413
+ onMouseEnter: function onMouseEnter() {
1414
+ return setHoveredIndex(index);
1415
+ },
1416
+ onMouseLeave: function onMouseLeave() {
1417
+ return setHoveredIndex(-1);
1418
+ },
1419
+ onClick: function onClick() {
1420
+ return setActiveIndex(index);
1421
+ },
1422
+ onDismiss: function onDismiss() {
1423
+ return activateArea(-1);
1424
+ }
1425
+ });
1426
+ });
1427
+ }
1428
+ function renderFullscreenToggle() {
1429
+ if (!displayFullscreenToggle) {
1430
+ return null;
1431
+ }
1432
+ return /*#__PURE__*/React.createElement(ToggleFullscreenCornerButton, {
1433
+ isFullscreen: false,
1434
+ onEnter: onFullscreenEnter
1435
+ });
1436
+ }
1437
+ function renderLetterboxBackground() {
1438
+ if (configuration.position !== 'backdrop') {
1439
+ return null;
1440
+ }
1441
+ return /*#__PURE__*/React.createElement("div", {
1442
+ className: styles$7.letterboxBackground
1443
+ }, /*#__PURE__*/React.createElement(Image, {
1444
+ imageFile: imageFile,
1445
+ load: shouldLoad,
1446
+ variant: 'medium'
1447
+ }));
1448
+ }
1449
+ return /*#__PURE__*/React.createElement(Pager, {
1450
+ areas: areas,
1451
+ customMargin: customMargin,
1452
+ panZoomEnabled: panZoomEnabled,
1453
+ hideButtons: isIntersecting,
1454
+ activeIndex: activeIndex,
1455
+ activateArea: activateArea
1456
+ }, /*#__PURE__*/React.createElement(FitViewport, {
1457
+ file: imageFile,
1458
+ aspectRatio: imageFile ? undefined : 0.75,
1459
+ fill: configuration.position === 'backdrop',
1460
+ opaque: !imageFile
1461
+ }, /*#__PURE__*/React.createElement(Composite, {
1462
+ activeIndex: activeIndex + 1,
1463
+ loop: false,
1464
+ onNavigate: function onNavigate(index) {
1465
+ return activateArea(index - 1);
1466
+ }
1467
+ }, /*#__PURE__*/React.createElement("div", {
1468
+ className: styles$7.tooltipsWrapper,
1469
+ style: {
1470
+ '--hotspots-image-aspect-ratio': aspectRatio,
1471
+ '--hotspots-container-height': "".concat(containerRect.height, "px")
1472
+ }
1473
+ }, children( /*#__PURE__*/React.createElement(FitViewport.Content, null, /*#__PURE__*/React.createElement("div", {
1474
+ className: styles$7.stack,
1475
+ ref: containerRef
1476
+ }, renderLetterboxBackground(), /*#__PURE__*/React.createElement("div", {
1477
+ className: styles$7.wrapper,
1478
+ ref: panZoomRefs.wrapper,
1479
+ style: {
1480
+ transform: panZoomTransforms.initial.wrapper
1481
+ }
1482
+ }, /*#__PURE__*/React.createElement(Image, {
1483
+ imageFile: imageFile,
1484
+ load: shouldLoad,
1485
+ fill: false,
1486
+ structuredData: true,
1487
+ variant: panZoomEnabled ? 'ultra' : 'large',
1488
+ preferSvg: true
1489
+ }), renderVisibleAreas()), /*#__PURE__*/React.createElement(Scroller, {
1490
+ disabled: !panZoomEnabled,
1491
+ areas: areas,
1492
+ ref: panZoomRefs.scroller,
1493
+ setStepRef: panZoomRefs.setStep
1494
+ }, /*#__PURE__*/React.createElement("div", {
1495
+ className: styles$7.wrapper,
1496
+ ref: panZoomRefs.scrollerAreas,
1497
+ style: {
1498
+ transform: panZoomTransforms.initial.wrapper
1499
+ }
1500
+ }, renderClickableAreas())), renderIndicators()), renderFullscreenToggle(), /*#__PURE__*/React.createElement(InlineFileRights, {
1501
+ configuration: configuration,
1502
+ context: "insideElement",
1503
+ items: [{
1504
+ file: imageFile,
1505
+ label: 'image'
1506
+ }]
1507
+ }))), /*#__PURE__*/React.createElement(CompositeItem, {
1508
+ render: /*#__PURE__*/React.createElement("div", {
1509
+ className: styles$7.compositeItem
1510
+ })
1511
+ }), renderTooltips(), /*#__PURE__*/React.createElement(CompositeItem, {
1512
+ render: /*#__PURE__*/React.createElement("div", {
1513
+ className: styles$7.compositeItem
1514
+ })
1515
+ }))), /*#__PURE__*/React.createElement(InlineFileRights, {
1516
+ configuration: configuration,
1517
+ context: "afterElement",
1518
+ items: [{
1519
+ file: imageFile,
1520
+ label: 'image'
1521
+ }]
1522
+ })));
1523
+ }
1524
+
1525
+ frontend.contentElementTypes.register('hotspots', {
1526
+ component: Hotspots,
1527
+ lifecycle: true,
1528
+ customMargin: true
1529
+ });