@squiz/formatted-text-editor 0.0.0-rbv2-20240530041851

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 (457) hide show
  1. package/.eslintrc.json +41 -0
  2. package/CHANGELOG.md +155 -0
  3. package/README.md +74 -0
  4. package/build.js +21 -0
  5. package/coverage/clover.xml +1544 -0
  6. package/coverage/coverage-final.json +74 -0
  7. package/coverage/lcov-report/base.css +224 -0
  8. package/coverage/lcov-report/block-navigation.js +87 -0
  9. package/coverage/lcov-report/favicon.png +0 -0
  10. package/coverage/lcov-report/index.html +911 -0
  11. package/coverage/lcov-report/prettify.css +1 -0
  12. package/coverage/lcov-report/prettify.js +2 -0
  13. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  14. package/coverage/lcov-report/sorter.js +196 -0
  15. package/coverage/lcov-report/src/Editor/Editor.tsx.html +436 -0
  16. package/coverage/lcov-report/src/Editor/EditorContext.ts.html +145 -0
  17. package/coverage/lcov-report/src/Editor/index.html +131 -0
  18. package/coverage/lcov-report/src/EditorToolbar/FloatingToolbar.tsx.html +271 -0
  19. package/coverage/lcov-report/src/EditorToolbar/Toolbar.tsx.html +265 -0
  20. package/coverage/lcov-report/src/EditorToolbar/Tools/Bold/BoldButton.tsx.html +178 -0
  21. package/coverage/lcov-report/src/EditorToolbar/Tools/Bold/index.html +116 -0
  22. package/coverage/lcov-report/src/EditorToolbar/Tools/ClearFormatting/ClearFormattingButton.tsx.html +229 -0
  23. package/coverage/lcov-report/src/EditorToolbar/Tools/ClearFormatting/index.html +116 -0
  24. package/coverage/lcov-report/src/EditorToolbar/Tools/HorizontalLine/HorizontalLineButton.tsx.html +187 -0
  25. package/coverage/lcov-report/src/EditorToolbar/Tools/HorizontalLine/index.html +116 -0
  26. package/coverage/lcov-report/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx.html +688 -0
  27. package/coverage/lcov-report/src/EditorToolbar/Tools/Image/Form/index.html +116 -0
  28. package/coverage/lcov-report/src/EditorToolbar/Tools/Image/ImageButton.tsx.html +301 -0
  29. package/coverage/lcov-report/src/EditorToolbar/Tools/Image/ImageModal.tsx.html +181 -0
  30. package/coverage/lcov-report/src/EditorToolbar/Tools/Image/index.html +131 -0
  31. package/coverage/lcov-report/src/EditorToolbar/Tools/Italic/ItalicButton.tsx.html +178 -0
  32. package/coverage/lcov-report/src/EditorToolbar/Tools/Italic/index.html +116 -0
  33. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx.html +508 -0
  34. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/Form/index.html +116 -0
  35. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/LinkButton.tsx.html +286 -0
  36. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/LinkModal.tsx.html +196 -0
  37. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx.html +211 -0
  38. package/coverage/lcov-report/src/EditorToolbar/Tools/Link/index.html +146 -0
  39. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/ListButtons.tsx.html +127 -0
  40. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/OrderedList/OrderedListButton.tsx.html +175 -0
  41. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/OrderedList/index.html +116 -0
  42. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/UnorderedList/UnorderedListButton.tsx.html +175 -0
  43. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/UnorderedList/index.html +116 -0
  44. package/coverage/lcov-report/src/EditorToolbar/Tools/Lists/index.html +116 -0
  45. package/coverage/lcov-report/src/EditorToolbar/Tools/Redo/RedoButton.tsx.html +178 -0
  46. package/coverage/lcov-report/src/EditorToolbar/Tools/Redo/index.html +116 -0
  47. package/coverage/lcov-report/src/EditorToolbar/Tools/Table/TableButton.tsx.html +181 -0
  48. package/coverage/lcov-report/src/EditorToolbar/Tools/Table/index.html +116 -0
  49. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.tsx.html +178 -0
  50. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/CenterAlign/index.html +116 -0
  51. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.tsx.html +178 -0
  52. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/JustifyAlign/index.html +116 -0
  53. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.tsx.html +178 -0
  54. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/LeftAlign/index.html +116 -0
  55. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.tsx.html +178 -0
  56. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/RightAlign/index.html +116 -0
  57. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/TextAlignButtons.tsx.html +148 -0
  58. package/coverage/lcov-report/src/EditorToolbar/Tools/TextAlign/index.html +116 -0
  59. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/CodeBlock/CodeBlockButton.tsx.html +181 -0
  60. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/CodeBlock/index.html +116 -0
  61. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Heading/HeadingButton.tsx.html +241 -0
  62. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Heading/index.html +116 -0
  63. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Paragraph/ParagraphButton.tsx.html +160 -0
  64. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Paragraph/index.html +116 -0
  65. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.tsx.html +181 -0
  66. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/Preformatted/index.html +116 -0
  67. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/TextTypeDropdown.tsx.html +247 -0
  68. package/coverage/lcov-report/src/EditorToolbar/Tools/TextType/index.html +116 -0
  69. package/coverage/lcov-report/src/EditorToolbar/Tools/Underline/UnderlineButton.tsx.html +178 -0
  70. package/coverage/lcov-report/src/EditorToolbar/Tools/Underline/index.html +116 -0
  71. package/coverage/lcov-report/src/EditorToolbar/Tools/Undo/UndoButton.tsx.html +178 -0
  72. package/coverage/lcov-report/src/EditorToolbar/Tools/Undo/index.html +116 -0
  73. package/coverage/lcov-report/src/EditorToolbar/index.html +146 -0
  74. package/coverage/lcov-report/src/EditorToolbar/index.ts.html +91 -0
  75. package/coverage/lcov-report/src/Extensions/ClearFormattingExtension/ClearFormattingExtension.ts.html +256 -0
  76. package/coverage/lcov-report/src/Extensions/ClearFormattingExtension/index.html +116 -0
  77. package/coverage/lcov-report/src/Extensions/CodeBlockExtension/CodeBlockExtension.ts.html +187 -0
  78. package/coverage/lcov-report/src/Extensions/CodeBlockExtension/index.html +116 -0
  79. package/coverage/lcov-report/src/Extensions/CommandsExtension/CommandsExtension.ts.html +247 -0
  80. package/coverage/lcov-report/src/Extensions/CommandsExtension/index.html +116 -0
  81. package/coverage/lcov-report/src/Extensions/Extensions.ts.html +349 -0
  82. package/coverage/lcov-report/src/Extensions/FetchUrlExtension/FetchUrlExtension.ts.html +289 -0
  83. package/coverage/lcov-report/src/Extensions/FetchUrlExtension/index.html +116 -0
  84. package/coverage/lcov-report/src/Extensions/ImageExtension/AssetImageExtension.ts.html +412 -0
  85. package/coverage/lcov-report/src/Extensions/ImageExtension/ImageExtension.ts.html +142 -0
  86. package/coverage/lcov-report/src/Extensions/ImageExtension/index.html +131 -0
  87. package/coverage/lcov-report/src/Extensions/LinkExtension/AssetLinkExtension.ts.html +466 -0
  88. package/coverage/lcov-report/src/Extensions/LinkExtension/LinkExtension.ts.html +400 -0
  89. package/coverage/lcov-report/src/Extensions/LinkExtension/common.ts.html +115 -0
  90. package/coverage/lcov-report/src/Extensions/LinkExtension/index.html +146 -0
  91. package/coverage/lcov-report/src/Extensions/PreformattedExtension/PreformattedExtension.ts.html +340 -0
  92. package/coverage/lcov-report/src/Extensions/PreformattedExtension/index.html +116 -0
  93. package/coverage/lcov-report/src/Extensions/UnsuportedExtension/UnsupportedNodeExtension.tsx.html +325 -0
  94. package/coverage/lcov-report/src/Extensions/UnsuportedExtension/index.html +116 -0
  95. package/coverage/lcov-report/src/Extensions/index.html +116 -0
  96. package/coverage/lcov-report/src/hooks/index.html +161 -0
  97. package/coverage/lcov-report/src/hooks/index.ts.html +91 -0
  98. package/coverage/lcov-report/src/hooks/useExpandedSelection.ts.html +217 -0
  99. package/coverage/lcov-report/src/hooks/useExtensionNames.ts.html +130 -0
  100. package/coverage/lcov-report/src/hooks/useFocus.ts.html +268 -0
  101. package/coverage/lcov-report/src/index.html +116 -0
  102. package/coverage/lcov-report/src/index.ts.html +112 -0
  103. package/coverage/lcov-report/src/ui/Button/Button.tsx.html +190 -0
  104. package/coverage/lcov-report/src/ui/Button/index.html +116 -0
  105. package/coverage/lcov-report/src/ui/CollapseBox/CollapseBox.tsx.html +193 -0
  106. package/coverage/lcov-report/src/ui/CollapseBox/index.html +116 -0
  107. package/coverage/lcov-report/src/ui/Fields/Checkbox/Checkbox.tsx.html +232 -0
  108. package/coverage/lcov-report/src/ui/Fields/Checkbox/index.html +116 -0
  109. package/coverage/lcov-report/src/ui/Fields/Input/Input.tsx.html +160 -0
  110. package/coverage/lcov-report/src/ui/Fields/Input/index.html +116 -0
  111. package/coverage/lcov-report/src/ui/Fields/InputContainer/InputContainer.tsx.html +172 -0
  112. package/coverage/lcov-report/src/ui/Fields/InputContainer/index.html +116 -0
  113. package/coverage/lcov-report/src/ui/Fields/MatrixAsset/MatrixAsset.tsx.html +256 -0
  114. package/coverage/lcov-report/src/ui/Fields/MatrixAsset/index.html +116 -0
  115. package/coverage/lcov-report/src/ui/Fields/Select/Select.tsx.html +283 -0
  116. package/coverage/lcov-report/src/ui/Fields/Select/index.html +116 -0
  117. package/coverage/lcov-report/src/ui/Modal/FormModal.tsx.html +136 -0
  118. package/coverage/lcov-report/src/ui/Modal/Modal.tsx.html +397 -0
  119. package/coverage/lcov-report/src/ui/Modal/index.html +131 -0
  120. package/coverage/lcov-report/src/ui/Tabs/Tabs.tsx.html +208 -0
  121. package/coverage/lcov-report/src/ui/Tabs/index.html +116 -0
  122. package/coverage/lcov-report/src/ui/ToolbarDropdown/ToolbarDropdown.tsx.html +211 -0
  123. package/coverage/lcov-report/src/ui/ToolbarDropdown/index.html +116 -0
  124. package/coverage/lcov-report/src/ui/ToolbarDropdownButton/ToolbarDropdownButton.tsx.html +184 -0
  125. package/coverage/lcov-report/src/ui/ToolbarDropdownButton/index.html +116 -0
  126. package/coverage/lcov-report/src/utils/converters/htmlToSquizNode/htmlToSquizNode.ts.html +166 -0
  127. package/coverage/lcov-report/src/utils/converters/htmlToSquizNode/index.html +116 -0
  128. package/coverage/lcov-report/src/utils/converters/mocks/index.html +116 -0
  129. package/coverage/lcov-report/src/utils/converters/mocks/squizNodeJson.mock.ts.html +895 -0
  130. package/coverage/lcov-report/src/utils/converters/remirrorNodeToSquizNode/index.html +116 -0
  131. package/coverage/lcov-report/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts.html +976 -0
  132. package/coverage/lcov-report/src/utils/converters/squizNodeToRemirrorNode/index.html +116 -0
  133. package/coverage/lcov-report/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts.html +748 -0
  134. package/coverage/lcov-report/src/utils/createToolbarPositioner.ts.html +469 -0
  135. package/coverage/lcov-report/src/utils/getCursorRect.ts.html +100 -0
  136. package/coverage/lcov-report/src/utils/getMarkNamesByGroup.ts.html +106 -0
  137. package/coverage/lcov-report/src/utils/getNodeNamesByGroup.ts.html +106 -0
  138. package/coverage/lcov-report/src/utils/getShortcutSymbol.ts.html +97 -0
  139. package/coverage/lcov-report/src/utils/index.html +206 -0
  140. package/coverage/lcov-report/src/utils/undefinedIfEmpty.ts.html +94 -0
  141. package/coverage/lcov-report/src/utils/validation.ts.html +133 -0
  142. package/coverage/lcov.info +2737 -0
  143. package/cypress/e2e/bold.spec.cy.ts +18 -0
  144. package/cypress/global.d.ts +9 -0
  145. package/cypress/support/commands.ts +130 -0
  146. package/cypress/support/e2e.ts +20 -0
  147. package/cypress/tsconfig.json +8 -0
  148. package/cypress.config.ts +7 -0
  149. package/demo/App.tsx +107 -0
  150. package/demo/AppContext.tsx +70 -0
  151. package/demo/index.html +13 -0
  152. package/demo/index.scss +33 -0
  153. package/demo/main.tsx +12 -0
  154. package/demo/public/favicon-dxp.svg +3 -0
  155. package/demo/resources.json +204 -0
  156. package/demo/sources.json +27 -0
  157. package/demo/vite-env.d.ts +1 -0
  158. package/file-transformer.js +1 -0
  159. package/jest.bootstrap.ts +3 -0
  160. package/jest.config.ts +27 -0
  161. package/lib/Editor/Editor.d.ts +16 -0
  162. package/lib/Editor/Editor.js +85 -0
  163. package/lib/Editor/EditorContext.d.ts +10 -0
  164. package/lib/Editor/EditorContext.js +16 -0
  165. package/lib/EditorToolbar/FloatingToolbar.d.ts +2 -0
  166. package/lib/EditorToolbar/FloatingToolbar.js +76 -0
  167. package/lib/EditorToolbar/Toolbar.d.ts +7 -0
  168. package/lib/EditorToolbar/Toolbar.js +47 -0
  169. package/lib/EditorToolbar/Tools/Bold/BoldButton.d.ts +3 -0
  170. package/lib/EditorToolbar/Tools/Bold/BoldButton.js +23 -0
  171. package/lib/EditorToolbar/Tools/ClearFormatting/ClearFormattingButton.d.ts +3 -0
  172. package/lib/EditorToolbar/Tools/ClearFormatting/ClearFormattingButton.js +57 -0
  173. package/lib/EditorToolbar/Tools/HorizontalLine/HorizontalLineButton.d.ts +3 -0
  174. package/lib/EditorToolbar/Tools/HorizontalLine/HorizontalLineButton.js +25 -0
  175. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.d.ts +18 -0
  176. package/lib/EditorToolbar/Tools/Image/Form/ImageForm.js +143 -0
  177. package/lib/EditorToolbar/Tools/Image/ImageButton.d.ts +6 -0
  178. package/lib/EditorToolbar/Tools/Image/ImageButton.js +76 -0
  179. package/lib/EditorToolbar/Tools/Image/ImageModal.d.ts +9 -0
  180. package/lib/EditorToolbar/Tools/Image/ImageModal.js +24 -0
  181. package/lib/EditorToolbar/Tools/Italic/ItalicButton.d.ts +3 -0
  182. package/lib/EditorToolbar/Tools/Italic/ItalicButton.js +23 -0
  183. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.d.ts +19 -0
  184. package/lib/EditorToolbar/Tools/Link/Form/LinkForm.js +63 -0
  185. package/lib/EditorToolbar/Tools/Link/LinkButton.d.ts +6 -0
  186. package/lib/EditorToolbar/Tools/Link/LinkButton.js +71 -0
  187. package/lib/EditorToolbar/Tools/Link/LinkModal.d.ts +9 -0
  188. package/lib/EditorToolbar/Tools/Link/LinkModal.js +27 -0
  189. package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.d.ts +4 -0
  190. package/lib/EditorToolbar/Tools/Link/RemoveLinkButton.js +54 -0
  191. package/lib/EditorToolbar/Tools/Lists/ListButtons.d.ts +3 -0
  192. package/lib/EditorToolbar/Tools/Lists/ListButtons.js +14 -0
  193. package/lib/EditorToolbar/Tools/Lists/OrderedList/OrderedListButton.d.ts +3 -0
  194. package/lib/EditorToolbar/Tools/Lists/OrderedList/OrderedListButton.js +22 -0
  195. package/lib/EditorToolbar/Tools/Lists/UnorderedList/UnorderedListButton.d.ts +3 -0
  196. package/lib/EditorToolbar/Tools/Lists/UnorderedList/UnorderedListButton.js +22 -0
  197. package/lib/EditorToolbar/Tools/Redo/RedoButton.d.ts +3 -0
  198. package/lib/EditorToolbar/Tools/Redo/RedoButton.js +22 -0
  199. package/lib/EditorToolbar/Tools/Table/TableButton.d.ts +3 -0
  200. package/lib/EditorToolbar/Tools/Table/TableButton.js +22 -0
  201. package/lib/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.d.ts +3 -0
  202. package/lib/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.js +22 -0
  203. package/lib/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.d.ts +3 -0
  204. package/lib/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.js +22 -0
  205. package/lib/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.d.ts +3 -0
  206. package/lib/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.js +22 -0
  207. package/lib/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.d.ts +3 -0
  208. package/lib/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.js +22 -0
  209. package/lib/EditorToolbar/Tools/TextAlign/TextAlignButtons.d.ts +3 -0
  210. package/lib/EditorToolbar/Tools/TextAlign/TextAlignButtons.js +21 -0
  211. package/lib/EditorToolbar/Tools/TextType/CodeBlock/CodeBlockButton.d.ts +3 -0
  212. package/lib/EditorToolbar/Tools/TextType/CodeBlock/CodeBlockButton.js +22 -0
  213. package/lib/EditorToolbar/Tools/TextType/Heading/HeadingButton.d.ts +6 -0
  214. package/lib/EditorToolbar/Tools/TextType/Heading/HeadingButton.js +37 -0
  215. package/lib/EditorToolbar/Tools/TextType/Paragraph/ParagraphButton.d.ts +3 -0
  216. package/lib/EditorToolbar/Tools/TextType/Paragraph/ParagraphButton.js +21 -0
  217. package/lib/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.d.ts +3 -0
  218. package/lib/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.js +22 -0
  219. package/lib/EditorToolbar/Tools/TextType/TextTypeDropdown.d.ts +3 -0
  220. package/lib/EditorToolbar/Tools/TextType/TextTypeDropdown.js +46 -0
  221. package/lib/EditorToolbar/Tools/Underline/UnderlineButton.d.ts +3 -0
  222. package/lib/EditorToolbar/Tools/Underline/UnderlineButton.js +23 -0
  223. package/lib/EditorToolbar/Tools/Undo/UndoButton.d.ts +3 -0
  224. package/lib/EditorToolbar/Tools/Undo/UndoButton.js +22 -0
  225. package/lib/EditorToolbar/index.d.ts +2 -0
  226. package/lib/EditorToolbar/index.js +18 -0
  227. package/lib/Extensions/ClearFormattingExtension/ClearFormattingExtension.d.ts +5 -0
  228. package/lib/Extensions/ClearFormattingExtension/ClearFormattingExtension.js +63 -0
  229. package/lib/Extensions/CodeBlockExtension/CodeBlockExtension.d.ts +5 -0
  230. package/lib/Extensions/CodeBlockExtension/CodeBlockExtension.js +30 -0
  231. package/lib/Extensions/CommandsExtension/CommandsExtension.d.ts +20 -0
  232. package/lib/Extensions/CommandsExtension/CommandsExtension.js +52 -0
  233. package/lib/Extensions/Extensions.d.ts +17 -0
  234. package/lib/Extensions/Extensions.js +73 -0
  235. package/lib/Extensions/FetchUrlExtension/FetchUrlExtension.d.ts +12 -0
  236. package/lib/Extensions/FetchUrlExtension/FetchUrlExtension.js +63 -0
  237. package/lib/Extensions/ImageExtension/AssetImageExtension.d.ts +17 -0
  238. package/lib/Extensions/ImageExtension/AssetImageExtension.js +91 -0
  239. package/lib/Extensions/ImageExtension/ImageExtension.d.ts +7 -0
  240. package/lib/Extensions/ImageExtension/ImageExtension.js +18 -0
  241. package/lib/Extensions/LinkExtension/AssetLinkExtension.d.ts +27 -0
  242. package/lib/Extensions/LinkExtension/AssetLinkExtension.js +101 -0
  243. package/lib/Extensions/LinkExtension/LinkExtension.d.ts +23 -0
  244. package/lib/Extensions/LinkExtension/LinkExtension.js +87 -0
  245. package/lib/Extensions/LinkExtension/common.d.ts +7 -0
  246. package/lib/Extensions/LinkExtension/common.js +14 -0
  247. package/lib/Extensions/PreformattedExtension/PreformattedExtension.d.ts +12 -0
  248. package/lib/Extensions/PreformattedExtension/PreformattedExtension.js +76 -0
  249. package/lib/Extensions/UnsuportedExtension/UnsupportedNodeExtension.d.ts +10 -0
  250. package/lib/Extensions/UnsuportedExtension/UnsupportedNodeExtension.js +76 -0
  251. package/lib/hooks/index.d.ts +2 -0
  252. package/lib/hooks/index.js +18 -0
  253. package/lib/hooks/useExpandedSelection.d.ts +23 -0
  254. package/lib/hooks/useExpandedSelection.js +37 -0
  255. package/lib/hooks/useExtensionNames.d.ts +1 -0
  256. package/lib/hooks/useExtensionNames.js +16 -0
  257. package/lib/hooks/useFocus.d.ts +8 -0
  258. package/lib/hooks/useFocus.js +43 -0
  259. package/lib/index.css +1525 -0
  260. package/lib/index.d.ts +8 -0
  261. package/lib/index.js +16 -0
  262. package/lib/types.d.ts +7 -0
  263. package/lib/types.js +2 -0
  264. package/lib/ui/Button/Button.d.ts +12 -0
  265. package/lib/ui/Button/Button.js +13 -0
  266. package/lib/ui/CollapseBox/CollapseBox.d.ts +7 -0
  267. package/lib/ui/CollapseBox/CollapseBox.js +48 -0
  268. package/lib/ui/Fields/Checkbox/Checkbox.d.ts +9 -0
  269. package/lib/ui/Fields/Checkbox/Checkbox.js +47 -0
  270. package/lib/ui/Fields/Input/Input.d.ts +3 -0
  271. package/lib/ui/Fields/Input/Input.js +33 -0
  272. package/lib/ui/Fields/InputContainer/InputContainer.d.ts +9 -0
  273. package/lib/ui/Fields/InputContainer/InputContainer.js +16 -0
  274. package/lib/ui/Fields/MatrixAsset/MatrixAsset.d.ts +19 -0
  275. package/lib/ui/Fields/MatrixAsset/MatrixAsset.js +30 -0
  276. package/lib/ui/Modal/FormModal.d.ts +5 -0
  277. package/lib/ui/Modal/FormModal.js +39 -0
  278. package/lib/ui/Modal/Modal.d.ts +11 -0
  279. package/lib/ui/Modal/Modal.js +79 -0
  280. package/lib/ui/Tabs/Tabs.d.ts +11 -0
  281. package/lib/ui/Tabs/Tabs.js +46 -0
  282. package/lib/ui/ToolbarDropdown/ToolbarDropdown.d.ts +7 -0
  283. package/lib/ui/ToolbarDropdown/ToolbarDropdown.js +48 -0
  284. package/lib/ui/ToolbarDropdownButton/ToolbarDropdownButton.d.ts +11 -0
  285. package/lib/ui/ToolbarDropdownButton/ToolbarDropdownButton.js +15 -0
  286. package/lib/utils/converters/htmlToSquizNode/htmlToSquizNode.d.ts +5 -0
  287. package/lib/utils/converters/htmlToSquizNode/htmlToSquizNode.js +23 -0
  288. package/lib/utils/converters/htmlToSquizNode/htmlToSquizNode.props.d.ts +3 -0
  289. package/lib/utils/converters/htmlToSquizNode/htmlToSquizNode.props.js +2 -0
  290. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.d.ts +11 -0
  291. package/lib/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.js +229 -0
  292. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.d.ts +9 -0
  293. package/lib/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.js +205 -0
  294. package/lib/utils/createToolbarPositioner.d.ts +18 -0
  295. package/lib/utils/createToolbarPositioner.js +96 -0
  296. package/lib/utils/getCursorRect.d.ts +2 -0
  297. package/lib/utils/getCursorRect.js +7 -0
  298. package/lib/utils/getMarkNamesByGroup.d.ts +2 -0
  299. package/lib/utils/getMarkNamesByGroup.js +9 -0
  300. package/lib/utils/getNodeNamesByGroup.d.ts +2 -0
  301. package/lib/utils/getNodeNamesByGroup.js +9 -0
  302. package/lib/utils/getShortcutSymbol.d.ts +1 -0
  303. package/lib/utils/getShortcutSymbol.js +8 -0
  304. package/lib/utils/undefinedIfEmpty.d.ts +1 -0
  305. package/lib/utils/undefinedIfEmpty.js +7 -0
  306. package/lib/utils/validation.d.ts +3 -0
  307. package/lib/utils/validation.js +16 -0
  308. package/package.json +83 -0
  309. package/postcss.config.js +12 -0
  310. package/src/Editor/Editor.spec.tsx +465 -0
  311. package/src/Editor/Editor.tsx +117 -0
  312. package/src/Editor/EditorContext.spec.tsx +25 -0
  313. package/src/Editor/EditorContext.ts +20 -0
  314. package/src/Editor/_editor.scss +430 -0
  315. package/src/EditorToolbar/FloatingToolbar.spec.tsx +49 -0
  316. package/src/EditorToolbar/FloatingToolbar.tsx +62 -0
  317. package/src/EditorToolbar/Toolbar.tsx +60 -0
  318. package/src/EditorToolbar/Tools/Bold/BoldButton.spec.tsx +19 -0
  319. package/src/EditorToolbar/Tools/Bold/BoldButton.tsx +31 -0
  320. package/src/EditorToolbar/Tools/ClearFormatting/ClearFormattingButton.spec.tsx +34 -0
  321. package/src/EditorToolbar/Tools/ClearFormatting/ClearFormattingButton.tsx +48 -0
  322. package/src/EditorToolbar/Tools/HorizontalLine/HorizontalLineButton.spec.tsx +23 -0
  323. package/src/EditorToolbar/Tools/HorizontalLine/HorizontalLineButton.tsx +34 -0
  324. package/src/EditorToolbar/Tools/Image/Form/ImageForm.spec.tsx +117 -0
  325. package/src/EditorToolbar/Tools/Image/Form/ImageForm.tsx +201 -0
  326. package/src/EditorToolbar/Tools/Image/ImageButton.spec.tsx +385 -0
  327. package/src/EditorToolbar/Tools/Image/ImageButton.tsx +72 -0
  328. package/src/EditorToolbar/Tools/Image/ImageModal.spec.tsx +123 -0
  329. package/src/EditorToolbar/Tools/Image/ImageModal.tsx +32 -0
  330. package/src/EditorToolbar/Tools/Italic/ItalicButton.spec.tsx +19 -0
  331. package/src/EditorToolbar/Tools/Italic/ItalicButton.tsx +31 -0
  332. package/src/EditorToolbar/Tools/Link/Form/LinkForm.spec.tsx +79 -0
  333. package/src/EditorToolbar/Tools/Link/Form/LinkForm.tsx +141 -0
  334. package/src/EditorToolbar/Tools/Link/LinkButton.spec.tsx +402 -0
  335. package/src/EditorToolbar/Tools/Link/LinkButton.tsx +67 -0
  336. package/src/EditorToolbar/Tools/Link/LinkModal.tsx +37 -0
  337. package/src/EditorToolbar/Tools/Link/RemoveLinkButton.spec.tsx +143 -0
  338. package/src/EditorToolbar/Tools/Link/RemoveLinkButton.tsx +42 -0
  339. package/src/EditorToolbar/Tools/Lists/ListButtons.tsx +14 -0
  340. package/src/EditorToolbar/Tools/Lists/OrderedList/OrderListButton.spec.tsx +39 -0
  341. package/src/EditorToolbar/Tools/Lists/OrderedList/OrderedListButton.tsx +30 -0
  342. package/src/EditorToolbar/Tools/Lists/UnorderedList/UnorderedList.spec.tsx +19 -0
  343. package/src/EditorToolbar/Tools/Lists/UnorderedList/UnorderedListButton.tsx +30 -0
  344. package/src/EditorToolbar/Tools/Redo/RedoButton.spec.tsx +59 -0
  345. package/src/EditorToolbar/Tools/Redo/RedoButton.tsx +31 -0
  346. package/src/EditorToolbar/Tools/Table/TableButton.spec.tsx +25 -0
  347. package/src/EditorToolbar/Tools/Table/TableButton.tsx +32 -0
  348. package/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.spec.tsx +39 -0
  349. package/src/EditorToolbar/Tools/TextAlign/CenterAlign/CenterAlignButton.tsx +31 -0
  350. package/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.spec.tsx +39 -0
  351. package/src/EditorToolbar/Tools/TextAlign/JustifyAlign/JustifyAlignButton.tsx +31 -0
  352. package/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.spec.tsx +39 -0
  353. package/src/EditorToolbar/Tools/TextAlign/LeftAlign/LeftAlignButton.tsx +31 -0
  354. package/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.spec.tsx +39 -0
  355. package/src/EditorToolbar/Tools/TextAlign/RightAlign/RightAlignButton.tsx +31 -0
  356. package/src/EditorToolbar/Tools/TextAlign/TextAlignButtons.tsx +21 -0
  357. package/src/EditorToolbar/Tools/TextType/CodeBlock/CodeBlockButton.spec.tsx +47 -0
  358. package/src/EditorToolbar/Tools/TextType/CodeBlock/CodeBlockButton.tsx +32 -0
  359. package/src/EditorToolbar/Tools/TextType/Heading/HeadingButton.spec.tsx +56 -0
  360. package/src/EditorToolbar/Tools/TextType/Heading/HeadingButton.tsx +52 -0
  361. package/src/EditorToolbar/Tools/TextType/Paragraph/ParagraphButton.spec.tsx +30 -0
  362. package/src/EditorToolbar/Tools/TextType/Paragraph/ParagraphButton.tsx +25 -0
  363. package/src/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.spec.tsx +47 -0
  364. package/src/EditorToolbar/Tools/TextType/Preformatted/PreformattedButton.tsx +32 -0
  365. package/src/EditorToolbar/Tools/TextType/TextTypeDropdown.spec.tsx +51 -0
  366. package/src/EditorToolbar/Tools/TextType/TextTypeDropdown.tsx +54 -0
  367. package/src/EditorToolbar/Tools/Underline/Underline.spec.tsx +19 -0
  368. package/src/EditorToolbar/Tools/Underline/UnderlineButton.tsx +31 -0
  369. package/src/EditorToolbar/Tools/Undo/UndoButton.spec.tsx +70 -0
  370. package/src/EditorToolbar/Tools/Undo/UndoButton.tsx +31 -0
  371. package/src/EditorToolbar/_floating-toolbar.scss +9 -0
  372. package/src/EditorToolbar/_toolbar.scss +37 -0
  373. package/src/EditorToolbar/index.ts +2 -0
  374. package/src/Extensions/ClearFormattingExtension/ClearFormattingExtension.ts +57 -0
  375. package/src/Extensions/CodeBlockExtension/CodeBlockExtension.ts +34 -0
  376. package/src/Extensions/CommandsExtension/CommandsExtension.ts +54 -0
  377. package/src/Extensions/Extensions.ts +88 -0
  378. package/src/Extensions/FetchUrlExtension/FetchUrlExtension.ts +68 -0
  379. package/src/Extensions/ImageExtension/AssetImageExtension.spec.ts +77 -0
  380. package/src/Extensions/ImageExtension/AssetImageExtension.ts +109 -0
  381. package/src/Extensions/ImageExtension/ImageExtension.ts +19 -0
  382. package/src/Extensions/LinkExtension/AssetLinkExtension.spec.ts +106 -0
  383. package/src/Extensions/LinkExtension/AssetLinkExtension.ts +127 -0
  384. package/src/Extensions/LinkExtension/LinkExtension.spec.ts +68 -0
  385. package/src/Extensions/LinkExtension/LinkExtension.ts +105 -0
  386. package/src/Extensions/LinkExtension/common.ts +10 -0
  387. package/src/Extensions/PreformattedExtension/PreformattedExtension.spec.ts +43 -0
  388. package/src/Extensions/PreformattedExtension/PreformattedExtension.ts +85 -0
  389. package/src/Extensions/UnsuportedExtension/UnsupportedNodeExtension.spec.ts +137 -0
  390. package/src/Extensions/UnsuportedExtension/UnsupportedNodeExtension.tsx +80 -0
  391. package/src/hooks/index.ts +2 -0
  392. package/src/hooks/useExpandedSelection.ts +44 -0
  393. package/src/hooks/useExtensionNames.ts +15 -0
  394. package/src/hooks/useFocus.ts +61 -0
  395. package/src/index.scss +24 -0
  396. package/src/index.ts +9 -0
  397. package/src/types.ts +10 -0
  398. package/src/ui/Button/Button.spec.tsx +44 -0
  399. package/src/ui/Button/Button.tsx +35 -0
  400. package/src/ui/Button/_button.scss +37 -0
  401. package/src/ui/CollapseBox/CollapseBox.spec.tsx +49 -0
  402. package/src/ui/CollapseBox/CollapseBox.tsx +36 -0
  403. package/src/ui/CollapseBox/_collapseBox.scss +23 -0
  404. package/src/ui/Fields/Checkbox/Checkbox.spec.tsx +50 -0
  405. package/src/ui/Fields/Checkbox/Checkbox.tsx +49 -0
  406. package/src/ui/Fields/Checkbox/_checkbox.scss +26 -0
  407. package/src/ui/Fields/Input/Input.spec.tsx +49 -0
  408. package/src/ui/Fields/Input/Input.tsx +25 -0
  409. package/src/ui/Fields/InputContainer/InputContainer.spec.tsx +18 -0
  410. package/src/ui/Fields/InputContainer/InputContainer.tsx +29 -0
  411. package/src/ui/Fields/MatrixAsset/MatrixAsset.spec.tsx +121 -0
  412. package/src/ui/Fields/MatrixAsset/MatrixAsset.tsx +57 -0
  413. package/src/ui/Fields/Select/Select.spec.tsx +30 -0
  414. package/src/ui/Fields/Select/Select.tsx +66 -0
  415. package/src/ui/Modal/FormModal.spec.tsx +21 -0
  416. package/src/ui/Modal/FormModal.tsx +17 -0
  417. package/src/ui/Modal/Modal.spec.tsx +136 -0
  418. package/src/ui/Modal/Modal.tsx +104 -0
  419. package/src/ui/Modal/_modal.scss +24 -0
  420. package/src/ui/Tabs/Tabs.spec.tsx +44 -0
  421. package/src/ui/Tabs/Tabs.tsx +41 -0
  422. package/src/ui/ToolbarDropdown/ToolbarDropdown.spec.tsx +80 -0
  423. package/src/ui/ToolbarDropdown/ToolbarDropdown.tsx +42 -0
  424. package/src/ui/ToolbarDropdown/_toolbar-dropdown.scss +32 -0
  425. package/src/ui/ToolbarDropdownButton/ToolbarDropdownButton.spec.tsx +48 -0
  426. package/src/ui/ToolbarDropdownButton/ToolbarDropdownButton.tsx +33 -0
  427. package/src/ui/ToolbarDropdownButton/_toolbar-dropdown-button.scss +25 -0
  428. package/src/ui/_forms.scss +32 -0
  429. package/src/ui/_typography.scss +95 -0
  430. package/src/utils/converters/htmlToSquizNode/htmlToSquizNode.props.ts +3 -0
  431. package/src/utils/converters/htmlToSquizNode/htmlToSquizNode.spec.ts +179 -0
  432. package/src/utils/converters/htmlToSquizNode/htmlToSquizNode.ts +27 -0
  433. package/src/utils/converters/mocks/squizNodeJson.mock.ts +270 -0
  434. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.spec.ts +1058 -0
  435. package/src/utils/converters/remirrorNodeToSquizNode/remirrorNodeToSquizNode.ts +297 -0
  436. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.spec.ts +878 -0
  437. package/src/utils/converters/squizNodeToRemirrorNode/squizNodeToRemirrorNode.ts +221 -0
  438. package/src/utils/createToolbarPositioner.ts +128 -0
  439. package/src/utils/getCursorRect.ts +5 -0
  440. package/src/utils/getMarkNamesByGroup.spec.ts +20 -0
  441. package/src/utils/getMarkNamesByGroup.ts +7 -0
  442. package/src/utils/getNodeNamesByGroup.spec.ts +37 -0
  443. package/src/utils/getNodeNamesByGroup.ts +7 -0
  444. package/src/utils/getShortcutSymbol.spec.ts +27 -0
  445. package/src/utils/getShortcutSymbol.ts +4 -0
  446. package/src/utils/undefinedIfEmpty.spec.ts +12 -0
  447. package/src/utils/undefinedIfEmpty.ts +3 -0
  448. package/src/utils/validation.spec.ts +22 -0
  449. package/src/utils/validation.ts +16 -0
  450. package/tailwind.config.cjs +87 -0
  451. package/tests/index.ts +4 -0
  452. package/tests/mockResourceBrowserContext.tsx +99 -0
  453. package/tests/renderWithContext.tsx +75 -0
  454. package/tests/renderWithEditor.tsx +123 -0
  455. package/tests/select.ts +16 -0
  456. package/tsconfig.json +22 -0
  457. package/vite.config.ts +27 -0
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { EditorContext, EditorContextOptions } from './EditorContext';
3
+ import { render } from '@testing-library/react';
4
+
5
+ describe('EditorContext', () => {
6
+ it('Has expected defaults', async () => {
7
+ let defaultContext: EditorContextOptions | null = null;
8
+
9
+ render(
10
+ <EditorContext.Consumer>
11
+ {(value) => {
12
+ defaultContext = value;
13
+ return null;
14
+ }}
15
+ </EditorContext.Consumer>,
16
+ );
17
+
18
+ expect(defaultContext).toEqual({
19
+ matrix: {
20
+ matrixDomain: '',
21
+ },
22
+ resolveNodeToUrl: expect.any(Function),
23
+ });
24
+ });
25
+ });
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ResolveNodeToUrl } from '../types';
3
+
4
+ export type EditorContextOptions = {
5
+ matrix: {
6
+ matrixDomain: string;
7
+ };
8
+ resolveNodeToUrl: ResolveNodeToUrl;
9
+ };
10
+
11
+ export const defaultEditorContext: EditorContextOptions = {
12
+ matrix: {
13
+ matrixDomain: '',
14
+ },
15
+ resolveNodeToUrl: () => {
16
+ throw new Error('resolveNodeToUrl has not been configured.');
17
+ },
18
+ };
19
+
20
+ export const EditorContext = React.createContext(defaultEditorContext);
@@ -0,0 +1,430 @@
1
+ /* 2 class selectors so specificity is higher vs eg. ".squiz-ce-scope *" which would take priority over this. */
2
+ .squiz-fte-scope.squiz-fte-scope__editor {
3
+ font-family: 'Open Sans' !important;
4
+ @apply bg-white rounded border-gray-300;
5
+
6
+ .squiz-fte-scope__floating-popover {
7
+ z-index: 999; // ensure table styles don't hide this menu
8
+ }
9
+
10
+ &:has(&__children) {
11
+ /* The children replace the space taken up by top padding of the editor when present. */
12
+ @apply w-full min-h-[2rem];
13
+
14
+ .remirror-editor {
15
+ @apply pt-0;
16
+ }
17
+ }
18
+
19
+ .remirror-editor {
20
+ @apply shadow-none p-8;
21
+ overflow: auto;
22
+ min-height: 15vh;
23
+
24
+ &:active,
25
+ &:focus {
26
+ @apply outline-0;
27
+ }
28
+
29
+ p {
30
+ position: relative; // ensures that the placeholder text is positioned correctly
31
+ /* Make sure content aligned with "text-align: justify" is justified */
32
+ @apply block;
33
+ }
34
+
35
+ &-wrapper {
36
+ position: relative;
37
+ }
38
+ }
39
+
40
+ &--bordered {
41
+ @apply border-2 border-solid;
42
+ }
43
+
44
+ &--is-disabled {
45
+ @apply bg-gray-50 border-0 cursor-not-allowed;
46
+
47
+ .remirror-is-empty:first-of-type::before {
48
+ display: none;
49
+ }
50
+ }
51
+
52
+ .remirror-is-empty:first-of-type::before {
53
+ position: absolute;
54
+ pointer-events: none;
55
+ height: 0;
56
+ font-style: italic;
57
+ content: attr(data-placeholder);
58
+ @apply text-gray-500;
59
+ }
60
+
61
+ .ProseMirror-selectednode {
62
+ @apply border-blue-300 border-2 border-solid;
63
+ }
64
+
65
+ // match the Remirror node
66
+ img {
67
+ display: inline;
68
+ }
69
+
70
+ &:has(.show-toolbar) {
71
+ @apply shadow-md border-0;
72
+ }
73
+
74
+ // Tables
75
+ .remirror-table {
76
+ &-container {
77
+ @apply m-8;
78
+ }
79
+
80
+ width: 100%;
81
+
82
+ tbody {
83
+ th,
84
+ td {
85
+ @apply p-2;
86
+ }
87
+
88
+ p {
89
+ margin: 0; // everything is by default a paragraph, inside the table that does not make sense so remove the margin
90
+ }
91
+ }
92
+ }
93
+ }
94
+
95
+ // TODO: work through this nonsense and see which bits are necessary for functionality
96
+ :root {
97
+ --rmr-color-table-default-border: #e0e0e0;
98
+ --rmr-color-table-selected-cell: transparent;
99
+ --rmr-color-table-selected-border: #0774d2;
100
+ --rmr-color-table-selected-controller: #0774d2;
101
+ --rmr-hue-blue-7: #0774d2;
102
+ --rmr-color-table-mark: #f5f5f5;
103
+ --rmr-color-table-default-controller: #f7f7f7;
104
+ --rmr-color-table-predelete-cell: transparent;
105
+ --rmr-color-table-predelete-border: #d72321;
106
+ --rmr-color-table-predelete-controller: #d72321;
107
+ }
108
+
109
+ //remirror styles
110
+ .remirror-positioner {
111
+ cursor: none;
112
+ min-height: 1px;
113
+ min-width: 1px;
114
+ pointer-events: none;
115
+ position: absolute;
116
+ -webkit-user-select: none;
117
+ -moz-user-select: none;
118
+ -ms-user-select: none;
119
+ user-select: none;
120
+ z-index: -1;
121
+ }
122
+
123
+ .remirror-positioner-widget {
124
+ height: 0;
125
+ position: absolute;
126
+ width: 0;
127
+ }
128
+
129
+ .remirror-editor.ProseMirror .tableWrapper {
130
+ overflow-x: auto;
131
+ }
132
+
133
+ .remirror-editor.ProseMirror table {
134
+ border-collapse: collapse;
135
+ overflow: hidden;
136
+ table-layout: fixed;
137
+ width: 100%;
138
+ }
139
+
140
+ .remirror-editor.ProseMirror td,
141
+ .remirror-editor.ProseMirror th {
142
+ border-color: var(--rmr-color-table-default-border);
143
+ border-style: solid;
144
+ border-width: 1px;
145
+ box-sizing: border-box;
146
+ position: relative;
147
+ vertical-align: top;
148
+ }
149
+
150
+ .remirror-editor.ProseMirror .column-resize-handle {
151
+ background-color: var(--rmr-hue-blue-7);
152
+ bottom: 0;
153
+ pointer-events: none;
154
+ position: absolute;
155
+ right: -2px;
156
+ top: 0;
157
+ width: 4px;
158
+ z-index: 40;
159
+ }
160
+
161
+ .remirror-editor.ProseMirror.resize-cursor {
162
+ cursor: ew-resize;
163
+ cursor: col-resize;
164
+ }
165
+
166
+ .remirror-editor.ProseMirror td.selectedCell,
167
+ .remirror-editor.ProseMirror th.selectedCell {
168
+ background-color: var(--rmr-color-table-selected-cell);
169
+ border-color: var(--rmr-color-table-selected-border);
170
+ border-style: double;
171
+ }
172
+
173
+ .remirror-table-colgroup > col:first-of-type {
174
+ overflow: visible;
175
+ width: 13px;
176
+ }
177
+
178
+ .remirror-controllers-toggle {
179
+ visibility: hidden;
180
+ }
181
+
182
+ .remirror-table-show-controllers .remirror-controllers-toggle {
183
+ visibility: visible;
184
+ }
185
+
186
+ .remirror-table-insert-button {
187
+ background-color: #dcdcdc;
188
+ border-radius: 4px;
189
+ cursor: pointer;
190
+ height: 18px;
191
+ position: absolute;
192
+ transition: background-color 0.15s ease;
193
+ width: 18px;
194
+ z-index: 25;
195
+ }
196
+
197
+ .remirror-table-insert-button svg {
198
+ fill: #fff;
199
+ }
200
+
201
+ .remirror-table-insert-button:hover {
202
+ background-color: #136bda;
203
+ }
204
+
205
+ .remirror-table-insert-button:hover svg {
206
+ fill: #fff;
207
+ }
208
+
209
+ .remirror-table-delete-inner-button {
210
+ background-color: #cecece;
211
+ border: none;
212
+ border-radius: 4px;
213
+ cursor: pointer;
214
+ height: 18px;
215
+ padding: 0;
216
+ position: absolute;
217
+ transition: background-color 0.15s ease;
218
+ width: 18px;
219
+ z-index: 30;
220
+ }
221
+
222
+ .remirror-table-delete-inner-button:hover {
223
+ background-color: #ff7884;
224
+ }
225
+
226
+ .remirror-table-delete-table-inner-button {
227
+ left: calc(var(--remirror-table-delete-button-x) - 9px);
228
+ top: calc(var(--remirror-table-delete-button-y) - 9px);
229
+ }
230
+
231
+ .remirror-table-delete-row-column-inner-button {
232
+ left: calc(var(--remirror-table-delete-row-column-button-x) - 9px);
233
+ top: calc(var(--remirror-table-delete-row-column-button-y) - 9px);
234
+ }
235
+
236
+ .remirror-table-with-controllers {
237
+ height: 1px;
238
+ margin-bottom: 40px;
239
+ margin-top: 40px;
240
+ }
241
+
242
+ .ProseMirror table.remirror-table-with-controllers {
243
+ overflow: visible;
244
+ }
245
+
246
+ .remirror-table-waitting-controllers {
247
+ display: none;
248
+ }
249
+
250
+ .remirror-table-tbody-with-controllers > tr:first-of-type {
251
+ height: 12px;
252
+ overflow: visible;
253
+ }
254
+
255
+ .remirror-table-tbody-with-controllers > tr:first-of-type th:first-of-type {
256
+ cursor: pointer;
257
+ height: 12px;
258
+ overflow: visible;
259
+ padding: 0;
260
+ position: relative;
261
+ width: 12px;
262
+ z-index: 15;
263
+ }
264
+
265
+ .remirror-table-tbody-with-controllers > tr:first-of-type th:first-of-type div.remirror-table-controller-wrapper {
266
+ align-items: flex-end;
267
+ display: flex;
268
+ height: 12px;
269
+ justify-content: flex-end;
270
+ overflow: visible;
271
+ width: 12px;
272
+ }
273
+
274
+ .remirror-table-tbody-with-controllers > tr:first-of-type th:first-of-type div.remirror-table-controller-trigger-area {
275
+ display: none;
276
+ flex: 1;
277
+ position: relative;
278
+ z-index: 10;
279
+ }
280
+
281
+ .remirror-table-tbody-with-controllers
282
+ > tr:first-of-type
283
+ th:first-of-type
284
+ div.remirror-table-controller-mark-row-corner {
285
+ border-color: var(--rmr-color-table-mark);
286
+ border-radius: 50%;
287
+ border-style: solid;
288
+ border-width: 2px;
289
+ bottom: -2px;
290
+ height: 0;
291
+ left: -12px;
292
+ position: absolute;
293
+ width: 0;
294
+ }
295
+
296
+ .remirror-table-tbody-with-controllers
297
+ > tr:first-of-type
298
+ th:first-of-type
299
+ div.remirror-table-controller-mark-column-corner {
300
+ border-color: var(--rmr-color-table-mark);
301
+ border-radius: 50%;
302
+ border-style: solid;
303
+ border-width: 2px;
304
+ height: 0;
305
+ position: absolute;
306
+ right: -2px;
307
+ top: -12px;
308
+ width: 0;
309
+ }
310
+
311
+ .remirror-table-tbody-with-controllers > tr:first-of-type th:nth-of-type(n + 2) {
312
+ cursor: pointer;
313
+ height: 12px;
314
+ overflow: visible;
315
+ padding: 0;
316
+ position: relative;
317
+ z-index: 15;
318
+ }
319
+
320
+ .remirror-table-tbody-with-controllers > tr:first-of-type th:nth-of-type(n + 2) div.remirror-table-controller-wrapper {
321
+ align-items: flex-end;
322
+ display: flex;
323
+ flex-direction: row;
324
+ height: 12px;
325
+ justify-content: flex-end;
326
+ overflow: visible;
327
+ width: 100%;
328
+ }
329
+
330
+ .remirror-table-tbody-with-controllers
331
+ > tr:first-of-type
332
+ th:nth-of-type(n + 2)
333
+ div.remirror-table-controller-trigger-area {
334
+ flex: 1;
335
+ height: 36px;
336
+ position: relative;
337
+ z-index: 10;
338
+ }
339
+
340
+ .remirror-table-tbody-with-controllers
341
+ > tr:first-of-type
342
+ th:nth-of-type(n + 2)
343
+ div.remirror-table-controller-mark-row-corner {
344
+ display: none;
345
+ }
346
+
347
+ .remirror-table-tbody-with-controllers
348
+ > tr:first-of-type
349
+ th:nth-of-type(n + 2)
350
+ div.remirror-table-controller-mark-column-corner {
351
+ border-color: var(--rmr-color-table-mark);
352
+ border-radius: 50%;
353
+ border-style: solid;
354
+ border-width: 2px;
355
+ height: 0;
356
+ position: absolute;
357
+ right: -2px;
358
+ top: -12px;
359
+ width: 0;
360
+ }
361
+
362
+ .remirror-table-tbody-with-controllers > tr:nth-of-type(n + 2) th {
363
+ cursor: pointer;
364
+ overflow: visible;
365
+ padding: 0;
366
+ position: relative;
367
+ width: 12px;
368
+ z-index: 15;
369
+ }
370
+
371
+ .remirror-table-tbody-with-controllers > tr:nth-of-type(n + 2) th div.remirror-table-controller-wrapper {
372
+ align-items: flex-end;
373
+ display: flex;
374
+ flex-direction: column;
375
+ height: 100%;
376
+ justify-content: flex-end;
377
+ overflow: visible;
378
+ width: 12px;
379
+ }
380
+
381
+ .remirror-table-tbody-with-controllers > tr:nth-of-type(n + 2) th div.remirror-table-controller-trigger-area {
382
+ flex: 1;
383
+ position: relative;
384
+ width: 36px;
385
+ z-index: 10;
386
+ }
387
+
388
+ .remirror-table-tbody-with-controllers > tr:nth-of-type(n + 2) th div.remirror-table-controller-mark-row-corner {
389
+ border-color: var(--rmr-color-table-mark);
390
+ border-radius: 50%;
391
+ border-style: solid;
392
+ border-width: 2px;
393
+ bottom: -2px;
394
+ height: 0;
395
+ left: -12px;
396
+ position: absolute;
397
+ width: 0;
398
+ }
399
+
400
+ .remirror-table-tbody-with-controllers > tr:nth-of-type(n + 2) th div.remirror-table-controller-mark-column-corner {
401
+ display: none;
402
+ }
403
+
404
+ .remirror-table-tbody-with-controllers th.remirror-table-controller {
405
+ background-color: var(--rmr-color-table-default-controller);
406
+ }
407
+
408
+ .remirror-table-tbody-with-controllers th.selectedCell.remirror-table-controller {
409
+ background-color: var(--rmr-color-table-selected-controller);
410
+ }
411
+
412
+ .remirror-table-show-predelete td.selectedCell,
413
+ .remirror-table-show-predelete th.selectedCell.remirror-table-controller {
414
+ background-color: var(--rmr-color-table-predelete-cell) !important;
415
+ border-color: var(--rmr-color-table-predelete-border) !important;
416
+ }
417
+
418
+ .remirror-table-show-predelete th.selectedCell.remirror-table-controller {
419
+ background-color: var(--rmr-color-table-predelete-controller) !important;
420
+ }
421
+
422
+ .remirror-table-show-predelete.remirror-table-preselect-all td,
423
+ .remirror-table-show-predelete.remirror-table-preselect-all th.remirror-table-controller {
424
+ background-color: var(--rmr-color-table-predelete-cell) !important;
425
+ border-color: var(--rmr-color-table-predelete-border) !important;
426
+ }
427
+
428
+ .remirror-table-show-predelete.remirror-table-preselect-all th.remirror-table-controller {
429
+ background-color: var(--rmr-color-table-predelete-controller) !important;
430
+ }
@@ -0,0 +1,49 @@
1
+ import { act, screen } from '@testing-library/react';
2
+ import { NodeSelection } from 'prosemirror-state';
3
+ import { renderWithEditor } from '../../tests';
4
+
5
+ describe('FloatingToolbar', () => {
6
+ const getFloatingButtonNames = () => {
7
+ return screen.queryAllByRole('button').map((button) => button.getAttribute('title'));
8
+ };
9
+
10
+ it.each([
11
+ ['Nothing selected', 3, 3, []],
12
+ ['Regular text selected', 3, 4, ['Bold (Ctrl+B)', 'Italic (Ctrl+I)', 'Underline (Ctrl+U)', 'Link (Ctrl+K)']],
13
+ ['Regular text + link selected', 3, 17, ['Bold (Ctrl+B)', 'Italic (Ctrl+I)', 'Underline (Ctrl+U)']],
14
+ ['Nothing selected, positioned directly on the left of a link', 12, 12, []],
15
+ ['Nothing selected, positioned directly on the right of a link', 19, 19, []],
16
+ ['Nothing selected, positioned within a link', 13, 13, ['Link (Ctrl+K)', 'Remove link (Shift+Ctrl+K)']],
17
+ ])(
18
+ 'Renders formatting buttons when text is selected - %s',
19
+ async (description: string, from: number, to: number, expectedButtons: string[]) => {
20
+ const { editor } = await renderWithEditor(null, {
21
+ content: 'My awesome <a href="https://example.org">example</a> content.',
22
+ editable: true,
23
+ });
24
+
25
+ await act(() => editor.selectText({ from, to }));
26
+
27
+ expect(getFloatingButtonNames()).toEqual(expectedButtons);
28
+ },
29
+ );
30
+
31
+ it.each([
32
+ ['Image selected', 1, ['Image (Ctrl+L)']],
33
+ ['Asset image selected', 2, ['Image (Ctrl+L)']],
34
+ ])(
35
+ 'Renders formatting buttons when node is selected - %s',
36
+ async (description: string, pos: number, expectedButtons: string[]) => {
37
+ const { editor } = await renderWithEditor(null, {
38
+ content:
39
+ '<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" />' +
40
+ '<img data-matrix-asset-id="100" data-matrix-identifier="key" data-matrix-domain="my-matrix.squiz.net" />',
41
+ editable: true,
42
+ });
43
+
44
+ await act(() => editor.selectText(new NodeSelection(editor.state.doc.resolve(pos))));
45
+
46
+ expect(getFloatingButtonNames()).toEqual(expectedButtons);
47
+ },
48
+ );
49
+ });
@@ -0,0 +1,62 @@
1
+ import React, { useMemo } from 'react';
2
+ import ItalicButton from './Tools/Italic/ItalicButton';
3
+ import UnderlineButton from './Tools/Underline/UnderlineButton';
4
+ import BoldButton from './Tools/Bold/BoldButton';
5
+ import { useExtensionNames } from '../hooks';
6
+ import RemoveLinkButton from './Tools/Link/RemoveLinkButton';
7
+ import LinkButton from './Tools/Link/LinkButton';
8
+ import { FloatingToolbar as RemirrorFloatingToolbar, useActive, usePositioner, useCommands } from '@remirror/react';
9
+ import { VerticalDivider } from '@remirror/react-components';
10
+ import { createToolbarPositioner, ToolbarPositionerRange } from '../utils/createToolbarPositioner';
11
+ import ImageButton from './Tools/Image/ImageButton';
12
+ import { MarkName } from '../Extensions/Extensions';
13
+ import { ImageExtension } from '../Extensions/ImageExtension/ImageExtension';
14
+ import ClearFormattingButton from './Tools/ClearFormatting/ClearFormattingButton';
15
+ import { ClearFormattingExtension } from '../Extensions/ClearFormattingExtension/ClearFormattingExtension';
16
+
17
+ export const FloatingToolbar = () => {
18
+ const watchedMarks = [MarkName.Link, MarkName.AssetLink];
19
+ const extensionNames = useExtensionNames();
20
+ const positioner = useMemo(() => createToolbarPositioner({ types: watchedMarks }), []);
21
+ const { clearFormatting } = useCommands<ClearFormattingExtension>();
22
+ const active = useActive<ImageExtension>();
23
+ const {
24
+ data: { marks },
25
+ } = usePositioner<Partial<ToolbarPositionerRange>>(positioner, []);
26
+
27
+ let buttons = [
28
+ extensionNames.bold && <BoldButton key="bold" />,
29
+ extensionNames.italic && <ItalicButton key="italic" />,
30
+ extensionNames.underline && <UnderlineButton key="underline" />,
31
+ ];
32
+
33
+ if (active.image() || active.assetImage()) {
34
+ buttons = [<ImageButton key="add-image" inPopover={true} />];
35
+ } else if (marks?.[MarkName.Link].isExclusivelyActive || marks?.[MarkName.AssetLink].isExclusivelyActive) {
36
+ // if all of the selected text is a link show the options to update/remove the link instead of the regular
37
+ // formatting options.
38
+ buttons = [
39
+ <LinkButton key="update-link" inPopover={true} />,
40
+ <RemoveLinkButton key="remove-link" inPopover={true} />,
41
+ ];
42
+ } else if (!marks?.[MarkName.Link].isActive && !marks?.[MarkName.AssetLink].isActive) {
43
+ // if none of the selected text is a link show the option to create a link.
44
+ buttons.push(<VerticalDivider key="link-divider" />, <LinkButton key="add-link" inPopover={true} />);
45
+ }
46
+
47
+ // Clear formatting will always be the last button in the toolbar
48
+ if (extensionNames.clearFormatting && clearFormatting.enabled()) {
49
+ buttons.push(<ClearFormattingButton key="clearFormatting" />);
50
+ }
51
+
52
+ return (
53
+ <RemirrorFloatingToolbar
54
+ className="squiz-fte-scope squiz-fte-scope__floating-popover"
55
+ positioner={positioner}
56
+ tabIndex={0}
57
+ role={'toolbar'}
58
+ >
59
+ {buttons}
60
+ </RemirrorFloatingToolbar>
61
+ );
62
+ };
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { Toolbar as RemirrorToolbar, VerticalDivider } from '@remirror/react-components';
3
+ import clsx from 'clsx';
4
+ import ItalicButton from './Tools/Italic/ItalicButton';
5
+ import UnderlineButton from './Tools/Underline/UnderlineButton';
6
+ import BoldButton from './Tools/Bold/BoldButton';
7
+ import TextAlignButtons from './Tools/TextAlign/TextAlignButtons';
8
+ import UndoButton from './Tools/Undo/UndoButton';
9
+ import RedoButton from './Tools/Redo/RedoButton';
10
+ import TextTypeDropdown from './Tools/TextType/TextTypeDropdown';
11
+ import LinkButton from './Tools/Link/LinkButton';
12
+ import ImageButton from './Tools/Image/ImageButton';
13
+ import RemoveLinkButton from './Tools/Link/RemoveLinkButton';
14
+ import ClearFormattingButton from './Tools/ClearFormatting/ClearFormattingButton';
15
+ import ListButtons from './Tools/Lists/ListButtons';
16
+ import HorizontalLineButton from './Tools/HorizontalLine/HorizontalLineButton';
17
+ import TableButton from './Tools/Table/TableButton';
18
+ import { useExtensionNames } from '../hooks';
19
+
20
+ type ToolbarProps = {
21
+ isVisible: boolean;
22
+ enableTableTool: boolean;
23
+ };
24
+ export const Toolbar = ({ isVisible, enableTableTool }: ToolbarProps) => {
25
+ const extensionNames = useExtensionNames();
26
+
27
+ return (
28
+ <RemirrorToolbar
29
+ className={clsx('editor-toolbar header-toolbar', isVisible && 'show-toolbar')}
30
+ role="toolbar"
31
+ tabIndex={0}
32
+ >
33
+ <div className="editor-toolbar__tools">
34
+ {extensionNames.history && (
35
+ <>
36
+ <UndoButton />
37
+ <RedoButton />
38
+ <VerticalDivider />
39
+ </>
40
+ )}
41
+ {extensionNames.heading && extensionNames.paragraph && extensionNames.preformatted && <TextTypeDropdown />}
42
+ {extensionNames.bold && <BoldButton />}
43
+ {extensionNames.italic && <ItalicButton />}
44
+ {extensionNames.underline && <UnderlineButton />}
45
+ {extensionNames.nodeFormatting && <TextAlignButtons />}
46
+ {extensionNames.listItem && <ListButtons />}
47
+ {extensionNames.horizontalRule && <HorizontalLineButton />}
48
+ {extensionNames.link && (
49
+ <>
50
+ <LinkButton />
51
+ <RemoveLinkButton />
52
+ </>
53
+ )}
54
+ {extensionNames.image && <ImageButton />}
55
+ {extensionNames.clearFormatting && <ClearFormattingButton />}
56
+ {enableTableTool && extensionNames.table && <TableButton />}
57
+ </div>
58
+ </RemirrorToolbar>
59
+ );
60
+ };
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import '@testing-library/jest-dom';
3
+ import { render, screen, fireEvent } from '@testing-library/react';
4
+ import Editor from '../../../Editor/Editor';
5
+
6
+ describe('Bold button', () => {
7
+ it('Renders the bold button', () => {
8
+ render(<Editor />);
9
+ expect(screen.getByRole('button', { name: 'Bold (Ctrl+B)' })).toBeInTheDocument();
10
+ });
11
+
12
+ it('Activates the button if clicked', () => {
13
+ render(<Editor />);
14
+ expect(screen.getByRole('button', { name: 'Bold (Ctrl+B)' }).classList.contains('squiz-fte-btn')).toBeTruthy();
15
+ const bold = screen.getByRole('button', { name: 'Bold (Ctrl+B)' });
16
+ fireEvent.click(bold);
17
+ expect(bold.classList.contains('squiz-fte-btn--is-active')).toBeTruthy();
18
+ });
19
+ });
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { useCommands, useActive, useChainedCommands } from '@remirror/react';
3
+ import { BoldExtension } from '@remirror/extension-bold';
4
+ import Button from '../../../ui/Button/Button';
5
+ import FormatBoldRoundedIcon from '@mui/icons-material/FormatBoldRounded';
6
+ import { getShortcutSymbol } from '../../../utils/getShortcutSymbol';
7
+
8
+ const BoldButton = () => {
9
+ const { toggleBold } = useCommands();
10
+ const chain = useChainedCommands();
11
+
12
+ const active = useActive<BoldExtension>();
13
+ const enabled = toggleBold.enabled();
14
+ const handleSelect = () => {
15
+ if (toggleBold.enabled()) {
16
+ chain.toggleBold().focus().run();
17
+ }
18
+ };
19
+
20
+ return (
21
+ <Button
22
+ handleOnClick={handleSelect}
23
+ isDisabled={!enabled}
24
+ isActive={active.bold()}
25
+ icon={<FormatBoldRoundedIcon />}
26
+ label={`Bold (${getShortcutSymbol()}+B)`}
27
+ />
28
+ );
29
+ };
30
+
31
+ export default BoldButton;