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
@@ -33,15 +33,16 @@ module PageflowScrolled
33
33
 
34
34
  # @api private
35
35
  class Batch
36
- def initialize(section, items)
36
+ def initialize(section, items, comment_thread_subject_ranges: nil)
37
37
  @section = section
38
38
  @storyline = section.chapter.storyline
39
39
  @items = items
40
+ @comment_thread_subject_ranges = comment_thread_subject_ranges
40
41
  end
41
42
 
42
43
  def save!
43
44
  ContentElement.transaction do
44
- @items.map.with_index { |item, index|
45
+ result = @items.map.with_index { |item, index|
45
46
  if item[:_delete]
46
47
  @section.content_elements.delete(item[:id])
47
48
  nil
@@ -49,6 +50,10 @@ module PageflowScrolled
49
50
  create_or_update(item, index)
50
51
  end
51
52
  }.compact
53
+
54
+ update_subject_ranges
55
+ reconcile_section_perma_ids
56
+ result
52
57
  end
53
58
  end
54
59
 
@@ -60,11 +65,48 @@ module PageflowScrolled
60
65
  position: index
61
66
  }.merge(item.slice(:type_name, :configuration))
62
67
 
63
- if item[:id]
64
- @storyline.content_elements.update(item[:id], attributes)
65
- else
66
- @section.content_elements.create(attributes)
67
- end
68
+ content_element = if item[:id]
69
+ @storyline.content_elements.update(item[:id], attributes)
70
+ else
71
+ @section.content_elements.create(attributes)
72
+ end
73
+
74
+ migrate_comment_threads(content_element, item[:migrate_comment_threads])
75
+ content_element
76
+ end
77
+
78
+ def migrate_comment_threads(content_element, thread_ids)
79
+ Pageflow::CommentThread.migrate_to_subject(
80
+ revision: @storyline.revision,
81
+ subject_type: 'ContentElement',
82
+ subject_id: content_element.perma_id,
83
+ thread_ids:
84
+ )
85
+ end
86
+
87
+ def update_subject_ranges
88
+ return if @comment_thread_subject_ranges.blank?
89
+
90
+ Pageflow::CommentThread.update_subject_ranges_for(
91
+ revision: @storyline.revision,
92
+ subject_type: 'ContentElement',
93
+ subject_id: @section.content_elements.pluck(:perma_id),
94
+ ranges: @comment_thread_subject_ranges
95
+ )
96
+ end
97
+
98
+ # A comment thread's section follows its content element. Reconcile
99
+ # the section perma id of threads on this section's content elements
100
+ # so threads stay relocatable to the right section once their
101
+ # content element is deleted — e.g. after a content element was
102
+ # moved here from another section.
103
+ def reconcile_section_perma_ids
104
+ Pageflow::CommentThread.update_section_perma_id_for(
105
+ revision: @storyline.revision,
106
+ subject_type: 'ContentElement',
107
+ subject_id: @section.content_elements.pluck(:perma_id),
108
+ section_perma_id: @section.perma_id
109
+ )
68
110
  end
69
111
  end
70
112
  end
@@ -0,0 +1,6 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ class LottieFile < Pageflow::ApplicationRecord
4
+ include Pageflow::UploadableFile
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module PageflowScrolled
2
+ # @api private
3
+ class LottieFileUrlTemplates
4
+ def call
5
+ {
6
+ original: Pageflow::UrlTemplate.from_attachment(example_file.attachment, :original)
7
+ }
8
+ end
9
+
10
+ private
11
+
12
+ def example_file
13
+ @example_file ||= LottieFile.new(id: 0, file_name: ':basename.:extension')
14
+ end
15
+ end
16
+ end
@@ -34,6 +34,7 @@ module PageflowScrolled
34
34
 
35
35
  def self.create_defaults(draft)
36
36
  create!(revision: draft, configuration: {main: true})
37
+ create!(revision: draft, position: 1)
37
38
  end
38
39
 
39
40
  private
@@ -1,4 +1,4 @@
1
- <%= cache_scrolled_entry(entry: entry, widget_scope: widget_scope) do %>
1
+ <%= cache_scrolled_entry(entry: entry, entry_mode: entry_mode) do %>
2
2
  <!DOCTYPE html>
3
3
  <%= content_tag(:html, lang: entry.locale, dir: text_direction(entry.locale)) do %>
4
4
  <head>
@@ -7,21 +7,25 @@
7
7
  <meta charset="utf-8" />
8
8
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
9
9
  <meta name="robots" content="max-image-preview:large">
10
+ <% if seed_options[:load_commenting] %>
11
+ <%= csrf_meta_tags %>
12
+ <% end %>
10
13
 
11
14
  <%= social_share_meta_tags_for(entry) %>
12
15
  <%= meta_tags_for_entry(entry) %>
13
16
  <%= hreflang_link_tags_for_entry(entry) unless local_assigns[:skip_hreflang_link_tags] %>
14
17
  <%= feed_link_tags_for_entry(entry) unless local_assigns[:skip_feed_link_tags] %>
15
18
 
16
- <%= scrolled_favicons_for_entry(entry, entry_mode: widget_scope) %>
19
+ <%= scrolled_favicons_for_entry(entry, entry_mode: entry_mode) %>
17
20
 
18
- <%= javascript_include_tag 'pageflow_scrolled/legacy' %>
19
- <%= scrolled_frontend_stylesheet_packs_tag(entry, widget_scope: widget_scope) %>
21
+ <%= scrolled_sprockets_asset_tags(entry, entry_mode: entry_mode) %>
22
+ <%= scrolled_frontend_stylesheet_packs_tag(entry, entry_mode: entry_mode, seed_options: seed_options) %>
20
23
 
24
+ <%= scrolled_theme_font_preload_link_tags(entry.theme) %>
21
25
  <%= scrolled_theme_properties_style_tag(entry.theme) %>
22
26
  <%= scrolled_theme_stylesheet_pack_tags(entry.theme) %>
23
27
 
24
- <%= render_widget_head_fragments(entry, scope: widget_scope) %>
28
+ <%= render_widget_head_fragments(entry, scope: entry_mode) %>
25
29
 
26
30
  <% if Rails.env.development? %>
27
31
  <script>
@@ -35,11 +39,8 @@
35
39
  </script>
36
40
  <% end %>
37
41
 
38
- <% ssr_html = local_assigns[:skip_ssr] ? '' : render_scrolled_entry(entry) %>
42
+ <% ssr_html = local_assigns[:skip_ssr] ? '' : render_scrolled_entry(entry, seed_options) %>
39
43
 
40
- <% if !local_assigns[:skip_ssr] && (params[:frontend] == 'v2' || entry.feature_state('frontend_v2')) %>
41
- <%= generated_media_queries_tags_for(ssr_html) %>
42
- <% end %>
43
44
  </head>
44
45
  <body>
45
46
  <%= structured_data_for_entry(entry) unless local_assigns[:skip_structured_data] %>
@@ -50,13 +51,13 @@
50
51
  <div id="root"><%= ssr_html %></div>
51
52
 
52
53
  <div id='template-widget-container'>
53
- <%= render_widgets(entry, scope: widget_scope, insert_point: :bottom_of_entry) %>
54
+ <%= render_widgets(entry, scope: entry_mode, insert_point: :bottom_of_entry) %>
54
55
  </div>
55
56
 
56
57
  <%= scrolled_webpack_public_path_script_tag %>
57
- <%= scrolled_frontend_javascript_packs_tag(entry, widget_scope: widget_scope) %>
58
+ <%= scrolled_frontend_javascript_packs_tag(entry, entry_mode: entry_mode) %>
58
59
 
59
- <%= scrolled_entry_json_seed_script_tag(entry, local_assigns[:seed_options] || {}) %>
60
+ <%= scrolled_entry_json_seed_script_tag(entry, seed_options) %>
60
61
  </body>
61
62
  <% end %>
62
63
  <% end %>
@@ -8,20 +8,26 @@ json.config do
8
8
  config_file_model_types_seed(json, entry_config)
9
9
  end
10
10
 
11
+ json.file_reference_locations do
12
+ json.content_elements file_reference_locations.content_element_locations
13
+ json.sections file_reference_locations.section_locations
14
+ json.entry file_reference_locations.entry_locations
15
+ end
16
+
11
17
  json.pretty_url pretty_entry_url(entry)
12
18
  json.share_url_templates share_provider_url_templates
13
19
 
14
20
  json.default_file_rights entry.account.default_file_rights
15
21
 
16
22
  json.legal_info do
17
- site = entry.site
23
+ legal_info = entry.legal_info
18
24
  json.imprint do
19
- json.label raw(site.imprint_link_label)
20
- json.url site.imprint_link_url
25
+ json.label raw(legal_info.imprint.label)
26
+ json.url legal_info.imprint.url
21
27
  end
22
28
  json.copyright do
23
- json.label raw(site.copyright_link_label)
24
- json.url site.copyright_link_url
29
+ json.label raw(legal_info.copyright.label)
30
+ json.url legal_info.copyright.url
25
31
  end
26
32
  json.privacy do
27
33
  json.label I18n.t('pageflow.public.privacy_notice')
@@ -30,7 +36,10 @@ json.config do
30
36
  end
31
37
 
32
38
  json.enabled_feature_names entry.enabled_feature_names
33
- json.partial!('pageflow_scrolled/entry_json_seed/theme', theme: entry.theme, entry_config:)
39
+ json.partial!('pageflow_scrolled/entry_json_seed/theme',
40
+ theme: entry.theme,
41
+ entry_config:,
42
+ include_theme_translations: options[:include_theme_translations])
34
43
 
35
44
  json.additional_seed_data(
36
45
  entry_config
@@ -48,14 +57,24 @@ json.config do
48
57
  )
49
58
 
50
59
  json.cut_off entry.cutoff_mode_enabled_for?(request)
60
+ json.embed options.fetch(:embed, false)
61
+ json.origin_url options[:origin_url] if options[:origin_url]
62
+ json.load_inline_editing true if options[:load_inline_editing]
63
+ json.load_commenting true if options[:load_commenting]
51
64
  end
52
65
 
53
66
  unless options[:skip_i18n]
67
+ ui_locale = options[:ui_locale] || I18n.locale
68
+
54
69
  json.i18n do
55
70
  json.default_locale I18n.default_locale
56
- json.locale I18n.locale
57
- json.translations scrolled_i18n_translations(entry,
58
- **options.fetch(:translations, {}))
71
+ json.locale ui_locale
72
+ json.translations scrolled_i18n_translations(
73
+ entry,
74
+ ui_locale:,
75
+ include_inline_editing: !!options[:load_inline_editing],
76
+ include_review: !!options[:load_commenting]
77
+ )
59
78
  end
60
79
  end
61
80
 
@@ -63,7 +82,8 @@ unless options[:skip_collections]
63
82
  json.collections do
64
83
  json.entries do
65
84
  json.array!([entry]) do |entry|
66
- json.call(entry, :id, :locale, :share_providers, :share_url, :credits, :configuration)
85
+ json.call(entry, :id, :locale, :share_providers, :share_url, :share_image_id,
86
+ :credits, :configuration)
67
87
  json.published_at entry.published_at.try(:iso8601, 0)
68
88
  json.permaId entry.id # required as keyAttribute in EntryStateProvider
69
89
  end
@@ -36,4 +36,13 @@ json.theme do
36
36
  end
37
37
  end
38
38
  json.options(theme.options.deep_transform_keys { |key| key.to_s.camelize(:lower) })
39
+
40
+ if include_theme_translations
41
+ json.translations do
42
+ generic_scales = I18n.t('pageflow_scrolled.editor.scales', default: {})
43
+ theme_scales = I18n.t("pageflow_scrolled.editor.themes.#{theme.name}.scales", default: {})
44
+ json.scales(generic_scales.deep_merge(theme_scales)
45
+ .deep_transform_keys { |key| key.to_s.camelize(:lower) })
46
+ end
47
+ end
39
48
  end
@@ -13,4 +13,4 @@
13
13
  <link rel="manifest" href="<%= manifest_path %>">
14
14
  <% end %>
15
15
 
16
- <meta name="theme-color" content="<%= theme_color %>">
16
+ <meta name="theme-color" content="#fff">
@@ -0,0 +1,414 @@
1
+ [
2
+ {
3
+ "$id": "pageflow-scrolled/contentElements/counter",
4
+ "x-subject": {
5
+ "model": "contentElement",
6
+ "typeName": "counter"
7
+ },
8
+ "type": "object",
9
+ "properties": {}
10
+ },
11
+ {
12
+ "$id": "pageflow-scrolled/contentElements/dataWrapperChart",
13
+ "x-subject": {
14
+ "model": "contentElement",
15
+ "typeName": "dataWrapperChart"
16
+ },
17
+ "type": "object",
18
+ "properties": {}
19
+ },
20
+ {
21
+ "$id": "pageflow-scrolled/contentElements/externalLinkList",
22
+ "x-subject": {
23
+ "model": "contentElement",
24
+ "typeName": "externalLinkList"
25
+ },
26
+ "type": "object",
27
+ "properties": {
28
+ "links": {
29
+ "type": "array",
30
+ "items": {
31
+ "$ref": "#/$defs/link"
32
+ }
33
+ }
34
+ },
35
+ "$defs": {
36
+ "link": {
37
+ "type": "object",
38
+ "properties": {
39
+ "thumbnail": {
40
+ "type": "integer",
41
+ "x-fileCollection": "image_files"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ {
48
+ "$id": "pageflow-scrolled/contentElements/heading",
49
+ "x-subject": {
50
+ "model": "contentElement",
51
+ "typeName": "heading"
52
+ },
53
+ "type": "object",
54
+ "properties": {}
55
+ },
56
+ {
57
+ "$id": "pageflow-scrolled/contentElements/hotspots",
58
+ "x-subject": {
59
+ "model": "contentElement",
60
+ "typeName": "hotspots"
61
+ },
62
+ "type": "object",
63
+ "properties": {
64
+ "image": {
65
+ "type": "integer",
66
+ "x-fileCollection": "image_files"
67
+ },
68
+ "portraitImage": {
69
+ "type": "integer",
70
+ "x-fileCollection": "image_files"
71
+ },
72
+ "areas": {
73
+ "type": "array",
74
+ "items": {
75
+ "$ref": "#/$defs/area"
76
+ }
77
+ }
78
+ },
79
+ "$defs": {
80
+ "area": {
81
+ "type": "object",
82
+ "properties": {
83
+ "activeImage": {
84
+ "type": "integer",
85
+ "x-fileCollection": "image_files"
86
+ },
87
+ "tooltipImage": {
88
+ "type": "integer",
89
+ "x-fileCollection": "image_files"
90
+ },
91
+ "portraitActiveImage": {
92
+ "type": "integer",
93
+ "x-fileCollection": "image_files",
94
+ "x-activeIf": {
95
+ "path": [
96
+ "portraitImage"
97
+ ],
98
+ "present": true
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ },
105
+ {
106
+ "$id": "pageflow-scrolled/contentElements/iframeEmbed",
107
+ "x-subject": {
108
+ "model": "contentElement",
109
+ "typeName": "iframeEmbed"
110
+ },
111
+ "type": "object",
112
+ "properties": {}
113
+ },
114
+ {
115
+ "$id": "pageflow-scrolled/contentElements/imageGallery",
116
+ "x-subject": {
117
+ "model": "contentElement",
118
+ "typeName": "imageGallery"
119
+ },
120
+ "type": "object",
121
+ "properties": {
122
+ "items": {
123
+ "type": "array",
124
+ "items": {
125
+ "$ref": "#/$defs/item"
126
+ }
127
+ }
128
+ },
129
+ "$defs": {
130
+ "item": {
131
+ "type": "object",
132
+ "properties": {
133
+ "image": {
134
+ "type": "integer",
135
+ "x-fileCollection": "image_files"
136
+ },
137
+ "portraitImage": {
138
+ "type": "integer",
139
+ "x-fileCollection": "image_files"
140
+ }
141
+ }
142
+ }
143
+ }
144
+ },
145
+ {
146
+ "$id": "pageflow-scrolled/contentElements/infoTable",
147
+ "x-subject": {
148
+ "model": "contentElement",
149
+ "typeName": "infoTable"
150
+ },
151
+ "type": "object",
152
+ "properties": {}
153
+ },
154
+ {
155
+ "$id": "pageflow-scrolled/contentElements/inlineAudio",
156
+ "x-subject": {
157
+ "model": "contentElement",
158
+ "typeName": "inlineAudio"
159
+ },
160
+ "type": "object",
161
+ "properties": {
162
+ "id": {
163
+ "type": "integer",
164
+ "x-fileCollection": "audio_files"
165
+ },
166
+ "posterId": {
167
+ "type": "integer",
168
+ "x-fileCollection": "image_files"
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "$id": "pageflow-scrolled/contentElements/inlineBeforeAfter",
174
+ "x-subject": {
175
+ "model": "contentElement",
176
+ "typeName": "inlineBeforeAfter"
177
+ },
178
+ "type": "object",
179
+ "properties": {
180
+ "before_id": {
181
+ "type": "integer",
182
+ "x-fileCollection": "image_files"
183
+ },
184
+ "after_id": {
185
+ "type": "integer",
186
+ "x-fileCollection": "image_files"
187
+ }
188
+ }
189
+ },
190
+ {
191
+ "$id": "pageflow-scrolled/contentElements/inlineImage",
192
+ "x-subject": {
193
+ "model": "contentElement",
194
+ "typeName": "inlineImage"
195
+ },
196
+ "type": "object",
197
+ "properties": {
198
+ "id": {
199
+ "type": "integer",
200
+ "x-fileCollection": "image_files"
201
+ },
202
+ "portraitId": {
203
+ "type": "integer",
204
+ "x-fileCollection": "image_files"
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "$id": "pageflow-scrolled/contentElements/inlineVideo",
210
+ "x-subject": {
211
+ "model": "contentElement",
212
+ "typeName": "inlineVideo"
213
+ },
214
+ "type": "object",
215
+ "properties": {
216
+ "id": {
217
+ "type": "integer",
218
+ "x-fileCollection": "video_files"
219
+ },
220
+ "posterId": {
221
+ "type": "integer",
222
+ "x-fileCollection": "image_files"
223
+ },
224
+ "portraitId": {
225
+ "type": "integer",
226
+ "x-fileCollection": "video_files"
227
+ },
228
+ "portraitPosterId": {
229
+ "type": "integer",
230
+ "x-fileCollection": "image_files",
231
+ "x-activeIf": {
232
+ "path": [
233
+ "portraitId"
234
+ ],
235
+ "present": true
236
+ }
237
+ }
238
+ }
239
+ },
240
+ {
241
+ "$id": "pageflow-scrolled/contentElements/lottieAnimation",
242
+ "x-subject": {
243
+ "model": "contentElement",
244
+ "typeName": "lottieAnimation"
245
+ },
246
+ "type": "object",
247
+ "properties": {
248
+ "id": {
249
+ "type": "integer",
250
+ "x-fileCollection": "lottie_files"
251
+ }
252
+ }
253
+ },
254
+ {
255
+ "$id": "pageflow-scrolled/contentElements/question",
256
+ "x-subject": {
257
+ "model": "contentElement",
258
+ "typeName": "question"
259
+ },
260
+ "type": "object",
261
+ "properties": {}
262
+ },
263
+ {
264
+ "$id": "pageflow-scrolled/contentElements/quote",
265
+ "x-subject": {
266
+ "model": "contentElement",
267
+ "typeName": "quote"
268
+ },
269
+ "type": "object",
270
+ "properties": {}
271
+ },
272
+ {
273
+ "$id": "pageflow-scrolled/contentElements/socialEmbed",
274
+ "x-subject": {
275
+ "model": "contentElement",
276
+ "typeName": "socialEmbed"
277
+ },
278
+ "type": "object",
279
+ "properties": {}
280
+ },
281
+ {
282
+ "$id": "pageflow-scrolled/contentElements/soundDisclaimer",
283
+ "x-subject": {
284
+ "model": "contentElement",
285
+ "typeName": "soundDisclaimer"
286
+ },
287
+ "type": "object",
288
+ "properties": {}
289
+ },
290
+ {
291
+ "$id": "pageflow-scrolled/contentElements/textBlock",
292
+ "x-subject": {
293
+ "model": "contentElement",
294
+ "typeName": "textBlock"
295
+ },
296
+ "type": "object",
297
+ "properties": {}
298
+ },
299
+ {
300
+ "$id": "pageflow-scrolled/contentElements/tikTokEmbed",
301
+ "x-subject": {
302
+ "model": "contentElement",
303
+ "typeName": "tikTokEmbed"
304
+ },
305
+ "type": "object",
306
+ "properties": {}
307
+ },
308
+ {
309
+ "$id": "pageflow-scrolled/contentElements/twitterEmbed",
310
+ "x-subject": {
311
+ "model": "contentElement",
312
+ "typeName": "twitterEmbed"
313
+ },
314
+ "type": "object",
315
+ "properties": {}
316
+ },
317
+ {
318
+ "$id": "pageflow-scrolled/contentElements/videoEmbed",
319
+ "x-subject": {
320
+ "model": "contentElement",
321
+ "typeName": "videoEmbed"
322
+ },
323
+ "type": "object",
324
+ "properties": {
325
+ "posterId": {
326
+ "type": "integer",
327
+ "x-fileCollection": "image_files"
328
+ }
329
+ }
330
+ },
331
+ {
332
+ "$id": "pageflow-scrolled/contentElements/vrImage",
333
+ "x-subject": {
334
+ "model": "contentElement",
335
+ "typeName": "vrImage"
336
+ },
337
+ "type": "object",
338
+ "properties": {
339
+ "image": {
340
+ "type": "integer",
341
+ "x-fileCollection": "image_files"
342
+ }
343
+ }
344
+ },
345
+ {
346
+ "$id": "pageflow-scrolled/entry",
347
+ "x-subject": {
348
+ "model": "entry"
349
+ },
350
+ "type": "object",
351
+ "properties": {
352
+ "shareImageId": {
353
+ "type": "integer",
354
+ "x-fileCollection": "image_files"
355
+ }
356
+ }
357
+ },
358
+ {
359
+ "$id": "pageflow-scrolled/section",
360
+ "x-subject": {
361
+ "model": "section"
362
+ },
363
+ "type": "object",
364
+ "properties": {
365
+ "backdrop": {
366
+ "type": "object",
367
+ "anyOf": [
368
+ {
369
+ "properties": {
370
+ "image": {
371
+ "type": "integer",
372
+ "x-fileCollection": "image_files"
373
+ },
374
+ "imageMobile": {
375
+ "type": "integer",
376
+ "x-fileCollection": "image_files"
377
+ }
378
+ }
379
+ },
380
+ {
381
+ "properties": {
382
+ "video": {
383
+ "type": "integer",
384
+ "x-fileCollection": "video_files"
385
+ },
386
+ "videoMobile": {
387
+ "type": "integer",
388
+ "x-fileCollection": "video_files"
389
+ }
390
+ }
391
+ },
392
+ {
393
+ "properties": {
394
+ "color": {
395
+ "type": "string"
396
+ }
397
+ }
398
+ },
399
+ {
400
+ "properties": {
401
+ "contentElement": {
402
+ "type": "integer"
403
+ }
404
+ }
405
+ }
406
+ ]
407
+ },
408
+ "atmoAudioFileId": {
409
+ "type": "integer",
410
+ "x-fileCollection": "audio_files"
411
+ }
412
+ }
413
+ }
414
+ ]