pageflow 17.1.0 → 17.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +319 -345
  3. data/README.md +3 -4
  4. data/admins/pageflow/accounts.rb +6 -6
  5. data/admins/pageflow/entry.rb +10 -8
  6. data/admins/pageflow/membership.rb +11 -11
  7. data/admins/pageflow/translations.rb +5 -5
  8. data/app/assets/images/pageflow/admin/icons/comment.svg +1 -0
  9. data/app/assets/javascripts/pageflow/dist/ui.js +1350 -630
  10. data/app/assets/javascripts/pageflow/editor/vendor.js +0 -1
  11. data/app/assets/javascripts/pageflow/ui.js +0 -1
  12. data/app/assets/stylesheets/pageflow/admin/entry_comments_indicator.scss +45 -0
  13. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +8 -1
  14. data/app/assets/stylesheets/pageflow/admin.scss +1 -0
  15. data/app/assets/stylesheets/pageflow/animations/spin.scss +9 -0
  16. data/app/assets/stylesheets/pageflow/animations.scss +1 -0
  17. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +21 -5
  18. data/app/assets/stylesheets/pageflow/editor/base.scss +9 -1
  19. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +13 -1
  20. data/app/assets/stylesheets/pageflow/editor/edit_configuration_view.scss +5 -0
  21. data/app/assets/stylesheets/pageflow/editor/file_folders.scss +127 -0
  22. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +0 -1
  23. data/app/assets/stylesheets/pageflow/editor/file_meta_data_overlay.scss +45 -0
  24. data/app/assets/stylesheets/pageflow/editor/file_preview.scss +138 -0
  25. data/app/assets/stylesheets/pageflow/editor/file_references.scss +68 -0
  26. data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +1 -1
  27. data/app/assets/stylesheets/pageflow/editor/file_stage_icons.scss +17 -0
  28. data/app/assets/stylesheets/pageflow/editor/file_stages.scss +25 -32
  29. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +31 -48
  30. data/app/assets/stylesheets/pageflow/editor/file_type_pills.scss +73 -0
  31. data/app/assets/stylesheets/pageflow/editor/files.scss +230 -50
  32. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +142 -14
  33. data/app/assets/stylesheets/pageflow/editor/folder_breadcrumb.scss +40 -0
  34. data/app/assets/stylesheets/pageflow/editor/info_box.scss +12 -0
  35. data/app/assets/stylesheets/pageflow/editor/inputs/edit_defaults_button.scss +15 -0
  36. data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
  37. data/app/assets/stylesheets/pageflow/editor/list.scss +88 -38
  38. data/app/assets/stylesheets/pageflow/editor/manage_files.scss +9 -0
  39. data/app/assets/stylesheets/pageflow/editor/menu.scss +14 -0
  40. data/app/assets/stylesheets/pageflow/editor/move_to_folder_dialog.scss +83 -0
  41. data/app/assets/stylesheets/pageflow/mixins/pageflow.scss +9 -5
  42. data/app/assets/stylesheets/pageflow/ui/color_picker.scss +230 -0
  43. data/app/assets/stylesheets/pageflow/ui/forms.scss +34 -4
  44. data/app/assets/stylesheets/pageflow/ui/functions.scss +12 -2
  45. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +9 -16
  46. data/app/assets/stylesheets/pageflow/ui/input/text_area_input.scss +15 -0
  47. data/app/assets/stylesheets/pageflow/ui/overrides.scss +8 -0
  48. data/app/assets/stylesheets/pageflow/ui/properties.scss +29 -0
  49. data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -3
  50. data/app/assets/stylesheets/pageflow/ui.scss +4 -2
  51. data/app/controllers/pageflow/editor/entries_controller.rb +1 -0
  52. data/app/controllers/pageflow/editor/file_folders_controller.rb +80 -0
  53. data/app/controllers/pageflow/editor/file_import_controller.rb +1 -0
  54. data/app/controllers/pageflow/editor/files_controller.rb +15 -6
  55. data/app/controllers/pageflow/editor/oembeds_controller.rb +21 -0
  56. data/app/controllers/pageflow/entries_controller.rb +17 -13
  57. data/app/controllers/pageflow/review/comment_thread_reads_controller.rb +30 -0
  58. data/app/controllers/pageflow/review/comment_threads_controller.rb +60 -0
  59. data/app/controllers/pageflow/review/comments_controller.rb +53 -0
  60. data/app/controllers/pageflow/revisions_controller.rb +4 -1
  61. data/app/helpers/pageflow/admin/entries_helper.rb +40 -0
  62. data/app/helpers/pageflow/admin/widgets_helper.rb +2 -2
  63. data/app/helpers/pageflow/common_entry_seed_helper.rb +5 -3
  64. data/app/helpers/pageflow/editor/config_helper.rb +3 -1
  65. data/app/helpers/pageflow/entries_helper.rb +24 -42
  66. data/app/helpers/pageflow/entry_json_seed_helper.rb +4 -4
  67. data/app/helpers/pageflow/public_i18n_helper.rb +9 -8
  68. data/app/helpers/pageflow/structured_data_helper.rb +4 -1
  69. data/app/helpers/pageflow/themes_helper.rb +1 -3
  70. data/app/helpers/pageflow/widgets_helper.rb +2 -1
  71. data/app/inputs/pageflow_permalink_input.rb +6 -2
  72. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +11 -4
  73. data/app/models/concerns/pageflow/reusable_file.rb +1 -1
  74. data/app/models/concerns/pageflow/serialization_blacklist.rb +2 -4
  75. data/app/models/concerns/pageflow/translated_attributes.rb +101 -0
  76. data/app/models/concerns/pageflow/uploadable_file.rb +1 -1
  77. data/app/models/pageflow/comment.rb +30 -0
  78. data/app/models/pageflow/comment_thread.rb +65 -0
  79. data/app/models/pageflow/comment_thread_read.rb +22 -0
  80. data/app/models/pageflow/customized_theme.rb +3 -2
  81. data/app/models/pageflow/draft_entry.rb +20 -8
  82. data/app/models/pageflow/entry.rb +2 -0
  83. data/app/models/pageflow/entry_at_revision.rb +9 -1
  84. data/app/models/pageflow/entry_comment_summary.rb +114 -0
  85. data/app/models/pageflow/file_folder.rb +74 -0
  86. data/app/models/pageflow/file_reuse.rb +3 -2
  87. data/app/models/pageflow/file_usage.rb +8 -0
  88. data/app/models/pageflow/image_file.rb +24 -20
  89. data/app/models/pageflow/image_file_url_templates.rb +3 -3
  90. data/app/models/pageflow/legal_info.rb +38 -0
  91. data/app/models/pageflow/nested_revision_component_copy.rb +1 -1
  92. data/app/models/pageflow/permalink.rb +1 -0
  93. data/app/models/pageflow/revision.rb +6 -2
  94. data/app/models/pageflow/site.rb +10 -0
  95. data/app/models/pageflow/used_file.rb +8 -2
  96. data/app/models/pageflow/widget.rb +2 -2
  97. data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +0 -1
  98. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +4 -2
  99. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
  100. data/app/views/pageflow/editor/entries/seed.json.erb +1 -0
  101. data/app/views/pageflow/editor/file_folders/_file_folder.json.jbuilder +5 -0
  102. data/app/views/pageflow/editor/file_folders/create.json.jbuilder +1 -0
  103. data/app/views/pageflow/editor/file_folders/index.json.jbuilder +3 -0
  104. data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -1
  105. data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +3 -0
  106. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +3 -0
  107. data/app/views/pageflow/files/_file.json.jbuilder +2 -0
  108. data/app/views/pageflow/image_files/_image_file.json.jbuilder +0 -1
  109. data/app/views/pageflow/review/comment_threads/_comment_thread.json.jbuilder +20 -0
  110. data/app/views/pageflow/review/comment_threads/create.json.jbuilder +2 -0
  111. data/app/views/pageflow/review/comment_threads/index.json.jbuilder +13 -0
  112. data/app/views/pageflow/review/comments/_comment.json.jbuilder +13 -0
  113. data/app/views/pageflow/review/comments/create.json.jbuilder +1 -0
  114. data/app/views/pageflow/structured_data/_entry.json.jbuilder +2 -3
  115. data/app/views/pageflow/video_files/_video_file.json.jbuilder +0 -1
  116. data/config/locales/de.yml +152 -14
  117. data/config/locales/en.yml +150 -14
  118. data/config/routes.rb +14 -0
  119. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  120. data/db/migrate/20251015000000_add_structured_data_type_name_to_revisions.rb +5 -0
  121. data/db/migrate/20251029142849_convert_legacy_social_embeds_to_unified_social_embed.rb +38 -0
  122. data/db/migrate/20251119083347_fix_main_storyline_positions.rb +16 -0
  123. data/db/migrate/20251119083348_ensure_scrolled_entries_have_excursion_storyline.rb +15 -0
  124. data/db/migrate/20260303000000_add_layout_version_to_revisions.rb +6 -0
  125. data/db/migrate/20260323000000_create_comment_threads_and_comments.rb +30 -0
  126. data/db/migrate/20260414000000_add_subject_range_to_comment_threads.rb +5 -0
  127. data/db/migrate/20260415000000_add_section_perma_id_to_comment_threads.rb +5 -0
  128. data/db/migrate/20260727000000_add_quote_to_comments.rb +5 -0
  129. data/db/migrate/20260728000000_create_file_folders.rb +17 -0
  130. data/db/migrate/20260805000000_add_attribute_translations_to_sites.rb +5 -0
  131. data/db/migrate/20260806000000_add_edited_at_to_comments.rb +5 -0
  132. data/db/migrate/20260810000000_create_pageflow_scrolled_lottie_files.rb +24 -0
  133. data/db/migrate/20260817000000_create_comment_thread_reads.rb +16 -0
  134. data/db/migrate/20260819000000_add_unread_comments_since_at_to_users.rb +18 -0
  135. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +8665 -3890
  136. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +979 -3571
  137. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +20199 -28120
  138. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +18652 -26584
  139. data/entry_types/scrolled/app/assets/stylesheets/pageflow_scrolled/ui.scss +2 -0
  140. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +33 -3
  141. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -3
  142. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +21 -1
  143. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +3 -3
  144. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +7 -5
  145. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +5 -2
  146. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +13 -5
  147. data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +28 -13
  148. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +26 -11
  149. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +2 -2
  150. data/entry_types/scrolled/app/helpers/pageflow_scrolled/sprockets_helper.rb +16 -0
  151. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +174 -3
  152. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +49 -7
  153. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file.rb +6 -0
  154. data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file_url_templates.rb +16 -0
  155. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +1 -0
  156. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +13 -12
  157. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +30 -10
  158. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +9 -0
  159. data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +1 -1
  160. data/entry_types/scrolled/config/configuration_schemas/pageflow-scrolled.json +414 -0
  161. data/entry_types/scrolled/config/locales/de.yml +512 -65
  162. data/entry_types/scrolled/config/locales/en.yml +518 -52
  163. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +2 -2
  164. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +51 -6
  165. data/entry_types/scrolled/lib/pageflow_scrolled/configuration_schemas.rb +91 -0
  166. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +2 -1
  167. data/entry_types/scrolled/lib/pageflow_scrolled/entry_file_reference_locations.rb +71 -0
  168. data/entry_types/scrolled/lib/pageflow_scrolled/entry_structured_data_types/faq_page.rb +58 -0
  169. data/entry_types/scrolled/lib/pageflow_scrolled/file_reference_locations.rb +69 -0
  170. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +205 -22
  171. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +2 -4
  172. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +56 -36
  173. data/entry_types/scrolled/lib/pageflow_scrolled/theme_options_default_scale.rb +35 -0
  174. data/entry_types/scrolled/lib/pageflow_scrolled.rb +13 -0
  175. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +19 -1
  176. data/entry_types/scrolled/package/config/configurationSchemas.js +70 -0
  177. data/entry_types/scrolled/package/config/rollup/configurationSchemas.js +19 -0
  178. data/entry_types/scrolled/package/config/webpack.js +72 -0
  179. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -1
  180. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1181 -915
  181. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.css +1 -0
  182. data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.js +219 -0
  183. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.css +1 -0
  184. data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.js +244 -0
  185. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.css +1 -0
  186. data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.js +823 -0
  187. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +71 -21
  188. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.css +1 -0
  189. data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.js +277 -0
  190. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.css +1 -0
  191. data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.js +244 -0
  192. data/entry_types/scrolled/package/contentElements-editor.js +1915 -1097
  193. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  194. data/entry_types/scrolled/package/contentElements-frontend.js +3093 -1679
  195. data/entry_types/scrolled/package/editor.css +1 -0
  196. data/entry_types/scrolled/package/editor.js +8667 -4077
  197. data/entry_types/scrolled/package/entryState.js +1600 -0
  198. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-20c600de.js +1979 -0
  199. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-58189220.js +2538 -0
  200. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-9f76033e.js → PhonePlatformContext-035a99fa.js} +7 -12
  201. data/entry_types/scrolled/package/frontend/PhonePlatformContext-9da43797.js +33 -0
  202. data/entry_types/scrolled/package/frontend/Placeholder.module-bf0966b4.js +5267 -0
  203. data/entry_types/scrolled/package/frontend/Placeholder.module-d22a9335.js +4180 -0
  204. data/entry_types/scrolled/package/frontend/ThemeIcon-ab834849.js +754 -0
  205. data/entry_types/scrolled/package/frontend/ThemeIcon-f6cb3a8f.js +773 -0
  206. data/entry_types/scrolled/package/frontend/{ToggleFullscreenCornerButton-788e9cdb.js → ToggleFullscreenCornerButton-30fd1124.js} +6 -6
  207. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-61c25224.js +72 -0
  208. data/entry_types/scrolled/package/frontend/Viewer-1074fd59.js +147 -0
  209. data/entry_types/scrolled/package/frontend/Viewer-1482ca34.js +480 -0
  210. data/entry_types/scrolled/package/frontend/Viewer-70504231.js +210 -0
  211. data/entry_types/scrolled/package/frontend/{Viewer-0345ce57.js → Viewer-cc8d4072.js} +84 -92
  212. data/entry_types/scrolled/package/frontend/Wavesurfer-656e3c36.js +302 -0
  213. data/entry_types/scrolled/package/frontend/Wavesurfer-b753b838.js +385 -0
  214. data/entry_types/scrolled/package/frontend/commenting.css +1 -0
  215. data/entry_types/scrolled/package/frontend/extensions-167ae143.js +1455 -0
  216. data/entry_types/scrolled/package/frontend/extensions-2318f92b.js +5918 -0
  217. data/entry_types/scrolled/package/frontend/extensions-a461fd13.js +4890 -0
  218. data/entry_types/scrolled/package/frontend/extensions-c98269fd.js +1982 -0
  219. data/entry_types/scrolled/package/frontend/i18n-493cd2a6.js +93 -0
  220. data/entry_types/scrolled/package/frontend/i18n-e06cac14.js +100 -0
  221. data/entry_types/scrolled/package/frontend/{index-eb670c2f.js → index-2e5546f7.js} +36 -44
  222. data/entry_types/scrolled/package/frontend/index-de2b418d.js +130 -0
  223. data/entry_types/scrolled/package/frontend/index.css +1 -1
  224. data/entry_types/scrolled/package/frontend/index.js +1870 -875
  225. data/entry_types/scrolled/package/frontend/inlineEditing.css +1 -0
  226. data/entry_types/scrolled/package/frontend/useContentElementEditorState-a084912e.js +25 -0
  227. data/entry_types/scrolled/package/frontend/useDelayedBoolean-a387d85b.js +24 -0
  228. data/entry_types/scrolled/package/frontend/{usePhonePlatform-c2ba875d.js → usePhonePlatform-4ecb96d4.js} +1 -1
  229. data/entry_types/scrolled/package/frontend/usePhonePlatform-ce9ff08d.js +8 -0
  230. data/entry_types/scrolled/package/frontend-server.js +20 -209
  231. data/entry_types/scrolled/package/package.json +5 -3
  232. data/entry_types/scrolled/package/review.css +1 -0
  233. data/entry_types/scrolled/package/review.js +3306 -0
  234. data/entry_types/scrolled/package/testHelpers.js +836 -359
  235. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  236. data/entry_types/scrolled/package/widgets/consentBar.js +269 -290
  237. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  238. data/entry_types/scrolled/package/widgets/defaultNavigation.js +911 -352
  239. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -1
  240. data/entry_types/scrolled/package/widgets/excursionSheet.js +87 -124
  241. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  242. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +62 -29
  243. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +32 -13
  244. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -1
  245. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +56 -100
  246. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  247. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +33 -28
  248. data/entry_types/scrolled/package/widgets-server.js +1 -0
  249. data/entry_types/scrolled/spec/factories/lottie_files.rb +29 -0
  250. data/entry_types/scrolled/spec/fixtures/animation.lottie +0 -0
  251. data/entry_types/scrolled/spec/fixtures/font.woff +0 -0
  252. data/entry_types/scrolled/spec/fixtures/font.woff2 +0 -0
  253. data/lib/generators/pageflow/resque/resque_generator.rb +0 -2
  254. data/lib/pageflow/configuration.rb +49 -7
  255. data/lib/pageflow/deprecation.rb +19 -0
  256. data/lib/pageflow/engine.rb +1 -1
  257. data/lib/pageflow/entries_controller_env_helper.rb +32 -2
  258. data/lib/pageflow/entry_export_import/entry_serialization.rb +4 -4
  259. data/lib/pageflow/entry_export_import/page_type_versions.rb +2 -2
  260. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +10 -0
  261. data/lib/pageflow/entry_export_import/revision_serialization.rb +3 -0
  262. data/lib/pageflow/entry_structured_data_types.rb +43 -0
  263. data/lib/pageflow/entry_type_configuration.rb +1 -0
  264. data/lib/pageflow/file_type.rb +2 -2
  265. data/lib/pageflow/file_types.rb +1 -1
  266. data/lib/pageflow/oembed_providers.rb +42 -0
  267. data/lib/pageflow/primary_domain_entry_redirect.rb +6 -0
  268. data/lib/pageflow/rails_version.rb +13 -2
  269. data/lib/pageflow/themes.rb +41 -0
  270. data/lib/pageflow/user_mixin.rb +12 -0
  271. data/lib/pageflow/version.rb +1 -1
  272. data/lib/pageflow.rb +1 -0
  273. data/package/config/eslint-rules/documented-in-toc.js +125 -0
  274. data/package/config/jest/index.js +0 -1
  275. data/package/config/webpack.js +0 -1
  276. data/package/config/webpack5.js +0 -1
  277. data/package/editor.js +4378 -1897
  278. data/package/frontend.js +647 -886
  279. data/package/package.json +2 -1
  280. data/package/review.js +384 -0
  281. data/package/testHelpers.js +248 -188
  282. data/package/ui.js +1346 -630
  283. data/package/vendor/stubs/wysihtml5.js +2 -0
  284. data/spec/factories/comment_thread_reads.rb +10 -0
  285. data/spec/factories/comment_threads.rb +10 -0
  286. data/spec/factories/comments.rb +9 -0
  287. data/spec/factories/file_folders.rb +8 -0
  288. data/spec/factories/published_entries.rb +2 -0
  289. metadata +188 -67
  290. data/app/assets/stylesheets/pageflow/editor/select_button.scss +0 -51
  291. data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +0 -55
  292. data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-51914be7.js +0 -5439
  293. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +0 -1932
  294. data/entry_types/scrolled/package/frontend/Viewer-cdc549cc.js +0 -147
  295. data/entry_types/scrolled/package/frontend/Wavesurfer-1cdc3925.js +0 -313
  296. data/entry_types/scrolled/package/frontend/components-96660ffd.js +0 -3803
  297. data/entry_types/scrolled/package/frontend/inherits-539844a6.js +0 -99
  298. data/entry_types/scrolled/package/frontend/useContentElementEditorState-77fe6c79.js +0 -51
  299. data/entry_types/scrolled/package/widgets/excursionDialog.css +0 -1
  300. data/entry_types/scrolled/package/widgets/excursionDialog.js +0 -109
  301. data/lib/generators/pageflow/resque/templates/resque_enqueue_after_commit_patch.rb +0 -25
  302. data/package/vendor/jquery.minicolors.js +0 -1108
@@ -95,8 +95,8 @@ module Pageflow
95
95
  def placeholders_by_role
96
96
  return {} unless options[:include_placeholders]
97
97
 
98
- config.widget_types.roles.each_with_object({}) do |role, result|
99
- result[role] = Widget.new(role:, type_name: nil, subject: nil)
98
+ config.widget_types.roles.to_h do |role|
99
+ [role, Widget.new(role:, type_name: nil, subject: nil)]
100
100
  end
101
101
  end
102
102
 
@@ -1,5 +1,4 @@
1
1
  json.call(audio_file, :duration_in_ms)
2
- json.created_at audio_file.created_at.try(:utc).try(:iso8601, 0)
3
2
 
4
3
  variants = [
5
4
  :m4a,
@@ -7,7 +7,7 @@ json.call(Pageflow.config,
7
7
  :available_file_licenses,
8
8
  :available_text_track_kinds,
9
9
  :available_share_providers)
10
- json.file_types Pageflow.config_for(entry).file_types do |file_type|
10
+ json.file_types entry_config.file_types do |file_type|
11
11
  json.collection_name file_type.collection_name
12
12
  json.top_level_type file_type.top_level_type
13
13
  json.type_name file_type.type_name
@@ -18,7 +18,7 @@ json.file_types Pageflow.config_for(entry).file_types do |file_type|
18
18
  end
19
19
  end
20
20
 
21
- json.file_importers Pageflow.config_for(entry).file_importers do |file_importer|
21
+ json.file_importers entry_config.file_importers do |file_importer|
22
22
  json.importer_name file_importer.name
23
23
  json.logo_source asset_url(file_importer.logo_source)
24
24
  json.authentication_provider file_importer.authentication_provider
@@ -29,3 +29,5 @@ json.default_publisher_meta_tag Pageflow.config.default_publisher_meta_tag
29
29
  json.default_keywords_meta_tag Pageflow.config.default_keywords_meta_tag
30
30
  json.themes(Pageflow.config.themes, :name, :preview_image_path)
31
31
  json.edit_lock_polling_interval_in_seconds Pageflow.config.edit_lock_polling_interval
32
+
33
+ json.entry_structured_data_types entry_config.entry_structured_data_types.names
@@ -11,6 +11,7 @@ json.last_published_with_noindex(entry.last_published_with_noindex?)
11
11
  json.metadata do
12
12
  json.(entry,
13
13
  :title, :locale, :summary, :credits, :author, :publisher, :keywords, :share_providers,
14
- :share_url, :share_image_id, :share_image_x, :share_image_y, :configuration)
14
+ :share_url, :share_image_id, :share_image_x, :share_image_y, :configuration,
15
+ :structured_data_type_name)
15
16
  json.theme_name entry.theme.name
16
17
  end
@@ -10,6 +10,7 @@
10
10
  "widgets": <%= widgets_json_seeds(@entry) %>,
11
11
 
12
12
  "files": <%= editor_files_json_seed(@entry) %>,
13
+ "file_folders": <%= render_json_seed(@entry.file_folders) %>,
13
14
 
14
15
  "account": <%= render_json_seed(@entry.account) %>,
15
16
  "site": <%= render_json_seed(@entry.site) %>,
@@ -0,0 +1,5 @@
1
+ json.call(file_folder,
2
+ :id,
3
+ :perma_id,
4
+ :parent_folder_perma_id,
5
+ :name)
@@ -0,0 +1 @@
1
+ json.partial!(partial: 'pageflow/editor/file_folders/file_folder', object: @file_folder)
@@ -0,0 +1,3 @@
1
+ json.array!(@file_folders,
2
+ partial: 'pageflow/editor/file_folders/file_folder',
3
+ as: :file_folder)
@@ -5,7 +5,8 @@ json.partial!(partial: 'pageflow/files/file',
5
5
  json.call(file,
6
6
  :state,
7
7
  :rights,
8
- :usage_id)
8
+ :usage_id,
9
+ :folder_perma_id)
9
10
 
10
11
  json.direct_upload_config(file.direct_upload_config) if file.can_upload?
11
12
 
@@ -1,3 +1,6 @@
1
1
  json.(image_file, :width, :height, :panorama_url)
2
2
 
3
3
  json.dimensions(file_dimensions(image_file))
4
+
5
+ # Uncropped, unlike the thumbnail styles used elsewhere in the editor.
6
+ json.preview_url(image_file.attachment.url(:medium)) if image_file.ready?
@@ -10,6 +10,9 @@ if video_file.state == 'encoded'
10
10
  json.src source[:high_src]
11
11
  json.type source[:type]
12
12
  end
13
+
14
+ # Smallest encoded version, sufficient for the preview in the editor.
15
+ json.preview_url(video_file.mp4_low.url)
13
16
  end
14
17
 
15
18
  json.poster_url(video_file.poster.url(:large)) if video_file.poster.present?
@@ -10,6 +10,8 @@ json.call(file,
10
10
 
11
11
  json.display_name(file.display_name.presence || file.file_name)
12
12
 
13
+ json.created_at(file.created_at.try(:utc).try(:iso8601, 0))
14
+
13
15
  json.is_ready(file.ready?)
14
16
 
15
17
  json.partial!(object: file, partial: file_type.partial) if file_type.partial.present?
@@ -1,3 +1,2 @@
1
1
  json.call(image_file, :width, :height)
2
2
  json.processed_extension image_file.output_present?(:webp) ? 'webp' : 'JPG'
3
- json.created_at image_file.created_at.try(:utc).try(:iso8601, 0)
@@ -0,0 +1,20 @@
1
+ json.key_format!(camelize: :lower)
2
+
3
+ json.call(comment_thread,
4
+ :id,
5
+ :perma_id,
6
+ :subject_type,
7
+ :subject_id,
8
+ :subject_range,
9
+ :section_perma_id,
10
+ :creator_id,
11
+ :resolved_at,
12
+ :resolved_by_id,
13
+ :created_at,
14
+ :updated_at)
15
+
16
+ json.resolver_name comment_thread.resolver&.full_name
17
+
18
+ json.comments(comment_thread.comments) do |comment|
19
+ json.partial!('pageflow/review/comments/comment', comment:)
20
+ end
@@ -0,0 +1,2 @@
1
+ json.partial!('pageflow/review/comment_threads/comment_thread',
2
+ comment_thread: @comment_thread)
@@ -0,0 +1,13 @@
1
+ json.key_format!(camelize: :lower)
2
+
3
+ json.current_user do
4
+ json.id current_user.id
5
+ json.name current_user.full_name
6
+ json.unread_comments_since_at current_user.unread_comments_since_at
7
+ end
8
+
9
+ json.comment_threads(@comment_threads) do |comment_thread|
10
+ json.partial!('pageflow/review/comment_threads/comment_thread', comment_thread:)
11
+ end
12
+
13
+ json.comment_thread_reads(@read_at_by_perma_id.transform_keys(&:to_s))
@@ -0,0 +1,13 @@
1
+ json.key_format!(camelize: :lower)
2
+
3
+ json.call(comment,
4
+ :id,
5
+ :perma_id,
6
+ :creator_id,
7
+ :body,
8
+ :quote,
9
+ :created_at,
10
+ :updated_at,
11
+ :edited_at)
12
+
13
+ json.creator_name comment.creator.full_name
@@ -0,0 +1 @@
1
+ json.partial!('pageflow/review/comments/comment', comment: @comment)
@@ -1,7 +1,8 @@
1
1
  json.key_format!(camelize: :lower)
2
2
 
3
3
  json.set! '@context', 'http://schema.org'
4
- json.set! '@type', 'Article'
4
+
5
+ json.merge! custom_properties
5
6
 
6
7
  json.headline pretty_entry_title(entry)
7
8
  json.url structured_data_normalize_protocol(social_share_entry_url(entry))
@@ -30,8 +31,6 @@ end
30
31
  json.date_published entry.first_published_at.try(:utc).try(:iso8601, 0)
31
32
  json.date_modified entry.published_at.try(:utc).try(:iso8601, 0)
32
33
 
33
- json.article_section 'longform'
34
-
35
34
  json.main_entity_of_page do
36
35
  json.set! '@type', 'WebPage'
37
36
  json.set! '@id', structured_data_normalize_protocol(social_share_entry_url(entry))
@@ -1,5 +1,4 @@
1
1
  json.call(video_file, :width, :height, :duration_in_ms)
2
- json.created_at video_file.created_at.try(:utc).try(:iso8601, 0)
3
2
 
4
3
  variants = (video_file.present_outputs + [:poster_medium, :poster_large, :poster_ultra, :print])
5
4
 
@@ -182,7 +182,9 @@ de:
182
182
  account: Konto
183
183
  author: Autor
184
184
  created_at: Erstellt
185
+ folder: Ordner
185
186
  credits: Credits
187
+ structured_data_type_name: Strukturierter Datentyp
186
188
  edited_at: Geändert
187
189
  embed_code: Einbetten
188
190
  first_published_at: Erstmals veröffentlicht am
@@ -375,6 +377,11 @@ de:
375
377
  attributes:
376
378
  user:
377
379
  required: Benutzer muss ausgewählt sein
380
+ pageflow/site:
381
+ attributes:
382
+ attribute_translations:
383
+ not_translatable: enthält ein Attribut, das nicht übersetzt werden kann
384
+ unknown_locale: enthält eine unbekannte Sprache
378
385
  models:
379
386
  account:
380
387
  one: Konto
@@ -821,6 +828,20 @@ de:
821
828
  site_defaults_inline_help: Die folgenden Einstellungen werden als Standard für neue Beiträge des Kontos verwendet. Änderungen wirken sich nicht auf existierende Beiträge aus.
822
829
  entries:
823
830
  add_folder: Ordner hinzufügen
831
+ comments:
832
+ tooltip: "Kommentare: %{summary}"
833
+ topic_count:
834
+ one: 1 ungelöstes Thema
835
+ other: "%{count} ungelöste Themen"
836
+ unread_reply_count:
837
+ one: 1 ungelesene Antwort
838
+ other: "%{count} ungelesene Antworten"
839
+ unread_resolution_count:
840
+ one: 1 neu gelöstes Thema
841
+ other: "%{count} neu gelöste Themen"
842
+ unread_topic_count:
843
+ one: 1 ungelesenes Thema
844
+ other: "%{count} ungelesene Themen"
824
845
  confirm_depublish: Soll der Beitrag wirklich depubliziert werden?
825
846
  confirm_duplicate: Beitrag wirklich duplizieren?
826
847
  confirm_restore: Soll der Beitrag wirklich auf den Stand dieser Revision zurückgesetzt werden? Vor dem Zurücksetzen wird eine automatische Sicherung des aktuellen Standes erstellt.
@@ -1178,6 +1199,11 @@ de:
1178
1199
  entries:
1179
1200
  unsupported_browser_hint:
1180
1201
  message: Die Version Ihres Browsers wird vom Pageflow Editor nicht unterstützt. Bitte benutzen Sie einen aktuellen Browser.
1202
+ entry_structured_data_types:
1203
+ article:
1204
+ label: Artikel
1205
+ faq_page:
1206
+ label: FAQ-Seite
1181
1207
  errors:
1182
1208
  UnmatchedUploadError: Der Dateityp wird nicht unterstützt.
1183
1209
  invalid_nested_type_error: 'Fehler: Upload-Datei ''%{name}'' ist eine %{type}. Es sind nur folgende Arten von Dateien erlaubt: %{validList}'
@@ -1191,6 +1217,22 @@ de:
1191
1217
  video_settings_tab: Video-Details
1192
1218
  files:
1193
1219
  common_attributes:
1220
+ ai_indicator:
1221
+ blank: "(Nicht angegeben)"
1222
+ inline_help: |-
1223
+ Kennzeichne, dass die Datei mit künstlicher Intelligenz
1224
+ erzeugt oder verändert wurde. Wird als EU-KI-Label an
1225
+ der Stelle im Beitrag angezeigt, wo die Datei verwendet
1226
+ wird.
1227
+ label: KI-Kennzeichnung
1228
+ values:
1229
+ ai_generated: Vollständig KI-generiert
1230
+ ai_modified: Teilweise KI-modifiziert
1231
+ ai_indicator_text:
1232
+ inline_help: |-
1233
+ Erläutert, welche Teile der Datei mit künstlicher
1234
+ Intelligenz erzeugt oder verändert wurden.
1235
+ label: Text der KI-Kennzeichnung
1194
1236
  alt:
1195
1237
  inline_help: Ein Hinweis darauf, was in dem dargestellten Element zum Ausdruck kommt. Der Text ist im Beitrag nicht sichtbar, kann aber von Screen-Readern verarbeitet werden und trägt somit zur barrierearmen Gestaltung der Inhalte bei.
1196
1238
  label: Alt-Text
@@ -1262,6 +1304,11 @@ de:
1262
1304
  failed: Fehler beim übertragen zu S3.
1263
1305
  finished: Erfolgreich zu S3 übertragen.
1264
1306
  pending: Noch nicht zu S3 übertragen.
1307
+ singular:
1308
+ audio_files: Audio-Datei
1309
+ image_files: Bild
1310
+ other_files: Datei
1311
+ video_files: Video
1265
1312
  tabs:
1266
1313
  audio_files: Audios
1267
1314
  image_files: Bilder
@@ -1379,13 +1426,18 @@ de:
1379
1426
  entry_preview:
1380
1427
  navigation_disabled_hint: Seitenwechsel sind innerhalb der Phone Vorschau nicht möglich.
1381
1428
  file_item:
1382
- cancel: Abbrechen
1429
+ actions: Aktionen
1430
+ cancel_upload: Upload abbrechen
1383
1431
  confirm: Überprüfen und bestätigen
1384
1432
  credits: Rechte
1385
1433
  destroy: Löschen
1386
1434
  download: Herunterladen
1387
1435
  expand_details: Details einblenden
1388
1436
  collapse_details: Details ausblenden
1437
+ move: Verschieben...
1438
+ reference_count:
1439
+ one: 1x verwendet
1440
+ other: "%{count}x verwendet"
1389
1441
  retry: Erneut versuchen
1390
1442
  select: Auswählen
1391
1443
  settings: Einstellungen
@@ -1396,8 +1448,9 @@ de:
1396
1448
  close: Schließen
1397
1449
  files:
1398
1450
  back: Zurück
1451
+ in_folder: 'Im Ordner:'
1399
1452
  files_blank_slate:
1400
- no_files: Es wurden noch keine Dateien dieses Typs hochgeladen.
1453
+ no_files: Es wurden noch keine Dateien hochgeladen.
1401
1454
  files_explorer:
1402
1455
  cancel: Abbrechen
1403
1456
  ok: Ok
@@ -1419,6 +1472,8 @@ de:
1419
1472
  list_search_field:
1420
1473
  placeholder: 'Dateien filtern'
1421
1474
  hint: 'Mit %{hotkey} suchen'
1475
+ hint_in_all_folders: 'Mit %{hotkey} in allen Ordnern suchen'
1476
+ hint_in_folder: 'Mit %{hotkey} in diesem Ordner suchen'
1422
1477
  reset: 'Filter zurücksetzen'
1423
1478
  loading:
1424
1479
  loading: Daten werden geladen.
@@ -1475,8 +1530,6 @@ de:
1475
1530
  until_including: Bis einschließlich
1476
1531
  user_name: Benutzername
1477
1532
  view_revisions: Revisionen ansehen
1478
- select_button:
1479
- select: Auswählen
1480
1533
  storyline_outline:
1481
1534
  header: Gliederung
1482
1535
  new_chapter: Neues Kapitel
@@ -1498,15 +1551,24 @@ de:
1498
1551
  title_loading_spinner:
1499
1552
  widget_type_info_box_text: Dies ist eine Vorschau der 'Titel und Bild'-Lade-Ansicht. Die Animation läuft ab, während der Beitrag lädt.
1500
1553
  views:
1554
+ audio_file_preview_view:
1555
+ pause: Pause
1556
+ play: Abspielen
1501
1557
  chapter_item_view:
1502
1558
  chapter: Kapitel
1503
1559
  unnamed: "(Unbenannt)"
1560
+ confirmable_file_item_view:
1561
+ confirm_destroy: Datei wirklich löschen?
1504
1562
  edit_chapter_view:
1505
1563
  confirm_destroy: |-
1506
1564
  Kapitel einschließlich ALLER enthaltener Seiten wirklich löschen?
1507
1565
 
1508
1566
  Dieser Schritt kann nicht rückgängig gemacht werden.
1567
+ destroy_menu_item:
1568
+ confirm_destroy: Wirklich löschen?
1569
+ destroy: Löschen
1509
1570
  edit_configuration:
1571
+ actions: Aktionen
1510
1572
  back: "Zurück"
1511
1573
  confirm_destroy: Wirklich löschen?
1512
1574
  destroy: Löschen
@@ -1527,22 +1589,67 @@ de:
1527
1589
  show_editor: Editorleiste einblenden
1528
1590
  entry_preview_view:
1529
1591
  scroll_hint: Scrollen, um weiterzulesen
1592
+ file_item_view:
1593
+ confirm_destroy: Datei wirklich löschen?
1530
1594
  file_meta_data_item_value_view:
1531
1595
  blank: "-"
1596
+ file_references:
1597
+ header: Verwendet in
1598
+ file_preview_progress_bar_view:
1599
+ position: Wiedergabeposition
1600
+ files_blank_slate_view:
1601
+ empty_folder: 'Dieser Ordner enthält noch keine Dateien.'
1602
+ no_matches: 'Keine Datei entspricht dem aktuellen Filter.'
1532
1603
  files_view:
1533
1604
  add: Hinzufügen
1534
1605
  authenticating: Authentifizieren
1535
- import: Importieren
1606
+ folder: Neuer Ordner
1607
+ import: Datei importieren...
1536
1608
  importer:
1537
1609
  heading: Dateien importieren von
1538
- reuse: Wiederverwenden
1539
- upload: Hochladen
1610
+ reuse: Datei wiederverwenden...
1611
+ tabs:
1612
+ files: Dateien
1613
+ upload: Datei hochladen...
1614
+ file_type_pills_view:
1615
+ group_label: 'Nach Dateityp filtern'
1616
+ hint: 'Dateityp anklicken, um nur dessen Dateien anzuzeigen. Mit Strg/Cmd Dateitypen kombinieren.'
1540
1617
  filtered_files_view:
1541
- banner_prefix: 'Aktiver Filter:'
1618
+ actions: 'Aktionen für die Dateiliste'
1619
+ any_file_type: 'Datei'
1620
+ cancel_selection: 'Auswahl abbrechen'
1621
+ confirm_destroy_selection:
1622
+ one: '1 Element wirklich löschen?'
1623
+ other: '%{count} Elemente wirklich löschen?'
1624
+ destroy_selection: 'Auswahl löschen'
1625
+ end_selection: 'Auswahl beenden'
1626
+ move_selection: 'Verschieben...'
1627
+ reset_filter: 'Filter zurücksetzen'
1628
+ search: 'Dateien und Ordner filtern'
1629
+ search_in_folder: 'Dateien in %{folder} filtern'
1630
+ select: '%{name} auswählen'
1631
+ select_items: 'Dateien und Ordner auswählen'
1632
+ selected_items:
1633
+ zero: 'Keine Elemente ausgewählt'
1634
+ one: '1 Element ausgewählt'
1635
+ other: '%{count} Elemente ausgewählt'
1542
1636
  sort_button_label: 'Sortieren'
1543
1637
  sort:
1544
1638
  alphabetical: 'Alphabetisch'
1545
1639
  most_recent: 'Zuletzt hochgeladen'
1640
+ folder_breadcrumb_view:
1641
+ label: 'Ordnerpfad'
1642
+ reset: 'Ordner verlassen'
1643
+ folder_item_view:
1644
+ actions: 'Ordner-Aktionen'
1645
+ destroy: 'Löschen'
1646
+ file_count:
1647
+ one: '1 Datei'
1648
+ other: '%{count} Dateien'
1649
+ move: 'Verschieben...'
1650
+ name: 'Name des neuen Ordners'
1651
+ new_name: 'Neuer Name des Ordners'
1652
+ rename: 'Umbenennen'
1546
1653
  inputs:
1547
1654
  file_input:
1548
1655
  auto_default_text_track: "(Automatisch)"
@@ -1556,6 +1663,35 @@ de:
1556
1663
  unset: Verknüpfung entfernen
1557
1664
  theme_input_view:
1558
1665
  choose: Theme ändern
1666
+ edit_defaults_input_view:
1667
+ label: Voreinstellungen für neue Elemente
1668
+ oembed_url_input_view:
1669
+ status:
1670
+ resolving: "Auflösen..."
1671
+ resolved: "Aufgelöst"
1672
+ invalid_provider: "Ungültiger Anbieter"
1673
+ not_found: "URL nicht gefunden"
1674
+ error: "Fehler beim Auflösen der URL"
1675
+ move_to_folder_dialog_view:
1676
+ cancel: 'Abbrechen'
1677
+ current: 'Aktueller Ordner'
1678
+ header:
1679
+ files:
1680
+ one: 'Datei verschieben'
1681
+ other: 'Dateien verschieben'
1682
+ folders:
1683
+ one: 'Ordner verschieben'
1684
+ other: 'Ordner verschieben'
1685
+ items: 'Elemente verschieben'
1686
+ hint:
1687
+ files:
1688
+ one: 'Wähle den Ordner aus, in den %{name} verschoben werden soll.'
1689
+ other: 'Wähle den Ordner aus, in den %{count} Dateien verschoben werden sollen.'
1690
+ folders:
1691
+ one: 'Wähle den Ordner aus, in den %{name} verschoben werden soll.'
1692
+ other: 'Wähle den Ordner aus, in den %{count} Ordner verschoben werden sollen.'
1693
+ items: 'Wähle den Ordner aus, in den %{count} Elemente verschoben werden sollen.'
1694
+ root: 'Kein Ordner'
1559
1695
  page_item_view:
1560
1696
  unnamed: "(Unbenannt)"
1561
1697
  page_link_item_view:
@@ -1564,6 +1700,9 @@ de:
1564
1700
  storylines_picker_view:
1565
1701
  label: Erzählstrang
1566
1702
  without_parent_page: Ohne übergeordnete Seite
1703
+ video_file_preview_view:
1704
+ mute: Ton ausschalten
1705
+ unmute: Ton einschalten
1567
1706
  widgets:
1568
1707
  attributes:
1569
1708
  media_loading_spinner:
@@ -1933,10 +2072,15 @@ de:
1933
2072
  untitled: Unbenannter Erzählstrang
1934
2073
  structured_data:
1935
2074
  feature_name: Eingebettete strukturierte Daten
2075
+ faq_page_structured_data:
2076
+ feature_name: FAQ-Seite strukturierte Daten
1936
2077
  title_loading_spinner:
1937
2078
  feature_name: "'Titel und Bild'-Lade-Ansicht"
1938
2079
  widget_type_name: Titel und Bild
1939
2080
  ui:
2081
+ color_picker:
2082
+ hue: "Farbton"
2083
+ opacity: "Deckkraft"
1940
2084
  configuration_editor:
1941
2085
  tabs:
1942
2086
  consent_bar: Consent-Leiste
@@ -2098,12 +2242,6 @@ de:
2098
2242
  next: ">>"
2099
2243
  previous: !!str '<<'
2100
2244
  truncate: "..."
2101
- pageflow_scrolled:
2102
- editor:
2103
- section_item:
2104
- set_cutoff: "Paywall Grenze oberhalb setzen"
2105
- reset_cutoff: "Paywall Grenze entfernen"
2106
- cutoff: "Paywall Grenze"
2107
2245
  activemodel:
2108
2246
  attributes:
2109
2247
  pageflow/site_root_entry_form: