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
@@ -0,0 +1,93 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ import { useEntryMetadata } from 'pageflow-scrolled/entryState';
3
+ import I18n from 'i18n-js';
4
+
5
+ const LocaleContext = createContext('en');
6
+ function setupI18n({
7
+ defaultLocale,
8
+ locale,
9
+ translations
10
+ }) {
11
+ I18n.defaultLocale = defaultLocale;
12
+ I18n.locale = locale;
13
+ I18n.translations = translations;
14
+ }
15
+ function LocaleProvider({
16
+ children
17
+ }) {
18
+ const {
19
+ locale
20
+ } = useEntryMetadata() || {};
21
+ return /*#__PURE__*/React.createElement(LocaleContext.Provider, {
22
+ value: locale
23
+ }, children);
24
+ }
25
+
26
+ /**
27
+ * Obtain a locale to translate or format data in. Returns the
28
+ * configured locale of the current entry by default.
29
+ *
30
+ * Elements that are rendered on top of the entry in the editor
31
+ * preview or while reviewing an entry are part of the user interface
32
+ * rather than of the entry itself. Pass `"ui"` as `locale` option to
33
+ * obtain the locale of the user interface for those.
34
+ *
35
+ * @param {Object} [options]
36
+ * @param {"entry"|"ui"} [options.locale="entry"] -
37
+ * Pass `"ui"` to obtain the locale of the user interface instead.
38
+ * Note that this option selects which of the two locales to use. It
39
+ * does not take a locale name.
40
+ *
41
+ * @example
42
+ * const locale = useLocale();
43
+ * date.toLocaleDateString(locale)
44
+ *
45
+ * const locale = useLocale({locale: 'ui'});
46
+ */
47
+ function useLocale({
48
+ locale: scope = 'entry'
49
+ } = {}) {
50
+ const entryLocale = useContext(LocaleContext);
51
+ if (!localeScopes.includes(scope)) {
52
+ throw new Error(`Unknown locale option '${scope}'. Pass either ${localeScopes.join(' or ')}.`);
53
+ }
54
+ return scope === 'ui' ? I18n.currentLocale() : entryLocale;
55
+ }
56
+ const localeScopes = ['entry', 'ui'];
57
+
58
+ /**
59
+ * Use translations in frontend elements. Uses the configured locale
60
+ * of the current entry by default. Note that only translation keys
61
+ * from the `pageflow_scrolled.public` scope are universally
62
+ * available.
63
+ *
64
+ * to render translations for inline editing controls in the editor
65
+ * preview, you can pass `"ui"` as `locale` option and use
66
+ * translations from the `pageflow_scrolled.inline_editing` scope.
67
+ *
68
+ * @param {Object} [options]
69
+ * @param {"entry"|"ui"} [options.locale="entry"] -
70
+ * Pass `"ui"` to use the locale of the user interface instead. Note
71
+ * that this option selects which of the two locales to use. It does
72
+ * not take a locale name.
73
+ *
74
+ * @example
75
+ * const {t} = useI18n();
76
+ * t('pageflow_scrolled.public.some.key')
77
+ *
78
+ * const {t} = useI18n({locale: 'ui'});
79
+ * t('pageflow_scrolled.inline_editing.some.key')
80
+ */
81
+ function useI18n(options) {
82
+ const locale = useLocale(options);
83
+ return {
84
+ t(key, translateOptions) {
85
+ return I18n.t(key, {
86
+ ...translateOptions,
87
+ locale
88
+ });
89
+ }
90
+ };
91
+ }
92
+
93
+ export { LocaleProvider as L, useLocale as a, setupI18n as s, useI18n as u };
@@ -0,0 +1,100 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ import { useEntryMetadata } from 'pageflow-scrolled/entryState';
3
+ import I18n from 'i18n-js';
4
+
5
+ var _jsxFileName = "/home/tfischbach/code/pageflow/entry_types/scrolled/package/src/frontend/i18n.js";
6
+ const LocaleContext = createContext('en');
7
+ function setupI18n({
8
+ defaultLocale,
9
+ locale,
10
+ translations
11
+ }) {
12
+ I18n.defaultLocale = defaultLocale;
13
+ I18n.locale = locale;
14
+ I18n.translations = translations;
15
+ }
16
+ function LocaleProvider({
17
+ children
18
+ }) {
19
+ const {
20
+ locale
21
+ } = useEntryMetadata() || {};
22
+ return /*#__PURE__*/React.createElement(LocaleContext.Provider, {
23
+ value: locale,
24
+ __self: this,
25
+ __source: {
26
+ fileName: _jsxFileName,
27
+ lineNumber: 17,
28
+ columnNumber: 5
29
+ }
30
+ }, children);
31
+ }
32
+
33
+ /**
34
+ * Obtain a locale to translate or format data in. Returns the
35
+ * configured locale of the current entry by default.
36
+ *
37
+ * Elements that are rendered on top of the entry in the editor
38
+ * preview or while reviewing an entry are part of the user interface
39
+ * rather than of the entry itself. Pass `"ui"` as `locale` option to
40
+ * obtain the locale of the user interface for those.
41
+ *
42
+ * @param {Object} [options]
43
+ * @param {"entry"|"ui"} [options.locale="entry"] -
44
+ * Pass `"ui"` to obtain the locale of the user interface instead.
45
+ * Note that this option selects which of the two locales to use. It
46
+ * does not take a locale name.
47
+ *
48
+ * @example
49
+ * const locale = useLocale();
50
+ * date.toLocaleDateString(locale)
51
+ *
52
+ * const locale = useLocale({locale: 'ui'});
53
+ */
54
+ function useLocale({
55
+ locale: scope = 'entry'
56
+ } = {}) {
57
+ const entryLocale = useContext(LocaleContext);
58
+ if (!localeScopes.includes(scope)) {
59
+ throw new Error(`Unknown locale option '${scope}'. Pass either ${localeScopes.join(' or ')}.`);
60
+ }
61
+ return scope === 'ui' ? I18n.currentLocale() : entryLocale;
62
+ }
63
+ const localeScopes = ['entry', 'ui'];
64
+
65
+ /**
66
+ * Use translations in frontend elements. Uses the configured locale
67
+ * of the current entry by default. Note that only translation keys
68
+ * from the `pageflow_scrolled.public` scope are universally
69
+ * available.
70
+ *
71
+ * to render translations for inline editing controls in the editor
72
+ * preview, you can pass `"ui"` as `locale` option and use
73
+ * translations from the `pageflow_scrolled.inline_editing` scope.
74
+ *
75
+ * @param {Object} [options]
76
+ * @param {"entry"|"ui"} [options.locale="entry"] -
77
+ * Pass `"ui"` to use the locale of the user interface instead. Note
78
+ * that this option selects which of the two locales to use. It does
79
+ * not take a locale name.
80
+ *
81
+ * @example
82
+ * const {t} = useI18n();
83
+ * t('pageflow_scrolled.public.some.key')
84
+ *
85
+ * const {t} = useI18n({locale: 'ui'});
86
+ * t('pageflow_scrolled.inline_editing.some.key')
87
+ */
88
+ function useI18n(options) {
89
+ const locale = useLocale(options);
90
+ return {
91
+ t(key, translateOptions) {
92
+ return I18n.t(key, {
93
+ ...translateOptions,
94
+ locale
95
+ });
96
+ }
97
+ };
98
+ }
99
+
100
+ export { LocaleProvider as L, useLocale as a, setupI18n as s, useI18n as u };
@@ -1,23 +1,21 @@
1
1
  import React, { useMemo, useEffect, useState, useCallback } from 'react';
2
2
  import ReactDOM from 'react-dom';
3
- import { _ as _slicedToArray, b as _defineProperty } from './ThemeIcon-81f2f066.js';
4
3
  import classNames from 'classnames';
5
- import { u as useDelayedBoolean } from './useContentElementEditorState-77fe6c79.js';
6
- import { T as ToggleFullscreenCornerButton } from './ToggleFullscreenCornerButton-788e9cdb.js';
4
+ import { u as useDelayedBoolean } from './useDelayedBoolean-a387d85b.js';
5
+ import { T as ToggleFullscreenCornerButton } from './ToggleFullscreenCornerButton-30fd1124.js';
7
6
 
8
7
  var styles = {"wrapper":"Fullscreen-module_wrapper__2MP7f"};
9
8
 
10
- function Fullscreen(_ref) {
11
- var children = _ref.children;
12
- var root = useMemo(function () {
13
- return document.getElementById('fullscreenRoot');
14
- }, []);
15
- useEffect(function () {
16
- var resetScrollbarPadding = adjustScrollbarPadding(function () {
9
+ function Fullscreen({
10
+ children
11
+ }) {
12
+ const root = useMemo(() => document.getElementById('fullscreenRoot'), []);
13
+ useEffect(() => {
14
+ const resetScrollbarPadding = adjustScrollbarPadding(() => {
17
15
  document.getElementById('root').setAttribute('inert', true);
18
16
  document.body.style.overflow = 'hidden';
19
17
  });
20
- return function () {
18
+ return () => {
21
19
  resetScrollbarPadding();
22
20
  document.getElementById('root').removeAttribute('inert', true);
23
21
  document.body.style.overflow = 'initial';
@@ -31,45 +29,39 @@ function Fullscreen(_ref) {
31
29
  // Adapted from
32
30
  // https://github.com/tailwindlabs/headlessui/blob/9dff5456fa196cdc304e2ed17ef47962a9364ce7/packages/%40headlessui-react/src/hooks/document-overflow/adjust-scrollbar-padding.ts
33
31
  function adjustScrollbarPadding(hideScrollbar) {
34
- var documentElement = document.documentElement;
35
- var ownerWindow = document.defaultView || window;
36
- var scrollbarWidthBefore = ownerWindow.innerWidth - documentElement.clientWidth;
32
+ const documentElement = document.documentElement;
33
+ const ownerWindow = document.defaultView || window;
34
+ const scrollbarWidthBefore = ownerWindow.innerWidth - documentElement.clientWidth;
37
35
  hideScrollbar();
38
- var scrollbarWidthAfter = documentElement.clientWidth - documentElement.offsetWidth;
39
- var scrollbarWidth = scrollbarWidthBefore - scrollbarWidthAfter;
40
- document.documentElement.style.paddingRight = "".concat(scrollbarWidth, "px");
41
- return function () {
42
- return document.documentElement.style.paddingRight = '0';
43
- };
36
+ const scrollbarWidthAfter = documentElement.clientWidth - documentElement.offsetWidth;
37
+ const scrollbarWidth = scrollbarWidthBefore - scrollbarWidthAfter;
38
+ document.documentElement.style.paddingRight = `${scrollbarWidth}px`;
39
+ return () => document.documentElement.style.paddingRight = '0';
44
40
  }
45
41
 
46
42
  var styles$1 = {"wrapper":"index-module_wrapper__ilo7n","visible":"index-module_visible__6QUDn"};
47
43
 
48
- function FullscreenViewer(_ref) {
49
- var contentElementId = _ref.contentElementId,
50
- renderChildren = _ref.renderChildren,
51
- renderFullscreenChildren = _ref.renderFullscreenChildren;
52
- var _useState = useState(false),
53
- _useState2 = _slicedToArray(_useState, 2),
54
- isFullscreen = _useState2[0],
55
- setIsFullscreen = _useState2[1];
56
- var isRendered = useDelayedBoolean(isFullscreen, {
44
+ function FullscreenViewer({
45
+ contentElementId,
46
+ renderChildren,
47
+ renderFullscreenChildren
48
+ }) {
49
+ const [isFullscreen, setIsFullscreen] = useState(false);
50
+ const isRendered = useDelayedBoolean(isFullscreen, {
57
51
  fromTrueToFalse: 200
58
52
  });
59
- var isVisible = useDelayedBoolean(isFullscreen, {
53
+ const isVisible = useDelayedBoolean(isFullscreen, {
60
54
  fromFalseToTrue: 1
61
55
  });
62
- useEffect(function () {
56
+ useEffect(() => {
63
57
  function handlePopState() {
64
58
  var _window$history$state;
65
59
  setIsFullscreen(((_window$history$state = window.history.state) === null || _window$history$state === void 0 ? void 0 : _window$history$state.fullscreenContentElementId) === contentElementId);
66
60
  }
67
61
  window.addEventListener('popstate', handlePopState);
68
- return function () {
69
- return window.removeEventListener('popstate', handlePopState);
70
- };
62
+ return () => window.removeEventListener('popstate', handlePopState);
71
63
  });
72
- var enterFullscreen = useCallback(function () {
64
+ const enterFullscreen = useCallback(() => {
73
65
  setIsFullscreen(true);
74
66
  if (window.parent === window) {
75
67
  window.history.pushState({
@@ -77,31 +69,31 @@ function FullscreenViewer(_ref) {
77
69
  }, '');
78
70
  }
79
71
  }, [contentElementId]);
80
- var exitFullscreen = useCallback(function () {
72
+ const exitFullscreen = useCallback(() => {
81
73
  var _window$history$state2;
82
74
  setIsFullscreen(false);
83
75
  if (((_window$history$state2 = window.history.state) === null || _window$history$state2 === void 0 ? void 0 : _window$history$state2.fullscreenContentElementId) === contentElementId && window.parent === window) {
84
76
  window.history.back();
85
77
  }
86
78
  }, [contentElementId]);
87
- useEffect(function () {
79
+ useEffect(() => {
88
80
  function handleKeyDown(event) {
89
81
  if (event.key === 'Escape') {
90
82
  exitFullscreen();
91
83
  }
92
84
  }
93
85
  window.addEventListener('keydown', handleKeyDown);
94
- return function () {
95
- return window.removeEventListener('keydown', handleKeyDown);
96
- };
86
+ return () => window.removeEventListener('keydown', handleKeyDown);
97
87
  }, [exitFullscreen]);
98
88
  return /*#__PURE__*/React.createElement(React.Fragment, null, renderChildren({
99
- enterFullscreen: enterFullscreen,
100
- isFullscreen: isFullscreen
89
+ enterFullscreen,
90
+ isFullscreen
101
91
  }), isRendered && /*#__PURE__*/React.createElement(Fullscreen, null, /*#__PURE__*/React.createElement("div", {
102
- className: classNames(styles$1.wrapper, _defineProperty({}, styles$1.visible, isVisible))
92
+ className: classNames(styles$1.wrapper, {
93
+ [styles$1.visible]: isVisible
94
+ })
103
95
  }, renderFullscreenChildren({
104
- exitFullscreen: exitFullscreen
96
+ exitFullscreen
105
97
  }), /*#__PURE__*/React.createElement(ToggleFullscreenCornerButton, {
106
98
  isFullscreen: true,
107
99
  onExit: exitFullscreen
@@ -0,0 +1,130 @@
1
+ import React, { useMemo, useEffect, useState, useCallback } from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import classNames from 'classnames';
4
+ import { u as useDelayedBoolean } from './useDelayedBoolean-a387d85b.js';
5
+ import { T as ToggleFullscreenCornerButton } from './ToggleFullscreenCornerButton-61c25224.js';
6
+
7
+ var styles = {"wrapper":"Fullscreen-module_wrapper__2MP7f"};
8
+
9
+ var _jsxFileName = "/home/tfischbach/code/pageflow/entry_types/scrolled/package/src/frontend/FullscreenViewer/Fullscreen.js";
10
+ function Fullscreen({
11
+ children
12
+ }) {
13
+ const root = useMemo(() => document.getElementById('fullscreenRoot'), []);
14
+ useEffect(() => {
15
+ const resetScrollbarPadding = adjustScrollbarPadding(() => {
16
+ document.getElementById('root').setAttribute('inert', true);
17
+ document.body.style.overflow = 'hidden';
18
+ });
19
+ return () => {
20
+ resetScrollbarPadding();
21
+ document.getElementById('root').removeAttribute('inert', true);
22
+ document.body.style.overflow = 'initial';
23
+ };
24
+ }, []);
25
+ return ReactDOM.createPortal( /*#__PURE__*/React.createElement("div", {
26
+ className: styles.wrapper,
27
+ __self: this,
28
+ __source: {
29
+ fileName: _jsxFileName,
30
+ lineNumber: 24,
31
+ columnNumber: 5
32
+ }
33
+ }, children), root);
34
+ }
35
+
36
+ // Adapted from
37
+ // https://github.com/tailwindlabs/headlessui/blob/9dff5456fa196cdc304e2ed17ef47962a9364ce7/packages/%40headlessui-react/src/hooks/document-overflow/adjust-scrollbar-padding.ts
38
+ function adjustScrollbarPadding(hideScrollbar) {
39
+ const documentElement = document.documentElement;
40
+ const ownerWindow = document.defaultView || window;
41
+ const scrollbarWidthBefore = ownerWindow.innerWidth - documentElement.clientWidth;
42
+ hideScrollbar();
43
+ const scrollbarWidthAfter = documentElement.clientWidth - documentElement.offsetWidth;
44
+ const scrollbarWidth = scrollbarWidthBefore - scrollbarWidthAfter;
45
+ document.documentElement.style.paddingRight = `${scrollbarWidth}px`;
46
+ return () => document.documentElement.style.paddingRight = '0';
47
+ }
48
+
49
+ var styles$1 = {"wrapper":"index-module_wrapper__ilo7n","visible":"index-module_visible__6QUDn"};
50
+
51
+ var _jsxFileName$1 = "/home/tfischbach/code/pageflow/entry_types/scrolled/package/src/frontend/FullscreenViewer/index.js";
52
+ function FullscreenViewer({
53
+ contentElementId,
54
+ renderChildren,
55
+ renderFullscreenChildren
56
+ }) {
57
+ const [isFullscreen, setIsFullscreen] = useState(false);
58
+ const isRendered = useDelayedBoolean(isFullscreen, {
59
+ fromTrueToFalse: 200
60
+ });
61
+ const isVisible = useDelayedBoolean(isFullscreen, {
62
+ fromFalseToTrue: 1
63
+ });
64
+ useEffect(() => {
65
+ function handlePopState() {
66
+ var _window$history$state;
67
+ setIsFullscreen(((_window$history$state = window.history.state) === null || _window$history$state === void 0 ? void 0 : _window$history$state.fullscreenContentElementId) === contentElementId);
68
+ }
69
+ window.addEventListener('popstate', handlePopState);
70
+ return () => window.removeEventListener('popstate', handlePopState);
71
+ });
72
+ const enterFullscreen = useCallback(() => {
73
+ setIsFullscreen(true);
74
+ if (window.parent === window) {
75
+ window.history.pushState({
76
+ fullscreenContentElementId: contentElementId
77
+ }, '');
78
+ }
79
+ }, [contentElementId]);
80
+ const exitFullscreen = useCallback(() => {
81
+ var _window$history$state2;
82
+ setIsFullscreen(false);
83
+ if (((_window$history$state2 = window.history.state) === null || _window$history$state2 === void 0 ? void 0 : _window$history$state2.fullscreenContentElementId) === contentElementId && window.parent === window) {
84
+ window.history.back();
85
+ }
86
+ }, [contentElementId]);
87
+ useEffect(() => {
88
+ function handleKeyDown(event) {
89
+ if (event.key === 'Escape') {
90
+ exitFullscreen();
91
+ }
92
+ }
93
+ window.addEventListener('keydown', handleKeyDown);
94
+ return () => window.removeEventListener('keydown', handleKeyDown);
95
+ }, [exitFullscreen]);
96
+ return /*#__PURE__*/React.createElement(React.Fragment, null, renderChildren({
97
+ enterFullscreen,
98
+ isFullscreen
99
+ }), isRendered && /*#__PURE__*/React.createElement(Fullscreen, {
100
+ __self: this,
101
+ __source: {
102
+ fileName: _jsxFileName$1,
103
+ lineNumber: 61,
104
+ columnNumber: 8
105
+ }
106
+ }, /*#__PURE__*/React.createElement("div", {
107
+ className: classNames(styles$1.wrapper, {
108
+ [styles$1.visible]: isVisible
109
+ }),
110
+ __self: this,
111
+ __source: {
112
+ fileName: _jsxFileName$1,
113
+ lineNumber: 62,
114
+ columnNumber: 10
115
+ }
116
+ }, renderFullscreenChildren({
117
+ exitFullscreen
118
+ }), /*#__PURE__*/React.createElement(ToggleFullscreenCornerButton, {
119
+ isFullscreen: true,
120
+ onExit: exitFullscreen,
121
+ __self: this,
122
+ __source: {
123
+ fileName: _jsxFileName$1,
124
+ lineNumber: 64,
125
+ columnNumber: 12
126
+ }
127
+ }))));
128
+ }
129
+
130
+ export { FullscreenViewer as F };