pageflow 16.0.0 → 16.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -33
  3. data/README.md +6 -6
  4. data/Rakefile +1 -1
  5. data/admins/pageflow/entry.rb +0 -1
  6. data/admins/pageflow/sites.rb +3 -0
  7. data/app/assets/images/pageflow/admin/icons/published_with_noindex.svg +4 -0
  8. data/app/assets/javascripts/pageflow/dist/ui.js +299 -72
  9. data/app/assets/stylesheets/pageflow/admin/active_admin_patches.scss +1 -1
  10. data/app/assets/stylesheets/pageflow/admin/entries.scss +4 -0
  11. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +10 -0
  12. data/app/assets/stylesheets/pageflow/admin/publication_state_indicator.scss +4 -0
  13. data/app/assets/stylesheets/pageflow/editor/base.scss +0 -1
  14. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +61 -7
  15. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +12 -1
  16. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +4 -0
  17. data/app/assets/stylesheets/pageflow/editor/help.scss +3 -3
  18. data/app/assets/stylesheets/pageflow/editor/info_box.scss +7 -0
  19. data/app/assets/stylesheets/pageflow/editor/inputs/file_input.scss +0 -5
  20. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -4
  21. data/app/assets/stylesheets/pageflow/{editor/wysihtml5.scss → ui/input/text_area_input.scss} +13 -1
  22. data/app/assets/stylesheets/pageflow/ui.scss +1 -0
  23. data/app/controllers/pageflow/chapters_controller.rb +2 -2
  24. data/app/controllers/pageflow/editor/entry_publications_controller.rb +5 -1
  25. data/app/controllers/pageflow/editor/file_import_controller.rb +1 -1
  26. data/app/controllers/pageflow/editor/files_controller.rb +1 -1
  27. data/app/controllers/pageflow/entries_controller.rb +12 -2
  28. data/app/controllers/pageflow/feeds_controller.rb +18 -0
  29. data/app/controllers/pageflow/pages_controller.rb +2 -2
  30. data/app/controllers/pageflow/sitemaps_controller.rb +15 -0
  31. data/app/controllers/pageflow/storylines_controller.rb +2 -2
  32. data/app/helpers/pageflow/entries_helper.rb +4 -1
  33. data/app/helpers/pageflow/feeds_helper.rb +66 -0
  34. data/app/helpers/pageflow/meta_tags_helper.rb +2 -1
  35. data/app/helpers/pageflow/page_types_helper.rb +10 -10
  36. data/app/helpers/pageflow/revision_file_helper.rb +3 -3
  37. data/app/helpers/pageflow/social_share_helper.rb +2 -2
  38. data/app/inputs/pageflow_permalink_input.rb +15 -3
  39. data/app/models/concerns/pageflow/entry_publication_states.rb +9 -0
  40. data/app/models/concerns/pageflow/reusable_file.rb +3 -3
  41. data/app/models/concerns/pageflow/uploadable_file.rb +5 -0
  42. data/app/models/pageflow/account.rb +8 -0
  43. data/app/models/pageflow/audio_file_url_templates.rb +2 -1
  44. data/app/models/pageflow/draft_entry.rb +1 -1
  45. data/app/models/pageflow/entries_feed.rb +32 -0
  46. data/app/models/pageflow/entry.rb +7 -5
  47. data/app/models/pageflow/entry_at_revision.rb +2 -0
  48. data/app/models/pageflow/image_file.rb +34 -8
  49. data/app/models/pageflow/image_file_url_templates.rb +7 -1
  50. data/app/models/pageflow/membership.rb +3 -2
  51. data/app/models/pageflow/other_file.rb +5 -0
  52. data/app/models/pageflow/other_file_url_templates.rb +16 -0
  53. data/app/models/pageflow/published_entry.rb +6 -0
  54. data/app/models/pageflow/revision.rb +6 -0
  55. data/app/models/pageflow/site.rb +8 -0
  56. data/app/models/pageflow/sitemaps.rb +14 -0
  57. data/app/models/pageflow/used_file.rb +10 -2
  58. data/app/models/pageflow/video_file_url_templates.rb +3 -1
  59. data/app/models/pageflow/widget.rb +9 -1
  60. data/app/views/admin/entries/_permalink_inputs.html.erb +1 -2
  61. data/app/views/admin/sites/_attributes_table.html.arb +3 -0
  62. data/app/views/admin/sites/_fields.html.erb +6 -0
  63. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +2 -2
  64. data/app/views/components/pageflow/admin/revisions_tab.rb +8 -0
  65. data/app/views/components/pageflow/admin/sites_tab.rb +3 -0
  66. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +2 -0
  67. data/app/views/pageflow/editor/entries/_entry.json.jbuilder +1 -0
  68. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +1 -0
  69. data/app/views/pageflow/feeds/index.atom.builder +20 -0
  70. data/app/views/pageflow/image_files/_image_file.json.jbuilder +1 -0
  71. data/app/views/pageflow/meta_tags/_entry.html.erb +1 -0
  72. data/app/views/pageflow/sitemaps/index.xml.builder +9 -0
  73. data/config/initializers/features.rb +3 -0
  74. data/config/initializers/paperclip.rb +8 -0
  75. data/config/locales/de.yml +77 -6
  76. data/config/locales/en.yml +79 -4
  77. data/config/routes.rb +3 -0
  78. data/config/spring.rb +1 -1
  79. data/db/migrate/20230120092923_create_other_files.rb +23 -0
  80. data/db/migrate/20230323115745_add_feeds_enabled_to_sites.rb +5 -0
  81. data/db/migrate/20230323154323_add_sitemap_enabled_to_sites.rb +5 -0
  82. data/db/migrate/20230331103823_add_title_to_sites.rb +5 -0
  83. data/db/migrate/20230405103612_add_custom_feed_url_to_sites.rb +5 -0
  84. data/db/migrate/20231024062501_add_output_presences_to_image_files.rb +5 -0
  85. data/db/migrate/20231128124523_add_noindex_to_revisions.rb +5 -0
  86. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +710 -259
  87. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +34 -5
  88. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +1 -1
  89. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +1 -1
  90. data/entry_types/paged/app/controllers/pageflow_paged/editor/entries_controller.rb +0 -2
  91. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +2 -1
  92. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  93. data/entry_types/paged/config/initializers/features.rb +0 -1
  94. data/entry_types/paged/lib/pageflow_paged/engine.rb +13 -1
  95. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
  96. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +3 -4
  97. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +13 -6
  98. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +11 -3
  99. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +11 -0
  100. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +42 -0
  101. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +8 -5
  102. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +17 -12
  103. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +9 -1
  104. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +1 -1
  105. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +23 -0
  106. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -1
  107. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_seed.json.jbuilder +1 -5
  108. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +10 -0
  109. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +44 -41
  110. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_consent_vendors.json.jbuilder +16 -0
  111. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +7 -0
  112. data/entry_types/scrolled/config/initializers/features.rb +5 -0
  113. data/entry_types/scrolled/config/locales/consent_widget.de.yml +4 -0
  114. data/entry_types/scrolled/config/locales/consent_widget.en.yml +4 -0
  115. data/entry_types/scrolled/config/locales/de.yml +225 -8
  116. data/entry_types/scrolled/config/locales/en.yml +239 -2
  117. data/entry_types/scrolled/config/routes.rb +4 -0
  118. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +69 -44
  119. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +2 -1
  120. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  121. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +96 -0
  122. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +38 -0
  123. data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +13 -1
  124. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +30 -0
  125. data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +6 -1
  126. data/entry_types/scrolled/lib/pageflow_scrolled/web_app_manifest.rb +1 -1
  127. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/dummy.rake +1 -1
  128. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +1 -2
  129. data/entry_types/scrolled/package/config/webpack.js +26 -0
  130. data/entry_types/scrolled/package/contentElements-editor.js +330 -32
  131. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  132. data/entry_types/scrolled/package/contentElements-frontend.js +920 -145
  133. data/entry_types/scrolled/package/editor.js +819 -239
  134. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-14c7b097.js → EditableInlineText.module-6ee0e024.js} +1975 -1792
  135. data/entry_types/scrolled/package/frontend/PhonePlatformContext-b28d991a.js +32 -0
  136. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-8242f213.js +107 -0
  137. data/entry_types/scrolled/package/frontend/Viewer-32cd1ac1.js +154 -0
  138. data/entry_types/scrolled/package/frontend/{Viewer-b6becc57.js → Viewer-6e4d14ed.js} +32 -161
  139. data/entry_types/scrolled/package/frontend/arrowRight-e42e6011.js +77 -0
  140. data/entry_types/scrolled/package/frontend/{components-b3160dd7.js → components-24363f97.js} +188 -47
  141. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-f6093cc6.js → i18n-71c39823.js} +191 -111
  142. data/entry_types/scrolled/package/frontend/index-fc4b13e6.js +118 -0
  143. data/entry_types/scrolled/package/frontend/index.css +1 -1
  144. data/entry_types/scrolled/package/frontend/index.js +252 -76
  145. data/entry_types/scrolled/package/frontend/useContentElementEditorState-245f1986.js +52 -0
  146. data/entry_types/scrolled/package/package.json +6 -4
  147. data/entry_types/scrolled/package/testHelpers.js +11 -2
  148. data/entry_types/scrolled/package/values/colors.module.css +15 -0
  149. data/entry_types/scrolled/package/widgets/consentBar.css +1 -0
  150. data/entry_types/scrolled/package/widgets/consentBar.js +426 -0
  151. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  152. data/entry_types/scrolled/package/widgets/defaultNavigation.js +39 -4
  153. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -0
  154. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +49 -0
  155. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -0
  156. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +37 -0
  157. data/lib/generators/pageflow/resque/resque_generator.rb +1 -1
  158. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  159. data/lib/generators/pageflow/resque/templates/resque.rb +1 -1
  160. data/lib/generators/pageflow/routes/routes_generator.rb +1 -1
  161. data/lib/pageflow/ability_mixin.rb +5 -5
  162. data/lib/pageflow/active_admin_can_can_fix.rb +2 -2
  163. data/lib/pageflow/built_in_file_type.rb +7 -0
  164. data/lib/pageflow/configuration.rb +29 -1
  165. data/lib/pageflow/engine.rb +18 -40
  166. data/lib/pageflow/entry_export_import/revision_serialization.rb +1 -1
  167. data/lib/pageflow/file_type.rb +2 -2
  168. data/lib/pageflow/global_config_api.rb +2 -2
  169. data/lib/pageflow/nested_revision_component.rb +23 -5
  170. data/lib/pageflow/page_type.rb +1 -1
  171. data/lib/pageflow/paperclip_processors/webp.rb +63 -0
  172. data/lib/pageflow/rails_version.rb +19 -0
  173. data/lib/pageflow/seeds.rb +10 -7
  174. data/lib/pageflow/user_mixin.rb +1 -1
  175. data/lib/pageflow/version.rb +1 -1
  176. data/lib/pageflow/widget_types.rb +4 -0
  177. data/package/config/jest/index.js +3 -1
  178. data/package/config/webpack5.js +14 -0
  179. data/package/editor.js +410 -181
  180. data/package/frontend.js +34 -4
  181. data/package/testHelpers.js +1 -1
  182. data/package/ui.js +297 -71
  183. data/spec/factories/entries.rb +34 -3
  184. data/spec/factories/sites.rb +3 -0
  185. data/vendor/assets/javascripts/iscroll.js +4 -7
  186. metadata +118 -80
  187. data/app/helpers/pageflow/admin/permalinks_helper.rb +0 -15
  188. data/entry_types/scrolled/package/frontend/arrowRight-78a7cee4.js +0 -42
@@ -1,16 +1,19 @@
1
1
  import 'regenerator-runtime';
2
- import { a6 as ContentElementEditorCommandEmitterContext, b as usePostMessageListener, a7 as MotifAreaVisibilityProvider, a8 as ForcePaddingContext, a9 as ContentElementConfigurationUpdateContext, aa as ContentElementEditorStateContext, d as api, z as useContentElementEditorState, ab as LayoutWithoutInlineEditing, a5 as SectionThumbnail, ac as renderElement, ad as renderLeaf$1, y as useContentElementEditorCommandSubscription, T as Text$1, n as frontendStyles } from './EditableInlineText.module-14c7b097.js';
2
+ import { ae as ContentElementEditorCommandEmitterContext, b as usePostMessageListener, af as MotifAreaVisibilityProvider, ag as ForcePaddingContext, ah as ContentElementConfigurationUpdateContext, D as api, l as widths, ai as LayoutWithoutInlineEditing, ad as SectionThumbnail, aj as renderElement, ak as renderLeaf$1, H as useContentElementEditorCommandSubscription, a0 as Text$1, r as frontendStyles } from './EditableInlineText.module-6ee0e024.js';
3
3
  import 'pageflow/frontend';
4
4
  import React, { useMemo, useState, useCallback, useContext, useRef, useEffect, createContext, memo } from 'react';
5
- import { c as _slicedToArray, o as useEntryStateDispatch, b as _defineProperty, _ as _objectWithoutProperties, u as useI18n, D as updateContentElementConfiguration, q as useChapter, a as _objectSpread2, j as _toConsumableArray, F as _unsupportedIterableToArray, P as PhonePlatformContext } from './PhonePlatformContext-f6093cc6.js';
6
- import 'i18n-js';
7
- import 'use-context-selector';
8
- import 'reselect';
9
- import 'slugify';
5
+ import { _ as _slicedToArray, p as useEntryStateDispatch, b as _defineProperty, e as _objectWithoutProperties, u as useI18n, D as updateContentElementConfiguration, o as useChapter, i as useFile, a as _objectSpread2, n as _toConsumableArray, F as _unsupportedIterableToArray } from './i18n-71c39823.js';
10
6
  import classNames from 'classnames';
7
+ import { C as ContentElementEditorStateContext, a as useContentElementEditorState } from './useContentElementEditorState-245f1986.js';
11
8
  import './createSuper-d0f30da3.js';
12
9
  import BackboneEvents from 'backbone-events-standalone';
10
+ import 'use-context-selector';
11
+ import 'reselect';
12
+ import 'slugify';
13
+ import 'i18n-js';
14
+ import 'striptags';
13
15
  import 'react-measure';
16
+ import { P as PhonePlatformContext } from './PhonePlatformContext-b28d991a.js';
14
17
  import { DndProvider, useDrop, useDrag } from 'react-dnd';
15
18
  import { HTML5Backend } from 'react-dnd-html5-backend';
16
19
  import { Range, Editor, Transforms, Node, Element, Path, Text, createEditor } from 'slate';
@@ -193,7 +196,7 @@ function MessageHandler(_ref) {
193
196
  return null;
194
197
  }
195
198
 
196
- var styles = {"wrapper":"SectionDecorator-module_wrapper__3sTk3","selected":"SectionDecorator-module_selected__1gcmF","transitionSelected":"SectionDecorator-module_transitionSelected__Wklk6","controls":"SectionDecorator-module_controls__LVEJG","editToolbar":"SectionDecorator-module_editToolbar__18Kjq","toolbar":"SectionDecorator-module_toolbar__2Va1D","transitionToolbar-before":"SectionDecorator-module_transitionToolbar-before__KipOO SectionDecorator-module_toolbar__2Va1D","transitionToolbar-after":"SectionDecorator-module_transitionToolbar-after__2_DVO SectionDecorator-module_toolbar__2Va1D"};
199
+ var styles = {"wrapper":"SectionDecorator-module_wrapper__3sTk3","selected":"SectionDecorator-module_selected__1gcmF","transitionSelected":"SectionDecorator-module_transitionSelected__Wklk6","controls":"SectionDecorator-module_controls__LVEJG","transitionToolbar-after":"SectionDecorator-module_transitionToolbar-after__2_DVO SectionDecorator-module_toolbar__2Va1D","toolbar":"SectionDecorator-module_toolbar__2Va1D","transitionToolbar-before":"SectionDecorator-module_transitionToolbar-before__KipOO SectionDecorator-module_toolbar__2Va1D"};
197
200
 
198
201
  var styles$1 = {"wrapper":"ContentElementDecorator-module_wrapper__NQgFN"};
199
202
 
@@ -298,7 +301,7 @@ function SectionDecorator(_ref) {
298
301
  isLastContentElementSelected = _useEditorSelection2.isSelected;
299
302
 
300
303
  function selectIfOutsideContentItem(event) {
301
- if (!event.target.closest(".".concat(styles$1.wrapper))) {
304
+ if (!event.target.closest(".".concat(styles$1.wrapper)) && !event.target.closest('#fullscreenRoot')) {
302
305
  isSelected ? resetSelection() : select();
303
306
  }
304
307
  }
@@ -770,7 +773,7 @@ function DefaultSelectionRect(props) {
770
773
  scrollPoint: isSelected,
771
774
  drag: drag,
772
775
  dragHandleTitle: t('pageflow_scrolled.inline_editing.drag_content_element'),
773
- full: props.position === 'full',
776
+ full: props.width === widths.full || props.customMargin,
774
777
  ariaLabel: t('pageflow_scrolled.inline_editing.select_content_element'),
775
778
  insertButtonTitles: t('pageflow_scrolled.inline_editing.insert_content_element'),
776
779
  onClick: function onClick() {
@@ -930,7 +933,8 @@ var styles$6 = {"placeholder":"TextPlaceholder-module_placeholder__sgVwx"};
930
933
 
931
934
  function TextPlaceholder(_ref) {
932
935
  var text = _ref.text,
933
- visible = _ref.visible;
936
+ visible = _ref.visible,
937
+ className = _ref.className;
934
938
 
935
939
  if (!text || !visible) {
936
940
  return null;
@@ -938,7 +942,9 @@ function TextPlaceholder(_ref) {
938
942
 
939
943
  return /*#__PURE__*/React.createElement("div", {
940
944
  className: styles$6.placeholder
941
- }, /*#__PURE__*/React.createElement("div", null, text));
945
+ }, /*#__PURE__*/React.createElement("div", {
946
+ className: className
947
+ }, text));
942
948
  }
943
949
 
944
950
  function withCustomInsertBreak(editor) {
@@ -977,7 +983,7 @@ function withCustomInsertBreak(editor) {
977
983
  return editor;
978
984
  }
979
985
 
980
- var styles$7 = {"container":"index-module_container__3dD9z","shy":"index-module_shy__KgWjc","selected":"index-module_selected__mE58y","hoveringToolbar":"index-module_hoveringToolbar__31Xpd","selection":"index-module_selection__3dUiD","linkTooltip":"index-module_linkTooltip__36m1K","linkTooltipThumbnail":"index-module_linkTooltipThumbnail__2v-cf","linkTooltipThumbnailClickMask":"index-module_linkTooltipThumbnailClickMask__2Z3ff","linkTooltipNewTab":"index-module_linkTooltipNewTab__4tnLF","linkTooltipChapterNumber":"index-module_linkTooltipChapterNumber__2CsQA"};
986
+ var styles$7 = {"container":"index-module_container__3dD9z","shy":"index-module_shy__KgWjc","selected":"index-module_selected__mE58y","hoveringToolbarContainer":"index-module_hoveringToolbarContainer__3xVEz","hoveringToolbar":"index-module_hoveringToolbar__31Xpd","selection":"index-module_selection__3dUiD","linkTooltip":"index-module_linkTooltip__36m1K","linkTooltip-below":"index-module_linkTooltip-below__1wvl7","linkTooltip-above":"index-module_linkTooltip-above__P3YfD","linkTooltipThumbnail":"index-module_linkTooltipThumbnail__2v-cf","linkTooltipThumbnailClickMask":"index-module_linkTooltipThumbnailClickMask__2Z3ff","linkTooltipNewTab":"index-module_linkTooltipNewTab__4tnLF","linkTooltipChapterNumber":"index-module_linkTooltipChapterNumber__2CsQA"};
981
987
 
982
988
  function _extends$3() {
983
989
  _extends$3 = Object.assign || function (target) {
@@ -1018,6 +1024,7 @@ var UpdateContext = createContext();
1018
1024
  function LinkTooltipProvider(_ref) {
1019
1025
  var editor = _ref.editor,
1020
1026
  disabled = _ref.disabled,
1027
+ position = _ref.position,
1021
1028
  children = _ref.children;
1022
1029
 
1023
1030
  var _useState = useState(),
@@ -1037,7 +1044,8 @@ function LinkTooltipProvider(_ref) {
1037
1044
  setState({
1038
1045
  href: href,
1039
1046
  openInNewTab: openInNewTab,
1040
- top: linkRect.bottom - outerRect.top + 10,
1047
+ top: position === 'below' ? linkRect.bottom - outerRect.top + 10 : 'auto',
1048
+ bottom: position === 'above' ? outerRect.bottom - linkRect.top + 10 : 'auto',
1041
1049
  left: linkRect.left - outerRect.left
1042
1050
  });
1043
1051
  },
@@ -1054,7 +1062,7 @@ function LinkTooltipProvider(_ref) {
1054
1062
  }
1055
1063
  }
1056
1064
  };
1057
- }, []);
1065
+ }, [position]);
1058
1066
  return /*#__PURE__*/React.createElement(UpdateContext.Provider, {
1059
1067
  value: update
1060
1068
  }, /*#__PURE__*/React.createElement("div", {
@@ -1062,7 +1070,8 @@ function LinkTooltipProvider(_ref) {
1062
1070
  }, /*#__PURE__*/React.createElement(LinkTooltip, {
1063
1071
  editor: editor,
1064
1072
  state: state,
1065
- disabled: disabled
1073
+ disabled: disabled,
1074
+ position: position
1066
1075
  }), children));
1067
1076
  }
1068
1077
  function LinkPreview(_ref2) {
@@ -1087,6 +1096,7 @@ function LinkPreview(_ref2) {
1087
1096
  function LinkTooltip(_ref3) {
1088
1097
  var editor = _ref3.editor,
1089
1098
  disabled = _ref3.disabled,
1099
+ position = _ref3.position,
1090
1100
  state = _ref3.state;
1091
1101
 
1092
1102
  var _useContext2 = useContext(UpdateContext),
@@ -1098,11 +1108,12 @@ function LinkTooltip(_ref3) {
1098
1108
  }
1099
1109
 
1100
1110
  return /*#__PURE__*/React.createElement("div", {
1101
- className: classNames(styles$7.linkTooltip, styles$7.hoveringToolbar),
1111
+ className: classNames(styles$7.linkTooltip, styles$7["linkTooltip-".concat(position)], styles$7.hoveringToolbar),
1102
1112
  onMouseEnter: keep,
1103
1113
  onMouseLeave: deactivate,
1104
1114
  style: {
1105
1115
  top: state.top,
1116
+ bottom: state.bottom,
1106
1117
  left: state.left,
1107
1118
  opacity: 1
1108
1119
  }
@@ -1124,6 +1135,10 @@ function LinkDestination(_ref4) {
1124
1135
  return /*#__PURE__*/React.createElement(SectionLinkDestination, {
1125
1136
  permaId: href.section
1126
1137
  });
1138
+ } else if (href === null || href === void 0 ? void 0 : href.file) {
1139
+ return /*#__PURE__*/React.createElement(FileLinkDestination, {
1140
+ fileOptions: href.file
1141
+ });
1127
1142
  } else {
1128
1143
  return /*#__PURE__*/React.createElement(ExternalLinkDestination, {
1129
1144
  href: href,
@@ -1144,7 +1159,7 @@ function ChapterLinkDestination(_ref5) {
1144
1159
  t = _useI18n.t;
1145
1160
 
1146
1161
  if (!chapter) {
1147
- return '(Deleted chapter)';
1162
+ return /*#__PURE__*/React.createElement("span", null, t('pageflow_scrolled.inline_editing.link_tooltip.deleted_chapter'));
1148
1163
  }
1149
1164
 
1150
1165
  return /*#__PURE__*/React.createElement("a", {
@@ -1197,6 +1212,29 @@ function ExternalLinkDestination(_ref7) {
1197
1212
  }, openInNewTab ? t('pageflow_scrolled.inline_editing.link_tooltip.opens_in_new_tab') : t('pageflow_scrolled.inline_editing.link_tooltip.opens_in_same_tab')));
1198
1213
  }
1199
1214
 
1215
+ function FileLinkDestination(_ref8) {
1216
+ var fileOptions = _ref8.fileOptions;
1217
+ var file = useFile(fileOptions);
1218
+
1219
+ var _useI18n4 = useI18n({
1220
+ locale: 'ui'
1221
+ }),
1222
+ t = _useI18n4.t;
1223
+
1224
+ if (!file) {
1225
+ return /*#__PURE__*/React.createElement("span", null, t('pageflow_scrolled.inline_editing.link_tooltip.deleted_file'));
1226
+ }
1227
+
1228
+ return /*#__PURE__*/React.createElement("a", {
1229
+ href: file.urls.original,
1230
+ target: "_blank",
1231
+ rel: "noopener noreferrer"
1232
+ }, file.urls.original.split('/').pop(), /*#__PURE__*/React.createElement(ExternalLinkIcon, {
1233
+ width: 10,
1234
+ height: 10
1235
+ }));
1236
+ }
1237
+
1200
1238
  function withLinks(editor) {
1201
1239
  var isInline = editor.isInline;
1202
1240
 
@@ -1258,20 +1296,28 @@ function useDropTargetsActive() {
1258
1296
  return [dropTargetsActive, drop];
1259
1297
  }
1260
1298
 
1299
+ var abortPreviousCall;
1261
1300
  function useSelectLinkDestination() {
1262
1301
  return function () {
1263
1302
  return new Promise(function (resolve, reject) {
1303
+ if (abortPreviousCall) {
1304
+ abortPreviousCall();
1305
+ }
1306
+
1307
+ abortPreviousCall = function abortPreviousCall() {
1308
+ window.removeEventListener('message', receive);
1309
+ reject();
1310
+ };
1311
+
1264
1312
  postSelectLinkDestinationMessage();
1265
1313
  window.addEventListener('message', receive);
1266
1314
 
1267
1315
  function receive(message) {
1268
1316
  if (window.location.href.indexOf(message.origin) === 0) {
1269
1317
  if (message.data.type === 'LINK_DESTINATION_SELECTED') {
1318
+ abortPreviousCall = null;
1270
1319
  window.removeEventListener('message', receive);
1271
1320
  resolve(message.data.payload);
1272
- } else if (message.data.type === 'LINK_DESTINATION_SELECTION_ABORTED') {
1273
- window.removeEventListener('message', receive);
1274
- reject();
1275
1321
  }
1276
1322
  }
1277
1323
  }
@@ -1454,7 +1500,8 @@ var LinkIcon = (function (_ref) {
1454
1500
  }));
1455
1501
  });
1456
1502
 
1457
- function HoveringToolbar() {
1503
+ function HoveringToolbar(_ref) {
1504
+ var position = _ref.position;
1458
1505
  var ref = useRef();
1459
1506
  var outerRef = useRef();
1460
1507
  var editor = useSlate();
@@ -1482,11 +1529,19 @@ function HoveringToolbar() {
1482
1529
  var rect = domRange.getBoundingClientRect();
1483
1530
  var outerRect = outerRef.current.getBoundingClientRect();
1484
1531
  el.style.opacity = 1;
1485
- el.style.top = "".concat(rect.bottom - outerRect.top + 10, "px");
1486
1532
  el.style.left = "".concat(rect.left - outerRect.left, "px");
1533
+
1534
+ if (position === 'above') {
1535
+ el.style.top = 'auto';
1536
+ el.style.bottom = "".concat(outerRect.bottom - rect.top + 5, "px");
1537
+ } else {
1538
+ el.style.bottom = 'auto';
1539
+ el.style.top = "".concat(rect.bottom - outerRect.top + 5, "px");
1540
+ }
1487
1541
  });
1488
1542
  return /*#__PURE__*/React.createElement("div", {
1489
- ref: outerRef
1543
+ ref: outerRef,
1544
+ className: styles$7.hoveringToolbarContainer
1490
1545
  }, /*#__PURE__*/React.createElement("div", {
1491
1546
  ref: ref,
1492
1547
  className: styles$7.hoveringToolbar
@@ -1532,9 +1587,9 @@ function handleButtonClick(editor, format, selectLinkDestination) {
1532
1587
  if (isLinkActive(editor)) {
1533
1588
  unwrapLink(editor);
1534
1589
  } else {
1535
- selectLinkDestination().then(function (_ref) {
1536
- var href = _ref.href,
1537
- openInNewTab = _ref.openInNewTab;
1590
+ selectLinkDestination().then(function (_ref2) {
1591
+ var href = _ref2.href,
1592
+ openInNewTab = _ref2.openInNewTab;
1538
1593
  wrapLink(editor, href, openInNewTab);
1539
1594
  }, function () {});
1540
1595
  }
@@ -1704,21 +1759,30 @@ function toggleBlock(editor, format) {
1704
1759
  var block = _objectSpread2({
1705
1760
  type: format,
1706
1761
  children: []
1707
- }, preserveTypograpyhVariant(editor));
1762
+ }, preserveColorAndTypograpyhVariant(editor));
1708
1763
 
1709
1764
  Transforms.wrapNodes(editor, block);
1710
1765
  }
1711
1766
  }
1712
1767
  function applyTypograpyhVariant(editor, variant) {
1713
- Transforms.setNodes(editor, {
1768
+ applyProperties(editor, {
1714
1769
  variant: variant
1715
- }, {
1770
+ });
1771
+ }
1772
+ function applyColor(editor, color) {
1773
+ applyProperties(editor, {
1774
+ color: color
1775
+ });
1776
+ }
1777
+
1778
+ function applyProperties(editor, properties) {
1779
+ Transforms.setNodes(editor, properties, {
1716
1780
  mode: 'highest'
1717
1781
  });
1718
- applyTypograpyhVariantToListItems(editor, variant);
1782
+ applyPropertiesToListItems(editor, properties);
1719
1783
  }
1720
1784
 
1721
- function applyTypograpyhVariantToListItems(editor, variant) {
1785
+ function applyPropertiesToListItems(editor, properties) {
1722
1786
  var lists = Editor.nodes(editor, {
1723
1787
  match: function match(n) {
1724
1788
  return listTypes.includes(n.type);
@@ -1748,9 +1812,7 @@ function applyTypograpyhVariantToListItems(editor, variant) {
1748
1812
  var _step2$value = _slicedToArray(_step2.value, 2),
1749
1813
  itemPath = _step2$value[1];
1750
1814
 
1751
- Transforms.setNodes(editor, {
1752
- variant: variant
1753
- }, {
1815
+ Transforms.setNodes(editor, properties, {
1754
1816
  at: itemPath
1755
1817
  });
1756
1818
  }
@@ -1767,16 +1829,24 @@ function applyTypograpyhVariantToListItems(editor, variant) {
1767
1829
  }
1768
1830
  }
1769
1831
 
1770
- function preserveTypograpyhVariant(editor) {
1832
+ function preserveColorAndTypograpyhVariant(editor) {
1771
1833
  var nodeEntry = Editor.above(editor, {
1772
1834
  at: Range.start(editor.selection),
1773
1835
  match: function match(n) {
1774
1836
  return !!n.type;
1775
1837
  }
1776
1838
  });
1777
- return nodeEntry && nodeEntry[0].variant ? {
1778
- variant: nodeEntry[0].variant
1779
- } : {};
1839
+ var result = {};
1840
+
1841
+ if (nodeEntry && nodeEntry[0].variant) {
1842
+ result.variant = nodeEntry[0].variant;
1843
+ }
1844
+
1845
+ if (nodeEntry && nodeEntry[0].color) {
1846
+ result.color = nodeEntry[0].color;
1847
+ }
1848
+
1849
+ return result;
1780
1850
  }
1781
1851
 
1782
1852
  function withBlockNormalization(_ref, editor) {
@@ -2027,7 +2097,7 @@ function Selection(props) {
2027
2097
  range = _useContentElementEdi.range;
2028
2098
 
2029
2099
  useEffect(function () {
2030
- var _getUniformSelectedNo;
2100
+ var _getUniformSelectedNo, _getUniformSelectedNo2;
2031
2101
 
2032
2102
  var selection = editor.selection;
2033
2103
 
@@ -2084,7 +2154,8 @@ function Selection(props) {
2084
2154
  setTransientState({
2085
2155
  editableTextIsSingleBlock: editor.children.length <= 1,
2086
2156
  exampleNode: getUniformSelectedNode(editor, 'type'),
2087
- typographyVariant: (_getUniformSelectedNo = getUniformSelectedNode(editor, 'variant')) === null || _getUniformSelectedNo === void 0 ? void 0 : _getUniformSelectedNo.variant
2157
+ typographyVariant: (_getUniformSelectedNo = getUniformSelectedNode(editor, 'variant')) === null || _getUniformSelectedNo === void 0 ? void 0 : _getUniformSelectedNo.variant,
2158
+ color: (_getUniformSelectedNo2 = getUniformSelectedNode(editor, 'color')) === null || _getUniformSelectedNo2 === void 0 ? void 0 : _getUniformSelectedNo2.color
2088
2159
  });
2089
2160
  boundsRef.current = {
2090
2161
  start: start,
@@ -2463,13 +2534,24 @@ var EditableText = React.memo(function EditableText(_ref) {
2463
2534
  placeholder = _ref.placeholder,
2464
2535
  onChange = _ref.onChange,
2465
2536
  selectionRect = _ref.selectionRect,
2466
- className = _ref.className;
2537
+ className = _ref.className,
2538
+ placeholderClassName = _ref.placeholderClassName,
2539
+ _ref$scaleCategory = _ref.scaleCategory,
2540
+ scaleCategory = _ref$scaleCategory === void 0 ? 'body' : _ref$scaleCategory,
2541
+ autoFocus = _ref.autoFocus,
2542
+ _ref$floatingControls = _ref.floatingControlsPosition,
2543
+ floatingControlsPosition = _ref$floatingControls === void 0 ? 'below' : _ref$floatingControls;
2467
2544
  var editor = useMemo(function () {
2468
2545
  return withLinks(withCustomInsertBreak(withBlockNormalization({
2469
2546
  onlyParagraphs: !selectionRect
2470
2547
  }, withLineBreakNormalization(withReact(createEditor())))));
2471
2548
  }, [selectionRect]);
2472
2549
  var handleLineBreaks = useLineBreakHandler(editor);
2550
+ useEffect(function () {
2551
+ if (autoFocus) {
2552
+ ReactEditor.focus(editor);
2553
+ }
2554
+ }, [autoFocus, editor]);
2473
2555
 
2474
2556
  var _useCachedValue = useCachedValue(value, {
2475
2557
  defaultValue: [{
@@ -2495,8 +2577,14 @@ var EditableText = React.memo(function EditableText(_ref) {
2495
2577
  Transforms.removeNodes(editor, {
2496
2578
  mode: 'highest'
2497
2579
  });
2498
- } else if (command.type === 'TRANSIENT_STATE_UPDATE' && 'typographyVariant' in command.payload) {
2499
- applyTypograpyhVariant(editor, command.payload.typographyVariant);
2580
+ } else if (command.type === 'TRANSIENT_STATE_UPDATE') {
2581
+ if ('typographyVariant' in command.payload) {
2582
+ applyTypograpyhVariant(editor, command.payload.typographyVariant);
2583
+ }
2584
+
2585
+ if ('color' in command.payload) {
2586
+ applyColor(editor, command.payload.color);
2587
+ }
2500
2588
  }
2501
2589
  });
2502
2590
 
@@ -2506,7 +2594,7 @@ var EditableText = React.memo(function EditableText(_ref) {
2506
2594
  ref = _useDropTargetsActive2[1];
2507
2595
 
2508
2596
  return /*#__PURE__*/React.createElement(Text$1, {
2509
- scaleCategory: "body"
2597
+ scaleCategory: scaleCategory
2510
2598
  }, /*#__PURE__*/React.createElement("div", {
2511
2599
  className: classNames(styles$7.container, _defineProperty({}, styles$7.selected, isSelected)),
2512
2600
  ref: ref
@@ -2515,12 +2603,15 @@ var EditableText = React.memo(function EditableText(_ref) {
2515
2603
  value: cachedValue,
2516
2604
  onChange: setCachedValue
2517
2605
  }, /*#__PURE__*/React.createElement(LinkTooltipProvider, {
2518
- editor: editor
2606
+ editor: editor,
2607
+ position: floatingControlsPosition
2519
2608
  }, selectionRect && /*#__PURE__*/React.createElement(Selection, {
2520
2609
  contentElementId: contentElementId
2521
2610
  }), dropTargetsActive && /*#__PURE__*/React.createElement(DropTargets$1, {
2522
2611
  contentElementId: contentElementId
2523
- }), /*#__PURE__*/React.createElement(HoveringToolbar, null), /*#__PURE__*/React.createElement(Editable, {
2612
+ }), /*#__PURE__*/React.createElement(HoveringToolbar, {
2613
+ position: floatingControlsPosition
2614
+ }), /*#__PURE__*/React.createElement(Editable, {
2524
2615
  className: className,
2525
2616
  decorate: decorateLineBreaks,
2526
2617
  onKeyDown: handleLineBreaks,
@@ -2528,6 +2619,7 @@ var EditableText = React.memo(function EditableText(_ref) {
2528
2619
  renderLeaf: renderLeafWithLineBreakDecoration
2529
2620
  }))), /*#__PURE__*/React.createElement(TextPlaceholder, {
2530
2621
  text: placeholder,
2622
+ className: placeholderClassName,
2531
2623
  visible: isBlank(cachedValue)
2532
2624
  })));
2533
2625
  });
@@ -2679,6 +2771,55 @@ function renderLeaf(_ref2) {
2679
2771
  return /*#__PURE__*/React.createElement("span", attributes, children);
2680
2772
  }
2681
2773
 
2774
+ var styles$a = {"button":"ActionButton-module_button__8gy6J","position-outside":"ActionButton-module_position-outside__1E_lp","position-outsideIndented":"ActionButton-module_position-outsideIndented__3vf-7","position-inside":"ActionButton-module_position-inside__28_gp"};
2775
+
2776
+ function _extends$e() {
2777
+ _extends$e = Object.assign || function (target) {
2778
+ for (var i = 1; i < arguments.length; i++) {
2779
+ var source = arguments[i];
2780
+
2781
+ for (var key in source) {
2782
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
2783
+ target[key] = source[key];
2784
+ }
2785
+ }
2786
+ }
2787
+
2788
+ return target;
2789
+ };
2790
+
2791
+ return _extends$e.apply(this, arguments);
2792
+ }
2793
+ var pencil = (function (_ref) {
2794
+ var _ref$styles = _ref.styles,
2795
+ props = _objectWithoutProperties(_ref, ["styles"]);
2796
+
2797
+ return /*#__PURE__*/React.createElement("svg", _extends$e({
2798
+ xmlns: "http://www.w3.org/2000/svg",
2799
+ viewBox: "0 0 512 512"
2800
+ }, props), /*#__PURE__*/React.createElement("path", {
2801
+ d: "M410.3 231l11.3-11.3-33.9-33.9-62.1-62.1-33.9-33.9-11.3 11.3-22.6 22.6L58.6 322.9c-10.4 10.4-18 23.3-22.2 37.4L1 480.7c-2.5 8.4-.2 17.5 6.1 23.7s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2l199.2-199.2 22.6-22.7zM160 399.4l-9.1 22.7c-4 3.1-8.5 5.4-13.3 6.9l-78.2 23 23-78.1c1.4-4.9 3.8-9.4 6.9-13.3l22.7-9.1v32c0 8.8 7.2 16 16 16h32zM362.7 18.7l-14.4 14.5-22.6 22.6-11.4 11.3 33.9 33.9 62.1 62.1 33.9 33.9 11.3-11.3 22.6-22.6 14.5-14.5c25-25 25-65.5 0-90.5l-39.3-39.4c-25-25-65.5-25-90.5 0zm-47.4 168l-144 144c-6.2 6.2-16.4 6.2-22.6 0s-6.2-16.4 0-22.6l144-144c6.2-6.2 16.4-6.2 22.6 0s6.2 16.4 0 22.6z"
2802
+ }));
2803
+ });
2804
+
2805
+ var icons = {
2806
+ pencil: pencil
2807
+ };
2808
+ function ActionButton(_ref) {
2809
+ var icon = _ref.icon,
2810
+ text = _ref.text,
2811
+ position = _ref.position,
2812
+ onClick = _ref.onClick;
2813
+ var Icon = icons[icon];
2814
+ return /*#__PURE__*/React.createElement("button", {
2815
+ className: classNames(styles$a.button, styles$a["position-".concat(position)]),
2816
+ onClick: onClick
2817
+ }, /*#__PURE__*/React.createElement(Icon, {
2818
+ width: 15,
2819
+ height: 15
2820
+ }), text);
2821
+ }
2822
+
2682
2823
  function PhonePlatformProvider(_ref) {
2683
2824
  var children = _ref.children;
2684
2825
 
@@ -2709,4 +2850,4 @@ function PhonePlatformProvider(_ref) {
2709
2850
  }, children);
2710
2851
  }
2711
2852
 
2712
- export { ContentDecorator, ContentElementDecorator, EditableInlineText, EditableText, LayoutWithPlaceholder, PhonePlatformProvider, SectionDecorator };
2853
+ export { ActionButton, ContentDecorator, ContentElementDecorator, EditableInlineText, EditableText, LayoutWithPlaceholder, PhonePlatformProvider, SectionDecorator };