pageflow 16.0.0 → 16.2.0

Sign up to get free protection for your applications and to get access to all the features.
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 };