pageflow 15.6.1 → 15.7.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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +236 -11
  3. data/README.md +1 -2
  4. data/admins/pageflow/entry.rb +28 -57
  5. data/admins/pageflow/user.rb +1 -3
  6. data/app/assets/images/pageflow/admin/icons/buttons/editor.svg +2 -0
  7. data/app/assets/images/pageflow/admin/icons/buttons/preview.svg +2 -0
  8. data/app/assets/images/pageflow/admin/icons/buttons/show_public.svg +2 -0
  9. data/app/assets/images/pageflow/admin/icons/delete.svg +9 -0
  10. data/app/assets/images/pageflow/admin/icons/done.svg +6 -0
  11. data/app/assets/images/pageflow/admin/icons/edit.svg +7 -0
  12. data/app/assets/images/pageflow/admin/icons/editor.svg +2 -0
  13. data/app/assets/images/pageflow/admin/icons/folder.svg +8 -0
  14. data/app/assets/images/pageflow/admin/icons/folder_active.svg +8 -0
  15. data/app/assets/images/pageflow/admin/icons/info.svg +3 -0
  16. data/app/assets/images/pageflow/admin/icons/new.svg +5 -0
  17. data/app/assets/images/pageflow/admin/icons/preview.svg +2 -0
  18. data/app/assets/images/pageflow/admin/icons/published.svg +2 -0
  19. data/app/assets/images/pageflow/admin/icons/published_with_password.svg +2 -0
  20. data/app/assets/images/pageflow/admin/icons/show_public.svg +2 -0
  21. data/app/assets/images/pageflow/editor/blank_entry/logo.png +0 -0
  22. data/app/assets/images/pageflow/themes/default/embed_opt_in.svg +3 -0
  23. data/app/assets/images/pageflow/themes/default/embed_opt_out_info.svg +16 -0
  24. data/app/assets/javascripts/pageflow/admin/entries.js +9 -57
  25. data/app/assets/javascripts/pageflow/dist/ui.js +127 -10
  26. data/app/assets/stylesheets/pageflow/admin/active_admin_patches.scss +18 -16
  27. data/app/assets/stylesheets/pageflow/admin/badge_list.scss +25 -35
  28. data/app/assets/stylesheets/pageflow/admin/columns.scss +13 -11
  29. data/app/assets/stylesheets/pageflow/admin/embed_code.scss +1 -4
  30. data/app/assets/stylesheets/pageflow/admin/entries/folders.scss +44 -19
  31. data/app/assets/stylesheets/pageflow/admin/entries.scss +15 -31
  32. data/app/assets/stylesheets/pageflow/admin/features.scss +3 -1
  33. data/app/assets/stylesheets/pageflow/admin/forms.scss +14 -12
  34. data/app/assets/stylesheets/pageflow/admin/hint.scss +8 -14
  35. data/app/assets/stylesheets/pageflow/admin/icon_button.scss +25 -14
  36. data/app/assets/stylesheets/pageflow/admin/icon_link.scss +31 -15
  37. data/app/assets/stylesheets/pageflow/admin/publication_state_indicator.scss +14 -7
  38. data/app/assets/stylesheets/pageflow/admin/status_tags.scss +5 -4
  39. data/app/assets/stylesheets/pageflow/admin/tabs_view.scss +36 -34
  40. data/app/assets/stylesheets/pageflow/admin/tooltip_bubble.scss +15 -11
  41. data/app/assets/stylesheets/pageflow/admin.scss +12 -0
  42. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +15 -61
  43. data/app/assets/stylesheets/pageflow/editor/base.scss +28 -13
  44. data/app/assets/stylesheets/pageflow/editor/blank_entry.scss +6 -6
  45. data/app/assets/stylesheets/pageflow/editor/change_theme.scss +28 -71
  46. data/app/assets/stylesheets/pageflow/editor/composables.scss +2 -2
  47. data/app/assets/stylesheets/pageflow/editor/confirm_encoding.scss +18 -36
  48. data/app/assets/stylesheets/pageflow/editor/confirm_upload.scss +12 -39
  49. data/app/assets/stylesheets/pageflow/editor/dialogs.scss +39 -12
  50. data/app/assets/stylesheets/pageflow/editor/disabled_atmo_indicator.scss +3 -3
  51. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +7 -10
  52. data/app/assets/stylesheets/pageflow/editor/emulation_mode_button.scss +3 -8
  53. data/app/assets/stylesheets/pageflow/editor/failures.scss +3 -3
  54. data/app/assets/stylesheets/pageflow/editor/file_import.scss +22 -38
  55. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +3 -7
  56. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +4 -24
  57. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +10 -11
  58. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -8
  59. data/app/assets/stylesheets/pageflow/editor/files.scss +7 -6
  60. data/app/assets/stylesheets/pageflow/editor/files_explorer.scss +13 -30
  61. data/app/assets/stylesheets/pageflow/editor/files_gallery.scss +15 -11
  62. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +6 -7
  63. data/app/assets/stylesheets/pageflow/editor/help.scss +19 -14
  64. data/app/assets/stylesheets/pageflow/editor/help_image.scss +1 -1
  65. data/app/assets/stylesheets/pageflow/editor/info_box.scss +19 -0
  66. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +7 -11
  67. data/app/assets/stylesheets/pageflow/editor/inputs/file_processing_state_display.scss +0 -2
  68. data/app/assets/stylesheets/pageflow/editor/inputs/reference.scss +7 -11
  69. data/app/assets/stylesheets/pageflow/editor/list.scss +13 -10
  70. data/app/assets/stylesheets/pageflow/editor/loading.scss +1 -1
  71. data/app/assets/stylesheets/pageflow/editor/locked.scss +9 -5
  72. data/app/assets/stylesheets/pageflow/editor/menu.scss +5 -5
  73. data/app/assets/stylesheets/pageflow/editor/notifications.scss +15 -14
  74. data/app/assets/stylesheets/pageflow/editor/other_entry_item.scss +7 -3
  75. data/app/assets/stylesheets/pageflow/editor/outline.scss +57 -19
  76. data/app/assets/stylesheets/pageflow/editor/page_links.scss +10 -8
  77. data/app/assets/stylesheets/pageflow/editor/page_selection.scss +2 -29
  78. data/app/assets/stylesheets/pageflow/editor/publish_entry.scss +5 -6
  79. data/app/assets/stylesheets/pageflow/editor/quotas.scss +2 -3
  80. data/app/assets/stylesheets/pageflow/editor/select_button.scss +12 -6
  81. data/app/assets/stylesheets/pageflow/editor/sidebar_footer.scss +1 -5
  82. data/app/assets/stylesheets/pageflow/editor/storyline_picker.scss +6 -2
  83. data/app/assets/stylesheets/pageflow/editor/text_tracks.scss +6 -22
  84. data/app/assets/stylesheets/pageflow/editor/widgets.scss +2 -2
  85. data/app/assets/stylesheets/pageflow/editor/wysihtml5.scss +35 -29
  86. data/app/assets/stylesheets/pageflow/mixins/background_icons.scss +3 -3
  87. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +50 -68
  88. data/app/assets/stylesheets/pageflow/themes/default/base.scss +2 -0
  89. data/app/assets/stylesheets/pageflow/themes/default/consent/bar.scss +156 -0
  90. data/app/assets/stylesheets/pageflow/themes/default/consent/vendor_list.scss +62 -0
  91. data/app/assets/stylesheets/pageflow/themes/default/consent.scss +2 -0
  92. data/app/assets/stylesheets/pageflow/themes/default/logo/alignment.scss +7 -0
  93. data/app/assets/stylesheets/pageflow/themes/default/page/shadow.scss +44 -0
  94. data/app/assets/stylesheets/pageflow/themes/default/third_party_embed_consent.scss +103 -0
  95. data/app/assets/stylesheets/pageflow/ui/forms.scss +79 -84
  96. data/app/assets/stylesheets/pageflow/ui/functions.scss +56 -0
  97. data/app/assets/stylesheets/pageflow/ui/input/check_box_group_input.scss +2 -3
  98. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +6 -6
  99. data/app/assets/stylesheets/pageflow/ui/input/extended_select_input.scss +63 -50
  100. data/app/assets/stylesheets/pageflow/ui/normalize/forms.scss +153 -0
  101. data/app/assets/stylesheets/pageflow/ui/normalize.scss +278 -0
  102. data/app/assets/stylesheets/pageflow/ui/properties.scss +44 -0
  103. data/app/assets/stylesheets/pageflow/ui/table_cells/delete_row_table_cell.scss +1 -1
  104. data/app/assets/stylesheets/pageflow/ui/table_view.scss +14 -18
  105. data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -11
  106. data/app/assets/stylesheets/pageflow/ui/tooltip.scss +6 -8
  107. data/app/assets/stylesheets/pageflow/ui/validation_error_messages.scss +6 -0
  108. data/app/assets/stylesheets/pageflow/ui.scss +4 -0
  109. data/app/controllers/pageflow/edit_locks_controller.rb +3 -1
  110. data/app/helpers/pageflow/admin/entries_helper.rb +2 -12
  111. data/app/helpers/pageflow/embed_code_helper.rb +1 -1
  112. data/app/helpers/pageflow/entries_helper.rb +41 -2
  113. data/app/helpers/pageflow/file_background_images_helper.rb +1 -1
  114. data/app/helpers/pageflow/page_types_helper.rb +1 -1
  115. data/app/helpers/pageflow/themes_helper.rb +1 -1
  116. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -1
  117. data/app/jobs/pageflow/poll_zencoder_job.rb +1 -9
  118. data/app/models/pageflow/audio_file.rb +17 -0
  119. data/app/models/pageflow/audio_file_url_templates.rb +4 -1
  120. data/app/models/pageflow/customized_theme.rb +37 -0
  121. data/app/models/pageflow/draft_entry.rb +6 -59
  122. data/app/models/pageflow/entry_at_revision.rb +68 -0
  123. data/app/models/pageflow/entry_role_query.rb +44 -24
  124. data/app/models/pageflow/image_file_css_background_image_urls.rb +8 -2
  125. data/app/models/pageflow/published_entry.rb +9 -56
  126. data/app/models/pageflow/theme_customization.rb +46 -0
  127. data/app/models/pageflow/theme_customization_file.rb +58 -0
  128. data/app/models/pageflow/video_file.rb +11 -1
  129. data/app/models/pageflow/video_file_url_templates.rb +1 -0
  130. data/app/policies/pageflow/entry_policy.rb +4 -0
  131. data/app/state_machines/pageflow/media_encoding_state_machine.rb +23 -4
  132. data/app/views/admin/entries/_form.html.erb +50 -0
  133. data/app/views/admin/entries/entry_type_name_input.html.erb +5 -0
  134. data/app/views/admin/features/_form.html.erb +1 -1
  135. data/app/views/admin/memberships/_form.html.erb +2 -3
  136. data/app/views/admin/users/_form.html.erb +1 -1
  137. data/app/views/admin/users/invitation.html.erb +2 -2
  138. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +10 -9
  139. data/app/views/components/pageflow/admin/members_tab.rb +5 -1
  140. data/app/views/components/pageflow/admin/revisions_tab.rb +13 -3
  141. data/app/views/components/pageflow/admin/timestamp.rb +20 -0
  142. data/app/views/components/pageflow/admin/user_account_badge_list.rb +5 -6
  143. data/app/views/pageflow/admin/entries/_cannot_add_user.html.erb +9 -5
  144. data/app/views/pageflow/admin/entries/_entry_type_name_input.html.erb +7 -0
  145. data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +13 -0
  146. data/app/views/pageflow/editor/encoding_confirmations/_intro.html.erb +0 -0
  147. data/app/views/pageflow/editor/encoding_confirmations/check.json.jbuilder +14 -2
  148. data/config/initializers/paperclip.rb +16 -1
  149. data/config/locales/de.yml +24 -28
  150. data/config/locales/en.yml +19 -10
  151. data/db/migrate/20210528073122_create_pageflow_theme_customizations.rb +11 -0
  152. data/db/migrate/20210531090654_create_pageflow_theme_customization_files.rb +15 -0
  153. data/db/migrate/20210531102228_add_selected_file_ids_to_theme_customizations.rb +5 -0
  154. data/db/migrate/20211020085902_add_canonical_entry_url_prefix_to_themings.rb +5 -0
  155. data/db/migrate/20220503150010_add_peak_data_to_audio_files.rb +5 -0
  156. data/db/migrate/20220705084830_add_trailing_slash_in_canonical_urls_to_themings.rb +5 -0
  157. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +256 -124
  158. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +566 -167
  159. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +5 -5
  160. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +4 -4
  161. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +38 -0
  162. data/entry_types/paged/app/views/pageflow_paged/third_party_embed_consent/_opt_in.html.erb +12 -0
  163. data/entry_types/paged/app/views/pageflow_paged/third_party_embed_consent/_opt_out_info.html.erb +10 -0
  164. data/entry_types/paged/config/initializers/features.rb +2 -0
  165. data/entry_types/paged/config/locales/new/video_contain.de.yml +7 -0
  166. data/entry_types/paged/config/locales/new/video_contain.en.yml +7 -0
  167. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +3 -0
  168. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +1 -0
  169. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +58 -0
  170. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +37 -3
  171. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +92 -6
  172. data/entry_types/scrolled/app/helpers/pageflow_scrolled/webpack_public_path_helper.rb +20 -0
  173. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +7 -0
  174. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +5 -2
  175. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +5 -1
  176. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +5 -4
  177. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +16 -0
  178. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +13 -2
  179. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_widget.json.jbuilder +2 -0
  180. data/entry_types/scrolled/config/locales/de.yml +1 -8
  181. data/entry_types/scrolled/config/locales/en.yml +1 -9
  182. data/entry_types/scrolled/config/locales/new/before_after_slider.de.yml +8 -0
  183. data/entry_types/scrolled/config/locales/new/before_after_slider.en.yml +8 -0
  184. data/entry_types/scrolled/config/locales/new/center_ragged.de.yml +8 -0
  185. data/entry_types/scrolled/config/locales/new/center_ragged.en.yml +9 -0
  186. data/entry_types/scrolled/config/locales/new/consent.de.yml +25 -0
  187. data/entry_types/scrolled/config/locales/new/consent.en.yml +24 -0
  188. data/entry_types/scrolled/config/locales/new/content_element_categories.de.yml +39 -0
  189. data/entry_types/scrolled/config/locales/new/content_element_categories.en.yml +39 -0
  190. data/entry_types/scrolled/config/locales/new/default_transition.de.yml +14 -0
  191. data/entry_types/scrolled/config/locales/new/default_transition.en.yml +14 -0
  192. data/entry_types/scrolled/config/locales/new/header_line_breaks.de.yml +28 -0
  193. data/entry_types/scrolled/config/locales/new/header_line_breaks.en.yml +27 -0
  194. data/entry_types/scrolled/config/locales/new/header_size.de.yml +17 -0
  195. data/entry_types/scrolled/config/locales/new/header_size.en.yml +17 -0
  196. data/entry_types/scrolled/config/locales/new/iframe_embed.de.yml +39 -0
  197. data/entry_types/scrolled/config/locales/new/iframe_embed.en.yml +39 -0
  198. data/entry_types/scrolled/config/locales/new/inline_loops.de.yml +26 -0
  199. data/entry_types/scrolled/config/locales/new/inline_loops.en.yml +26 -0
  200. data/entry_types/scrolled/config/locales/new/portrait_inline_image.de.yml +9 -0
  201. data/entry_types/scrolled/config/locales/new/portrait_inline_image.en.yml +9 -0
  202. data/entry_types/scrolled/config/locales/new/section_width.de.yml +10 -0
  203. data/entry_types/scrolled/config/locales/new/section_width.en.yml +10 -0
  204. data/entry_types/scrolled/config/locales/new/typography_variants.de.yml +7 -0
  205. data/entry_types/scrolled/config/locales/new/typography_variants.en.yml +7 -0
  206. data/entry_types/scrolled/config/locales/new/video_embed_poster.de.yml +8 -0
  207. data/entry_types/scrolled/config/locales/new/video_embed_poster.en.yml +8 -0
  208. data/entry_types/scrolled/config/locales/new/waveform_styles.de.yml +11 -0
  209. data/entry_types/scrolled/config/locales/new/waveform_styles.en.yml +12 -0
  210. data/entry_types/scrolled/config/locales/new/widgets.de.yml +6 -0
  211. data/entry_types/scrolled/config/locales/new/widgets.en.yml +6 -0
  212. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +29 -5
  213. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +8 -6
  214. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +37 -0
  215. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +57 -0
  216. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +49 -0
  217. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +8 -0
  218. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +42 -0
  219. data/entry_types/scrolled/lib/pageflow_scrolled.rb +17 -1
  220. data/entry_types/scrolled/package/contentElements-editor.js +323 -89
  221. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  222. data/entry_types/scrolled/package/contentElements-frontend.js +719 -529
  223. data/entry_types/scrolled/package/editor.js +459 -261
  224. data/entry_types/scrolled/package/frontend/{EditableText-7093fd0e.js → EditableInlineText.module-b9923660.js} +284 -362
  225. data/entry_types/scrolled/package/frontend/{i18n-4dc6c377.js → PhonePlatformContext-9fb97827.js} +199 -106
  226. data/entry_types/scrolled/package/frontend/{Viewer-e49e7807.js → Viewer-e2290ea0.js} +196 -79
  227. data/entry_types/scrolled/package/frontend/{Wavesurfer-0adf5667.js → Wavesurfer-7d9cf1b7.js} +16 -58
  228. data/entry_types/scrolled/package/frontend/{components-6a6793ca.js → components-6ab26015.js} +664 -671
  229. data/entry_types/scrolled/package/frontend/{getPrototypeOf-63c7c8e8.js → createSuper-d0f30da3.js} +34 -5
  230. data/entry_types/scrolled/package/frontend/index.css +1 -9
  231. data/entry_types/scrolled/package/frontend/index.js +1919 -2386
  232. data/entry_types/scrolled/package/frontend/{useBrowserFeature-91a4c29d.js → usePhonePlatform-2857c22b.js} +9 -8
  233. data/entry_types/scrolled/package/frontend-server.js +3 -6
  234. data/entry_types/scrolled/package/package.json +16 -8
  235. data/entry_types/scrolled/package/testHelpers.js +456 -0
  236. data/entry_types/scrolled/package/values/breakpoints.module.css +9 -0
  237. data/entry_types/scrolled/package/values/colors.module.css +5 -0
  238. data/entry_types/scrolled/package/widgets/defaultNavigation.css +9 -0
  239. data/entry_types/scrolled/package/widgets/defaultNavigation.js +612 -0
  240. data/entry_types/scrolled/spec/fixtures/image.svg +1 -0
  241. data/lib/pageflow/ability_mixin.rb +4 -0
  242. data/lib/pageflow/built_in_widget_type.rb +4 -0
  243. data/lib/pageflow/built_in_widget_types_plugin.rb +7 -0
  244. data/lib/pageflow/configuration.rb +34 -1
  245. data/lib/pageflow/entry_type.rb +11 -2
  246. data/lib/pageflow/entry_type_configuration.rb +2 -0
  247. data/lib/pageflow/file_type.rb +24 -0
  248. data/lib/pageflow/paperclip_processors/audio_waveform.rb +42 -0
  249. data/lib/pageflow/paperclip_processors/noop.rb +10 -0
  250. data/lib/pageflow/theme_customizations.rb +61 -0
  251. data/lib/pageflow/version.rb +1 -1
  252. data/lib/pageflow.rb +9 -0
  253. data/package/config/jest/index.js +2 -1
  254. data/package/config/postcss/scaleFunctions.js +71 -0
  255. data/package/editor.js +95 -85
  256. data/package/frontend.js +521 -161
  257. data/package/package.json +5 -3
  258. data/package/testHelpers.js +26 -5
  259. data/package/ui.js +124 -11
  260. data/spec/factories/draft_entries.rb +19 -1
  261. data/spec/factories/entries.rb +4 -0
  262. data/spec/factories/published_entries.rb +6 -0
  263. data/spec/fixtures/audio.ogg +0 -0
  264. metadata +118 -14
  265. data/app/views/admin/entries/_not_allowed_to_see_entry_types.json.jbuilder +0 -2
  266. data/app/views/admin/entries/entry_types.json.jbuilder +0 -4
  267. data/package/config/jest/transformers/upwardBabel.js +0 -5
@@ -0,0 +1,38 @@
1
+ module PageflowPaged
2
+ # Render opt-in placeholders for embeds and opt-out hints.
3
+ module ThirdPartyEmbedConsentHelper
4
+ include Pageflow::EntriesHelper
5
+
6
+ def third_party_embed_opt_in(entry:, vendor_name:, message:)
7
+ link_html = third_party_embed_privacy_link(
8
+ entry: entry,
9
+ text: t('pageflow.public.third_party_embed_consent.opt_in.more_information'),
10
+ vendor_name: vendor_name
11
+ )
12
+
13
+ render('pageflow_paged/third_party_embed_consent/opt_in',
14
+ message: message,
15
+ vendor_name: vendor_name,
16
+ link_html: link_html)
17
+ end
18
+
19
+ def third_party_embed_opt_out_info(entry)
20
+ link_html = third_party_embed_privacy_link(
21
+ entry: entry,
22
+ text: t('pageflow.public.third_party_embed_consent.opt_out_info.prompt_link')
23
+ )
24
+
25
+ render('pageflow_paged/third_party_embed_consent/opt_out_info', link_html: link_html)
26
+ end
27
+
28
+ def third_party_embed_privacy_link(entry:, text:, vendor_name: nil)
29
+ params = vendor_name ? "&vendors=#{vendor_name}" : ''
30
+
31
+ link_to(
32
+ text,
33
+ "#{entry_privacy_link_url(entry)}#{params}#consent",
34
+ target: '_blank', rel: 'noopener noreferrer'
35
+ )
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ <div class="third_party_embed_opt_in">
2
+ <div class="third_party_embed_opt_in-message">
3
+ <%= message %>
4
+ <%= link_html %>
5
+ </div>
6
+ <div>
7
+ <button class="third_party_embed_opt_in-button"
8
+ data-consent-vendor="<%= vendor_name %>">
9
+ <%= t('pageflow.public.third_party_embed_consent.opt_in.confirm') %>
10
+ </button>
11
+ </div>
12
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="third_party_embed_opt_out_info">
2
+ <a href="#" class="third_party_embed_opt_out_info-icon">
3
+ </a>
4
+ <div class="third_party_embed_opt_out_info-tooltip">
5
+ <p>
6
+ <%= t('pageflow.public.third_party_embed_consent.opt_out_info.prompt_html',
7
+ link: link_html) %>
8
+ </p>
9
+ </div>
10
+ </div>
@@ -1,5 +1,7 @@
1
1
  Pageflow.configure do |config|
2
2
  config.for_entry_type(PageflowPaged.entry_type) do |entry_type_config|
3
+ entry_type_config.features.register('highdef_background_images')
4
+
3
5
  entry_type_config.features.register('auto_change_page')
4
6
  entry_type_config.features.register('delayed_text_fade_in')
5
7
 
@@ -0,0 +1,7 @@
1
+ de:
2
+ pageflow:
3
+ video:
4
+ page_attributes:
5
+ smart_contain:
6
+ label: "Letterboxing/Pillarboxing vermeiden"
7
+ inline_help: "Video skalieren, um die Darstellung von schwarzen Balken oben und unten (Letterboxing) bzw. rechts und links (Pillarboxing) zu vermeiden, wenn das Seitenverhältnis des Videos nur leicht vom Seitenverhältnis des Browser-Viewports abweicht."
@@ -0,0 +1,7 @@
1
+ en:
2
+ pageflow:
3
+ video:
4
+ page_attributes:
5
+ smart_contain:
6
+ label: "Avoid letterboxing/pillarboxing"
7
+ inline_help: "Scale video to prevent displaying black bars above and below it (letterboxing) or on the left and right (pillarboxing) when the aspect ratio of the video only deviates slightly from the aspect ratio of the browser viewport."
@@ -7,6 +7,8 @@ module PageflowScrolled
7
7
  include Pageflow::WidgetsHelper
8
8
  include Pageflow::StructuredDataHelper
9
9
  include FaviconHelper
10
+ include PacksHelper
11
+ include WebpackPublicPathHelper
10
12
 
11
13
  def scrolled_editor_iframe_seed_html_script_tag(entry)
12
14
  html = render(template: 'pageflow_scrolled/entries/show',
@@ -17,6 +19,7 @@ module PageflowScrolled
17
19
  :@skip_structured_data => true,
18
20
  :@seed_options => {
19
21
  skip_collections: true,
22
+ include_unused_additional_seed_data: true,
20
23
  translations: {include_inline_editing: true}
21
24
  }
22
25
  })
@@ -32,6 +32,7 @@ module PageflowScrolled
32
32
  entry_config: Pageflow.config_for(scrolled_entry),
33
33
  sections: main_storyline.sections,
34
34
  content_elements: main_storyline.content_elements,
35
+ widgets: scrolled_entry.resolve_widgets(insert_point: :react),
35
36
  options: options)
36
37
  end
37
38
  end
@@ -0,0 +1,58 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ module PacksHelper
4
+ def scrolled_frontend_javascript_packs_tag(entry, options)
5
+ javascript_packs_with_chunks_tag(
6
+ *scrolled_frontend_packs(entry, options)
7
+ )
8
+ end
9
+
10
+ def scrolled_frontend_stylesheet_packs_tag(entry, options)
11
+ stylesheet_packs_with_chunks_tag(
12
+ *scrolled_frontend_packs(entry, options),
13
+ media: 'all'
14
+ )
15
+ end
16
+
17
+ def scrolled_editor_javascript_packs_tag(entry)
18
+ javascript_packs_with_chunks_tag(
19
+ *scrolled_editor_packs(entry)
20
+ )
21
+ end
22
+
23
+ def scrolled_frontend_packs(entry, widget_scope:)
24
+ widget_types = scrolled_frontend_pack_widget_types(entry, widget_scope)
25
+
26
+ ['pageflow-scrolled-frontend'] +
27
+ scrolled_frontend_content_element_packs(entry, widget_scope) +
28
+ widget_types.map(&:pack)
29
+ end
30
+
31
+ def scrolled_editor_packs(entry)
32
+ ['pageflow-scrolled-editor'] +
33
+ Pageflow.config_for(entry).additional_editor_packs.paths
34
+ end
35
+
36
+ private
37
+
38
+ def scrolled_frontend_content_element_packs(entry, widget_scope)
39
+ additional_packs = Pageflow.config_for(entry).additional_frontend_packs
40
+ return additional_packs.paths if widget_scope == :editor
41
+
42
+ additional_packs.paths_for_content_element_types(
43
+ ContentElement.select_used_type_names(
44
+ entry.revision,
45
+ additional_packs.content_element_type_names
46
+ )
47
+ )
48
+ end
49
+
50
+ def scrolled_frontend_pack_widget_types(entry, widget_scope)
51
+ if widget_scope == :editor
52
+ ReactWidgetType.all_for(entry)
53
+ else
54
+ entry.resolve_widgets(insert_point: :react).map(&:widget_type)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -26,15 +26,49 @@ module PageflowScrolled
26
26
  # Scrolled from host application configuration.
27
27
  class ReactRenderer < ::React::ServerRendering::BundleRenderer
28
28
  def asset_container_class
29
- ::React::ServerRendering::WebpackerManifestContainer
29
+ WebpackerSplitChunksManifestContainer
30
+ end
31
+ end
32
+
33
+ # see https://github.com/reactjs/react-rails/issues/970#issuecomment-476338244
34
+ class WebpackerSplitChunksManifestContainer < React::ServerRendering::WebpackerManifestContainer
35
+ def find_asset(logical_path)
36
+ asset_paths = manifest.lookup_pack_with_chunks(logical_path, type: :javascript)
37
+
38
+ asset_contents =
39
+ begin
40
+ if Webpacker.dev_server.running?
41
+ ds = Webpacker.dev_server
42
+ asset_paths.map do |asset_path|
43
+ # Remove the protocol and host from the asset
44
+ # path. Sometimes webpacker includes this, sometimes
45
+ # it does not
46
+ asset_path.slice!("#{ds.protocol}://#{ds.host_with_port}")
47
+ dev_server_asset =
48
+ URI.open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read
49
+ dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
50
+ dev_server_asset
51
+ end
52
+ else
53
+ asset_paths.map do |asset_path|
54
+ full_path = ::Rails.root.join('public', asset_path[1..-1])
55
+ File.read(full_path)
56
+ end
57
+ end
58
+ end
59
+
60
+ asset_contents.join("\n")
30
61
  end
31
62
  end
32
63
 
33
64
  def self.new_renderer
34
65
  ReactRenderer
35
- .new(files: ['pageflow-scrolled-server.js'],
66
+ .new(files: ['pageflow-scrolled-server'],
36
67
  # Define required external globals.
37
- code: 'function videojs() {};')
68
+ code: <<-JS)
69
+ #{WebpackPublicPathHelper.js_snippet}
70
+ function videojs() {};
71
+ JS
38
72
  end
39
73
  end
40
74
  end
@@ -1,13 +1,21 @@
1
1
  module PageflowScrolled
2
2
  # @api private
3
3
  module ThemesHelper
4
- def scrolled_theme_asset_path(theme, path)
5
- asset_pack_path("media/pageflow-scrolled/themes/#{theme.name}/#{path}")
4
+ def scrolled_theme_asset_path(theme, path, theme_file_role: nil, relative_url: false)
5
+ path =
6
+ theme.files.dig(theme_file_role, :resized) ||
7
+ asset_pack_path("media/pageflow-scrolled/themes/#{theme.name}/#{path}")
8
+
9
+ if relative_url
10
+ URI.parse(path).path
11
+ else
12
+ path
13
+ end
6
14
  end
7
15
 
8
16
  def scrolled_theme_stylesheet_pack_tags(theme)
9
17
  safe_join(theme.options.fetch(:stylesheet_packs, []).map do |pack|
10
- stylesheet_pack_tag(pack, media: 'all')
18
+ stylesheet_pack_tag(pack, media: 'all', data: {theme: ''})
11
19
  end)
12
20
  end
13
21
 
@@ -17,17 +25,95 @@ module PageflowScrolled
17
25
  scrolled_theme_deep_declarations(theme.options.fetch(:colors, {}), 'color')
18
26
  ].flatten
19
27
 
20
- content_tag('style', raw(":root {\n#{declarations.join("\n")}\n}\n"))
28
+ content_tag('style', raw(<<~CSS), data: {theme: ''})
29
+ :root {
30
+ #{declarations.join("\n")}
31
+ }
32
+
33
+ #{scrolled_theme_typography_rules(theme)}
34
+ #{scrolled_theme_properties_rules(theme)}
35
+ CSS
36
+ end
37
+
38
+ def scrolled_theme_typography_rules(theme)
39
+ RuleSet.new(prefix: 'typography').generate(theme.options.fetch(:typography, {}))
40
+ end
41
+
42
+ def scrolled_theme_properties_rules(theme)
43
+ RuleSet.new(prefix: 'scope',
44
+ custom_properties: true).generate(theme.options.fetch(:properties, {}))
21
45
  end
22
46
 
23
47
  private
24
48
 
25
- def scrolled_theme_deep_declarations(hash, suffix, prefix = [])
49
+ BREAKPOINTS = {
50
+ sm: '640px',
51
+ md: '768px',
52
+ lg: '1024px',
53
+ xl: '1280px'
54
+ }.freeze
55
+
56
+ # @api private
57
+ class RuleSet
58
+ def initialize(prefix:, custom_properties: false)
59
+ @prefix = prefix
60
+ @property_prefix = custom_properties ? '--theme-' : ''
61
+ end
62
+
63
+ def generate(rules)
64
+ rules.flat_map { |rule_name, declarations|
65
+ declarations = declarations.dup
66
+ declarations_by_breakpoint = extract_breakpoint_declarations!(declarations)
67
+
68
+ [
69
+ generate_rule(rule_name, declarations),
70
+ *declarations_by_breakpoint.map do |breakpoint_name, breakpoint_declarations|
71
+ generate_media_query_rule(breakpoint_name, rule_name, breakpoint_declarations)
72
+ end
73
+ ]
74
+ }.join("\n")
75
+ end
76
+
77
+ private
78
+
79
+ def extract_breakpoint_declarations!(declarations)
80
+ BREAKPOINTS.keys.each_with_object({}) { |breakpoint_name, result|
81
+ result[breakpoint_name] = declarations.delete(breakpoint_name)
82
+ }.compact
83
+ end
84
+
85
+ def generate_media_query_rule(breakpoint_name, rule_name, declarations)
86
+ <<~CSS
87
+ @media (min-width: #{BREAKPOINTS[breakpoint_name]}) {
88
+ #{generate_rule(rule_name, declarations)}
89
+ }
90
+ CSS
91
+ end
92
+
93
+ def generate_rule(rule_name, declarations)
94
+ declarations = declarations.map do |property, value|
95
+ "#{@property_prefix}#{property.to_s.dasherize}: #{value};"
96
+ end
97
+
98
+ <<~CSS
99
+ #{selector(rule_name)} {
100
+ #{declarations.join("\n")}
101
+ }
102
+ CSS
103
+ end
104
+
105
+ def selector(rule_name)
106
+ return ':root' if rule_name == :root
107
+ ".#{@prefix}-#{rule_name.to_s.camelize(:lower)}"
108
+ end
109
+ end
110
+
111
+ def scrolled_theme_deep_declarations(hash, suffix = nil, prefix = [])
26
112
  hash.flat_map do |key, value|
27
113
  if value.is_a?(Hash)
28
114
  scrolled_theme_deep_declarations(value, suffix, [*prefix, key])
29
115
  else
30
- name = [*prefix, key, suffix].join('_')
116
+ name = [*prefix, key, suffix].compact.join('_')
31
117
  "--theme-#{name.dasherize}: #{value};"
32
118
  end
33
119
  end
@@ -0,0 +1,20 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ module WebpackPublicPathHelper
4
+ def scrolled_webpack_public_path_script_tag
5
+ content_tag(:script, WebpackPublicPathHelper.js_snippet(request).html_safe)
6
+ end
7
+
8
+ def self.js_snippet(request = nil)
9
+ config_host = Rails.configuration.action_controller.asset_host
10
+ packs_dir = Webpacker.config.public_output_path.basename
11
+ asset_host = if config_host.respond_to?(:call)
12
+ config_host.call(packs_dir, request)
13
+ else
14
+ config_host
15
+ end
16
+
17
+ "var __webpack_public_path__ = '#{asset_host}/#{packs_dir}/';"
18
+ end
19
+ end
20
+ end
@@ -12,6 +12,13 @@ module PageflowScrolled
12
12
  .where(pageflow_scrolled_storylines: {revision_id: revision})
13
13
  end
14
14
 
15
+ def self.select_used_type_names(revision, type_names)
16
+ all_for_revision(revision)
17
+ .where(type_name: type_names)
18
+ .map(&:type_name)
19
+ .uniq
20
+ end
21
+
15
22
  # @api private
16
23
  class Batch
17
24
  def initialize(section, items)
@@ -1,6 +1,9 @@
1
1
  <%= stylesheet_link_tag 'pageflow_paged/editor', media: 'all' %>
2
- <%= stylesheet_pack_tag 'pageflow-scrolled-theme' %>
2
+ <%= stylesheet_packs_with_chunks_tag 'pageflow-scrolled-frontend' %>
3
+
4
+ <%= scrolled_theme_properties_style_tag(entry.theme) %>
5
+ <%= scrolled_theme_stylesheet_pack_tags(entry.theme) %>
3
6
 
4
7
  <%= javascript_include_tag 'pageflow/vendor' %>
5
8
  <%= javascript_include_tag 'pageflow/editor/vendor' %>
6
- <%= javascript_pack_tag 'pageflow-scrolled-editor' %>
9
+ <%= scrolled_editor_javascript_packs_tag(entry) %>
@@ -1 +1,5 @@
1
- scrolled_entry_json_seed(json, entry, skip_files: true, skip_i18n: true)
1
+ scrolled_entry_json_seed(json,
2
+ entry,
3
+ skip_files: true,
4
+ skip_i18n: true,
5
+ include_unused_additional_seed_data: true)
@@ -6,8 +6,6 @@
6
6
  <meta charset="utf-8" />
7
7
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
8
8
 
9
- <%= scrolled_theme_stylesheet_pack_tags(@entry.theme) %>
10
- <%= scrolled_theme_properties_style_tag(@entry.theme) %>
11
9
 
12
10
  <%= social_share_meta_tags_for(@entry) %>
13
11
  <%= meta_tags_for_entry(@entry) %>
@@ -15,8 +13,10 @@
15
13
  <%= scrolled_favicons_for_entry(@entry.theme) %>
16
14
 
17
15
  <%= javascript_include_tag 'pageflow_scrolled/legacy' %>
16
+ <%= scrolled_frontend_stylesheet_packs_tag(@entry, widget_scope: @widget_scope) %>
18
17
 
19
- <%= stylesheet_pack_tag 'pageflow-scrolled-theme', media: 'all' %>
18
+ <%= scrolled_theme_properties_style_tag(@entry.theme) %>
19
+ <%= scrolled_theme_stylesheet_pack_tags(@entry.theme) %>
20
20
 
21
21
  <%= render_widget_head_fragments(@entry, scope: @widget_scope) %>
22
22
 
@@ -44,7 +44,8 @@
44
44
  <%= render_widgets(@entry, scope: @widget_scope, insert_point: :bottom_of_entry) %>
45
45
  </div>
46
46
 
47
- <%= javascript_pack_tag 'pageflow-scrolled-frontend' %>
47
+ <%= scrolled_webpack_public_path_script_tag %>
48
+ <%= scrolled_frontend_javascript_packs_tag(@entry, widget_scope: @widget_scope) %>
48
49
 
49
50
  <%= scrolled_entry_json_seed_script_tag(@entry, @seed_options || {}) %>
50
51
  </body>
@@ -29,7 +29,16 @@ json.config do
29
29
  end
30
30
  end
31
31
 
32
+ json.enabled_feature_names entry.enabled_feature_names
32
33
  json.partial! 'pageflow_scrolled/entry_json_seed/theme', theme: entry.theme
34
+
35
+ json.additional_seed_data(
36
+ entry_config
37
+ .additional_frontend_seed_data
38
+ .for(entry,
39
+ self,
40
+ include_unused: options[:include_unused_additional_seed_data])
41
+ )
33
42
  end
34
43
 
35
44
  unless options[:skip_i18n]
@@ -70,6 +79,13 @@ unless options[:skip_collections]
70
79
  end
71
80
  end
72
81
 
82
+ json.widgets do
83
+ json.array!(widgets) do |widget|
84
+ json.partial! 'pageflow_scrolled/entry_json_seed/widget',
85
+ widget: widget
86
+ end
87
+ end
88
+
73
89
  files_json_seed(json, entry) unless options[:skip_files]
74
90
  end
75
91
  end
@@ -1,8 +1,19 @@
1
1
  json.theme do
2
2
  json.assets do
3
- json.logo_desktop scrolled_theme_asset_path(theme, 'logoDesktop.svg')
4
- json.logo_mobile scrolled_theme_asset_path(theme, 'logoMobile.svg')
3
+ json.logo_desktop scrolled_theme_asset_path(theme, 'logoDesktop.svg',
4
+ theme_file_role: :logo_desktop)
5
+ json.logo_mobile scrolled_theme_asset_path(theme, 'logoMobile.svg',
6
+ theme_file_role: :logo_mobile)
5
7
  json.unmute scrolled_theme_asset_path(theme, 'unmute.mp3')
8
+
9
+ json.icons({})
10
+ json.icons do
11
+ theme.options.fetch(:custom_icons, []).each do |icon_name|
12
+ json.set!(icon_name,
13
+ scrolled_theme_asset_path(theme, "icons/#{icon_name}.svg",
14
+ relative_url: true))
15
+ end
16
+ end
6
17
  end
7
18
  json.options(theme.options.deep_transform_keys { |key| key.to_s.camelize(:lower) })
8
19
  end
@@ -0,0 +1,2 @@
1
+ json.perma_id widget.role
2
+ json.call(widget, :role, :type_name, :configuration)
@@ -95,7 +95,6 @@ de:
95
95
  label: Player Controls
96
96
  values:
97
97
  classic: Klassisch
98
- waveform: Waveform
99
98
  posterId:
100
99
  label: Poster
101
100
  waveformColor:
@@ -121,15 +120,9 @@ de:
121
120
  initial_slider_position:
122
121
  inline_help: Falls die Trennlinie zu Beginn nicht in der Mitte des Bildes liegen soll, lässt sich ihre Startposition hier voreinstellen.
123
122
  label: Trennlinien-Startposition
124
- slider:
125
- inline_help: Zeigt/versteckt den sichtbaren Schieberegler.
126
- label: Schieberegler sichtbar
127
123
  slider_color:
128
124
  inline_help: Farbe des Schiebereglers inklusive Griff kann frei konfiguriert werden. Achte auf gute Sichtbarkeit des Reglers über den gesamten Vorher/Nachher-Bereich.
129
125
  label: Schieberegler-Farbe
130
- slider_handle:
131
- inline_help: Aktiviert/deaktiviert den Griff des Schiebereglers.
132
- label: Schieberegler-Griff sichtbar
133
126
  name: Vorher/Nachher
134
127
  tabs:
135
128
  general: Vorher/Nachher
@@ -192,6 +185,7 @@ de:
192
185
  label: Initialer Gierungswinkel
193
186
  initialYaw:
194
187
  label: Initialer Neigungswinkel
188
+ name: 360°-Bild
195
189
  edit_chapter:
196
190
  attributes:
197
191
  summary:
@@ -652,7 +646,6 @@ de:
652
646
  confirm: Einverstanden
653
647
  opt_in_prompt:
654
648
  datawrapper: Ich bin damit einverstanden, dass mir Diagramme von Datawrapper angezeigt werden.
655
- video: Ich bin damit einverstanden, dass mir Videos von externen Anbietern gezeigt werden.
656
649
  opt_out:
657
650
  prompt: Um externe Dienste auszuschalten, %{link} klicken.
658
651
  prompt_link: hier
@@ -95,7 +95,6 @@ en:
95
95
  label: Player Controls
96
96
  values:
97
97
  classic: Classic
98
- waveform: Waveform
99
98
  posterId:
100
99
  label: Poster
101
100
  waveformColor:
@@ -121,15 +120,9 @@ en:
121
120
  initial_slider_position:
122
121
  inline_help: In case the divider shouldn't be in the middle at the start, its start position can be set here.
123
122
  label: Divider start position
124
- slider:
125
- inline_help: Shows/hides visible slider at divider line.
126
- label: Show Slider
127
123
  slider_color:
128
124
  inline_help: You can configure slider color (incl. slider handle) freely. Make sure that the slider can be seen clearly on every position over the entire Before/After area.
129
125
  label: Slider Color
130
- slider_handle:
131
- inline_help: Activates/deactivates slider handle.
132
- label: Show Slider Handle
133
126
  name: Before/After
134
127
  tabs:
135
128
  general: Before/After
@@ -192,6 +185,7 @@ en:
192
185
  label: Initial Pitch
193
186
  initialYaw:
194
187
  label: Initial Yaw
188
+ name: 360° Image
195
189
  edit_chapter:
196
190
  attributes:
197
191
  summary:
@@ -260,7 +254,6 @@ en:
260
254
  inline_help: This setting controls the position of the scrolling foreground layer of the section on desktop devices. On mobile devices the foreground layer will automatically become centered.
261
255
  label: Content alignment
262
256
  values:
263
- center: Center
264
257
  left: Left
265
258
  right: Right
266
259
  staticShadowOpacity:
@@ -471,7 +464,6 @@ en:
471
464
  confirm: Okay
472
465
  opt_in_prompt:
473
466
  datawrapper: I agree with being shown Datawrapper graphs.
474
- video: I agree with being shown videos from external providers.
475
467
  opt_out:
476
468
  prompt: To opt out of displaying external embeds, change your settings %{link}.
477
469
  prompt_link: here
@@ -0,0 +1,8 @@
1
+ de:
2
+ pageflow_scrolled:
3
+ editor:
4
+ content_elements:
5
+ inlineBeforeAfter:
6
+ attributes:
7
+ slider: DELETED
8
+ slider_handle: DELETED
@@ -0,0 +1,8 @@
1
+ en:
2
+ pageflow_scrolled:
3
+ editor:
4
+ content_elements:
5
+ inlineBeforeAfter:
6
+ attributes:
7
+ slider: DELETED
8
+ slider_handle: DELETED
@@ -0,0 +1,8 @@
1
+ de:
2
+ pageflow_scrolled:
3
+ editor:
4
+ edit_section:
5
+ attributes:
6
+ layout:
7
+ values:
8
+ centerRagged: "Zentriert"
@@ -0,0 +1,9 @@
1
+ en:
2
+ pageflow_scrolled:
3
+ editor:
4
+ edit_section:
5
+ attributes:
6
+ layout:
7
+ values:
8
+ centerRagged: "Centered (Ragged)"
9
+ center: "Centered"
@@ -0,0 +1,25 @@
1
+ de:
2
+ pageflow_scrolled:
3
+ public:
4
+ third_party_consent:
5
+ opt_in_prompt:
6
+ video: DELETED
7
+ youtube: Ich bin damit einverstanden, dass mir YouTube Videos gezeigt werden.
8
+ vimeo: Ich bin damit einverstanden, dass mir Vimeo Videos gezeigt werden.
9
+ facebook: Ich bin damit einverstanden, dass mir Facebook Videos gezeigt werden.
10
+ consent_accept_all: Alle akzeptieren und schließen
11
+ consent_configure: Mehr Informationen
12
+ consent_deny_all: Ablehnen
13
+ consent_expand_vendor: Mehr Informationen
14
+ consent_no_vendors: Es werden im Moment keine Drittanbieter verwendet.
15
+ consent_prompt_html: |-
16
+ Diese Website nutzt Technologien von Drittanbietern.
17
+ Wir bitten Sie hiermit um Erlaubnis, diese Technologien zu verwenden.
18
+ Sie können Ihre Einwilligung später jederzeit auf unserer Seite zur
19
+ <a href="%{privacyLinkUrl}" target="_blank">Datenschutzerklärung</a>
20
+ ändern oder widerrufen.
21
+ consent_save: Auswahl speichern
22
+ consent_settings: Privatsphäre-Einstellungen
23
+ pageflow:
24
+ datawrapper_chart_embed_opt_in:
25
+ feature_name: 'Opt-in für Datawrapper Embeds'