@plone/volto 18.0.0-alpha.2 → 18.0.0-alpha.4

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 (293) hide show
  1. package/.eslintrc +3 -3
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +12 -0
  4. package/{packages/registry/.release-it.json → .release-it.json} +11 -6
  5. package/CHANGELOG.md +44 -4
  6. package/locales/ca/LC_MESSAGES/volto.po +1 -0
  7. package/locales/de/LC_MESSAGES/volto.po +1 -0
  8. package/locales/en/LC_MESSAGES/volto.po +1 -0
  9. package/locales/es/LC_MESSAGES/volto.po +1 -0
  10. package/locales/eu/LC_MESSAGES/volto.po +1 -0
  11. package/locales/fi/LC_MESSAGES/volto.po +1 -0
  12. package/locales/fr/LC_MESSAGES/volto.po +1 -0
  13. package/locales/it/LC_MESSAGES/volto.po +1 -0
  14. package/locales/ja/LC_MESSAGES/volto.po +1 -0
  15. package/locales/nl/LC_MESSAGES/volto.po +1 -0
  16. package/locales/pt/LC_MESSAGES/volto.po +1 -0
  17. package/locales/pt_BR/LC_MESSAGES/volto.po +1 -0
  18. package/locales/ro/LC_MESSAGES/volto.po +1 -0
  19. package/locales/volto.pot +2 -1
  20. package/locales/zh_CN/LC_MESSAGES/volto.po +1 -0
  21. package/package.json +57 -127
  22. package/razzle.config.js +4 -7
  23. package/src/components/manage/Blocks/Video/Body.jsx +52 -22
  24. package/src/components/manage/Blocks/Video/Body.test.jsx +167 -0
  25. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +2 -2
  26. package/src/components/manage/Form/Form.jsx +5 -2
  27. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +19 -2
  28. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +46 -39
  29. package/src/config/index.js +0 -4
  30. package/src/icons/divide-horizontal.svg +0 -0
  31. package/src/icons/divide-vertical.svg +0 -0
  32. package/src/icons/hero.svg +0 -0
  33. package/src/icons/slider.svg +0 -0
  34. package/src/icons/summary.svg +0 -0
  35. package/src/middleware/api.js +1 -1
  36. package/theme/themes/default/elements/icon.overrides +0 -0
  37. package/theme/themes/default/globals/reset.overrides +0 -0
  38. package/theme/themes/default/globals/site.variables +0 -0
  39. package/theme/themes/default/modules/dropdown.overrides +0 -0
  40. package/theme/themes/default/modules/dropdown.variables +0 -0
  41. package/theme/themes/default/modules/modal.variables +0 -0
  42. package/theme/themes/default/modules/video.overrides +0 -0
  43. package/theme/themes/default/modules/video.variables +0 -0
  44. package/theme/themes/pastanaga/assets/fonts/icons.eot +0 -0
  45. package/theme/themes/pastanaga/assets/fonts/icons.svg +0 -0
  46. package/theme/themes/pastanaga/assets/fonts/icons.ttf +0 -0
  47. package/theme/themes/pastanaga/assets/fonts/icons.woff +0 -0
  48. package/theme/themes/pastanaga/globals/reset.overrides +0 -0
  49. package/theme/themes/pastanaga/globals/site.variables +0 -0
  50. package/theme/themes/pastanaga/modules/dropdown.variables +0 -0
  51. package/theme/themes/pastanaga/modules/modal.variables +0 -0
  52. package/theme/themes/pastanaga/modules/video.overrides +0 -0
  53. package/theme/themes/pastanaga/modules/video.variables +0 -0
  54. package/tsconfig.json +1 -4
  55. package/types/components/manage/Blocks/Video/Body.d.ts +5 -0
  56. package/types/config/RichTextEditor/index.d.ts +5 -8
  57. package/types/helpers/AsyncConnect/index.d.ts +2 -2
  58. package/types/helpers/Url/Url.d.ts +3 -3
  59. package/types/icons/load-icons.d.ts +1 -1
  60. package/webpack-plugins/webpack-less-plugin.js +1 -0
  61. package/CODE_OF_CONDUCT.md +0 -13
  62. package/CONTRIBUTING.md +0 -7
  63. package/README.md +0 -154
  64. package/RELEASING.md +0 -73
  65. package/ROADMAP.md +0 -30
  66. package/SECURITY.md +0 -14
  67. package/logos/Logo.png +0 -0
  68. package/logos/VoltoLogoEra2-dark-mode.png +0 -0
  69. package/logos/VoltoLogoEra2.png +0 -0
  70. package/logos/volto-colorful.png +0 -0
  71. package/logos/volto-colorful.svg +0 -35
  72. package/logos/volto-guide.png +0 -0
  73. package/logos/volto-h-transparent.svg +0 -6
  74. package/logos/volto-transparent.png +0 -0
  75. package/logos/volto-transparent.svg +0 -19
  76. package/logos/volto-transparent2.svg +0 -5
  77. package/logos/volto-yellow.svg +0 -29
  78. package/logos/volto.sketch +0 -0
  79. package/packages/README.md +0 -7
  80. package/packages/registry/.towncrier/towncrier_template.jinja +0 -10
  81. package/packages/registry/CHANGELOG.md +0 -16
  82. package/packages/registry/README.md +0 -207
  83. package/packages/registry/addon-registry.js +0 -603
  84. package/packages/registry/create-addons-loader.js +0 -116
  85. package/packages/registry/create-theme-addons-loader.js +0 -78
  86. package/packages/registry/news/.gitkeep +0 -0
  87. package/packages/registry/package.json +0 -76
  88. package/packages/registry/src/index.ts +0 -174
  89. package/packages/registry/src/registry.test.js +0 -111
  90. package/packages/registry/tsconfig.json +0 -32
  91. package/packages/scripts/CHANGELOG.md +0 -173
  92. package/packages/scripts/README.md +0 -128
  93. package/packages/scripts/addon/consolidate.js +0 -28
  94. package/packages/scripts/addon/generators.js +0 -213
  95. package/packages/scripts/addon/getAddonInfo.js +0 -65
  96. package/packages/scripts/addon/index.js +0 -88
  97. package/packages/scripts/addon/utils.js +0 -44
  98. package/packages/scripts/backportpr.js +0 -75
  99. package/packages/scripts/changelogupdater.cjs +0 -94
  100. package/packages/scripts/corepackagebump.js +0 -20
  101. package/packages/scripts/i18n.cjs +0 -310
  102. package/packages/scripts/package.json +0 -76
  103. package/packages/scripts/templates/towncrier_template.jinja +0 -10
  104. package/packages/types/Blocks/View.ts +0 -11
  105. package/packages/types/actions.ts +0 -15
  106. package/packages/types/breadcrumbs.ts +0 -10
  107. package/packages/types/config/Blocks.ts +0 -153
  108. package/packages/types/config/Content.ts +0 -62
  109. package/packages/types/config/Settings.ts +0 -86
  110. package/packages/types/config/Views.ts +0 -15
  111. package/packages/types/config/Widgets.ts +0 -7
  112. package/packages/types/config/index.ts +0 -21
  113. package/packages/types/content/common.ts +0 -60
  114. package/packages/types/content/get.ts +0 -66
  115. package/packages/types/index.ts +0 -0
  116. package/packages/types/navigation.ts +0 -12
  117. package/packages/types/package.json +0 -64
  118. package/packages/types/types.ts +0 -61
  119. package/packages/volto-slate/.i18n.babel.config.js +0 -1
  120. package/packages/volto-slate/README.md +0 -4
  121. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +0 -90
  122. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +0 -6
  123. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +0 -6
  124. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +0 -6
  125. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +0 -10
  126. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +0 -10
  127. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +0 -30
  128. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +0 -10
  129. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +0 -6
  130. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +0 -6
  131. package/packages/volto-slate/locales/de/LC_MESSAGES/volto.po +0 -148
  132. package/packages/volto-slate/locales/en/LC_MESSAGES/volto.po +0 -148
  133. package/packages/volto-slate/locales/volto.pot +0 -182
  134. package/packages/volto-slate/package.json +0 -43
  135. package/packages/volto-slate/src/actions/content.js +0 -30
  136. package/packages/volto-slate/src/actions/index.js +0 -3
  137. package/packages/volto-slate/src/actions/plugins.js +0 -9
  138. package/packages/volto-slate/src/actions/selection.js +0 -22
  139. package/packages/volto-slate/src/blocks/Table/Cell.jsx +0 -87
  140. package/packages/volto-slate/src/blocks/Table/Cell.test.js +0 -54
  141. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +0 -694
  142. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.test.js +0 -40
  143. package/packages/volto-slate/src/blocks/Table/TableBlockView.jsx +0 -150
  144. package/packages/volto-slate/src/blocks/Table/TableBlockView.test.js +0 -49
  145. package/packages/volto-slate/src/blocks/Table/deconstruct.js +0 -113
  146. package/packages/volto-slate/src/blocks/Table/extensions/normalizeTable.js +0 -5
  147. package/packages/volto-slate/src/blocks/Table/index.js +0 -60
  148. package/packages/volto-slate/src/blocks/Table/schema.js +0 -122
  149. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +0 -304
  150. package/packages/volto-slate/src/blocks/Text/DetachedTextBlockEditor.jsx +0 -77
  151. package/packages/volto-slate/src/blocks/Text/MarkdownIntroduction.jsx +0 -59
  152. package/packages/volto-slate/src/blocks/Text/PluginSidebar.jsx +0 -18
  153. package/packages/volto-slate/src/blocks/Text/ShortcutListing.jsx +0 -28
  154. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +0 -203
  155. package/packages/volto-slate/src/blocks/Text/TextBlockEdit.jsx +0 -38
  156. package/packages/volto-slate/src/blocks/Text/TextBlockEdit.test.js +0 -107
  157. package/packages/volto-slate/src/blocks/Text/TextBlockSchema.js +0 -54
  158. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +0 -31
  159. package/packages/volto-slate/src/blocks/Text/css/editor.css +0 -18
  160. package/packages/volto-slate/src/blocks/Text/extensions/Readme.md +0 -49
  161. package/packages/volto-slate/src/blocks/Text/extensions/breakList.js +0 -100
  162. package/packages/volto-slate/src/blocks/Text/extensions/index.js +0 -6
  163. package/packages/volto-slate/src/blocks/Text/extensions/insertBreak.js +0 -57
  164. package/packages/volto-slate/src/blocks/Text/extensions/isSelected.js +0 -7
  165. package/packages/volto-slate/src/blocks/Text/extensions/normalizeExternalData.js +0 -7
  166. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +0 -87
  167. package/packages/volto-slate/src/blocks/Text/extensions/withLists.js +0 -5
  168. package/packages/volto-slate/src/blocks/Text/index.js +0 -171
  169. package/packages/volto-slate/src/blocks/Text/keyboard/backspaceInList.js +0 -58
  170. package/packages/volto-slate/src/blocks/Text/keyboard/breakBlocks.js +0 -3
  171. package/packages/volto-slate/src/blocks/Text/keyboard/cancelEsc.js +0 -7
  172. package/packages/volto-slate/src/blocks/Text/keyboard/indentListItems.js +0 -240
  173. package/packages/volto-slate/src/blocks/Text/keyboard/index.js +0 -52
  174. package/packages/volto-slate/src/blocks/Text/keyboard/joinBlocks.js +0 -180
  175. package/packages/volto-slate/src/blocks/Text/keyboard/moveListItems.js +0 -124
  176. package/packages/volto-slate/src/blocks/Text/keyboard/slashMenu.js +0 -19
  177. package/packages/volto-slate/src/blocks/Text/keyboard/softBreak.js +0 -7
  178. package/packages/volto-slate/src/blocks/Text/keyboard/traverseBlocks.js +0 -81
  179. package/packages/volto-slate/src/blocks/Text/keyboard/unwrapEmptyString.js +0 -26
  180. package/packages/volto-slate/src/blocks/Text/schema.js +0 -39
  181. package/packages/volto-slate/src/constants.js +0 -123
  182. package/packages/volto-slate/src/editor/EditorContext.jsx +0 -5
  183. package/packages/volto-slate/src/editor/EditorReference.jsx +0 -22
  184. package/packages/volto-slate/src/editor/SlateEditor.jsx +0 -375
  185. package/packages/volto-slate/src/editor/config.jsx +0 -344
  186. package/packages/volto-slate/src/editor/decorate.js +0 -68
  187. package/packages/volto-slate/src/editor/deserialize.js +0 -185
  188. package/packages/volto-slate/src/editor/extensions/index.js +0 -6
  189. package/packages/volto-slate/src/editor/extensions/insertBreak.js +0 -15
  190. package/packages/volto-slate/src/editor/extensions/insertData.js +0 -159
  191. package/packages/volto-slate/src/editor/extensions/isInline.js +0 -14
  192. package/packages/volto-slate/src/editor/extensions/normalizeExternalData.js +0 -8
  193. package/packages/volto-slate/src/editor/extensions/normalizeNode.js +0 -48
  194. package/packages/volto-slate/src/editor/extensions/withDeserializers.js +0 -15
  195. package/packages/volto-slate/src/editor/extensions/withTestingFeatures.jsx +0 -84
  196. package/packages/volto-slate/src/editor/index.js +0 -14
  197. package/packages/volto-slate/src/editor/less/editor.less +0 -173
  198. package/packages/volto-slate/src/editor/less/globals.less +0 -18
  199. package/packages/volto-slate/src/editor/less/slate.less +0 -28
  200. package/packages/volto-slate/src/editor/plugins/AdvancedLink/deserialize.js +0 -90
  201. package/packages/volto-slate/src/editor/plugins/AdvancedLink/extensions.js +0 -32
  202. package/packages/volto-slate/src/editor/plugins/AdvancedLink/index.js +0 -50
  203. package/packages/volto-slate/src/editor/plugins/AdvancedLink/render.jsx +0 -37
  204. package/packages/volto-slate/src/editor/plugins/AdvancedLink/schema.js +0 -114
  205. package/packages/volto-slate/src/editor/plugins/AdvancedLink/styles.less +0 -8
  206. package/packages/volto-slate/src/editor/plugins/Blockquote/index.js +0 -30
  207. package/packages/volto-slate/src/editor/plugins/Callout/index.js +0 -34
  208. package/packages/volto-slate/src/editor/plugins/Image/deconstruct.js +0 -30
  209. package/packages/volto-slate/src/editor/plugins/Image/extensions.js +0 -51
  210. package/packages/volto-slate/src/editor/plugins/Image/index.js +0 -11
  211. package/packages/volto-slate/src/editor/plugins/Image/render.jsx +0 -22
  212. package/packages/volto-slate/src/editor/plugins/Link/extensions.js +0 -58
  213. package/packages/volto-slate/src/editor/plugins/Link/index.js +0 -164
  214. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +0 -54
  215. package/packages/volto-slate/src/editor/plugins/Markdown/constants.js +0 -81
  216. package/packages/volto-slate/src/editor/plugins/Markdown/extensions.js +0 -334
  217. package/packages/volto-slate/src/editor/plugins/Markdown/index.js +0 -28
  218. package/packages/volto-slate/src/editor/plugins/Markdown/utils.js +0 -198
  219. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +0 -153
  220. package/packages/volto-slate/src/editor/plugins/StyleMenu/index.js +0 -19
  221. package/packages/volto-slate/src/editor/plugins/StyleMenu/style.less +0 -29
  222. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +0 -168
  223. package/packages/volto-slate/src/editor/plugins/Table/TableButton.jsx +0 -142
  224. package/packages/volto-slate/src/editor/plugins/Table/TableCell.jsx +0 -44
  225. package/packages/volto-slate/src/editor/plugins/Table/TableContainer.jsx +0 -37
  226. package/packages/volto-slate/src/editor/plugins/Table/TableSizePicker.jsx +0 -83
  227. package/packages/volto-slate/src/editor/plugins/Table/extensions.js +0 -87
  228. package/packages/volto-slate/src/editor/plugins/Table/index.js +0 -390
  229. package/packages/volto-slate/src/editor/plugins/Table/less/public.less +0 -29
  230. package/packages/volto-slate/src/editor/plugins/Table/less/table.less +0 -28
  231. package/packages/volto-slate/src/editor/plugins/Table/render.jsx +0 -30
  232. package/packages/volto-slate/src/editor/plugins/index.js +0 -19
  233. package/packages/volto-slate/src/editor/render.jsx +0 -224
  234. package/packages/volto-slate/src/editor/ui/BasicToolbar.jsx +0 -11
  235. package/packages/volto-slate/src/editor/ui/BlockButton.jsx +0 -31
  236. package/packages/volto-slate/src/editor/ui/ClearFormattingButton.jsx +0 -21
  237. package/packages/volto-slate/src/editor/ui/ExpandedToolbar.jsx +0 -18
  238. package/packages/volto-slate/src/editor/ui/Expando.jsx +0 -5
  239. package/packages/volto-slate/src/editor/ui/InlineToolbar.jsx +0 -73
  240. package/packages/volto-slate/src/editor/ui/MarkButton.jsx +0 -23
  241. package/packages/volto-slate/src/editor/ui/MarkElementButton.jsx +0 -30
  242. package/packages/volto-slate/src/editor/ui/Menu.jsx +0 -13
  243. package/packages/volto-slate/src/editor/ui/PositionedToolbar.jsx +0 -32
  244. package/packages/volto-slate/src/editor/ui/Separator.jsx +0 -7
  245. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +0 -13
  246. package/packages/volto-slate/src/editor/ui/SlateToolbar.jsx +0 -96
  247. package/packages/volto-slate/src/editor/ui/Toolbar.jsx +0 -103
  248. package/packages/volto-slate/src/editor/ui/ToolbarButton.jsx +0 -33
  249. package/packages/volto-slate/src/editor/ui/ToolbarButton.test.js +0 -25
  250. package/packages/volto-slate/src/editor/ui/index.js +0 -15
  251. package/packages/volto-slate/src/editor/utils.js +0 -248
  252. package/packages/volto-slate/src/elementEditor/ContextButtons.jsx +0 -56
  253. package/packages/volto-slate/src/elementEditor/PluginEditor.jsx +0 -124
  254. package/packages/volto-slate/src/elementEditor/Readme.md +0 -6
  255. package/packages/volto-slate/src/elementEditor/SchemaProvider.jsx +0 -3
  256. package/packages/volto-slate/src/elementEditor/SidebarEditor.jsx +0 -46
  257. package/packages/volto-slate/src/elementEditor/ToolbarButton.jsx +0 -44
  258. package/packages/volto-slate/src/elementEditor/index.js +0 -5
  259. package/packages/volto-slate/src/elementEditor/makeInlineElementPlugin.js +0 -100
  260. package/packages/volto-slate/src/elementEditor/messages.js +0 -14
  261. package/packages/volto-slate/src/elementEditor/utils.js +0 -226
  262. package/packages/volto-slate/src/hooks/index.js +0 -3
  263. package/packages/volto-slate/src/hooks/useEditorContext.js +0 -6
  264. package/packages/volto-slate/src/hooks/useIsomorphicLayoutEffect.js +0 -7
  265. package/packages/volto-slate/src/hooks/useSelectionPosition.js +0 -25
  266. package/packages/volto-slate/src/i18n.js +0 -180
  267. package/packages/volto-slate/src/icons/hashlink.svg +0 -57
  268. package/packages/volto-slate/src/index.js +0 -61
  269. package/packages/volto-slate/src/reducers/content.js +0 -74
  270. package/packages/volto-slate/src/reducers/index.js +0 -3
  271. package/packages/volto-slate/src/reducers/plugins.js +0 -17
  272. package/packages/volto-slate/src/reducers/selection.js +0 -16
  273. package/packages/volto-slate/src/utils/blocks.js +0 -375
  274. package/packages/volto-slate/src/utils/blocks.test.js +0 -138
  275. package/packages/volto-slate/src/utils/editor.js +0 -31
  276. package/packages/volto-slate/src/utils/image.js +0 -25
  277. package/packages/volto-slate/src/utils/index.js +0 -11
  278. package/packages/volto-slate/src/utils/internals.js +0 -46
  279. package/packages/volto-slate/src/utils/lists.js +0 -92
  280. package/packages/volto-slate/src/utils/marks.js +0 -104
  281. package/packages/volto-slate/src/utils/mime-types.js +0 -24
  282. package/packages/volto-slate/src/utils/nodes.js +0 -4
  283. package/packages/volto-slate/src/utils/ops.js +0 -20
  284. package/packages/volto-slate/src/utils/random.js +0 -17
  285. package/packages/volto-slate/src/utils/selection.js +0 -236
  286. package/packages/volto-slate/src/utils/slate-string-utils.js +0 -408
  287. package/packages/volto-slate/src/utils/volto-blocks.js +0 -314
  288. package/packages/volto-slate/src/widgets/ErrorBoundary.jsx +0 -27
  289. package/packages/volto-slate/src/widgets/HtmlSlateWidget.jsx +0 -139
  290. package/packages/volto-slate/src/widgets/ObjectByTypeWidget.jsx +0 -49
  291. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +0 -72
  292. package/packages/volto-slate/src/widgets/RichTextWidgetView.jsx +0 -37
  293. package/packages/volto-slate/src/widgets/style.css +0 -21
@@ -1,103 +0,0 @@
1
- import cx from 'classnames';
2
- import React, { useRef, useEffect } from 'react';
3
- import { Portal } from 'react-portal';
4
- import { useSlate } from 'slate-react';
5
- import Separator from './Separator';
6
- import BasicToolbar from './BasicToolbar';
7
- import { Editor, Node } from 'slate';
8
- import { ReactEditor } from 'slate-react';
9
-
10
- const Toolbar = ({
11
- elementType,
12
- enableExpando = false,
13
- toggleButton,
14
- className,
15
- children,
16
- show = true,
17
- }) => {
18
- const ref = useRef();
19
- const editor = useSlate();
20
-
21
- useEffect(() => {
22
- const domNode = ref.current;
23
- let rect = { width: 1, top: 0, left: 0 };
24
-
25
- if ((children || []).length === 0) {
26
- domNode.removeAttribute('style');
27
- return;
28
- }
29
-
30
- if (!show) {
31
- domNode.removeAttribute('style');
32
- return;
33
- }
34
-
35
- const { selection } = editor;
36
- // const savedSelection = editor.getSavedSelection();
37
- if (!selection) {
38
- domNode.removeAttribute('style');
39
- return;
40
- }
41
-
42
- if (editor.isSidebarOpen) {
43
- domNode.removeAttribute('style');
44
- return;
45
- }
46
-
47
- if (elementType) {
48
- const [element] = Editor.nodes(editor, {
49
- at: editor.selection || editor.getSavedSelection(),
50
- match: (n) => n.type === elementType,
51
- });
52
-
53
- if (!element) {
54
- domNode.removeAttribute('style');
55
- return;
56
- }
57
-
58
- const [node] = element;
59
- const domEl = ReactEditor.toDOMNode(editor, node);
60
-
61
- rect = domEl.getBoundingClientRect();
62
- } else {
63
- // TODO: should we fallback to editor.getSelection()?
64
- // TODO: test with third party plugins
65
- const slateNode = Node.get(editor, selection.anchor.path);
66
- try {
67
- const domEl = ReactEditor.toDOMNode(editor, slateNode);
68
- rect = domEl.getBoundingClientRect();
69
- } catch {
70
- // ignoring error here is safe, editor is out of sync and the selection
71
- // is actually none, so no toolbar should be shown
72
- }
73
- }
74
-
75
- domNode.style.opacity = 1;
76
- domNode.style.top = `${
77
- rect.top + window.pageYOffset - domNode.offsetHeight - 6
78
- }px`;
79
- domNode.style.left = `${Math.max(
80
- rect.left + window.pageXOffset - domNode.offsetWidth / 2 + rect.width / 2,
81
- 0, // if the left edge of the toolbar should be otherwise offscreen
82
- )}px`;
83
- });
84
-
85
- return (
86
- <Portal>
87
- <BasicToolbar
88
- className={cx('slate-inline-toolbar', { [className]: className })}
89
- ref={ref}
90
- >
91
- {children}
92
- {enableExpando && toggleButton && (
93
- <>
94
- <Separator />
95
- {toggleButton}
96
- </>
97
- )}
98
- </BasicToolbar>
99
- </Portal>
100
- );
101
- };
102
-
103
- export default Toolbar;
@@ -1,33 +0,0 @@
1
- import cx from 'classnames';
2
- import React from 'react';
3
- import { Icon } from '@plone/volto/components';
4
- import { Button } from 'semantic-ui-react';
5
- import { useIntl } from 'react-intl';
6
-
7
- const ToolbarButton = React.forwardRef(
8
- ({ className, active, reversed, icon, style, title = '', ...props }, ref) => {
9
- const intl = useIntl();
10
- const i18ntitle =
11
- typeof title !== 'string' ? intl.formatMessage(title) : title;
12
- return (
13
- <div className="button-wrapper">
14
- <Button
15
- as="a"
16
- {...props}
17
- title={i18ntitle}
18
- ref={ref}
19
- style={style}
20
- className={cx(className)}
21
- active={active}
22
- inverted={reversed}
23
- compact
24
- toggle
25
- size="tiny"
26
- icon={icon && <Icon name={icon} size="24px" />}
27
- ></Button>
28
- </div>
29
- );
30
- },
31
- );
32
-
33
- export default ToolbarButton;
@@ -1,25 +0,0 @@
1
- import React from 'react';
2
- import configureStore from 'redux-mock-store';
3
- import { Provider } from 'react-intl-redux';
4
- import { waitFor, render } from '@testing-library/react';
5
-
6
- import ToolbarButton from './ToolbarButton';
7
-
8
- const mockStore = configureStore();
9
-
10
- describe('ToolbarButton', () => {
11
- it('renders a toolbar button', async () => {
12
- const store = mockStore({
13
- intl: {
14
- locale: 'en',
15
- messages: {},
16
- },
17
- });
18
- const { asFragment } = render(
19
- <Provider store={store}>
20
- <ToolbarButton />
21
- </Provider>,
22
- );
23
- await waitFor(() => expect(asFragment()).toMatchSnapshot());
24
- });
25
- });
@@ -1,15 +0,0 @@
1
- export { default as BasicToolbar } from './BasicToolbar';
2
- export { default as BlockButton } from './BlockButton';
3
- export { default as ClearFormattingButton } from './ClearFormattingButton';
4
- export { default as ExpandedToolbar } from './ExpandedToolbar';
5
- export { default as Expando } from './Expando';
6
- export { default as MarkButton } from './MarkButton';
7
- export { default as Menu } from './Menu';
8
- export { default as Separator } from './Separator';
9
- export { default as SlateContextToolbar } from './SlateContextToolbar';
10
- export { default as SlateToolbar } from './SlateToolbar';
11
- export { default as Toolbar } from './Toolbar';
12
- export { default as ToolbarButton } from './ToolbarButton';
13
- export { default as MarkElementButton } from './MarkElementButton';
14
- export { default as PositionedToolbar } from './PositionedToolbar';
15
- export { default as InlineToolbar } from './InlineToolbar';
@@ -1,248 +0,0 @@
1
- import { INLINE_ELEMENTS, TEXT_NODE } from '../constants';
2
-
3
- // Original at https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
4
- /**
5
- * Throughout, whitespace is defined as one of the characters
6
- * "\t" TAB \u0009
7
- * "\n" LF \u000A
8
- * "\r" CR \u000D
9
- * " " SPC \u0020
10
- *
11
- * This does not use JavaScript's "\s" because that includes non-breaking
12
- * spaces (and also some other characters).
13
- */
14
-
15
- /**
16
- * Determine whether a node's text content is entirely whitespace.
17
- *
18
- * @param nod A node implementing the |CharacterData| interface (i.e.,
19
- * a |Text|, |Comment|, or |CDATASection| node
20
- * @return True if all of the text content of |nod| is whitespace,
21
- * otherwise false.
22
- */
23
- export function is_all_ws(text) {
24
- return !/[^\t\n\r ]/.test(text);
25
- }
26
-
27
- /**
28
- * Version of |data| that doesn't include whitespace at the beginning
29
- * and end and normalizes all whitespace to a single space. (Normally
30
- * |data| is a property of text nodes that gives the text of the node.)
31
- *
32
- * @param txt The text node whose data should be returned
33
- * @return A string giving the contents of the text node with
34
- * whitespace collapsed.
35
- */
36
- export function data_of(txt) {
37
- let data = txt.textContent;
38
- data = data.replace(/[\t\n\r ]+/g, ' ');
39
- if (data[0] === ' ') {
40
- data = data.substring(1, data.length);
41
- }
42
- if (data[data.length - 1] === ' ') {
43
- data = data.substring(0, data.length - 1);
44
- }
45
- return data;
46
- }
47
-
48
- /**
49
- * Determine if a node should be ignored by the iterator functions.
50
- *
51
- * @param nod An object implementing the DOM1 |Node| interface.
52
- * @return true if the node is:
53
- * 1) A |Text| node that is all whitespace
54
- * 2) A |Comment| node
55
- * and otherwise false.
56
- */
57
-
58
- export function is_ignorable(nod) {
59
- return (
60
- nod.nodeType === 8 || // A comment node
61
- (nod.nodeType === 3 && is_all_ws(nod.textContent))
62
- ); // a text node, all ws
63
- }
64
-
65
- /**
66
- * Version of |previousSibling| that skips nodes that are entirely
67
- * whitespace or comments. (Normally |previousSibling| is a property
68
- * of all DOM nodes that gives the sibling node, the node that is
69
- * a child of the same parent, that occurs immediately before the
70
- * reference node.)
71
- *
72
- * @param sib The reference node.
73
- * @return Either:
74
- * 1) The closest previous sibling to |sib| that is not
75
- * ignorable according to |is_ignorable|, or
76
- * 2) null if no such node exists.
77
- */
78
- export function node_before(sib) {
79
- while ((sib = sib.previousSibling)) {
80
- if (!is_ignorable(sib)) {
81
- return sib;
82
- }
83
- }
84
- return null;
85
- }
86
-
87
- /**
88
- * Version of |nextSibling| that skips nodes that are entirely
89
- * whitespace or comments.
90
- *
91
- * @param sib The reference node.
92
- * @return Either:
93
- * 1) The closest next sibling to |sib| that is not
94
- * ignorable according to |is_ignorable|, or
95
- * 2) null if no such node exists.
96
- */
97
- export function node_after(sib) {
98
- while ((sib = sib.nextSibling)) {
99
- if (!is_ignorable(sib)) {
100
- return sib;
101
- }
102
- }
103
- return null;
104
- }
105
-
106
- /**
107
- * Version of |lastChild| that skips nodes that are entirely
108
- * whitespace or comments. (Normally |lastChild| is a property
109
- * of all DOM nodes that gives the last of the nodes contained
110
- * directly in the reference node.)
111
- *
112
- * @param sib The reference node.
113
- * @return Either:
114
- * 1) The last child of |sib| that is not
115
- * ignorable according to |is_ignorable|, or
116
- * 2) null if no such node exists.
117
- */
118
- export function last_child(par) {
119
- let res = par.lastChild;
120
- while (res) {
121
- if (!is_ignorable(res)) {
122
- return res;
123
- }
124
- res = res.previousSibling;
125
- }
126
- return null;
127
- }
128
-
129
- /**
130
- * Version of |firstChild| that skips nodes that are entirely
131
- * whitespace and comments.
132
- *
133
- * @param sib The reference node.
134
- * @return Either:
135
- * 1) The first child of |sib| that is not
136
- * ignorable according to |is_ignorable|, or
137
- * 2) null if no such node exists.
138
- */
139
- export function first_child(par) {
140
- let res = par.firstChild;
141
- while (res) {
142
- if (!is_ignorable(res)) {
143
- return res;
144
- }
145
- res = res.nextSibling;
146
- }
147
- return null;
148
- }
149
-
150
- export const removeSpaceBeforeAfterEndLine = (text) => {
151
- text = text.replace(/\s+\n/gm, '\n'); // space before endline
152
- text = text.replace(/\n\s+/gm, '\n'); // space after endline
153
- return text;
154
- };
155
-
156
- export const convertTabsToSpaces = (text) => text.replace(/\t/gm, ' ');
157
- export const convertLineBreaksToSpaces = (text) => text.replace(/\n/gm, ' ');
158
-
159
- export const isInline = (node) =>
160
- node &&
161
- (node.nodeType === TEXT_NODE || INLINE_ELEMENTS.includes(node.nodeName));
162
-
163
- export const removeSpaceFollowSpace = (text, node) => {
164
- // Any space immediately following another space (even across two separate
165
- // inline elements) is ignored (rule 4)
166
- text = text.replace(/ ( +)/gm, ' ');
167
- if (!text.startsWith(' ')) return text;
168
-
169
- if (node.previousSibling) {
170
- if (node.previousSibling.nodeType === TEXT_NODE) {
171
- if (node.previousSibling.textContent.endsWith(' ')) {
172
- return text.replace(/^ /, '');
173
- }
174
- } else if (isInline(node.previousSibling)) {
175
- const prevText = collapseInlineSpace(node.previousSibling);
176
- if (prevText.endsWith(' ')) {
177
- return text.replace(/^ /, '');
178
- }
179
- }
180
- } else {
181
- const parent = node.parentNode;
182
- if (parent.previousSibling) {
183
- // && isInline(parent.previousSibling)
184
- const prevText = collapseInlineSpace(parent.previousSibling);
185
- if (prevText && prevText.endsWith(' ')) {
186
- return text.replace(/^ /, '');
187
- }
188
- }
189
- }
190
-
191
- return text;
192
- };
193
-
194
- export const removeElementEdges = (text, node) => {
195
- if (
196
- !isInline(node.parentNode) &&
197
- !node.previousSibling &&
198
- text.match(/^\s/)
199
- ) {
200
- text = text.replace(/^\s+/, '');
201
- }
202
-
203
- if (text.match(/\s$/) && !node.nextSibling && !isInline(node.parentNode)) {
204
- text = text.replace(/\s$/, '');
205
- }
206
-
207
- return text;
208
- };
209
-
210
- export const collapseInlineSpace = (node) => {
211
- let text = node.textContent;
212
-
213
- // See https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
214
-
215
- // 1. all spaces and tabs immediately before and after a line break are ignored
216
-
217
- text = removeSpaceBeforeAfterEndLine(text);
218
-
219
- // 2. Next, all tab characters are handled as space characters
220
- text = convertTabsToSpaces(text);
221
-
222
- // 3. Convert all line breaks to spaces
223
- text = convertLineBreaksToSpaces(text);
224
-
225
- // 4. Any space immediately following another space
226
- // (even across two separate inline elements) is ignored
227
- text = removeSpaceFollowSpace(text, node);
228
-
229
- // 5. Sequences of spaces at the beginning and end of an element are removed
230
- text = removeElementEdges(text, node);
231
-
232
- // (volto) Return null if the element is not adjacent to an inline node
233
- // This will cause the element to be ignored in the deserialization
234
- // TODO: use the node traverse functions defined here
235
- if (
236
- is_all_ws(text) &&
237
- !(
238
- isInline(node.previousSibling) ||
239
- isInline(node.nextSibling) ||
240
- isInline(node.parentNode.nextSibling) ||
241
- isInline(node.parentNode.previousSibling)
242
- )
243
- ) {
244
- return null;
245
- }
246
-
247
- return text;
248
- };
@@ -1,56 +0,0 @@
1
- import React from 'react';
2
- import { useDispatch, useSelector } from 'react-redux';
3
- import { useIntl } from 'react-intl'; // , defineMessages
4
-
5
- import clearSVG from '@plone/volto/icons/delete.svg';
6
-
7
- import { ToolbarButton } from '@plone/volto-slate/editor/ui';
8
- import { setPluginOptions } from '@plone/volto-slate/actions';
9
-
10
- /*
11
- * Note: this is a weirder component, it should be called as a native function
12
- */
13
- export default (options) => (editor) => {
14
- const {
15
- isActiveElement,
16
- unwrapElement,
17
- pluginId,
18
- messages,
19
- toolbarButtonIcon,
20
- } = options;
21
- const intl = useIntl();
22
- const dispatch = useDispatch();
23
- const pid = `${editor.uid}-${pluginId}`;
24
- const showEditor = useSelector(
25
- (state) => state['slate_plugins']?.[pid]?.show_sidebar_editor,
26
- );
27
-
28
- return isActiveElement(editor) ? (
29
- <React.Fragment key={pluginId}>
30
- <ToolbarButton
31
- title={intl.formatMessage(messages.edit)}
32
- icon={toolbarButtonIcon}
33
- active={showEditor}
34
- aria-label={intl.formatMessage(messages.edit)}
35
- onMouseDown={() => {
36
- dispatch(
37
- setPluginOptions(pid, {
38
- show_sidebar_editor: true,
39
- }),
40
- );
41
- }}
42
- />
43
- <ToolbarButton
44
- title={intl.formatMessage(messages.delete)}
45
- icon={clearSVG}
46
- aria-label={intl.formatMessage(messages.delete)}
47
- alt={intl.formatMessage(messages.delete)}
48
- onMouseDown={() => {
49
- unwrapElement(editor);
50
- }}
51
- />
52
- </React.Fragment>
53
- ) : (
54
- ''
55
- );
56
- };
@@ -1,124 +0,0 @@
1
- /* eslint no-console: ["error", { allow: ["error"] }] */
2
- import { isEqual } from 'lodash';
3
- import React from 'react';
4
- import { useDispatch } from 'react-redux';
5
- import { ReactEditor } from 'slate-react';
6
- import { Icon as VoltoIcon, BlockDataForm } from '@plone/volto/components';
7
- import { setPluginOptions } from '@plone/volto-slate/actions';
8
- import BaseSchemaProvider from './SchemaProvider';
9
-
10
- import briefcaseSVG from '@plone/volto/icons/briefcase.svg';
11
- import checkSVG from '@plone/volto/icons/check.svg';
12
- import clearSVG from '@plone/volto/icons/clear.svg';
13
-
14
- const PluginEditor = (props) => {
15
- const {
16
- editor,
17
- schemaProvider,
18
- pluginId,
19
- getActiveElement,
20
- isActiveElement,
21
- insertElement,
22
- unwrapElement,
23
- hasValue,
24
- onChangeValues,
25
- } = props;
26
-
27
- const dispatch = useDispatch();
28
- const [formData, setFormData] = React.useState({});
29
-
30
- const active = getActiveElement(editor);
31
-
32
- if (!active) {
33
- console.error('Active element not found, this will crash');
34
- }
35
- const [elementNode] = active;
36
- const isElement = isActiveElement(editor);
37
-
38
- // Update the form data based on the current element
39
- const elRef = React.useRef(null);
40
-
41
- if (isElement && !isEqual(elementNode, elRef.current)) {
42
- elRef.current = elementNode;
43
- setFormData(elementNode.data || {});
44
- } else if (!isElement) {
45
- elRef.current = null;
46
- }
47
-
48
- const saveDataToEditor = React.useCallback(
49
- (formData) => {
50
- if (hasValue(formData)) {
51
- // hasValue(formData) = !!formData.footnote
52
- insertElement(editor, formData);
53
- } else {
54
- unwrapElement(editor);
55
- }
56
- },
57
- [editor, insertElement, unwrapElement, hasValue],
58
- );
59
-
60
- const checkForCancel = () => {
61
- if (!hasValue(elementNode.data)) {
62
- unwrapElement(editor);
63
- }
64
- };
65
-
66
- const SchemaProvider = schemaProvider ? schemaProvider : BaseSchemaProvider;
67
-
68
- const pid = `${editor.uid}-${pluginId}`;
69
- return (
70
- <SchemaProvider {...props} data={formData}>
71
- {(schema) => (
72
- <BlockDataForm
73
- schema={schema}
74
- title={schema.title}
75
- icon={<VoltoIcon size="24px" name={briefcaseSVG} />}
76
- onChangeField={(id, value) => {
77
- if (!onChangeValues) {
78
- return setFormData({
79
- ...formData,
80
- [id]: value,
81
- });
82
- }
83
- return onChangeValues(id, value, formData, setFormData);
84
- }}
85
- onChangeFormData={setFormData}
86
- formData={formData}
87
- headerActions={
88
- <>
89
- <button
90
- onClick={() => {
91
- saveDataToEditor(formData);
92
- dispatch(
93
- setPluginOptions(pid, {
94
- show_sidebar_editor: false,
95
- }),
96
- );
97
- ReactEditor.focus(editor);
98
- }}
99
- >
100
- <VoltoIcon size="24px" name={checkSVG} />
101
- </button>
102
- <button
103
- onClick={() => {
104
- checkForCancel();
105
- dispatch(
106
- setPluginOptions(pid, {
107
- show_sidebar_editor: false,
108
- }),
109
- );
110
- setFormData({});
111
- ReactEditor.focus(editor);
112
- }}
113
- >
114
- <VoltoIcon size="24px" name={clearSVG} />
115
- </button>
116
- </>
117
- }
118
- />
119
- )}
120
- </SchemaProvider>
121
- );
122
- };
123
-
124
- export default PluginEditor;
@@ -1,6 +0,0 @@
1
- A generic plugin that can be used to create other editor interactions that
2
- follow the following pattern:
3
-
4
- - the plugin needs a button that toggles a format (an inline element)
5
- - the plugin needs a separate edit form for advanced customization of the data
6
- attached to the element
@@ -1,3 +0,0 @@
1
- export default ({ editSchema, children }) => {
2
- return children(editSchema);
3
- };
@@ -1,46 +0,0 @@
1
- /**
2
- * A small wrapper around PluginEditor. Its purpose it to allow for clearer
3
- * code, otherwise it would mix too many hooks and it's not possible to render
4
- * a variable number of hooks in a component
5
- */
6
- import React from 'react';
7
- import { useSelector, useDispatch } from 'react-redux';
8
- import { SidebarPopup } from '@plone/volto/components';
9
- import { setPluginOptions } from '@plone/volto-slate/actions';
10
-
11
- const SidebarEditor = (props) => {
12
- const { editor, pluginId, getActiveElement, pluginEditor } = props;
13
- const pid = `${editor.uid}-${pluginId}`;
14
- const PluginEditor = pluginEditor;
15
- const showEditor = useSelector((state) => {
16
- return state['slate_plugins']?.[pid]?.show_sidebar_editor;
17
- });
18
-
19
- const dispatch = useDispatch();
20
-
21
- let active;
22
- try {
23
- active = getActiveElement(editor);
24
- } catch (error) {
25
- // eslint-disable-next-line
26
- console.warn('Error in getting active element', error);
27
- }
28
-
29
- // Hide the editor when switching to another text element
30
- React.useEffect(() => {
31
- if (!active)
32
- dispatch(setPluginOptions(pid, { show_sidebar_editor: false }));
33
- }, [active, dispatch, pluginId, pid]);
34
-
35
- editor.isSidebarOpen = showEditor && active;
36
-
37
- return editor.isSidebarOpen ? (
38
- <SidebarPopup open={true}>
39
- <PluginEditor {...props} />
40
- </SidebarPopup>
41
- ) : (
42
- ''
43
- );
44
- };
45
-
46
- export default SidebarEditor;