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
@@ -2,41 +2,169 @@
2
2
  position: relative;
3
3
 
4
4
  &-banner {
5
- display: block;
6
- padding: space(2);
5
+ display: flex;
6
+ align-items: center;
7
+ gap: space(2);
8
+ padding: space(1) space(2);
7
9
  border-radius: rounded();
8
10
  background-color: var(--ui-selection-color-lighter);
9
11
  margin-top: space(2);
10
12
  }
11
13
 
12
- &-filter_name {
13
- font-weight: bold;
14
+ &-banner_text {
15
+ flex: 1;
16
+ }
17
+
18
+ &-banner_name {
19
+ font-weight: 500;
14
20
  }
15
21
 
16
- &-reset_filter {
17
- @include background-icon-center;
22
+ &-banner_dismiss {
18
23
  @include cancel-icon;
19
24
 
20
- position: absolute;
21
- right: space(4);
22
- top: space(4);
25
+ flex: none;
26
+ width: space(6);
27
+ padding: space(1) 0;
28
+ border: none;
29
+ border-radius: rounded();
30
+ background-color: transparent;
31
+ color: var(--ui-primary-color-light);
32
+ line-height: 16px;
33
+ cursor: pointer;
34
+
35
+ &:before {
36
+ font-size: 16px;
37
+ vertical-align: top;
38
+ }
39
+
40
+ &:hover {
41
+ background-color: var(--ui-on-surface-color-lightest);
42
+ color: var(--ui-primary-color);
43
+ }
44
+ }
45
+
46
+ // Clipping keeps the first and last row from poking out of the
47
+ // rounded corners.
48
+ &-list {
49
+ border: solid 1px var(--ui-on-surface-color-lighter);
50
+ border-radius: rounded(md);
51
+ overflow: clip;
52
+ }
53
+
54
+ // Keeps search field, menu and file type pills in reach while
55
+ // scrolling through a long list of files.
56
+ //
57
+ // Browse controls and selection bar share one cell and take turns
58
+ // being visible, so that the header keeps the height of the taller of
59
+ // the two and checking files never pushes the list down.
60
+ &-header {
61
+ display: grid;
62
+ position: sticky;
63
+ top: -10px;
64
+ z-index: 2;
65
+ background-color: var(--ui-surface-color);
66
+ }
67
+
68
+ &-browse_controls,
69
+ &-selection_bar {
70
+ grid-area: 1 / 1;
71
+
72
+ &.is_hidden {
73
+ visibility: hidden;
74
+ }
23
75
  }
24
76
 
25
77
  &-filter_bar {
26
78
  display: flex;
27
79
  align-items: center;
28
80
  gap: space(1);
29
- background-color: var(--ui-surface-color);
30
- position: sticky;
31
- top: -10px;
32
- z-index: 2;
81
+ margin-top: space(1);
33
82
 
34
83
  .drop_down_button button {
35
- @include fa-sort-amount-desc-icon;
36
84
  --drop-down-button-width: 31px;
37
85
  }
38
86
  }
39
87
 
88
+ &-selection_bar {
89
+ display: flex;
90
+ flex-direction: column;
91
+ justify-content: center;
92
+ gap: space(2);
93
+ margin: space(3) 0 space(2);
94
+ padding: space(2);
95
+ border-radius: rounded();
96
+ background-color: var(--ui-selection-color-lighter);
97
+
98
+ // Files cannot be checked in an entry which has none, so the bar does
99
+ // not have to keep its space above the list free either.
100
+ &.is_unavailable {
101
+ display: none;
102
+ }
103
+ }
104
+
105
+ &-selection_bar_status {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: space(2);
109
+ }
110
+
111
+ &-selection_bar_text {
112
+ flex: 1;
113
+ }
114
+
115
+ // On a line of their own, so that the number of checked files is not
116
+ // squeezed next to them in languages with longer words than English.
117
+ &-selection_bar_actions {
118
+ display: flex;
119
+ align-self: flex-end;
120
+ gap: space(1);
121
+ }
122
+
123
+ &-selection_bar_action {
124
+ @include simple-button;
125
+
126
+ padding: space(1) space(4);
127
+
128
+ &[disabled] {
129
+ opacity: 0.5;
130
+ cursor: default;
131
+ }
132
+ }
133
+
134
+ // The icon only mixin brings its own vertical padding, which would
135
+ // make this button taller than the one next to it.
136
+ &-selection_bar_destroy {
137
+ @include icon-only-button("destructive");
138
+ @include trash-icon;
139
+
140
+ padding-top: space(1);
141
+ padding-bottom: space(1);
142
+ }
143
+
144
+ &-selection_bar_dismiss {
145
+ @include cancel-icon;
146
+
147
+ flex: none;
148
+ width: space(6);
149
+ padding: space(1) 0;
150
+ border: none;
151
+ border-radius: rounded();
152
+ background-color: transparent;
153
+ color: var(--ui-primary-color-light);
154
+ line-height: 16px;
155
+ cursor: pointer;
156
+
157
+ &:before {
158
+ font-size: 16px;
159
+ vertical-align: top;
160
+ }
161
+
162
+ &:hover {
163
+ background-color: var(--ui-on-surface-color-lightest);
164
+ color: var(--ui-primary-color);
165
+ }
166
+ }
167
+
40
168
  &-sort {
41
169
  margin-top: space(2);
42
170
  text-align: right;
@@ -0,0 +1,40 @@
1
+ .folder_breadcrumb {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: space(1);
5
+ padding: space(2) 0 space(2) space(1);
6
+
7
+ // Deeply nested folders with long names wrap rather than push the
8
+ // path out of the sidebar.
9
+ &-path {
10
+ flex: 1;
11
+ min-width: 0;
12
+ }
13
+
14
+ &-root {
15
+ @include folder-icon;
16
+
17
+ padding: 0;
18
+ border: none;
19
+ background-color: transparent;
20
+ color: var(--ui-primary-color-light);
21
+ cursor: pointer;
22
+ }
23
+
24
+ &-separator {
25
+ @include right-open-icon;
26
+
27
+ margin: 0 space(1);
28
+ color: var(--ui-on-surface-color-lighter);
29
+ font-size: 12px;
30
+ }
31
+
32
+ &-parent {
33
+ padding: 0;
34
+ border: none;
35
+ background-color: transparent;
36
+ color: var(--ui-on-surface-color-light);
37
+ cursor: pointer;
38
+ text-decoration: underline;
39
+ }
40
+ }
@@ -18,6 +18,18 @@
18
18
  background-color: var(--ui-error-surface-color);
19
19
  }
20
20
 
21
+ .with_icon {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: space(2);
25
+
26
+ img {
27
+ flex-shrink: 0;
28
+ width: space(5);
29
+ height: space(5);
30
+ }
31
+ }
32
+
21
33
  .shortcuts {
22
34
  dt {
23
35
  display: block;
@@ -0,0 +1,15 @@
1
+ .edit_defaults_button {
2
+ button {
3
+ @include simple-button;
4
+
5
+ width: 100%;
6
+ text-align: left;
7
+ padding-block: space(3);
8
+ padding-left: space(3);
9
+ margin-bottom: space(2);
10
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M8 6l4 4 -4 4'/%3e%3c/svg%3e");
11
+ background-position: right space(1) center;
12
+ background-repeat: no-repeat;
13
+ background-size: 1.5rem 1.5rem;
14
+ }
15
+ }
@@ -1,3 +1,4 @@
1
+ @import "./inputs/edit_defaults_button";
1
2
  @import "./inputs/file_input";
2
3
  @import "./inputs/file_processing_state_display";
3
4
  @import "./inputs/reference";
@@ -1,38 +1,50 @@
1
1
  .list {
2
2
  .list_items {
3
- margin-bottom: 10px;
3
+ border: solid 1px var(--ui-on-surface-color-lighter);
4
+ border-radius: rounded(md);
5
+ margin-bottom: space(2);
4
6
  user-select: none;
5
7
  }
6
8
 
7
9
  .list_blank_slate {
8
- background-color: var(--ui-primary-color-lightest);
9
- border-radius: rounded();
10
10
  color: var(--ui-on-surface-color-light);
11
- padding: 10px;
11
+ padding: space(4);
12
+ text-align: center;
12
13
  }
13
14
 
15
+ // Thumbnail, title and buttons share a single row. The description
16
+ // takes a line of its own below them, so that the first line keeps its
17
+ // height and stays centered no matter whether there is a description.
14
18
  .list_item {
15
- background-color: var(--ui-primary-color-lightest);
16
- border-radius: rounded();
17
- overflow: hidden;
19
+ display: grid;
20
+ grid-template-columns: auto 1fr auto;
21
+ grid-template-areas: "thumbnail title buttons"
22
+ ". description description";
23
+ align-items: center;
24
+ column-gap: space(2);
25
+ border-bottom: solid 1px var(--ui-on-surface-color-lightest);
18
26
  cursor: default;
19
- padding: 10px 10px 10px 45px;
20
- position: relative;
21
- margin-bottom: 2px;
27
+
28
+ &:last-child {
29
+ border-bottom: none;
30
+ }
22
31
  }
23
32
 
24
33
  &.with_type_pictogram .list_item {
25
- padding-left: 70px;
34
+ grid-template-columns: auto auto 1fr auto;
35
+ grid-template-areas: "thumbnail pictogram title buttons"
36
+ ". . description description";
26
37
  }
27
38
 
28
39
  .list_item_thumbnail,
29
40
  .list_item_missing_thumbnail {
30
- position: absolute;
31
- top: 0;
32
- left: 0;
33
- width: 35px;
34
- height: 100%;
35
- background-size: cover;
41
+ grid-area: thumbnail;
42
+ align-self: start;
43
+ width: space(8);
44
+ height: space(8);
45
+ margin: space(1) 0 space(1) space(1);
46
+ border-radius: rounded(sm);
47
+ overflow: hidden;
36
48
  }
37
49
 
38
50
  .list_item_thumbnail .thumbnail {
@@ -43,12 +55,12 @@
43
55
  font-size: 20px;
44
56
  }
45
57
 
58
+ // Covers the thumbnail in the same cell of the grid.
46
59
  .list_item_missing_thumbnail {
47
60
  @include attention-icon;
48
61
  @include background-icon-center($color: var(--ui-error-color));
49
62
  background-color: var(--ui-error-surface-color);
50
63
  display: none;
51
- position: absolute;
52
64
  }
53
65
 
54
66
  .list_item.is_invalid .list_item_missing_thumbnail {
@@ -57,14 +69,13 @@
57
69
 
58
70
  .list_item_type_pictogram {
59
71
  display: none;
60
- content: ' ';
61
- position: absolute;
62
- top: 0;
63
- left: 37px;
64
- height: 100%;
65
- width: 35px;
72
+ grid-area: pictogram;
73
+ align-self: start;
74
+ width: space(9);
75
+ height: space(8);
76
+ margin: space(1) 0;
66
77
  background-repeat: no-repeat;
67
- background-position: 3px 45%;
78
+ background-position: center;
68
79
  opacity: 0.2;
69
80
  }
70
81
 
@@ -73,41 +84,80 @@
73
84
  }
74
85
 
75
86
  .list_item_title {
76
- padding-right: 30px;
77
- }
87
+ @include label;
78
88
 
79
- .list_item:has(.list_item_edit_button.is_available):has(.list_item_remove_button.is_available)
80
- .list_item_title {
81
- padding-right: 62px;
89
+ grid-area: title;
82
90
  }
83
91
 
84
92
  .list_item_description {
85
- margin-top: 10px;
93
+ grid-area: description;
94
+ padding: space(1) 0 space(2);
86
95
  color: var(--ui-on-surface-color-light);
87
96
  }
88
97
 
98
+ // Keeps the same inset from the top and right edge of the row as the
99
+ // thumbnail has from the top and left edge.
89
100
  .list_item_buttons {
90
- position: absolute;
91
- right: 4px;
92
- top: 3px;
93
- white-space: nowrap;
101
+ grid-area: buttons;
102
+ align-self: start;
103
+ display: flex;
104
+ margin: space(1) space(1) 0 0;
105
+ }
106
+
107
+ // The copy of the row which follows the pointer while dragging only
108
+ // points out which item is being moved: it has left the list and
109
+ // nothing on it can be clicked.
110
+ .list_item.sortable-drag {
111
+ border-bottom: none;
112
+
113
+ .list_item_buttons {
114
+ visibility: hidden;
115
+ }
94
116
  }
95
117
 
96
118
  .list_item_buttons > a {
97
119
  display: none;
98
120
 
99
121
  &.is_available {
100
- display: inline-block;
122
+ display: block;
123
+ }
124
+ }
125
+
126
+ .list_item_edit_button,
127
+ .list_item_remove_button {
128
+ width: space(8);
129
+ padding: 7px 0;
130
+ border-radius: rounded();
131
+ color: var(--ui-primary-color-light);
132
+ line-height: 16px;
133
+ text-align: center;
134
+ cursor: pointer;
135
+
136
+ &:before {
137
+ font-size: 16px;
138
+ vertical-align: top;
139
+ }
140
+
141
+ &:hover {
142
+ background-color: var(--ui-on-surface-color-lightest);
143
+ color: var(--ui-primary-color);
144
+ }
145
+
146
+ &:focus {
147
+ box-shadow: 0 0 0 2px var(--ui-button-focus-ring-color);
101
148
  }
102
149
  }
103
150
 
104
151
  .list_item_edit_button {
105
- @include icon-only-button;
106
152
  @include pencil-icon;
107
153
  }
108
154
 
109
155
  .list_item_remove_button {
110
- @include icon-only-button("destructive");
111
156
  @include trash-icon;
157
+
158
+ &:hover {
159
+ background-color: var(--ui-error-color);
160
+ color: var(--ui-on-error-color);
161
+ }
112
162
  }
113
163
  }
@@ -2,4 +2,13 @@
2
2
  .tabs_view {
3
3
  margin-top: 10px;
4
4
  }
5
+
6
+ > .drop_down_button {
7
+ float: right;
8
+ }
9
+
10
+ .drop_down_button > button.manage_files-add {
11
+ @include icon-button("primary");
12
+ @include up-icon;
13
+ }
5
14
  }
@@ -15,4 +15,18 @@ ul.menu {
15
15
  display: block;
16
16
  padding: space(2.5);
17
17
  }
18
+
19
+ // Set right after the label rather than at the edge of the item, so
20
+ // it reads as belonging to the label it marks.
21
+ a.indicator::after {
22
+ content: "";
23
+ display: inline-block;
24
+ position: relative;
25
+ top: space(-2);
26
+ margin-left: space(0.5);
27
+ width: space(1);
28
+ height: space(1);
29
+ border-radius: 50%;
30
+ background: var(--ui-warning-color);
31
+ }
18
32
  }
@@ -0,0 +1,83 @@
1
+ &.move_to_folder_dialog {
2
+ // A short list of folders would otherwise leave most of the dialog
3
+ // empty, since dialog boxes stretch to the viewport by default. Long
4
+ // lists still have to stop short of the viewport and scroll.
5
+ .box {
6
+ height: fit-content;
7
+ min-width: 320px;
8
+ max-width: 480px;
9
+ max-height: calc(100vh - #{space(20)});
10
+ }
11
+
12
+ // One border around the list of targets, like the inputs of the editor
13
+ // have. Sits on the scrolling container, so that the border of a long
14
+ // list stays put while it is scrolled.
15
+ .content {
16
+ // Safari resolves the percentage flex basis of the default `flex: 1`
17
+ // against the indefinite height of the box to zero instead of falling
18
+ // back to the height of the list.
19
+ flex: 0 1 auto;
20
+
21
+ margin-left: 0;
22
+ padding: space(1);
23
+ border: solid 1px var(--ui-on-surface-color-lighter);
24
+ border-radius: rounded();
25
+ }
26
+
27
+ .move_to_folder_dialog {
28
+ // The root target holds the top level folders, so its own list does
29
+ // not get indented.
30
+ &-targets ul {
31
+ padding-left: space(4);
32
+ }
33
+
34
+ &-target {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: space(2);
38
+ width: 100%;
39
+ box-sizing: border-box;
40
+ padding: space(1) space(2);
41
+ border: none;
42
+ border-radius: rounded(sm);
43
+ background-color: transparent;
44
+ color: inherit;
45
+
46
+ &:not([disabled]) {
47
+ cursor: pointer;
48
+ }
49
+
50
+ &:not([disabled]):hover {
51
+ background-color: var(--ui-selection-color-light);
52
+ }
53
+
54
+ // The folder the items are in is not a target they could move to.
55
+ &[disabled] {
56
+ color: var(--ui-on-surface-color-light);
57
+ }
58
+
59
+ // Folders which are being moved and their subfolders are no targets
60
+ // either. Dimming the whole row fades the folder icon along with
61
+ // the name, since no hint next to them says why they are inactive.
62
+ &.is_blocked {
63
+ opacity: 0.5;
64
+ }
65
+ }
66
+
67
+ &-pictogram {
68
+ @include folder-icon;
69
+
70
+ flex-shrink: 0;
71
+ color: var(--ui-primary-color-light);
72
+ }
73
+
74
+ &-name {
75
+ @include label;
76
+ }
77
+
78
+ &-current {
79
+ color: var(--ui-on-surface-color-light);
80
+ white-space: nowrap;
81
+ }
82
+ }
83
+ }
@@ -29,12 +29,16 @@
29
29
  }
30
30
  }
31
31
 
32
+ // Deprecated: The editor displays the same icons for all processing
33
+ // stages of a file. Pictograms per stage are no longer supported.
32
34
  @mixin pageflow-uploadable-file-stage($stage-name) {
33
- .editor {
34
- .file_thumbnail .pictogram.#{$stage-name},
35
- .file_stage_item.#{$stage-name} {
36
- @content;
37
- }
35
+ @warn "pageflow-uploadable-file-stage is deprecated and no longer has any effect. " +
36
+ "Remove the include for stage '#{$stage-name}'.";
37
+
38
+ // Keeps existing call sites from failing since they pass a content
39
+ // block.
40
+ @if false {
41
+ @content;
38
42
  }
39
43
  }
40
44