pageflow 15.1.2 → 15.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (205) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +160 -190
  3. data/README.md +3 -5
  4. data/admins/pageflow/accounts.rb +13 -35
  5. data/admins/pageflow/entry.rb +21 -1
  6. data/admins/pageflow/entry_templates.rb +140 -0
  7. data/admins/pageflow/membership.rb +12 -0
  8. data/admins/pageflow/user.rb +5 -3
  9. data/app/assets/javascripts/pageflow/admin/accounts.js +3 -3
  10. data/app/assets/javascripts/pageflow/admin/entries.js +65 -0
  11. data/app/assets/javascripts/pageflow/admin/users.js +1 -1
  12. data/app/assets/javascripts/pageflow/asset_urls.js.erb +1 -0
  13. data/app/assets/javascripts/pageflow/base.js +0 -12
  14. data/app/assets/javascripts/pageflow/components.js +2 -6
  15. data/app/assets/javascripts/pageflow/dist/ui.js +155 -46
  16. data/app/assets/javascripts/pageflow/vendor.js +12 -10
  17. data/app/assets/stylesheets/pageflow/base.scss +0 -7
  18. data/app/assets/stylesheets/pageflow/editor/base.scss +5 -2
  19. data/app/assets/stylesheets/pageflow/editor/composables.scss +5 -1
  20. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +1 -1
  21. data/app/assets/stylesheets/pageflow/editor/emulation_mode_button.scss +44 -55
  22. data/app/assets/stylesheets/pageflow/editor/help.scss +2 -2
  23. data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
  24. data/app/assets/stylesheets/pageflow/editor/sidebar_footer.scss +1 -1
  25. data/app/assets/stylesheets/pageflow/entries.scss +1 -1
  26. data/app/assets/stylesheets/pageflow/loading_spinner.scss +4 -1
  27. data/app/assets/stylesheets/pageflow/navigation_mobile.scss +4 -4
  28. data/app/assets/stylesheets/pageflow/themes/default/anchors.scss +1 -1
  29. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/background_image.scss +4 -0
  30. data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +6 -1
  31. data/app/assets/stylesheets/pageflow/themes/default/page/anchors.scss +1 -1
  32. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/control_bar.scss +1 -1
  33. data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/info_box.scss +1 -1
  34. data/app/assets/stylesheets/pageflow/themes/default/player_controls/shared/menu_bar.scss +2 -2
  35. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/control_bar.scss +2 -2
  36. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/info_box.scss +1 -1
  37. data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/quality_menu.scss +2 -2
  38. data/app/assets/stylesheets/pageflow/themes/default/player_controls/waveform/wave.scss +1 -1
  39. data/app/assets/stylesheets/pageflow/ui/forms.scss +9 -2
  40. data/app/assets/stylesheets/pageflow/ui/input/extended_select_input.scss +2 -2
  41. data/app/assets/stylesheets/pageflow/ui/tooltip.scss +17 -3
  42. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -1
  43. data/app/helpers/pageflow/admin/entries_helper.rb +16 -0
  44. data/app/helpers/pageflow/pages_helper.rb +1 -0
  45. data/app/helpers/pageflow/structured_data_helper.rb +0 -2
  46. data/app/models/pageflow/account.rb +26 -0
  47. data/app/models/pageflow/account_role_query.rb +1 -1
  48. data/app/models/pageflow/entry.rb +16 -2
  49. data/app/models/pageflow/entry_duplicate.rb +1 -0
  50. data/app/models/pageflow/entry_template.rb +69 -0
  51. data/app/models/pageflow/managed_user_query.rb +1 -1
  52. data/app/models/pageflow/revision.rb +1 -1
  53. data/app/models/pageflow/theming.rb +8 -47
  54. data/app/policies/pageflow/account_policy.rb +10 -0
  55. data/app/policies/pageflow/entry_template_policy.rb +22 -0
  56. data/app/policies/pageflow/folder_policy.rb +2 -2
  57. data/app/policies/pageflow/membership_policy.rb +2 -2
  58. data/app/policies/pageflow/theming_policy.rb +2 -6
  59. data/app/policies/pageflow/user_policy.rb +1 -1
  60. data/app/views/admin/accounts/_configuration_label.html.erb +5 -0
  61. data/app/views/admin/accounts/_entry_template_details.html.arb +19 -0
  62. data/app/views/admin/accounts/_form.html.erb +5 -31
  63. data/app/views/admin/accounts/_share_providers_label.html.erb +5 -0
  64. data/app/views/admin/accounts/_theming_details.html.arb +0 -12
  65. data/app/views/admin/entries/_attributes_table.html.arb +5 -0
  66. data/app/views/admin/entries/_not_allowed_to_see_entry_types.json.jbuilder +2 -0
  67. data/app/views/admin/entries/entry_types.json.jbuilder +4 -0
  68. data/app/views/admin/entry_templates/_form.html.erb +58 -0
  69. data/app/views/admin/users/_not_allowed_to_see_user_quota.html.erb +3 -0
  70. data/app/views/components/pageflow/admin/entry_templates_tab.rb +48 -0
  71. data/app/views/pageflow/admin/users/_quota_exhausted.html.erb +1 -1
  72. data/app/views/pageflow/themes/_theme.json.jbuilder +1 -0
  73. data/app/views/pageflow/video_files/_video_file.json.jbuilder +8 -1
  74. data/config/initializers/admin_resource_tabs.rb +5 -0
  75. data/config/initializers/help_entries.rb +1 -5
  76. data/config/locales/de.yml +100 -162
  77. data/config/locales/en.yml +91 -150
  78. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +75 -0
  79. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +48 -0
  80. data/db/migrate/20200515112500_add_constraints_to_entry_templates.rb +21 -0
  81. data/db/migrate/20200807135200_rename_pageflow_entry_template_entry_type_to_entry_type_name.rb +7 -0
  82. data/entry_types/paged/app/assets/javascripts/pageflow_paged/components.js +7 -0
  83. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +1541 -1357
  84. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +9245 -0
  85. data/{app/assets/javascripts/pageflow → entry_types/paged/app/assets/javascripts/pageflow_paged}/dist/react-client.js +1 -1
  86. data/{app/assets/javascripts/pageflow → entry_types/paged/app/assets/javascripts/pageflow_paged}/dist/react-server.js +3 -3
  87. data/entry_types/paged/app/assets/javascripts/pageflow_paged/frontend.js +6 -0
  88. data/entry_types/paged/app/assets/javascripts/pageflow_paged/server_rendering.js +9 -0
  89. data/entry_types/paged/app/assets/javascripts/pageflow_paged/vendor.js +9 -0
  90. data/entry_types/paged/app/assets/javascripts/pageflow_paged/videojs.js +6 -0
  91. data/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb +2 -2
  92. data/{app/helpers/pageflow → entry_types/paged/app/helpers/pageflow_paged}/page_background_asset_helper.rb +4 -3
  93. data/{app/helpers/pageflow → entry_types/paged/app/helpers/pageflow_paged}/react_server_side_rendering_helper.rb +23 -2
  94. data/entry_types/paged/app/views/layouts/pageflow_paged/_loading_spinner_inline_script.html.erb +1 -0
  95. data/entry_types/paged/app/views/layouts/pageflow_paged/application.html.erb +3 -3
  96. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_head.html.erb +4 -2
  97. data/entry_types/paged/app/views/pageflow_paged/entries/_entry.html.erb +1 -1
  98. data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/page_background_asset/_element.html.erb +0 -0
  99. data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/react/_widget.html.erb +0 -0
  100. data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/react/page.html.erb +0 -0
  101. data/entry_types/paged/config/initializers/features.rb +1 -1
  102. data/entry_types/paged/config/initializers/help_entries.rb +17 -0
  103. data/entry_types/paged/config/locales/new/help.de.yml +162 -0
  104. data/entry_types/paged/config/locales/new/help.en.yml +153 -0
  105. data/entry_types/paged/lib/pageflow_paged/engine.rb +13 -0
  106. data/entry_types/paged/lib/pageflow_paged/plugin.rb +5 -1
  107. data/entry_types/paged/lib/pageflow_paged/react.rb +12 -0
  108. data/{lib/pageflow → entry_types/paged/lib/pageflow_paged}/react/page_type.rb +2 -2
  109. data/{lib/pageflow → entry_types/paged/lib/pageflow_paged}/react/widget_type.rb +2 -2
  110. data/entry_types/paged/lib/tasks/pageflow_paged_tasks.rake +7 -0
  111. data/entry_types/paged/vendor/assets/javascripts/development/pageflow_paged/vendor/react-server.js +20613 -0
  112. data/entry_types/paged/vendor/assets/javascripts/development/pageflow_paged/vendor/react.js +21495 -0
  113. data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/dash.all.min.js +0 -0
  114. data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/videojs-dash.js +0 -0
  115. data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/videojs.js +0 -0
  116. data/entry_types/paged/vendor/assets/javascripts/production/pageflow_paged/vendor/react-server.js +24 -0
  117. data/entry_types/paged/vendor/assets/javascripts/production/pageflow_paged/vendor/react.js +24 -0
  118. data/entry_types/scrolled/app/assets/javascripts/pageflow_scrolled/legacy.js +0 -0
  119. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  120. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +15 -4
  121. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
  122. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +10 -0
  123. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +11 -1
  124. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +4 -1
  125. data/entry_types/scrolled/app/helpers/pageflow_scrolled/favicon_helper.rb +21 -0
  126. data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +35 -0
  127. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +40 -0
  128. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +8 -0
  129. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +38 -0
  130. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/content_elements/batch.json.jbuilder +2 -0
  131. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -7
  132. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -1
  133. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +36 -10
  134. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +13 -1
  135. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +8 -0
  136. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +10 -0
  137. data/entry_types/scrolled/config/initializers/help_entries.rb +16 -0
  138. data/entry_types/scrolled/config/locales/de.yml +655 -0
  139. data/entry_types/scrolled/config/locales/en.yml +522 -0
  140. data/entry_types/scrolled/config/routes.rb +1 -0
  141. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +36 -0
  142. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/android-chrome-192x192.png +0 -0
  143. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/android-chrome-512x512.png +0 -0
  144. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/apple-touch-icon.png +0 -0
  145. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/browserconfig.xml +9 -0
  146. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon-16x16.png +0 -0
  147. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon-32x32.png +0 -0
  148. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon.ico +0 -0
  149. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/mstile-150x150.png +0 -0
  150. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/safari-pinned-tab.svg +46 -0
  151. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/site.webmanifest +19 -0
  152. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDesktop.svg +56 -0
  153. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoMobile.svg +22 -0
  154. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/unmute.mp3 +0 -0
  155. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +4 -0
  156. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +3 -1
  157. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +93 -28
  158. data/entry_types/scrolled/lib/tasks/pageflow_scrolled_tasks.rake +134 -0
  159. data/entry_types/scrolled/package/contentElements-editor.js +482 -0
  160. data/entry_types/scrolled/package/contentElements-frontend.css +1 -0
  161. data/entry_types/scrolled/package/contentElements-frontend.js +1112 -0
  162. data/entry_types/scrolled/package/editor.js +3066 -2579
  163. data/entry_types/scrolled/package/frontend-server.js +228 -0
  164. data/entry_types/scrolled/package/frontend/EditableText-43c50894.js +2161 -0
  165. data/entry_types/scrolled/package/frontend/Wavesurfer-b88b02e0.js +375 -0
  166. data/entry_types/scrolled/package/frontend/components-3ead1b4a.js +2533 -0
  167. data/entry_types/scrolled/package/frontend/getPrototypeOf-63c7c8e8.js +86 -0
  168. data/entry_types/scrolled/package/frontend/index.css +9 -0
  169. data/entry_types/scrolled/package/frontend/index.js +5507 -0
  170. data/entry_types/scrolled/package/package.json +40 -7
  171. data/entry_types/scrolled/spec/fixtures/audio.m4a +0 -0
  172. data/entry_types/scrolled/spec/fixtures/video.mp4 +0 -0
  173. data/lib/generators/pageflow/initializer/templates/pageflow.rb +21 -9
  174. data/lib/pageflow/ability_mixin.rb +15 -2
  175. data/lib/pageflow/configuration.rb +6 -5
  176. data/lib/pageflow/entry_type_configuration.rb +1 -0
  177. data/lib/pageflow/global_config_api.rb +5 -4
  178. data/lib/pageflow/react.rb +4 -2
  179. data/lib/pageflow/seeds.rb +0 -2
  180. data/lib/pageflow/theme.rb +4 -0
  181. data/lib/pageflow/themes.rb +9 -1
  182. data/lib/pageflow/version.rb +1 -1
  183. data/{packages/pageflow → package}/config/jest/index.js +8 -3
  184. data/{packages/pageflow → package}/config/jest/transformers/jst.js +1 -1
  185. data/{packages/pageflow → package}/config/jest/transformers/upwardBabel.js +0 -0
  186. data/{packages/pageflow → package}/config/webpack.js +7 -1
  187. data/{packages/pageflow → package}/editor.js +493 -1122
  188. data/package/frontend.js +2542 -0
  189. data/{packages/pageflow → package}/package.json +5 -1
  190. data/package/testHelpers.js +732 -0
  191. data/{packages/pageflow → package}/ui.js +155 -46
  192. data/spec/factories/accounts.rb +9 -1
  193. data/spec/factories/entry_templates.rb +9 -0
  194. data/spec/factories/published_entries.rb +8 -1
  195. data/spec/factories/themings.rb +0 -1
  196. metadata +94 -33
  197. data/app/assets/javascripts/pageflow/dist/editor.js +0 -11890
  198. data/app/assets/javascripts/pageflow/dist/frontend.js +0 -5798
  199. data/app/assets/javascripts/pageflow/videojs.js +0 -6
  200. data/config/initializers/entry_types.rb +0 -4
  201. data/entry_types/scrolled/config/locales/new/de.yml +0 -46
  202. data/entry_types/scrolled/config/locales/new/en.yml +0 -46
  203. data/entry_types/scrolled/package/frontend.js +0 -3404
  204. data/packages/pageflow/config/jest/transformers/cssModules.js +0 -1
  205. data/packages/pageflow/testHelpers.js +0 -268
@@ -0,0 +1,228 @@
1
+ import 'core-js/modules/es.symbol';
2
+ import 'core-js/modules/es.symbol.description';
3
+ import 'core-js/modules/es.symbol.async-iterator';
4
+ import 'core-js/modules/es.symbol.has-instance';
5
+ import 'core-js/modules/es.symbol.is-concat-spreadable';
6
+ import 'core-js/modules/es.symbol.iterator';
7
+ import 'core-js/modules/es.symbol.match';
8
+ import 'core-js/modules/es.symbol.replace';
9
+ import 'core-js/modules/es.symbol.search';
10
+ import 'core-js/modules/es.symbol.species';
11
+ import 'core-js/modules/es.symbol.split';
12
+ import 'core-js/modules/es.symbol.to-primitive';
13
+ import 'core-js/modules/es.symbol.to-string-tag';
14
+ import 'core-js/modules/es.symbol.unscopables';
15
+ import 'core-js/modules/es.array.concat';
16
+ import 'core-js/modules/es.array.copy-within';
17
+ import 'core-js/modules/es.array.every';
18
+ import 'core-js/modules/es.array.fill';
19
+ import 'core-js/modules/es.array.filter';
20
+ import 'core-js/modules/es.array.find';
21
+ import 'core-js/modules/es.array.find-index';
22
+ import 'core-js/modules/es.array.flat';
23
+ import 'core-js/modules/es.array.flat-map';
24
+ import 'core-js/modules/es.array.for-each';
25
+ import 'core-js/modules/es.array.from';
26
+ import 'core-js/modules/es.array.includes';
27
+ import 'core-js/modules/es.array.index-of';
28
+ import 'core-js/modules/es.array.is-array';
29
+ import 'core-js/modules/es.array.iterator';
30
+ import 'core-js/modules/es.array.join';
31
+ import 'core-js/modules/es.array.last-index-of';
32
+ import 'core-js/modules/es.array.map';
33
+ import 'core-js/modules/es.array.of';
34
+ import 'core-js/modules/es.array.reduce';
35
+ import 'core-js/modules/es.array.reduce-right';
36
+ import 'core-js/modules/es.array.reverse';
37
+ import 'core-js/modules/es.array.slice';
38
+ import 'core-js/modules/es.array.some';
39
+ import 'core-js/modules/es.array.sort';
40
+ import 'core-js/modules/es.array.species';
41
+ import 'core-js/modules/es.array.splice';
42
+ import 'core-js/modules/es.array.unscopables.flat';
43
+ import 'core-js/modules/es.array.unscopables.flat-map';
44
+ import 'core-js/modules/es.array-buffer.constructor';
45
+ import 'core-js/modules/es.array-buffer.is-view';
46
+ import 'core-js/modules/es.array-buffer.slice';
47
+ import 'core-js/modules/es.data-view';
48
+ import 'core-js/modules/es.date.now';
49
+ import 'core-js/modules/es.date.to-iso-string';
50
+ import 'core-js/modules/es.date.to-json';
51
+ import 'core-js/modules/es.date.to-primitive';
52
+ import 'core-js/modules/es.date.to-string';
53
+ import 'core-js/modules/es.function.bind';
54
+ import 'core-js/modules/es.function.has-instance';
55
+ import 'core-js/modules/es.function.name';
56
+ import 'core-js/modules/es.json.to-string-tag';
57
+ import 'core-js/modules/es.map';
58
+ import 'core-js/modules/es.math.acosh';
59
+ import 'core-js/modules/es.math.asinh';
60
+ import 'core-js/modules/es.math.atanh';
61
+ import 'core-js/modules/es.math.cbrt';
62
+ import 'core-js/modules/es.math.clz32';
63
+ import 'core-js/modules/es.math.cosh';
64
+ import 'core-js/modules/es.math.expm1';
65
+ import 'core-js/modules/es.math.fround';
66
+ import 'core-js/modules/es.math.hypot';
67
+ import 'core-js/modules/es.math.imul';
68
+ import 'core-js/modules/es.math.log10';
69
+ import 'core-js/modules/es.math.log1p';
70
+ import 'core-js/modules/es.math.log2';
71
+ import 'core-js/modules/es.math.sign';
72
+ import 'core-js/modules/es.math.sinh';
73
+ import 'core-js/modules/es.math.tanh';
74
+ import 'core-js/modules/es.math.to-string-tag';
75
+ import 'core-js/modules/es.math.trunc';
76
+ import 'core-js/modules/es.number.constructor';
77
+ import 'core-js/modules/es.number.epsilon';
78
+ import 'core-js/modules/es.number.is-finite';
79
+ import 'core-js/modules/es.number.is-integer';
80
+ import 'core-js/modules/es.number.is-nan';
81
+ import 'core-js/modules/es.number.is-safe-integer';
82
+ import 'core-js/modules/es.number.max-safe-integer';
83
+ import 'core-js/modules/es.number.min-safe-integer';
84
+ import 'core-js/modules/es.number.parse-float';
85
+ import 'core-js/modules/es.number.parse-int';
86
+ import 'core-js/modules/es.number.to-fixed';
87
+ import 'core-js/modules/es.number.to-precision';
88
+ import 'core-js/modules/es.object.assign';
89
+ import 'core-js/modules/es.object.create';
90
+ import 'core-js/modules/es.object.define-getter';
91
+ import 'core-js/modules/es.object.define-properties';
92
+ import 'core-js/modules/es.object.define-property';
93
+ import 'core-js/modules/es.object.define-setter';
94
+ import 'core-js/modules/es.object.entries';
95
+ import 'core-js/modules/es.object.freeze';
96
+ import 'core-js/modules/es.object.from-entries';
97
+ import 'core-js/modules/es.object.get-own-property-descriptor';
98
+ import 'core-js/modules/es.object.get-own-property-descriptors';
99
+ import 'core-js/modules/es.object.get-own-property-names';
100
+ import 'core-js/modules/es.object.get-prototype-of';
101
+ import 'core-js/modules/es.object.is';
102
+ import 'core-js/modules/es.object.is-extensible';
103
+ import 'core-js/modules/es.object.is-frozen';
104
+ import 'core-js/modules/es.object.is-sealed';
105
+ import 'core-js/modules/es.object.keys';
106
+ import 'core-js/modules/es.object.lookup-getter';
107
+ import 'core-js/modules/es.object.lookup-setter';
108
+ import 'core-js/modules/es.object.prevent-extensions';
109
+ import 'core-js/modules/es.object.seal';
110
+ import 'core-js/modules/es.object.set-prototype-of';
111
+ import 'core-js/modules/es.object.to-string';
112
+ import 'core-js/modules/es.object.values';
113
+ import 'core-js/modules/es.parse-float';
114
+ import 'core-js/modules/es.parse-int';
115
+ import 'core-js/modules/es.promise';
116
+ import 'core-js/modules/es.promise.finally';
117
+ import 'core-js/modules/es.reflect.apply';
118
+ import 'core-js/modules/es.reflect.construct';
119
+ import 'core-js/modules/es.reflect.define-property';
120
+ import 'core-js/modules/es.reflect.delete-property';
121
+ import 'core-js/modules/es.reflect.get';
122
+ import 'core-js/modules/es.reflect.get-own-property-descriptor';
123
+ import 'core-js/modules/es.reflect.get-prototype-of';
124
+ import 'core-js/modules/es.reflect.has';
125
+ import 'core-js/modules/es.reflect.is-extensible';
126
+ import 'core-js/modules/es.reflect.own-keys';
127
+ import 'core-js/modules/es.reflect.prevent-extensions';
128
+ import 'core-js/modules/es.reflect.set';
129
+ import 'core-js/modules/es.reflect.set-prototype-of';
130
+ import 'core-js/modules/es.regexp.constructor';
131
+ import 'core-js/modules/es.regexp.exec';
132
+ import 'core-js/modules/es.regexp.flags';
133
+ import 'core-js/modules/es.regexp.to-string';
134
+ import 'core-js/modules/es.set';
135
+ import 'core-js/modules/es.string.code-point-at';
136
+ import 'core-js/modules/es.string.ends-with';
137
+ import 'core-js/modules/es.string.from-code-point';
138
+ import 'core-js/modules/es.string.includes';
139
+ import 'core-js/modules/es.string.iterator';
140
+ import 'core-js/modules/es.string.match';
141
+ import 'core-js/modules/es.string.pad-end';
142
+ import 'core-js/modules/es.string.pad-start';
143
+ import 'core-js/modules/es.string.raw';
144
+ import 'core-js/modules/es.string.repeat';
145
+ import 'core-js/modules/es.string.replace';
146
+ import 'core-js/modules/es.string.search';
147
+ import 'core-js/modules/es.string.split';
148
+ import 'core-js/modules/es.string.starts-with';
149
+ import 'core-js/modules/es.string.trim';
150
+ import 'core-js/modules/es.string.trim-end';
151
+ import 'core-js/modules/es.string.trim-start';
152
+ import 'core-js/modules/es.string.anchor';
153
+ import 'core-js/modules/es.string.big';
154
+ import 'core-js/modules/es.string.blink';
155
+ import 'core-js/modules/es.string.bold';
156
+ import 'core-js/modules/es.string.fixed';
157
+ import 'core-js/modules/es.string.fontcolor';
158
+ import 'core-js/modules/es.string.fontsize';
159
+ import 'core-js/modules/es.string.italics';
160
+ import 'core-js/modules/es.string.link';
161
+ import 'core-js/modules/es.string.small';
162
+ import 'core-js/modules/es.string.strike';
163
+ import 'core-js/modules/es.string.sub';
164
+ import 'core-js/modules/es.string.sup';
165
+ import 'core-js/modules/es.typed-array.float32-array';
166
+ import 'core-js/modules/es.typed-array.float64-array';
167
+ import 'core-js/modules/es.typed-array.int8-array';
168
+ import 'core-js/modules/es.typed-array.int16-array';
169
+ import 'core-js/modules/es.typed-array.int32-array';
170
+ import 'core-js/modules/es.typed-array.uint8-array';
171
+ import 'core-js/modules/es.typed-array.uint8-clamped-array';
172
+ import 'core-js/modules/es.typed-array.uint16-array';
173
+ import 'core-js/modules/es.typed-array.uint32-array';
174
+ import 'core-js/modules/es.typed-array.copy-within';
175
+ import 'core-js/modules/es.typed-array.every';
176
+ import 'core-js/modules/es.typed-array.fill';
177
+ import 'core-js/modules/es.typed-array.filter';
178
+ import 'core-js/modules/es.typed-array.find';
179
+ import 'core-js/modules/es.typed-array.find-index';
180
+ import 'core-js/modules/es.typed-array.for-each';
181
+ import 'core-js/modules/es.typed-array.from';
182
+ import 'core-js/modules/es.typed-array.includes';
183
+ import 'core-js/modules/es.typed-array.index-of';
184
+ import 'core-js/modules/es.typed-array.iterator';
185
+ import 'core-js/modules/es.typed-array.join';
186
+ import 'core-js/modules/es.typed-array.last-index-of';
187
+ import 'core-js/modules/es.typed-array.map';
188
+ import 'core-js/modules/es.typed-array.of';
189
+ import 'core-js/modules/es.typed-array.reduce';
190
+ import 'core-js/modules/es.typed-array.reduce-right';
191
+ import 'core-js/modules/es.typed-array.reverse';
192
+ import 'core-js/modules/es.typed-array.set';
193
+ import 'core-js/modules/es.typed-array.slice';
194
+ import 'core-js/modules/es.typed-array.some';
195
+ import 'core-js/modules/es.typed-array.sort';
196
+ import 'core-js/modules/es.typed-array.subarray';
197
+ import 'core-js/modules/es.typed-array.to-locale-string';
198
+ import 'core-js/modules/es.typed-array.to-string';
199
+ import 'core-js/modules/es.weak-map';
200
+ import 'core-js/modules/es.weak-set';
201
+ import 'core-js/modules/web.dom-collections.for-each';
202
+ import 'core-js/modules/web.dom-collections.iterator';
203
+ import 'core-js/modules/web.immediate';
204
+ import 'core-js/modules/web.queue-microtask';
205
+ import 'core-js/modules/web.timers';
206
+ import 'core-js/modules/web.url';
207
+ import 'core-js/modules/web.url.to-json';
208
+ import 'core-js/modules/web.url-search-params';
209
+ import React from 'react';
210
+ import ReactRailsUJS from 'react_ujs';
211
+ import { setupI18n, Root } from 'pageflow-scrolled/frontend';
212
+
213
+ ReactRailsUJS.getConstructor = function () {
214
+ // Normally this function receives the name of a component, but we
215
+ // only need to render one type of component.
216
+ return ServerRenderedRoot;
217
+ };
218
+
219
+ function ServerRenderedRoot(_ref) {
220
+ var seed = _ref.seed;
221
+ setupI18n(seed.i18n);
222
+ return (
223
+ /*#__PURE__*/
224
+ React.createElement(Root, {
225
+ seed: seed
226
+ })
227
+ );
228
+ }
@@ -0,0 +1,2161 @@
1
+ import React, { useReducer, useMemo, useCallback, createContext as createContext$1, useContext, useState, useEffect, useRef } from 'react';
2
+ import classNames from 'classnames';
3
+ import { createContext, useContextSelector } from 'use-context-selector';
4
+ import { createSelectorCreator, defaultMemoize, createSelector } from 'reselect';
5
+ import I18n from 'i18n-js';
6
+ import slugify from 'slugify';
7
+ import { _ as _createClass, a as _classCallCheck, b as _inherits, c as _getPrototypeOf, d as _possibleConstructorReturn } from './getPrototypeOf-63c7c8e8.js';
8
+
9
+ function _defineProperty(obj, key, value) {
10
+ if (key in obj) {
11
+ Object.defineProperty(obj, key, {
12
+ value: value,
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true
16
+ });
17
+ } else {
18
+ obj[key] = value;
19
+ }
20
+
21
+ return obj;
22
+ }
23
+
24
+ function _arrayWithHoles(arr) {
25
+ if (Array.isArray(arr)) return arr;
26
+ }
27
+
28
+ function _iterableToArrayLimit(arr, i) {
29
+ if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
30
+ var _arr = [];
31
+ var _n = true;
32
+ var _d = false;
33
+ var _e = undefined;
34
+
35
+ try {
36
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
37
+ _arr.push(_s.value);
38
+
39
+ if (i && _arr.length === i) break;
40
+ }
41
+ } catch (err) {
42
+ _d = true;
43
+ _e = err;
44
+ } finally {
45
+ try {
46
+ if (!_n && _i["return"] != null) _i["return"]();
47
+ } finally {
48
+ if (_d) throw _e;
49
+ }
50
+ }
51
+
52
+ return _arr;
53
+ }
54
+
55
+ function _arrayLikeToArray(arr, len) {
56
+ if (len == null || len > arr.length) len = arr.length;
57
+
58
+ for (var i = 0, arr2 = new Array(len); i < len; i++) {
59
+ arr2[i] = arr[i];
60
+ }
61
+
62
+ return arr2;
63
+ }
64
+
65
+ function _unsupportedIterableToArray(o, minLen) {
66
+ if (!o) return;
67
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
68
+ var n = Object.prototype.toString.call(o).slice(8, -1);
69
+ if (n === "Object" && o.constructor) n = o.constructor.name;
70
+ if (n === "Map" || n === "Set") return Array.from(n);
71
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
72
+ }
73
+
74
+ function _nonIterableRest() {
75
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
76
+ }
77
+
78
+ function _slicedToArray(arr, i) {
79
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
80
+ }
81
+
82
+ function ownKeys(object, enumerableOnly) {
83
+ var keys = Object.keys(object);
84
+
85
+ if (Object.getOwnPropertySymbols) {
86
+ var symbols = Object.getOwnPropertySymbols(object);
87
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
88
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
89
+ });
90
+ keys.push.apply(keys, symbols);
91
+ }
92
+
93
+ return keys;
94
+ }
95
+
96
+ function _objectSpread2(target) {
97
+ for (var i = 1; i < arguments.length; i++) {
98
+ var source = arguments[i] != null ? arguments[i] : {};
99
+
100
+ if (i % 2) {
101
+ ownKeys(Object(source), true).forEach(function (key) {
102
+ _defineProperty(target, key, source[key]);
103
+ });
104
+ } else if (Object.getOwnPropertyDescriptors) {
105
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
106
+ } else {
107
+ ownKeys(Object(source)).forEach(function (key) {
108
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
109
+ });
110
+ }
111
+ }
112
+
113
+ return target;
114
+ }
115
+
116
+ var PREFIX = 'PAGEFLOW_SCROLLED_COLLECTION';
117
+ var RESET = "".concat(PREFIX, "_RESET");
118
+ var ADD = "".concat(PREFIX, "_ADD");
119
+ var CHANGE = "".concat(PREFIX, "_CHANGE");
120
+ var PATCH = "".concat(PREFIX, "_PATCH");
121
+ var REMOVE = "".concat(PREFIX, "_REMOVE");
122
+ var SORT = "".concat(PREFIX, "_SORT");
123
+ function useCollections() {
124
+ var seed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
125
+
126
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
127
+ keyAttribute = _ref.keyAttribute;
128
+
129
+ return useReducer(reducer, Object.keys(seed).reduce(function (result, key) {
130
+ result[key] = init(seed[key], keyAttribute);
131
+ return result;
132
+ }, {}));
133
+ }
134
+
135
+ function reducer(state, action) {
136
+ var collectionName = action.payload.collectionName;
137
+ var keyAttribute = action.payload.keyAttribute;
138
+
139
+ switch (action.type) {
140
+ case RESET:
141
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, init(action.payload.items, keyAttribute)));
142
+
143
+ case ADD:
144
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
145
+ order: action.payload.order,
146
+ items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, action.payload.attributes[keyAttribute], action.payload.attributes))
147
+ }));
148
+
149
+ case CHANGE:
150
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
151
+ order: state[collectionName].order,
152
+ items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, action.payload.attributes[keyAttribute], action.payload.attributes))
153
+ }));
154
+
155
+ case PATCH:
156
+ var key = action.payload.key;
157
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
158
+ order: state[collectionName].order,
159
+ items: _objectSpread2(_objectSpread2({}, state[collectionName].items), {}, _defineProperty({}, key, _objectSpread2(_objectSpread2({}, state[collectionName].items[key]), action.payload.attributes)))
160
+ }));
161
+
162
+ case REMOVE:
163
+ var clonedItems = _objectSpread2({}, state[collectionName].items);
164
+
165
+ delete clonedItems[action.payload.key];
166
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
167
+ order: action.payload.order,
168
+ items: clonedItems
169
+ }));
170
+
171
+ case SORT:
172
+ return _objectSpread2(_objectSpread2({}, state), {}, _defineProperty({}, collectionName, {
173
+ order: action.payload.order,
174
+ items: state[collectionName].items
175
+ }));
176
+
177
+ default:
178
+ return state;
179
+ }
180
+ }
181
+
182
+ function init(items) {
183
+ var keyAttribute = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'id';
184
+ items = items.filter(function (item) {
185
+ return item[keyAttribute];
186
+ });
187
+ return {
188
+ order: items.map(function (item) {
189
+ return item[keyAttribute];
190
+ }),
191
+ items: items.reduce(function (result, item) {
192
+ result[item[keyAttribute]] = item;
193
+ return result;
194
+ }, {})
195
+ };
196
+ }
197
+
198
+ function updateConfiguration(_ref2) {
199
+ var dispatch = _ref2.dispatch,
200
+ name = _ref2.name,
201
+ key = _ref2.key,
202
+ configuration = _ref2.configuration;
203
+ dispatch({
204
+ type: PATCH,
205
+ payload: {
206
+ collectionName: name,
207
+ key: key,
208
+ attributes: {
209
+ configuration: configuration
210
+ }
211
+ }
212
+ });
213
+ }
214
+ function getItem(state, collectionName, key) {
215
+ if (state[collectionName]) {
216
+ return state[collectionName].items[key];
217
+ }
218
+ }
219
+ function createItemsSelector(collectionName, filter) {
220
+ if (filter) {
221
+ var itemsSelector = createItemsSelector(collectionName);
222
+ return createShallowEqualArraysSelector(function (collections) {
223
+ return itemsSelector(collections).filter(filter);
224
+ }, function (items) {
225
+ return items;
226
+ });
227
+ }
228
+
229
+ return createSelector(function (collections) {
230
+ return collections[collectionName];
231
+ }, function (collection) {
232
+ if (collection) {
233
+ var items = collection.items;
234
+ return collection.order.map(function (key) {
235
+ return items[key];
236
+ });
237
+ } else {
238
+ return [];
239
+ }
240
+ });
241
+ }
242
+ var createShallowEqualArraysSelector = createSelectorCreator(defaultMemoize, shallowEqualArrays);
243
+
244
+ function shallowEqualArrays(a, b) {
245
+ return a.length === b.length && a.every(function (item, index) {
246
+ return item === b[index];
247
+ });
248
+ }
249
+
250
+ var Context = createContext();
251
+ function EntryStateProvider(_ref) {
252
+ var seed = _ref.seed,
253
+ children = _ref.children;
254
+
255
+ var _useCollections = useCollections(seed.collections, {
256
+ keyAttribute: 'permaId'
257
+ }),
258
+ _useCollections2 = _slicedToArray(_useCollections, 2),
259
+ collections = _useCollections2[0],
260
+ dispatch = _useCollections2[1];
261
+
262
+ var value = useMemo(function () {
263
+ return {
264
+ entryState: {
265
+ collections: collections,
266
+ config: seed.config
267
+ },
268
+ dispatch: dispatch
269
+ };
270
+ }, [collections, dispatch, seed]);
271
+ return (
272
+ /*#__PURE__*/
273
+ React.createElement(Context.Provider, {
274
+ value: value
275
+ }, children)
276
+ );
277
+ }
278
+
279
+ function useEntryState() {
280
+ var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (entryState) {
281
+ return entryState;
282
+ };
283
+ return useContextSelector(Context, function (value) {
284
+ return selector(value.entryState);
285
+ });
286
+ }
287
+
288
+ function useEntryStateDispatch() {
289
+ return useContextSelector(Context, function (value) {
290
+ return value.dispatch;
291
+ });
292
+ }
293
+ function useEntryStateConfig() {
294
+ return useEntryState(function (entryState) {
295
+ return entryState.config;
296
+ });
297
+ }
298
+ function useEntryStateCollectionItem(collectionName, key) {
299
+ return useEntryState(function (entryState) {
300
+ return getItem(entryState.collections, collectionName, key);
301
+ });
302
+ }
303
+ function useEntryStateCollectionItems(collectionName, filter) {
304
+ var itemsSelector = useMemo(function () {
305
+ return createItemsSelector(collectionName, filter);
306
+ }, [collectionName, filter]);
307
+ return useEntryState(function (entryState) {
308
+ return itemsSelector(entryState.collections);
309
+ });
310
+ }
311
+
312
+ /**
313
+ * Returns a nested data structure representing the metadata of the entry.
314
+ *
315
+ * @example
316
+ *
317
+ * const metaData = useEntryMetadata();
318
+ * metaData // =>
319
+ * {
320
+ * id: 5,
321
+ * locale: 'en',
322
+ * shareProviders: {email: false, facebook: true},
323
+ * share_url: 'http://test.host/test',
324
+ * credits: 'Credits: Pageflow'
325
+ * }
326
+ */
327
+
328
+ function useEntryMetadata() {
329
+ var entries = useEntryStateCollectionItems('entries');
330
+ return useMemo(function () {
331
+ return entries[0];
332
+ }, [entries]);
333
+ }
334
+
335
+ function _objectWithoutPropertiesLoose(source, excluded) {
336
+ if (source == null) return {};
337
+ var target = {};
338
+ var sourceKeys = Object.keys(source);
339
+ var key, i;
340
+
341
+ for (i = 0; i < sourceKeys.length; i++) {
342
+ key = sourceKeys[i];
343
+ if (excluded.indexOf(key) >= 0) continue;
344
+ target[key] = source[key];
345
+ }
346
+
347
+ return target;
348
+ }
349
+
350
+ function _objectWithoutProperties(source, excluded) {
351
+ if (source == null) return {};
352
+ var target = _objectWithoutPropertiesLoose(source, excluded);
353
+ var key, i;
354
+
355
+ if (Object.getOwnPropertySymbols) {
356
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
357
+
358
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
359
+ key = sourceSymbolKeys[i];
360
+ if (excluded.indexOf(key) >= 0) continue;
361
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
362
+ target[key] = source[key];
363
+ }
364
+ }
365
+
366
+ return target;
367
+ }
368
+
369
+ function _extends() {
370
+ _extends = Object.assign || function (target) {
371
+ for (var i = 1; i < arguments.length; i++) {
372
+ var source = arguments[i];
373
+
374
+ for (var key in source) {
375
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
376
+ target[key] = source[key];
377
+ }
378
+ }
379
+ }
380
+
381
+ return target;
382
+ };
383
+
384
+ return _extends.apply(this, arguments);
385
+ }
386
+ var EmailIcon = (function (_ref) {
387
+ var _ref$styles = _ref.styles,
388
+ props = _objectWithoutProperties(_ref, ["styles"]);
389
+
390
+ return React.createElement("svg", _extends({
391
+ xmlns: "http://www.w3.org/2000/svg",
392
+ viewBox: "0 0 612 612"
393
+ }, props), React.createElement("path", {
394
+ d: "M573.75 57.375H38.25C17.136 57.375 0 74.511 0 95.625v420.75c0 21.133 17.136 38.25 38.25 38.25h535.5c21.133 0 38.25-17.117 38.25-38.25V95.625c0-21.114-17.117-38.25-38.25-38.25zM554.625 497.25H57.375V204.657l224.03 187.999c7.134 5.967 15.874 8.97 24.595 8.97 8.74 0 17.461-3.003 24.595-8.97l224.03-187.999V497.25zm0-367.487L306 338.379 57.375 129.763V114.75h497.25v15.013z"
395
+ }));
396
+ });
397
+
398
+ function _extends$1() {
399
+ _extends$1 = Object.assign || function (target) {
400
+ for (var i = 1; i < arguments.length; i++) {
401
+ var source = arguments[i];
402
+
403
+ for (var key in source) {
404
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
405
+ target[key] = source[key];
406
+ }
407
+ }
408
+ }
409
+
410
+ return target;
411
+ };
412
+
413
+ return _extends$1.apply(this, arguments);
414
+ }
415
+ var FacebookIcon = (function (_ref) {
416
+ var _ref$styles = _ref.styles,
417
+ props = _objectWithoutProperties(_ref, ["styles"]);
418
+
419
+ return React.createElement("svg", _extends$1({
420
+ xmlns: "http://www.w3.org/2000/svg",
421
+ viewBox: "0 0 430.113 430.114"
422
+ }, props), React.createElement("path", {
423
+ d: "M158.081 83.3v59.218h-43.385v72.412h43.385v215.183h89.122V214.936h59.805s5.601-34.721 8.316-72.685H247.54V92.74c0-7.4 9.717-17.354 19.321-17.354h48.557V.001h-66.021C155.878-.004 158.081 72.48 158.081 83.3z"
424
+ }));
425
+ });
426
+
427
+ function _extends$2() {
428
+ _extends$2 = Object.assign || function (target) {
429
+ for (var i = 1; i < arguments.length; i++) {
430
+ var source = arguments[i];
431
+
432
+ for (var key in source) {
433
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
434
+ target[key] = source[key];
435
+ }
436
+ }
437
+ }
438
+
439
+ return target;
440
+ };
441
+
442
+ return _extends$2.apply(this, arguments);
443
+ }
444
+ var LinkedInIcon = (function (_ref) {
445
+ var _ref$styles = _ref.styles,
446
+ props = _objectWithoutProperties(_ref, ["styles"]);
447
+
448
+ return React.createElement("svg", _extends$2({
449
+ xmlns: "http://www.w3.org/2000/svg",
450
+ viewBox: "0 0 430.117 430.117"
451
+ }, props), React.createElement("path", {
452
+ d: "M430.117 261.543V420.56h-92.188V272.193c0-37.271-13.334-62.707-46.703-62.707-25.473 0-40.632 17.142-47.301 33.724-2.432 5.928-3.058 14.179-3.058 22.477V420.56h-92.219s1.242-251.285 0-277.32h92.21v39.309c-.187.294-.43.611-.606.896h.606v-.896c12.251-18.869 34.13-45.824 83.102-45.824 60.673-.001 106.157 39.636 106.157 124.818zM52.183 9.558C20.635 9.558 0 30.251 0 57.463c0 26.619 20.038 47.94 50.959 47.94h.616c32.159 0 52.159-21.317 52.159-47.94-.606-27.212-20-47.905-51.551-47.905zM5.477 420.56h92.184V143.24H5.477v277.32z"
453
+ }));
454
+ });
455
+
456
+ function _extends$3() {
457
+ _extends$3 = Object.assign || function (target) {
458
+ for (var i = 1; i < arguments.length; i++) {
459
+ var source = arguments[i];
460
+
461
+ for (var key in source) {
462
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
463
+ target[key] = source[key];
464
+ }
465
+ }
466
+ }
467
+
468
+ return target;
469
+ };
470
+
471
+ return _extends$3.apply(this, arguments);
472
+ }
473
+ var TelegramIcon = (function (_ref) {
474
+ var _ref$styles = _ref.styles,
475
+ props = _objectWithoutProperties(_ref, ["styles"]);
476
+
477
+ return React.createElement("svg", _extends$3({
478
+ xmlns: "http://www.w3.org/2000/svg",
479
+ viewBox: "0 0 512.004 512.004"
480
+ }, props), React.createElement("path", {
481
+ d: "M508.194 20.517c-4.43-4.96-11.42-6.29-17.21-3.76l-482 211a15.01 15.01 0 00-8.98 13.41 15.005 15.005 0 008.38 13.79l115.09 56.6 28.68 172.06c.93 6.53 6.06 11.78 12.74 12.73 4.8.69 9.57-1 12.87-4.4l90.86-90.86 129.66 92.62a15.02 15.02 0 0014.24 1.74 15.01 15.01 0 009.19-11.01l90-451c.89-4.47-.26-9.26-3.52-12.92zm-372.84 263.45l-84.75-41.68 334.82-146.57-250.07 188.25zm46.94 44.59l-13.95 69.75-15.05-90.3 183.97-138.49-150.88 151.39c-2.12 2.12-3.53 4.88-4.09 7.65zm9.13 107.3l15.74-78.67 36.71 26.22-52.45 52.45zm205.41 19.94l-176.73-126.23 252.47-253.31-75.74 379.54z"
482
+ }));
483
+ });
484
+
485
+ function _extends$4() {
486
+ _extends$4 = Object.assign || function (target) {
487
+ for (var i = 1; i < arguments.length; i++) {
488
+ var source = arguments[i];
489
+
490
+ for (var key in source) {
491
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
492
+ target[key] = source[key];
493
+ }
494
+ }
495
+ }
496
+
497
+ return target;
498
+ };
499
+
500
+ return _extends$4.apply(this, arguments);
501
+ }
502
+ var TwitterIcon = (function (_ref) {
503
+ var _ref$styles = _ref.styles,
504
+ props = _objectWithoutProperties(_ref, ["styles"]);
505
+
506
+ return React.createElement("svg", _extends$4({
507
+ xmlns: "http://www.w3.org/2000/svg",
508
+ viewBox: "0 0 612 612"
509
+ }, props), React.createElement("path", {
510
+ d: "M612 116.258a250.714 250.714 0 01-72.088 19.772c25.929-15.527 45.777-40.155 55.184-69.411-24.322 14.379-51.169 24.82-79.775 30.48-22.907-24.437-55.49-39.658-91.63-39.658-69.334 0-125.551 56.217-125.551 125.513 0 9.828 1.109 19.427 3.251 28.606-104.326-5.24-196.835-55.223-258.75-131.174-10.823 18.51-16.98 40.078-16.98 63.101 0 43.559 22.181 81.993 55.835 104.479a125.556 125.556 0 01-56.867-15.756v1.568c0 60.806 43.291 111.554 100.693 123.104-10.517 2.83-21.607 4.398-33.08 4.398-8.107 0-15.947-.803-23.634-2.333 15.985 49.907 62.336 86.199 117.253 87.194-42.947 33.654-97.099 53.655-155.916 53.655-10.134 0-20.116-.612-29.944-1.721 55.567 35.681 121.536 56.485 192.438 56.485 230.948 0 357.188-191.291 357.188-357.188l-.421-16.253c24.666-17.593 46.005-39.697 62.794-64.861z"
511
+ }));
512
+ });
513
+
514
+ function _extends$5() {
515
+ _extends$5 = Object.assign || function (target) {
516
+ for (var i = 1; i < arguments.length; i++) {
517
+ var source = arguments[i];
518
+
519
+ for (var key in source) {
520
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
521
+ target[key] = source[key];
522
+ }
523
+ }
524
+ }
525
+
526
+ return target;
527
+ };
528
+
529
+ return _extends$5.apply(this, arguments);
530
+ }
531
+ var WhatsAppIcon = (function (_ref) {
532
+ var _ref$styles = _ref.styles,
533
+ props = _objectWithoutProperties(_ref, ["styles"]);
534
+
535
+ return React.createElement("svg", _extends$5({
536
+ xmlns: "http://www.w3.org/2000/svg",
537
+ viewBox: "0 0 90 90"
538
+ }, props), React.createElement("path", {
539
+ d: "M90 43.841c0 24.213-19.779 43.841-44.182 43.841a44.256 44.256 0 01-21.357-5.455L0 90l7.975-23.522a43.38 43.38 0 01-6.34-22.637C1.635 19.628 21.416 0 45.818 0 70.223 0 90 19.628 90 43.841zM45.818 6.982c-20.484 0-37.146 16.535-37.146 36.859 0 8.065 2.629 15.534 7.076 21.61L11.107 79.14l14.275-4.537A37.122 37.122 0 0045.819 80.7c20.481 0 37.146-16.533 37.146-36.857S66.301 6.982 45.818 6.982zm22.311 46.956c-.273-.447-.994-.717-2.076-1.254-1.084-.537-6.41-3.138-7.4-3.495-.993-.358-1.717-.538-2.438.537-.721 1.076-2.797 3.495-3.43 4.212-.632.719-1.263.809-2.347.271-1.082-.537-4.571-1.673-8.708-5.333-3.219-2.848-5.393-6.364-6.025-7.441-.631-1.075-.066-1.656.475-2.191.488-.482 1.084-1.255 1.625-1.882.543-.628.723-1.075 1.082-1.793.363-.717.182-1.344-.09-1.883-.27-.537-2.438-5.825-3.34-7.977-.902-2.15-1.803-1.792-2.436-1.792-.631 0-1.354-.09-2.076-.09s-1.896.269-2.889 1.344c-.992 1.076-3.789 3.676-3.789 8.963 0 5.288 3.879 10.397 4.422 11.113.541.716 7.49 11.92 18.5 16.223C58.2 65.771 58.2 64.336 60.186 64.156c1.984-.179 6.406-2.599 7.312-5.107.9-2.512.9-4.663.631-5.111z"
540
+ }));
541
+ });
542
+
543
+ /**
544
+ * Returns a list of attributes (icon, name and url) of all configured share providers of the entry.
545
+ * The url provides a %{url} placeholder where the link can be inserted.
546
+ *
547
+ * @example
548
+ *
549
+ * const shareProviders = useShareProviders(options);
550
+ * shareProviders // =>
551
+ * [
552
+ * {
553
+ * icon: <FacebookSVGIcon />,
554
+ * name: 'Facebook',
555
+ * url: http://www.facebook.com/sharer/sharer.php?u=%{url}
556
+ * },
557
+ * {
558
+ * icon: <TwitterSVGIcon />,
559
+ * name: 'Twitter',
560
+ * url: https://twitter.com/intent/tweet?url=%{url}
561
+ * }
562
+ * ]
563
+ */
564
+
565
+ function useShareProviders(_ref) {
566
+ var isPhonePlatform = _ref.isPhonePlatform;
567
+ var config = useEntryStateConfig();
568
+ var entryMetadata = useEntryMetadata();
569
+ var shareProviders = entryMetadata ? entryMetadata.shareProviders : {};
570
+ var urlTemplates = config.shareUrlTemplates;
571
+ var sharing = {
572
+ email: {
573
+ icon: EmailIcon,
574
+ name: 'Mail',
575
+ url: urlTemplates.email
576
+ },
577
+ facebook: {
578
+ icon: FacebookIcon,
579
+ name: 'Facebook',
580
+ url: urlTemplates.facebook
581
+ },
582
+ linked_in: {
583
+ icon: LinkedInIcon,
584
+ name: 'LinkedIn',
585
+ url: urlTemplates.linked_in
586
+ },
587
+ telegram: {
588
+ icon: TelegramIcon,
589
+ name: 'Telegram',
590
+ url: urlTemplates.telegram
591
+ },
592
+ twitter: {
593
+ icon: TwitterIcon,
594
+ name: 'Twitter',
595
+ url: urlTemplates.twitter
596
+ },
597
+ whats_app: {
598
+ icon: WhatsAppIcon,
599
+ name: 'WhatsApp',
600
+ url: urlTemplates.whats_app
601
+ }
602
+ };
603
+ return useMemo(function () {
604
+ return activeShareProviders(shareProviders, isPhonePlatform).map(function (provider) {
605
+ var config = sharing[provider];
606
+ return {
607
+ name: config.name,
608
+ icon: config.icon,
609
+ url: config.url
610
+ };
611
+ });
612
+ }, [shareProviders, isPhonePlatform]);
613
+ }
614
+
615
+ function activeShareProviders(shareProvidersConfig, isPhonePlatform) {
616
+ var providers = filterShareProviders(shareProvidersConfig, isPhonePlatform);
617
+ return providers.filter(function (provider) {
618
+ return shareProvidersConfig[provider] !== false;
619
+ });
620
+ }
621
+
622
+ function filterShareProviders(shareProvidersConfig, isPhonePlatform) {
623
+ if (!isPhonePlatform) {
624
+ return Object.keys(shareProvidersConfig).filter(function (provider) {
625
+ return provider !== 'telegram' && provider !== 'whats_app';
626
+ });
627
+ }
628
+
629
+ return Object.keys(shareProvidersConfig);
630
+ }
631
+ /**
632
+ * Returns the share url of the entry.
633
+ *
634
+ * @example
635
+ *
636
+ * const shareUrl = useShareUrl();
637
+ * shareUrl // => "http://test.host/test"
638
+ */
639
+
640
+
641
+ function useShareUrl() {
642
+ var entryMetadata = useEntryMetadata();
643
+ var config = useEntryStateConfig();
644
+
645
+ if (entryMetadata) {
646
+ return entryMetadata.shareUrl ? entryMetadata.shareUrl : config.prettyUrl;
647
+ } else {
648
+ return config.shareUrl;
649
+ }
650
+ }
651
+
652
+ /**
653
+ * Returns a nested data structure representing the chapters, sections
654
+ * and content elements of the entry.
655
+ *
656
+ * @private
657
+ *
658
+ * @example
659
+ *
660
+ * const structure = useEntryStructure();
661
+ * structure // =>
662
+ * [
663
+ * {
664
+ * permaId: 5,
665
+ * title: 'Chapter 1',
666
+ * summary: 'An introductory chapter',
667
+ * sections: [
668
+ * {
669
+ * id: 1,
670
+ * permaId: 101,
671
+ * chapterId: 3,
672
+ * sectionIndex: 0,
673
+ * transition: 'scroll',
674
+ *
675
+ * // references to adjacent section objects
676
+ * previousSection: { ... },
677
+ * nextSection: { ... },
678
+ * }
679
+ * ],
680
+ * }
681
+ * ]
682
+ */
683
+
684
+ function useEntryStructure() {
685
+ var chapters = useChapters();
686
+ var sections = useEntryStateCollectionItems('sections');
687
+ return useMemo(function () {
688
+ var linkedSections = sections.map(function (section) {
689
+ return sectionData(section);
690
+ });
691
+ linkedSections.forEach(function (section, index) {
692
+ section.sectionIndex = index;
693
+ section.previousSection = linkedSections[index - 1];
694
+ section.nextSection = linkedSections[index + 1];
695
+ });
696
+ return chapters.map(function (chapter) {
697
+ return _objectSpread2(_objectSpread2({}, chapter), {}, {
698
+ sections: linkedSections.filter(function (item) {
699
+ return item.chapterId === chapter.id;
700
+ })
701
+ });
702
+ });
703
+ }, [chapters, sections]);
704
+ }
705
+ /**
706
+ * Returns a nested data structure representing the content elements
707
+ * of section.
708
+ *
709
+ * @param {Object} options
710
+ * @param {number} options.sectionPermaId
711
+ *
712
+ * @private
713
+ *
714
+ * @example
715
+ *
716
+ * const section = useSection({sectionPermaId: 4});
717
+ * section // =>
718
+ * {
719
+ * id: 100,
720
+ * permaId: 4,
721
+ * chapterId: 1,
722
+ * transition: 'scroll'
723
+ * }
724
+ */
725
+
726
+ function useSection(_ref) {
727
+ var sectionPermaId = _ref.sectionPermaId;
728
+ var section = useEntryStateCollectionItem('sections', sectionPermaId);
729
+ return sectionData(section);
730
+ }
731
+
732
+ function sectionData(section) {
733
+ return section && _objectSpread2({
734
+ permaId: section.permaId,
735
+ id: section.id,
736
+ chapterId: section.chapterId
737
+ }, section.configuration);
738
+ }
739
+
740
+ function useSectionContentElements(_ref2) {
741
+ var sectionId = _ref2.sectionId;
742
+ var filterBySectionId = useCallback(function (contentElement) {
743
+ return contentElement.sectionId === sectionId;
744
+ }, [sectionId]);
745
+ var contentElements = useEntryStateCollectionItems('contentElements', filterBySectionId);
746
+ return contentElements.map(function (item) {
747
+ return {
748
+ id: item.id,
749
+ permaId: item.permaId,
750
+ type: item.typeName,
751
+ position: item.configuration.position,
752
+ props: item.configuration
753
+ };
754
+ });
755
+ }
756
+ function useChapters() {
757
+ var chapters = useEntryStateCollectionItems('chapters');
758
+ var chapterSlugs = {};
759
+ return chapters.map(function (chapter) {
760
+ var chapterSlug = chapter.configuration.title;
761
+
762
+ if (chapterSlug) {
763
+ chapterSlug = slugify(chapterSlug, {
764
+ lower: true,
765
+ locale: 'de',
766
+ strict: true
767
+ });
768
+
769
+ if (chapterSlugs[chapterSlug]) {
770
+ chapterSlug = chapterSlug + '-' + chapter.permaId; //append permaId if chapter reference is not unique
771
+ }
772
+
773
+ chapterSlugs[chapterSlug] = chapter;
774
+ } else {
775
+ chapterSlug = 'chapter-' + chapter.permaId;
776
+ }
777
+
778
+ return {
779
+ id: chapter.id,
780
+ permaId: chapter.permaId,
781
+ title: chapter.configuration.title,
782
+ summary: chapter.configuration.summary,
783
+ chapterSlug: chapterSlug
784
+ };
785
+ });
786
+ }
787
+
788
+ function extendFile(collectionName, file, config) {
789
+ return addModelType(collectionName, expandUrls(collectionName, file, config.fileUrlTemplates), config.fileModelTypes);
790
+ }
791
+
792
+ function addModelType(collectionName, file, modelTypes) {
793
+ if (!file) {
794
+ return null;
795
+ }
796
+
797
+ if (!modelTypes[collectionName]) {
798
+ throw new Error("Could not find model type for collection name ".concat(collectionName));
799
+ }
800
+
801
+ return _objectSpread2(_objectSpread2({}, file), {}, {
802
+ modelType: modelTypes[collectionName]
803
+ });
804
+ }
805
+
806
+ function expandUrls(collectionName, file, urlTemplates) {
807
+ if (!file) {
808
+ return null;
809
+ }
810
+
811
+ if (!urlTemplates[collectionName]) {
812
+ throw new Error("No file url templates found for ".concat(collectionName));
813
+ }
814
+
815
+ var variants = file.variants || Object.keys(urlTemplates[collectionName]);
816
+ var urls = variants.reduce(function (result, variant) {
817
+ var url = getFileUrl(collectionName, file, variant, urlTemplates);
818
+
819
+ if (url) {
820
+ result[variant] = url;
821
+ }
822
+
823
+ return result;
824
+ }, {});
825
+ return _objectSpread2({
826
+ urls: urls
827
+ }, file);
828
+ }
829
+
830
+ function getFileUrl(collectionName, file, quality, urlTemplates) {
831
+ var templates = urlTemplates[collectionName];
832
+ var template = templates[quality];
833
+
834
+ if (template) {
835
+ return template.replace(':id_partition', idPartition(file.id)).replace(':basename', file.basename);
836
+ }
837
+ }
838
+
839
+ function idPartition(id) {
840
+ return partition(pad(id, 9));
841
+ }
842
+
843
+ function partition(string, separator) {
844
+ return string.replace(/./g, function (c, i, a) {
845
+ return i && (a.length - i) % 3 === 0 ? '/' + c : c;
846
+ });
847
+ }
848
+
849
+ function pad(string, size) {
850
+ return (Array(size).fill(0).join('') + string).slice(-size);
851
+ }
852
+
853
+ /**
854
+ * Look up a file by its collection and perma id.
855
+ *
856
+ * @param {Object} options
857
+ * @param {String} options.collectionName - Collection name of file type to look for (in camel case).
858
+ * @param {String} options.permaId - Perma id of file look up
859
+ *
860
+ * @example
861
+ * const imageFile = useFile({collectionName: 'imageFiles', permaId: 5});
862
+ * imageFile // =>
863
+ * {
864
+ * id: 102,
865
+ * permaId: 5,
866
+ * width: 1000,
867
+ * height: 500,
868
+ * urls: {
869
+ * large: 'https://...'
870
+ * },
871
+ * configuration: {
872
+ * alt: '...'
873
+ * }
874
+ * }
875
+ */
876
+
877
+ function useFile(_ref) {
878
+ var collectionName = _ref.collectionName,
879
+ permaId = _ref.permaId;
880
+ var file = useEntryStateCollectionItem(collectionName, permaId);
881
+ return extendFile(collectionName, file, useEntryStateConfig());
882
+ }
883
+
884
+ function useNestedFiles(_ref) {
885
+ var collectionName = _ref.collectionName,
886
+ parent = _ref.parent;
887
+ var config = useEntryStateConfig();
888
+ var files = useEntryStateCollectionItems(collectionName, function (file) {
889
+ return parent && file.parentFileId === parent.id && file.parentFileModelType === parent.modelType;
890
+ });
891
+ return files.map(function (file) {
892
+ return extendFile(collectionName, file, config);
893
+ });
894
+ }
895
+
896
+ /**
897
+ * Returns a string (comma-separated list) of copyrights of
898
+ * all images used in the entry.
899
+ * If none of the images has a rights attribute configured,
900
+ * it falls back to the default file rights of the entry's account,
901
+ * otherwise returns an empty string
902
+ *
903
+ * @example
904
+ *
905
+ * const fileRights = useFileRights();
906
+ * fileRights // => "author of image 1, author of image 2"
907
+ */
908
+
909
+ function useFileRights() {
910
+ var config = useEntryStateConfig();
911
+ var imageFiles = useEntryStateCollectionItems('imageFiles');
912
+ var defaultFileRights = config.defaultFileRights;
913
+ var imageFileRights = imageFiles.reduce(function (result, imageConfig) {
914
+ if (imageConfig && imageConfig.rights) {
915
+ result.push(imageConfig.rights.trim());
916
+ }
917
+
918
+ return result;
919
+ }, []).filter(Boolean).join(', ');
920
+ var fileRights = !!imageFileRights ? imageFileRights : defaultFileRights.trim();
921
+ var fileRightsString = !!fileRights ? 'Bildrechte: ' + fileRights : '';
922
+ return fileRightsString;
923
+ }
924
+ /**
925
+ * Returns a nested data structure representing the legal info of the entry.
926
+ * Each legal info is separated into label and url to use in links.
927
+ * Both label and url can be blank, depending on the configuration.
928
+ *
929
+ * @example
930
+ *
931
+ * const legalInfo = useLegalInfo();
932
+ * legalInfo // =>
933
+ * {
934
+ * imprint: {
935
+ * label: '',
936
+ * url: ''
937
+ * },
938
+ * copyright: {
939
+ * label: '',
940
+ * url: ''
941
+ * },
942
+ * privacy: {
943
+ * label: '',
944
+ * url: ''
945
+ * }
946
+ * }
947
+ */
948
+
949
+ function useLegalInfo() {
950
+ var config = useEntryStateConfig();
951
+ return config.legalInfo;
952
+ }
953
+ /**
954
+ * Returns the credits string (rich text) of the entry.
955
+ *
956
+ * @example
957
+ *
958
+ * const credits = useCredits();
959
+ * credits // => "Credits: <a href="http://pageflow.com">pageflow.com</a>"
960
+ */
961
+
962
+ function useCredits() {
963
+ var entryMetadata = useEntryMetadata();
964
+ var credits = '';
965
+
966
+ if (entryMetadata) {
967
+ credits = entryMetadata.credits;
968
+ }
969
+
970
+ return credits;
971
+ }
972
+
973
+ function _arrayWithoutHoles(arr) {
974
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
975
+ }
976
+
977
+ function _iterableToArray(iter) {
978
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
979
+ }
980
+
981
+ function _nonIterableSpread() {
982
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
983
+ }
984
+
985
+ function _toConsumableArray(arr) {
986
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
987
+ }
988
+
989
+ var qualities = ['medium', 'fullhd', '4k'];
990
+ function useAvailableQualities(file) {
991
+ if (!file) {
992
+ return [];
993
+ }
994
+
995
+ return ['auto'].concat(_toConsumableArray(qualities.filter(function (name) {
996
+ return file.variants.includes(name);
997
+ })));
998
+ }
999
+
1000
+ /**
1001
+ * Returns an object containing theme asset paths.
1002
+ *
1003
+ * @example
1004
+ *
1005
+ * const theme = useTheme();
1006
+ * theme // =>
1007
+ * {
1008
+ * assets: {
1009
+ * logoDesktop: 'path/to/logoDesktop.svg',
1010
+ * logoMobile: 'path/to/logoMobile.svg'
1011
+ * },
1012
+ * options: {
1013
+ * // options passed to `themes.register` in `pageflow.rb` initializer
1014
+ * // with camleized keys.
1015
+ * }
1016
+ * }
1017
+ */
1018
+
1019
+ function useTheme() {
1020
+ var config = useEntryStateConfig();
1021
+ return config.theme;
1022
+ }
1023
+
1024
+ function updateContentElementConfiguration(_ref) {
1025
+ var dispatch = _ref.dispatch,
1026
+ permaId = _ref.permaId,
1027
+ configuration = _ref.configuration;
1028
+ updateConfiguration({
1029
+ dispatch: dispatch,
1030
+ name: 'contentElements',
1031
+ key: permaId,
1032
+ configuration: configuration
1033
+ });
1034
+ }
1035
+
1036
+ var LocaleContext = createContext$1('en');
1037
+ function setupI18n(_ref) {
1038
+ var defaultLocale = _ref.defaultLocale,
1039
+ locale = _ref.locale,
1040
+ translations = _ref.translations;
1041
+ I18n.defaultLocale = defaultLocale;
1042
+ I18n.locale = locale;
1043
+ I18n.translations = translations;
1044
+ }
1045
+ function LocaleProvider(_ref2) {
1046
+ var children = _ref2.children;
1047
+
1048
+ var _ref3 = useEntryMetadata() || {},
1049
+ locale = _ref3.locale;
1050
+
1051
+ return (
1052
+ /*#__PURE__*/
1053
+ React.createElement(LocaleContext.Provider, {
1054
+ value: locale
1055
+ }, children)
1056
+ );
1057
+ }
1058
+ function useLocale() {
1059
+ return useContext(LocaleContext);
1060
+ }
1061
+ /**
1062
+ * Use translations in frontend elements. Uses the configured locale
1063
+ * of the current entry by default. Note that only translation keys
1064
+ * from the `pageflow_scrolled.public` scope are universally
1065
+ * available.
1066
+ *
1067
+ * to render translations for inline editing controls in the editor
1068
+ * preview, you can pass `"ui"` as `locale` option and use
1069
+ * translations from the `pageflow_scrolled.inline_editing` scope.
1070
+ *
1071
+ * @param {Object} [options]
1072
+ * @param {string} [locale="entry"] -
1073
+ * Pass `"ui"` to use the locale of the editor interface instead.
1074
+ *
1075
+ * @example
1076
+ * const {t} = useI18n();
1077
+ * t('pageflow_scrolled.public.some.key')
1078
+ *
1079
+ * const {t} = useI18n({locale: 'ui'});
1080
+ * t('pageflow_scrolled.inline_editing.some.key')
1081
+ */
1082
+
1083
+ function useI18n() {
1084
+ var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
1085
+ scope = _ref4.locale;
1086
+
1087
+ var locale = useLocale();
1088
+ return {
1089
+ t: function t(key, options) {
1090
+ return I18n.t(key, _objectSpread2(_objectSpread2({}, options), {}, {
1091
+ locale: scope !== 'ui' && locale
1092
+ }));
1093
+ }
1094
+ };
1095
+ }
1096
+
1097
+ var PhonePlatformContext = React.createContext(false);
1098
+
1099
+ function useOnScreen(ref) {
1100
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1101
+ rootMargin = _ref.rootMargin,
1102
+ onIntersecting = _ref.onIntersecting,
1103
+ skipIframeFix = _ref.skipIframeFix;
1104
+
1105
+ var _useState = useState(false),
1106
+ _useState2 = _slicedToArray(_useState, 2),
1107
+ isIntersecting = _useState2[0],
1108
+ setIntersecting = _useState2[1];
1109
+
1110
+ useEffect(function () {
1111
+ var current = ref.current;
1112
+ var observer = createIntersectionObserver(function (entries) {
1113
+ // Even when observing only a single element, multiple entries
1114
+ // may have queued up. In Chrome this can be observed when
1115
+ // moving an observed element in the DOM: The callback is
1116
+ // invoked once with two entries for the same target, one
1117
+ // claiming the element no longer intersects and one - with a
1118
+ // later timestamp - saying that is does intersect. Assuming
1119
+ // entries are ordered according to time, we only consider the
1120
+ // last entry.
1121
+ var entry = entries[entries.length - 1];
1122
+ setIntersecting(entry.isIntersecting);
1123
+
1124
+ if (entry.isIntersecting && onIntersecting) {
1125
+ onIntersecting();
1126
+ }
1127
+ }, {
1128
+ rootMargin: rootMargin
1129
+ }, skipIframeFix);
1130
+
1131
+ if (ref.current) {
1132
+ observer.observe(current);
1133
+ }
1134
+
1135
+ return function () {
1136
+ observer.unobserve(current);
1137
+ };
1138
+ }, [ref, rootMargin, onIntersecting, skipIframeFix]);
1139
+ return isIntersecting;
1140
+ }
1141
+
1142
+ function createIntersectionObserver(callback, options, skipIframeFix) {
1143
+ if (skipIframeFix) {
1144
+ return new IntersectionObserver(callback, options);
1145
+ } // Positive root margins are ignored in iframes [1] (i.e. in
1146
+ // the Pageflow editor). To make it work, the iframe document
1147
+ // needs to be passed as `root` [2].
1148
+ // This leads to a `TypeError`, though, in browers that do not
1149
+ // support this yet (e.g. Chrome 80). We catch the error and
1150
+ // skip passing the `root` option.
1151
+ //
1152
+ // [1] https://github.com/w3c/IntersectionObserver/issues/283
1153
+ // [2] https://github.com/w3c/IntersectionObserver/issues/372
1154
+
1155
+
1156
+ try {
1157
+ var optionsWithIframeFix = options;
1158
+
1159
+ if (options.rootMargin && window.parent !== window) {
1160
+ optionsWithIframeFix = _objectSpread2(_objectSpread2({}, options), {}, {
1161
+ root: window.document
1162
+ });
1163
+ }
1164
+
1165
+ return new IntersectionObserver(callback, optionsWithIframeFix);
1166
+ } catch (e) {
1167
+ // Normally we would check for TypeError here. Since the polyfill
1168
+ // throws a generic error, we retry either way and trust that the
1169
+ // error will happen again if it is not related to the `root`
1170
+ // option.
1171
+ return createIntersectionObserver(callback, options, true);
1172
+ }
1173
+ }
1174
+
1175
+ var styles = {"wrapper":"useScrollPositionLifecycle-module_wrapper__1a6Kr","isActiveProbe":"useScrollPositionLifecycle-module_isActiveProbe__3VKB5"};
1176
+
1177
+ var StaticPreviewContext = createContext$1(false);
1178
+ function StaticPreview(_ref) {
1179
+ var children = _ref.children;
1180
+ return (
1181
+ /*#__PURE__*/
1182
+ React.createElement(StaticPreviewContext.Provider, {
1183
+ value: true
1184
+ }, children)
1185
+ );
1186
+ }
1187
+ /**
1188
+ * Use inside a content element component to determine whether the
1189
+ * component is being rendered in a static preview, e.g. editor
1190
+ * thumbnails.
1191
+ *
1192
+ * @example
1193
+ * const isStaticPreview = useIsStaticPreview();
1194
+ */
1195
+
1196
+ function useIsStaticPreview() {
1197
+ return useContext(StaticPreviewContext);
1198
+ }
1199
+ function createScrollPositionLifecycleProvider(Context) {
1200
+ return function ScrollPositionLifecycleProvider(_ref2) {
1201
+ var children = _ref2.children,
1202
+ onActivate = _ref2.onActivate;
1203
+ var ref = useRef();
1204
+ var isActiveProbeRef = useRef();
1205
+ var isStaticPreview = useContext(StaticPreviewContext);
1206
+ var shouldLoad = useOnScreen(ref, {
1207
+ rootMargin: '200% 0px 200% 0px'
1208
+ });
1209
+ var shouldPrepare = useOnScreen(ref, {
1210
+ rootMargin: '25% 0px 25% 0px'
1211
+ }) && !isStaticPreview;
1212
+ var isVisible = useOnScreen(ref) && !isStaticPreview;
1213
+ var isActive = useOnScreen(isActiveProbeRef, {
1214
+ rootMargin: '-50% 0px -50% 0px',
1215
+ onIntersecting: onActivate
1216
+ }) && !isStaticPreview;
1217
+ var value = useMemo(function () {
1218
+ return {
1219
+ shouldLoad: shouldLoad,
1220
+ shouldPrepare: shouldPrepare,
1221
+ isVisible: isVisible,
1222
+ isActive: isActive
1223
+ };
1224
+ }, [shouldLoad, shouldPrepare, isVisible, isActive]);
1225
+ return (
1226
+ /*#__PURE__*/
1227
+ React.createElement("div", {
1228
+ ref: ref,
1229
+ className: classNames(styles.wrapper)
1230
+ },
1231
+ /*#__PURE__*/
1232
+ React.createElement("div", {
1233
+ ref: isActiveProbeRef,
1234
+ className: styles.isActiveProbe
1235
+ }),
1236
+ /*#__PURE__*/
1237
+ React.createElement(Context.Provider, {
1238
+ value: value
1239
+ }, children))
1240
+ );
1241
+ };
1242
+ }
1243
+ function createScrollPositionLifecycleHook(Context) {
1244
+ return function useScrollPositionLifecycle() {
1245
+ var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
1246
+ onActivate = _ref3.onActivate,
1247
+ onDeactivate = _ref3.onDeactivate,
1248
+ onVisible = _ref3.onVisible,
1249
+ onInvisible = _ref3.onInvisible;
1250
+
1251
+ var result = useContext(Context);
1252
+ var wasActive = useRef();
1253
+ var wasVisible = useRef();
1254
+
1255
+ var _ref4 = result || {},
1256
+ isActive = _ref4.isActive,
1257
+ isVisible = _ref4.isVisible;
1258
+
1259
+ useEffect(function () {
1260
+ if (!wasVisible.current && isVisible && onVisible) {
1261
+ onVisible();
1262
+ }
1263
+
1264
+ if (!wasActive.current && isActive && onActivate) {
1265
+ onActivate();
1266
+ } else if (wasActive.current && !isActive && onDeactivate) {
1267
+ onDeactivate();
1268
+ }
1269
+
1270
+ if (wasVisible.current && !isVisible && onInvisible) {
1271
+ onInvisible();
1272
+ }
1273
+
1274
+ wasActive.current = isActive;
1275
+ wasVisible.current = isVisible;
1276
+ });
1277
+ return result;
1278
+ };
1279
+ }
1280
+
1281
+ var styles$1 = {"root":"MotifArea-module_root__1_ACd","visible":"MotifArea-module_visible__18Kln"};
1282
+
1283
+ var VisibilityContext = React.createContext(false);
1284
+ function MotifAreaVisibilityProvider(_ref) {
1285
+ var visible = _ref.visible,
1286
+ children = _ref.children;
1287
+ return (
1288
+ /*#__PURE__*/
1289
+ React.createElement(VisibilityContext.Provider, {
1290
+ value: visible
1291
+ }, children)
1292
+ );
1293
+ }
1294
+ var MotifArea = function MotifArea(props) {
1295
+ var _props$file;
1296
+
1297
+ var lastPosition = useRef();
1298
+ var position = ((_props$file = props.file) === null || _props$file === void 0 ? void 0 : _props$file.isReady) && getPosition(props);
1299
+ var visible = useContext(VisibilityContext);
1300
+ var elementRef = useRef();
1301
+ var onUpdate = props.onUpdate;
1302
+ var setElementRef = useCallback(function (element) {
1303
+ elementRef.current = element;
1304
+ onUpdate(element);
1305
+ }, [elementRef, onUpdate]);
1306
+ useEffect(function () {
1307
+ if (lastPosition.current && position && (lastPosition.current.top !== position.top || lastPosition.current.left !== position.left || lastPosition.current.width !== position.width || lastPosition.current.height !== position.height)) {
1308
+ onUpdate(elementRef.current);
1309
+ }
1310
+
1311
+ lastPosition.current = position;
1312
+ });
1313
+
1314
+ if (!position) {
1315
+ return null;
1316
+ }
1317
+
1318
+ return (
1319
+ /*#__PURE__*/
1320
+ React.createElement("div", {
1321
+ ref: setElementRef,
1322
+ className: classNames(styles$1.root, _defineProperty({}, styles$1.visible, visible)),
1323
+ style: position,
1324
+ onMouseEnter: props.onMouseEnter,
1325
+ onMouseLeave: props.onMouseLeave
1326
+ })
1327
+ );
1328
+ };
1329
+ MotifArea.defaultProps = {
1330
+ onUpdate: function onUpdate() {}
1331
+ };
1332
+
1333
+ function getPosition(props) {
1334
+ return props.file.motifAreaOffsetRect || {
1335
+ top: 0,
1336
+ left: 0,
1337
+ width: 0,
1338
+ height: 0
1339
+ };
1340
+ }
1341
+
1342
+ function useMediaQuery(query) {
1343
+ var _useState = useState(false),
1344
+ _useState2 = _slicedToArray(_useState, 2),
1345
+ doesMatch = _useState2[0],
1346
+ onSetDoesMatch = _useState2[1];
1347
+
1348
+ useEffect(function () {
1349
+ var onUpdateMatch = function onUpdateMatch(_ref) {
1350
+ var matches = _ref.matches;
1351
+ onSetDoesMatch(matches);
1352
+ };
1353
+
1354
+ var matcher = window.matchMedia(query);
1355
+ var isModern = 'addEventListener' in matcher;
1356
+
1357
+ if (isModern) {
1358
+ matcher.addEventListener('change', onUpdateMatch);
1359
+ } else {
1360
+ matcher.addListener(onUpdateMatch);
1361
+ }
1362
+
1363
+ onUpdateMatch(matcher);
1364
+ return function () {
1365
+ if (isModern) {
1366
+ matcher.removeEventListener('change', onUpdateMatch);
1367
+ } else {
1368
+ matcher.removeListener(onUpdateMatch);
1369
+ }
1370
+ };
1371
+ }, [query, onSetDoesMatch]);
1372
+ return doesMatch;
1373
+ }
1374
+
1375
+ var styles$2 = {"Foreground":"Foreground-module_Foreground__13ODU","fullFadeHeight":"Foreground-module_fullFadeHeight__2p9dx","fullHeight":"Foreground-module_fullHeight__1vMXb","inFirstSection":"Foreground-module_inFirstSection__1r-_i","paddingBottom":"Foreground-module_paddingBottom__3OtY4"};
1376
+
1377
+ var ForcePaddingContext = createContext$1(false);
1378
+ function Foreground(props) {
1379
+ var forcePadding = useContext(ForcePaddingContext);
1380
+ return (
1381
+ /*#__PURE__*/
1382
+ React.createElement("div", {
1383
+ className: className(props, forcePadding),
1384
+ style: {
1385
+ minHeight: props.minHeight
1386
+ }
1387
+ }, props.children)
1388
+ );
1389
+ }
1390
+
1391
+ function className(props, forcePadding) {
1392
+ return classNames(styles$2.Foreground, props.transitionStyles.foreground, props.transitionStyles["foreground-".concat(props.state)], _defineProperty({}, styles$2.paddingBottom, props.paddingBottom || forcePadding), _defineProperty({}, styles$2.inFirstSection, props.inFirstSection), styles$2["".concat(props.heightMode, "Height")]);
1393
+ }
1394
+
1395
+ /**
1396
+ * Register new types of content elements.
1397
+ * @name frontend_contentElementTypes
1398
+ */
1399
+ var ContentElementTypeRegistry =
1400
+ /*#__PURE__*/
1401
+ function () {
1402
+ function ContentElementTypeRegistry() {
1403
+ _classCallCheck(this, ContentElementTypeRegistry);
1404
+
1405
+ this.types = {};
1406
+ }
1407
+ /**
1408
+ * Register a new type of content element.
1409
+ *
1410
+ * @param {string} typeName - Name of the content element type.
1411
+ * @param {Object} options
1412
+ * @param {React.Component} options.component
1413
+ * @param {boolean} [options.supportsWrappingAroundFloats] -
1414
+ * In sections with centered layout, content elements can be
1415
+ * floated to the left or right. By default all content
1416
+ * elements are cleared to position them below floating
1417
+ * elements. If a content element renders mainly text that
1418
+ * can wrap around floating elements, clearing can be
1419
+ * disabled via this option.
1420
+ * @memberof frontend_contentElementTypes
1421
+ *
1422
+ * @example
1423
+ *
1424
+ * // frontend.js
1425
+ *
1426
+ * import {frontend} from 'pageflow-scrolled/frontend';
1427
+ * import {InlineImage} from './InlineImage';
1428
+ *
1429
+ * frontend.contentElementTypes.register('inlineImage', {
1430
+ * component: InlineImage
1431
+ * });
1432
+ */
1433
+
1434
+
1435
+ _createClass(ContentElementTypeRegistry, [{
1436
+ key: "register",
1437
+ value: function register(typeName, options) {
1438
+ this.types[typeName] = options;
1439
+ }
1440
+ }, {
1441
+ key: "getComponent",
1442
+ value: function getComponent(typeName) {
1443
+ return this.types[typeName] && this.types[typeName].component;
1444
+ }
1445
+ }, {
1446
+ key: "getOptions",
1447
+ value: function getOptions(typeName) {
1448
+ return this.types[typeName];
1449
+ }
1450
+ }]);
1451
+
1452
+ return ContentElementTypeRegistry;
1453
+ }();
1454
+
1455
+ var api = {
1456
+ contentElementTypes: new ContentElementTypeRegistry()
1457
+ };
1458
+
1459
+ // For reasons that are beyond me, Storybook's Webpack build fails
1460
+ // with a "JavaScript heap out of memory" error if this import
1461
+ // expression lives in inlineEditing/index.js directly. I originally
1462
+ // intended to hide the import from Webpack by using
1463
+ // file-replace-loader in Storybook's Webpack config to replace this
1464
+ // file with an empty one, but found out that extracting the import
1465
+ // to a separate file apparently is enough.
1466
+ function importComponents() {
1467
+ return import('./components-3ead1b4a.js');
1468
+ }
1469
+
1470
+ var components = {};
1471
+ function loadInlineEditingComponents() {
1472
+ return importComponents().then(function (importedComponents) {
1473
+ components = importedComponents;
1474
+ });
1475
+ }
1476
+ function withInlineEditingDecorator(name, Component) {
1477
+ return function InlineEditingDecorator(props) {
1478
+ var Decorator = components[name];
1479
+
1480
+ if (Decorator) {
1481
+ return (
1482
+ /*#__PURE__*/
1483
+ React.createElement(Decorator, props,
1484
+ /*#__PURE__*/
1485
+ React.createElement(Component, props))
1486
+ );
1487
+ } else {
1488
+ return (
1489
+ /*#__PURE__*/
1490
+ React.createElement(Component, props)
1491
+ );
1492
+ }
1493
+ };
1494
+ }
1495
+ function withInlineEditingAlternative(name, Component) {
1496
+ return function InlineEditingDecorator(props) {
1497
+ var Alternative = components[name];
1498
+
1499
+ if (Alternative) {
1500
+ return (
1501
+ /*#__PURE__*/
1502
+ React.createElement(Alternative, props)
1503
+ );
1504
+ } else {
1505
+ return (
1506
+ /*#__PURE__*/
1507
+ React.createElement(Component, props)
1508
+ );
1509
+ }
1510
+ };
1511
+ }
1512
+
1513
+ var ContentElementAttributesContext = createContext$1({});
1514
+ function ContentElementAttributesProvider(_ref) {
1515
+ var id = _ref.id,
1516
+ children = _ref.children;
1517
+ var attributes = useMemo(function () {
1518
+ return {
1519
+ contentElementId: id
1520
+ };
1521
+ }, [id]);
1522
+ return (
1523
+ /*#__PURE__*/
1524
+ React.createElement(ContentElementAttributesContext.Provider, {
1525
+ value: attributes
1526
+ }, children)
1527
+ );
1528
+ }
1529
+ function useContentElementAttributes() {
1530
+ return useContext(ContentElementAttributesContext);
1531
+ }
1532
+
1533
+ var ContentElementLifecycleContext = createContext$1();
1534
+ var LifecycleProvider = createScrollPositionLifecycleProvider(ContentElementLifecycleContext);
1535
+ var useLifecycle = createScrollPositionLifecycleHook(ContentElementLifecycleContext);
1536
+ function ContentElementLifecycleProvider(_ref) {
1537
+ var type = _ref.type,
1538
+ children = _ref.children;
1539
+
1540
+ var _api$contentElementTy = api.contentElementTypes.getOptions(type),
1541
+ lifecycle = _api$contentElementTy.lifecycle;
1542
+
1543
+ if (lifecycle) {
1544
+ return (
1545
+ /*#__PURE__*/
1546
+ React.createElement(LifecycleProvider, null, children)
1547
+ );
1548
+ } else {
1549
+ return children;
1550
+ }
1551
+ }
1552
+ /**
1553
+ * Returns an object containing information about the scroll position
1554
+ * related lifecylce of the content element. Requires the `lifecycle`
1555
+ * option to be set to true in the `frontend.contentElements.register`
1556
+ * call for the content element's type.
1557
+ *
1558
+ * * `shouldLoad` is true if the content element should start lazy
1559
+ * load. Becomes true before `shouldPrepare`.
1560
+ *
1561
+ * * `shouldPrepare` is true if the content element is about to enter
1562
+ * the viewport.
1563
+ *
1564
+ * * `isActive` is true if the content element is completely in the
1565
+ * viewport.
1566
+ *
1567
+ * @param {Function} onActivate -
1568
+ * Invoked when content element has entered the viewport.
1569
+ *
1570
+ * @param {Function} onDeactivate -
1571
+ * Invoked when content element has left the viewport.
1572
+ *
1573
+ * @example
1574
+ *
1575
+ * const {isActive, shouldPrepare} = useContentElementLifecycle();
1576
+ */
1577
+
1578
+ function useContentElementLifecycle(options) {
1579
+ var result = useLifecycle(options);
1580
+
1581
+ if (!result) {
1582
+ throw new Error('useContentElementLifecycle is only available in ' + 'content elements for which `lifecycle: true` has ' + 'been passed to frontend.contentElements.register');
1583
+ }
1584
+
1585
+ return result;
1586
+ }
1587
+
1588
+ var styles$3 = {"wrapper":"ContentElementMargin-module_wrapper__20kIk"};
1589
+
1590
+ function ContentElementMargin(_ref) {
1591
+ var position = _ref.position,
1592
+ children = _ref.children;
1593
+
1594
+ if (position === 'full') {
1595
+ return children;
1596
+ }
1597
+
1598
+ return (
1599
+ /*#__PURE__*/
1600
+ React.createElement("div", {
1601
+ className: styles$3.wrapper
1602
+ }, children)
1603
+ );
1604
+ }
1605
+
1606
+ var styles$4 = {"missing":"ContentElement-module_missing__2_1j9"};
1607
+
1608
+ function _createSuper(Derived) {
1609
+ function isNativeReflectConstruct() {
1610
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
1611
+ if (Reflect.construct.sham) return false;
1612
+ if (typeof Proxy === "function") return true;
1613
+
1614
+ try {
1615
+ Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
1616
+ return true;
1617
+ } catch (e) {
1618
+ return false;
1619
+ }
1620
+ }
1621
+
1622
+ return function () {
1623
+ var Super = _getPrototypeOf(Derived),
1624
+ result;
1625
+
1626
+ if (isNativeReflectConstruct()) {
1627
+ var NewTarget = _getPrototypeOf(this).constructor;
1628
+
1629
+ result = Reflect.construct(Super, arguments, NewTarget);
1630
+ } else {
1631
+ result = Super.apply(this, arguments);
1632
+ }
1633
+
1634
+ return _possibleConstructorReturn(this, result);
1635
+ };
1636
+ }
1637
+ var ContentElementErrorBoundary =
1638
+ /*#__PURE__*/
1639
+ function (_React$Component) {
1640
+ _inherits(ContentElementErrorBoundary, _React$Component);
1641
+
1642
+ var _super = _createSuper(ContentElementErrorBoundary);
1643
+
1644
+ function ContentElementErrorBoundary(props) {
1645
+ var _this;
1646
+
1647
+ _classCallCheck(this, ContentElementErrorBoundary);
1648
+
1649
+ _this = _super.call(this, props);
1650
+ _this.state = {
1651
+ hasError: false
1652
+ };
1653
+ return _this;
1654
+ }
1655
+
1656
+ _createClass(ContentElementErrorBoundary, [{
1657
+ key: "render",
1658
+ value: function render() {
1659
+ if (this.state.hasError) {
1660
+ return (
1661
+ /*#__PURE__*/
1662
+ React.createElement("div", {
1663
+ className: styles$4.missing
1664
+ }, "Error rendering element of type \"", this.props.type, "\"")
1665
+ );
1666
+ }
1667
+
1668
+ return this.props.children;
1669
+ }
1670
+ }], [{
1671
+ key: "getDerivedStateFromError",
1672
+ value: function getDerivedStateFromError(error) {
1673
+ return {
1674
+ hasError: true
1675
+ };
1676
+ }
1677
+ }]);
1678
+
1679
+ return ContentElementErrorBoundary;
1680
+ }(React.Component);
1681
+
1682
+ var ContentElement = withInlineEditingDecorator('ContentElementDecorator', function ContentElement(props) {
1683
+ var Component = api.contentElementTypes.getComponent(props.type);
1684
+
1685
+ if (Component) {
1686
+ return (
1687
+ /*#__PURE__*/
1688
+ React.createElement(ContentElementAttributesProvider, {
1689
+ id: props.id
1690
+ },
1691
+ /*#__PURE__*/
1692
+ React.createElement(ContentElementLifecycleProvider, {
1693
+ type: props.type
1694
+ },
1695
+ /*#__PURE__*/
1696
+ React.createElement(ContentElementMargin, {
1697
+ position: props.itemProps.position
1698
+ },
1699
+ /*#__PURE__*/
1700
+ React.createElement(ContentElementErrorBoundary, {
1701
+ type: props.type
1702
+ },
1703
+ /*#__PURE__*/
1704
+ React.createElement(Component, {
1705
+ sectionProps: props.sectionProps,
1706
+ configuration: props.itemProps,
1707
+ contentElementId: props.id
1708
+ })))))
1709
+ );
1710
+ } else {
1711
+ return (
1712
+ /*#__PURE__*/
1713
+ React.createElement("div", {
1714
+ className: styles$4.missing
1715
+ }, "Element of unknown type \"", props.type, "\"")
1716
+ );
1717
+ }
1718
+ });
1719
+ ContentElement.defaultProps = {
1720
+ itemProps: {}
1721
+ };
1722
+
1723
+ function ContentElements(props) {
1724
+ return (
1725
+ /*#__PURE__*/
1726
+ React.createElement(React.Fragment, null, props.items.map(function (item, index) {
1727
+ return props.children(item,
1728
+ /*#__PURE__*/
1729
+ React.createElement(MemoizedContentElement, {
1730
+ key: item.id,
1731
+ id: item.id,
1732
+ permaId: item.permaId,
1733
+ type: item.type,
1734
+ first: index === 0,
1735
+ position: item.position,
1736
+ itemProps: item.props,
1737
+ sectionProps: props.sectionProps
1738
+ }), index);
1739
+ }))
1740
+ );
1741
+ }
1742
+ var MemoizedContentElement = React.memo(ContentElement, function (prevProps, nextProps) {
1743
+ return prevProps.id === nextProps.id && prevProps.permaId === nextProps.permaId && prevProps.type === nextProps.type && prevProps.position === nextProps.position && prevProps.itemProps === nextProps.itemProps && prevProps.sectionProps === nextProps.sectionProps;
1744
+ });
1745
+ ContentElements.defaultProps = {
1746
+ children: function children(item, child) {
1747
+ return child;
1748
+ }
1749
+ };
1750
+
1751
+ function useNarrowViewport() {
1752
+ return useMediaQuery('(max-width: 950px)');
1753
+ }
1754
+
1755
+ var styles$5 = {"root":"TwoColumn-module_root__37EqL","group":"TwoColumn-module_group__3Hg2y","group-full":"TwoColumn-module_group-full__2OT4o","sticky":"TwoColumn-module_sticky__4LCDO","inline":"TwoColumn-module_inline__1fPfM","right":"TwoColumn-module_right__Fr52a","narrow":"TwoColumn-module_narrow__qAgnL","wide":"TwoColumn-module_wide__xdF_t"};
1756
+
1757
+ function availablePositions(narrow) {
1758
+ if (narrow) {
1759
+ return ['inline', 'full'];
1760
+ } else {
1761
+ return ['inline', 'sticky', 'full'];
1762
+ }
1763
+ }
1764
+
1765
+ function TwoColumn(props) {
1766
+ var narrow = useNarrowViewport();
1767
+ return (
1768
+ /*#__PURE__*/
1769
+ React.createElement("div", {
1770
+ className: classNames(styles$5.root, styles$5[props.align], narrow ? styles$5.narrow : styles$5.wide)
1771
+ },
1772
+ /*#__PURE__*/
1773
+ React.createElement("div", {
1774
+ className: classNames(styles$5.group),
1775
+ key: props.align
1776
+ },
1777
+ /*#__PURE__*/
1778
+ React.createElement("div", {
1779
+ className: styles$5.inline,
1780
+ ref: props.contentAreaRef
1781
+ })), renderItems(props, narrow), renderPlaceholder(props.placeholder))
1782
+ );
1783
+ }
1784
+ TwoColumn.defaultProps = {
1785
+ align: 'left'
1786
+ };
1787
+
1788
+ function renderItems(props, narrow) {
1789
+ return groupItemsByPosition(props.items, availablePositions(narrow)).map(function (group, index) {
1790
+ return (
1791
+ /*#__PURE__*/
1792
+ React.createElement("div", {
1793
+ key: index,
1794
+ className: classNames(styles$5.group, styles$5["group-".concat(group.position)])
1795
+ }, renderItemGroup(props, group, 'sticky'), renderItemGroup(props, group, 'inline'), renderItemGroup(props, group, 'full'))
1796
+ );
1797
+ });
1798
+ }
1799
+
1800
+ function renderItemGroup(props, group, position) {
1801
+ if (group[position].length) {
1802
+ return (
1803
+ /*#__PURE__*/
1804
+ React.createElement("div", {
1805
+ className: styles$5[position]
1806
+ }, props.children(
1807
+ /*#__PURE__*/
1808
+ React.createElement(ContentElements, {
1809
+ sectionProps: props.sectionProps,
1810
+ items: group[position]
1811
+ }), {
1812
+ position: position,
1813
+ openStart: position === 'inline' && group.openStart,
1814
+ openEnd: position === 'inline' && group.openEnd
1815
+ }))
1816
+ );
1817
+ }
1818
+ }
1819
+
1820
+ function groupItemsByPosition(items, availablePositions) {
1821
+ var groups = [];
1822
+ var currentGroup;
1823
+ items.reduce(function (previousItemPosition, item, index) {
1824
+ var position = availablePositions.indexOf(item.position) >= 0 ? item.position : 'inline';
1825
+
1826
+ if (!previousItemPosition || previousItemPosition !== position && !(previousItemPosition === 'sticky' && position === 'inline')) {
1827
+ currentGroup = {
1828
+ position: position,
1829
+ sticky: [],
1830
+ inline: [],
1831
+ full: []
1832
+ };
1833
+ groups = [].concat(_toConsumableArray(groups), [currentGroup]);
1834
+ }
1835
+
1836
+ currentGroup[position].push(item);
1837
+ return position;
1838
+ }, null);
1839
+ groups.forEach(function (group, index) {
1840
+ var previous = groups[index - 1];
1841
+ var next = groups[index + 1];
1842
+ group.openStart = previous && !previous.full.length;
1843
+ group.openEnd = next && next.inline.length > 0;
1844
+ });
1845
+ return groups;
1846
+ }
1847
+
1848
+ function renderPlaceholder(placeholder) {
1849
+ if (!placeholder) {
1850
+ return null;
1851
+ }
1852
+
1853
+ return (
1854
+ /*#__PURE__*/
1855
+ React.createElement("div", {
1856
+ className: classNames(styles$5.group)
1857
+ },
1858
+ /*#__PURE__*/
1859
+ React.createElement("div", {
1860
+ className: styles$5.inline
1861
+ }, placeholder))
1862
+ );
1863
+ }
1864
+
1865
+ var styles$6 = {"outer":"Center-module_outer__3Rr0H","outer-full":"Center-module_outer-full__3dknO","item":"Center-module_item__1KSs3","item-full":"Center-module_item-full__1cEuv","clear":"Center-module_clear__jJEap","inner-left":"Center-module_inner-left__2z9Ea","inner-right":"Center-module_inner-right__KBkVt"};
1866
+
1867
+ function Center(props) {
1868
+ return (
1869
+ /*#__PURE__*/
1870
+ React.createElement("div", {
1871
+ className: classNames(styles$6.root)
1872
+ },
1873
+ /*#__PURE__*/
1874
+ React.createElement("div", {
1875
+ ref: props.contentAreaRef
1876
+ }),
1877
+ /*#__PURE__*/
1878
+ React.createElement(ContentElements, {
1879
+ sectionProps: props.sectionProps,
1880
+ items: props.items
1881
+ }, function (item, child, index) {
1882
+ return (
1883
+ /*#__PURE__*/
1884
+ React.createElement("div", {
1885
+ key: item.id,
1886
+ className: outerClassName(item)
1887
+ },
1888
+ /*#__PURE__*/
1889
+ React.createElement("div", {
1890
+ className: classNames(styles$6.item, styles$6["item-".concat(item.position)])
1891
+ }, props.children(
1892
+ /*#__PURE__*/
1893
+ React.createElement("div", {
1894
+ className: styles$6["inner-".concat(item.position)]
1895
+ }, child), boxProps(props.items, item, index))))
1896
+ );
1897
+ }), renderPlaceholder$1(props.placeholder))
1898
+ );
1899
+ }
1900
+
1901
+ function outerClassName(item) {
1902
+ var _api$contentElementTy = api.contentElementTypes.getOptions(item.type),
1903
+ supportsWrappingAroundFloats = _api$contentElementTy.supportsWrappingAroundFloats;
1904
+
1905
+ return classNames(styles$6.outer, styles$6["outer-".concat(item.position)], _defineProperty({}, styles$6.clear, !supportsWrappingAroundFloats));
1906
+ }
1907
+
1908
+ function boxProps(items, item, index) {
1909
+ var previous = items[index - 1];
1910
+ var next = items[index + 1];
1911
+ return {
1912
+ position: item.position,
1913
+ openStart: previous && item.position !== 'full' && previous.position !== 'full',
1914
+ openEnd: next && item.position !== 'full' && next.position !== 'full'
1915
+ };
1916
+ }
1917
+
1918
+ function renderPlaceholder$1(placeholder) {
1919
+ if (!placeholder) {
1920
+ return null;
1921
+ }
1922
+
1923
+ return (
1924
+ /*#__PURE__*/
1925
+ React.createElement("div", {
1926
+ className: classNames(styles$6.outer)
1927
+ },
1928
+ /*#__PURE__*/
1929
+ React.createElement("div", {
1930
+ className: classNames(styles$6.item)
1931
+ }, placeholder))
1932
+ );
1933
+ }
1934
+
1935
+ var Layout = React.memo(withInlineEditingAlternative('LayoutWithPlaceholder', LayoutWithoutInlineEditing), function (prevProps, nextProps) {
1936
+ return prevProps.sectionId === nextProps.sectionId && prevProps.items === nextProps.items && prevProps.appearance === nextProps.appearance && prevProps.contentAreaRef === nextProps.contentAreaRef && prevProps.sectionProps === nextProps.sectionProps;
1937
+ });
1938
+ function LayoutWithoutInlineEditing(props) {
1939
+ if (props.sectionProps.layout === 'center') {
1940
+ return (
1941
+ /*#__PURE__*/
1942
+ React.createElement(Center, props)
1943
+ );
1944
+ } else if (props.sectionProps.layout === 'right') {
1945
+ return (
1946
+ /*#__PURE__*/
1947
+ React.createElement(TwoColumn, Object.assign({
1948
+ align: "right"
1949
+ }, props))
1950
+ );
1951
+ } else {
1952
+ return (
1953
+ /*#__PURE__*/
1954
+ React.createElement(TwoColumn, props)
1955
+ );
1956
+ }
1957
+ }
1958
+ Layout.defaultProps = {
1959
+ layout: 'left'
1960
+ };
1961
+
1962
+ function usePostMessageListener(receiveData) {
1963
+ useEffect(function () {
1964
+ if (window.parent !== window) {
1965
+ window.addEventListener('message', receive);
1966
+ }
1967
+
1968
+ return function () {
1969
+ return window.removeEventListener('message', receive);
1970
+ };
1971
+
1972
+ function receive(message) {
1973
+ if (window.location.href.indexOf(message.origin) === 0) {
1974
+ receiveData(message.data);
1975
+ }
1976
+ }
1977
+ }, [receiveData]);
1978
+ }
1979
+
1980
+ var styles$7 = {"text-s":"20px","text-base":"22px","text-l":"40px","text-xl":"66px","text-2xl":"110px","h2":"Text-module_h2__34chJ","h1":"Text-module_h1__2_5kX","body":"Text-module_body__4oWD-","caption":"Text-module_caption__3_6Au"};
1981
+
1982
+ /**
1983
+ * Render some text using the default typography scale.
1984
+ *
1985
+ * @param {Object} props
1986
+ * @param {string} props.scaleCategory - One of the styles `'h1'`, `'h2'`, `'body'`, `'caption'`.
1987
+ * @param {string} [props.inline] - Render a span instread of a div.
1988
+ * @param {string} props.children - Nodes to render with specified typography.
1989
+ */
1990
+
1991
+ function Text(_ref) {
1992
+ var inline = _ref.inline,
1993
+ scaleCategory = _ref.scaleCategory,
1994
+ children = _ref.children;
1995
+ return React.createElement(inline ? 'span' : 'div', {
1996
+ className: styles$7[scaleCategory]
1997
+ }, children);
1998
+ }
1999
+
2000
+ var ContentElementConfigurationUpdateContext = React.createContext(function () {});
2001
+ function useContentElementConfigurationUpdate() {
2002
+ return useContext(ContentElementConfigurationUpdateContext);
2003
+ }
2004
+
2005
+ var ContentElementEditorCommandEmitterContext = createContext$1({
2006
+ on: function on() {},
2007
+ off: function off() {}
2008
+ });
2009
+ function useContentElementEditorCommandSubscription(callback) {
2010
+ var _useContentElementAtt = useContentElementAttributes(),
2011
+ contentElementId = _useContentElementAtt.contentElementId;
2012
+
2013
+ var emitter = useContext(ContentElementEditorCommandEmitterContext);
2014
+ useEffect(function () {
2015
+ emitter.on("command:".concat(contentElementId), callback);
2016
+ return function () {
2017
+ return emitter.off("command:".concat(contentElementId), callback);
2018
+ };
2019
+ }, [emitter, callback, contentElementId]);
2020
+ }
2021
+
2022
+ var ContentElementEditorStateContext = createContext$1({
2023
+ isSelected: false,
2024
+ isEditable: false,
2025
+ setTransientState: function setTransientState() {}
2026
+ });
2027
+ /**
2028
+ * Use inside a content element component to determine whether the
2029
+ * component is being rendered inside the editor iframe, and whether
2030
+ * the content element is currently selected. This can be used to
2031
+ * implement simple inline editing capabilities like displaying extra
2032
+ * information when the content element is selected.
2033
+ *
2034
+ * @example
2035
+ * const {isEditable, isSelected} = useContentElementEditorState();
2036
+ */
2037
+
2038
+ function useContentElementEditorState() {
2039
+ return useContext(ContentElementEditorStateContext);
2040
+ }
2041
+
2042
+ var EditableText = withInlineEditingAlternative('EditableText', function EditableText(_ref) {
2043
+ var value = _ref.value;
2044
+ return (
2045
+ /*#__PURE__*/
2046
+ React.createElement(Text, {
2047
+ scaleCategory: "body"
2048
+ }, render(value))
2049
+ );
2050
+ });
2051
+
2052
+ function render() {
2053
+ var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
2054
+ return children.map(function (element, index) {
2055
+ if (element.type) {
2056
+ return renderElement({
2057
+ attributes: {
2058
+ key: index
2059
+ },
2060
+ element: element,
2061
+ children: render(element.children)
2062
+ });
2063
+ } else {
2064
+ return renderLeaf({
2065
+ attributes: {
2066
+ key: index
2067
+ },
2068
+ leaf: element,
2069
+ children: element.text.trim() === '' ? "\uFEFF" : element.text
2070
+ });
2071
+ }
2072
+ });
2073
+ }
2074
+
2075
+ function renderElement(_ref2) {
2076
+ var attributes = _ref2.attributes,
2077
+ children = _ref2.children,
2078
+ element = _ref2.element;
2079
+
2080
+ switch (element.type) {
2081
+ case 'block-quote':
2082
+ return (
2083
+ /*#__PURE__*/
2084
+ React.createElement("blockquote", attributes, children)
2085
+ );
2086
+
2087
+ case 'bulleted-list':
2088
+ return (
2089
+ /*#__PURE__*/
2090
+ React.createElement("ul", attributes, children)
2091
+ );
2092
+
2093
+ case 'numbered-list':
2094
+ return (
2095
+ /*#__PURE__*/
2096
+ React.createElement("ol", attributes, children)
2097
+ );
2098
+
2099
+ case 'list-item':
2100
+ return (
2101
+ /*#__PURE__*/
2102
+ React.createElement("li", attributes, children)
2103
+ );
2104
+
2105
+ case 'heading':
2106
+ return (
2107
+ /*#__PURE__*/
2108
+ React.createElement("h2", attributes, children)
2109
+ );
2110
+
2111
+ case 'link':
2112
+ return (
2113
+ /*#__PURE__*/
2114
+ React.createElement("a", Object.assign({}, attributes, {
2115
+ href: element.href
2116
+ }), children)
2117
+ );
2118
+
2119
+ default:
2120
+ return (
2121
+ /*#__PURE__*/
2122
+ React.createElement("p", attributes, children)
2123
+ );
2124
+ }
2125
+ }
2126
+ function renderLeaf(_ref3) {
2127
+ var attributes = _ref3.attributes,
2128
+ children = _ref3.children,
2129
+ leaf = _ref3.leaf;
2130
+
2131
+ if (leaf.bold) {
2132
+ children =
2133
+ /*#__PURE__*/
2134
+ React.createElement("strong", null, children);
2135
+ }
2136
+
2137
+ if (leaf.italic) {
2138
+ children =
2139
+ /*#__PURE__*/
2140
+ React.createElement("em", null, children);
2141
+ }
2142
+
2143
+ if (leaf.underline) {
2144
+ children =
2145
+ /*#__PURE__*/
2146
+ React.createElement("u", null, children);
2147
+ }
2148
+
2149
+ if (leaf.strikethrough) {
2150
+ children =
2151
+ /*#__PURE__*/
2152
+ React.createElement("s", null, children);
2153
+ }
2154
+
2155
+ return (
2156
+ /*#__PURE__*/
2157
+ React.createElement("span", attributes, children)
2158
+ );
2159
+ }
2160
+
2161
+ export { renderElement as $, useEntryStateDispatch as A, useSection as B, loadInlineEditingComponents as C, setupI18n as D, EntryStateProvider as E, Foreground as F, api as G, useContentElementConfigurationUpdate as H, useContentElementEditorCommandSubscription as I, useContentElementEditorState as J, useContentElementLifecycle as K, Layout as L, MotifArea as M, EditableText as N, useOnScreen as O, PhonePlatformContext as P, useLocale as Q, ContentElementEditorCommandEmitterContext as R, StaticPreview as S, Text as T, MotifAreaVisibilityProvider as U, ForcePaddingContext as V, updateContentElementConfiguration as W, ContentElementConfigurationUpdateContext as X, ContentElementEditorStateContext as Y, LayoutWithoutInlineEditing as Z, _slicedToArray as _, _defineProperty as a, renderLeaf as a0, _objectWithoutProperties as b, useFileRights as c, useLegalInfo as d, useCredits as e, useShareProviders as f, useShareUrl as g, useTheme as h, useChapters as i, createScrollPositionLifecycleProvider as j, createScrollPositionLifecycleHook as k, useEntryStructure as l, _objectSpread2 as m, useIsStaticPreview as n, useEntryMetadata as o, useNestedFiles as p, useFile as q, useMediaQuery as r, useSectionContentElements as s, usePostMessageListener as t, useI18n as u, withInlineEditingAlternative as v, withInlineEditingDecorator as w, LocaleProvider as x, _toConsumableArray as y, useAvailableQualities as z };