@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,11 @@
1
+ import { ProsemirrorNode } from 'remirror';
2
+ import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
3
+ type FormattedText = FormattedTextModels.v1.FormattedText;
4
+ export declare const resolveNodeTag: (node: ProsemirrorNode) => string;
5
+ /**
6
+ * Converts Remirror node JSON structure to Squiz component JSON structure.
7
+ * @param {ProsemirrorNode} node Remirror node to convert to component.
8
+ * @returns {FormattedText} The converted Squiz component JSON.
9
+ */
10
+ export declare const remirrorNodeToSquizNode: (node: ProsemirrorNode) => FormattedText | undefined;
11
+ export {};
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.remirrorNodeToSquizNode = exports.resolveNodeTag = void 0;
4
+ const remirror_1 = require("remirror");
5
+ const undefinedIfEmpty_1 = require("../../undefinedIfEmpty");
6
+ const Extensions_1 = require("../../../Extensions/Extensions");
7
+ const resolveNodeTag = (node) => {
8
+ if (node.type.name === Extensions_1.NodeName.Text) {
9
+ return 'span';
10
+ }
11
+ if (node.type.name === Extensions_1.NodeName.CodeBlock) {
12
+ return 'code';
13
+ }
14
+ if (node.type.spec?.toDOM) {
15
+ const domNode = node.type.spec.toDOM(node);
16
+ if (domNode instanceof window.Node) {
17
+ return domNode.nodeName.toLowerCase();
18
+ }
19
+ if (typeof domNode === 'object' && 'dom' in domNode && domNode.dom instanceof window.Node) {
20
+ return domNode.dom.nodeName.toLowerCase();
21
+ }
22
+ if (domNode instanceof Array) {
23
+ // [ tag, attributes, ...children ]
24
+ return domNode[0].toLowerCase();
25
+ }
26
+ }
27
+ throw new Error('Unexpected Remirror node encountered, cannot resolve tag.');
28
+ };
29
+ exports.resolveNodeTag = resolveNodeTag;
30
+ const resolveFormattingOptions = (node) => {
31
+ const formattingOptions = {};
32
+ const textAlignment = node.attrs.nodeTextAlignment;
33
+ const textAlignmentMap = {
34
+ none: undefined,
35
+ left: 'left',
36
+ right: 'right',
37
+ center: 'center',
38
+ start: 'left',
39
+ end: 'right',
40
+ justify: 'justify',
41
+ };
42
+ if (textAlignment && textAlignmentMap[textAlignment]) {
43
+ formattingOptions.alignment = textAlignmentMap[textAlignment];
44
+ }
45
+ return formattingOptions;
46
+ };
47
+ const resolveFontOptions = (node) => {
48
+ const fontOptions = {};
49
+ node.marks.forEach((mark) => {
50
+ switch (mark.type.name) {
51
+ case 'underline':
52
+ fontOptions.underline = true;
53
+ break;
54
+ }
55
+ });
56
+ return fontOptions;
57
+ };
58
+ const transformAttributes = (attributes, nodeType) => {
59
+ const transformed = {};
60
+ Object.keys(attributes).forEach((key) => {
61
+ // Component service requires attributes to be a string, cast as needed.
62
+ if (typeof attributes[key] === 'string' || typeof attributes[key] === 'number') {
63
+ transformed[key] = String(attributes[key]);
64
+ }
65
+ });
66
+ // We assign an attribute here for table controller cells as we need to differentiate
67
+ // between them and regular table headers (th)
68
+ if (nodeType === Extensions_1.NodeName.TableControllerCell) {
69
+ transformed[nodeType] = 'true';
70
+ }
71
+ // Another check here for more specific attributes for tables (column widths)
72
+ if (nodeType === Extensions_1.NodeName.TableControllerCell || nodeType === Extensions_1.NodeName.tableCell) {
73
+ if (Array.isArray(attributes.colwidth) && attributes.colwidth[0]) {
74
+ transformed.colwidth = String(attributes.colwidth[0]);
75
+ }
76
+ }
77
+ return transformed;
78
+ };
79
+ const transformFragment = (fragment) => {
80
+ const transformed = [];
81
+ fragment.forEach((child) => {
82
+ transformed.push(transformNode(child));
83
+ });
84
+ return transformed;
85
+ };
86
+ const transformNode = (node) => {
87
+ const formattingOptions = (0, undefinedIfEmpty_1.undefinedIfEmpty)(resolveFormattingOptions(node));
88
+ const font = (0, undefinedIfEmpty_1.undefinedIfEmpty)(resolveFontOptions(node));
89
+ let attributes;
90
+ if (node.type.name === Extensions_1.NodeName.Image ||
91
+ node.type.name === Extensions_1.NodeName.CodeBlock ||
92
+ node.type.name === Extensions_1.NodeName.TableControllerCell ||
93
+ node.type.name === Extensions_1.NodeName.tableCell) {
94
+ attributes = transformAttributes(node.attrs, node.type.name);
95
+ }
96
+ let transformedNode = { type: 'text', value: node.text || '' };
97
+ // Squiz "text" nodes can't have formatting/font options but Remirror "text" nodes can.
98
+ // If the node has formatting options wrap in a tag.
99
+ // If the node isn't a text type assume it is a tag type and wrap in a tag.
100
+ // If we pick the wrong tag here it will be corrected later as part of looping through the
101
+ // non-font marks.
102
+ if (node.type.name !== Extensions_1.NodeName.Text || attributes || formattingOptions || font) {
103
+ transformedNode = {
104
+ type: 'tag',
105
+ tag: (0, exports.resolveNodeTag)(node),
106
+ children: node.type.name === Extensions_1.NodeName.Text ? [transformedNode] : transformFragment(node.content),
107
+ attributes,
108
+ formattingOptions,
109
+ font,
110
+ };
111
+ }
112
+ if (node.type.name === Extensions_1.NodeName.AssetImage) {
113
+ transformedNode = {
114
+ type: 'matrix-image',
115
+ matrixAssetId: node.attrs.matrixAssetId,
116
+ matrixIdentifier: node.attrs.matrixIdentifier,
117
+ matrixDomain: node.attrs.matrixDomain,
118
+ };
119
+ }
120
+ node.marks.forEach((mark) => {
121
+ transformedNode = transformMark(mark, transformedNode);
122
+ });
123
+ if (node.type.name === Extensions_1.NodeName.Unsupported) {
124
+ const unsupportedNode = node.attrs?.originalNode;
125
+ return { ...unsupportedNode };
126
+ }
127
+ return transformedNode;
128
+ };
129
+ /**
130
+ * Merges 2 nodes together if they are compatible without losing any important details.
131
+ * Otherwise will wrap the node.
132
+ *
133
+ * @param {FormattedNode} node
134
+ * @param {FormattedNodeWithChildren} wrappingNode
135
+ *
136
+ * @return {FormattedNode}
137
+ */
138
+ const wrapNodeIfNeeded = (node, wrappingNode, copyFont = true) => {
139
+ const wrappingNodeChildren = wrappingNode.children || [];
140
+ if (node.type === 'tag' && wrappingNode.type === 'tag' && (node.tag === 'span' || node.tag === wrappingNode.tag)) {
141
+ const nodeChildren = node.children || [];
142
+ // if the node we are wrapping with is a DOM node, and the node being wrapped is
143
+ // a plain looking DOM node merge the 2 nodes.
144
+ return {
145
+ ...node,
146
+ ...wrappingNode,
147
+ formattingOptions: (0, undefinedIfEmpty_1.undefinedIfEmpty)({
148
+ ...node.formattingOptions,
149
+ ...wrappingNode.formattingOptions,
150
+ }),
151
+ attributes: (0, undefinedIfEmpty_1.undefinedIfEmpty)({
152
+ ...node.attributes,
153
+ ...wrappingNode.attributes,
154
+ }),
155
+ font: (0, undefinedIfEmpty_1.undefinedIfEmpty)(copyFont
156
+ ? {
157
+ ...node.font,
158
+ ...wrappingNode.font,
159
+ }
160
+ : {}),
161
+ children: [...nodeChildren, ...wrappingNodeChildren],
162
+ };
163
+ }
164
+ // if the node we are wrapping or the wrapping nodes are not compatible merge them.
165
+ return {
166
+ ...wrappingNode,
167
+ children: [node, ...wrappingNodeChildren],
168
+ };
169
+ };
170
+ const transformMark = (mark, node) => {
171
+ switch (mark.type.name) {
172
+ case 'bold':
173
+ return wrapNodeIfNeeded(node, {
174
+ type: 'tag',
175
+ tag: 'strong',
176
+ children: [],
177
+ }, false);
178
+ case 'italic':
179
+ return wrapNodeIfNeeded(node, {
180
+ type: 'tag',
181
+ tag: 'em',
182
+ children: [],
183
+ }, false);
184
+ case 'underline':
185
+ return wrapNodeIfNeeded(node, {
186
+ type: 'tag',
187
+ tag: 'span',
188
+ children: [],
189
+ font: {
190
+ underline: mark.type.name === 'underline',
191
+ },
192
+ });
193
+ case 'link':
194
+ return wrapNodeIfNeeded(node, {
195
+ type: 'tag',
196
+ tag: 'a',
197
+ attributes: transformAttributes(mark.attrs),
198
+ children: [],
199
+ }, false);
200
+ case 'assetLink':
201
+ return wrapNodeIfNeeded(node, {
202
+ type: 'link-to-matrix-asset',
203
+ target: mark.attrs.target,
204
+ matrixIdentifier: mark.attrs.matrixIdentifier,
205
+ matrixDomain: mark.attrs.matrixDomain,
206
+ matrixAssetId: mark.attrs.matrixAssetId,
207
+ children: [],
208
+ });
209
+ }
210
+ throw new Error(`Unsupported mark "${mark.type.name}" was applied to node.`);
211
+ };
212
+ /**
213
+ * Converts Remirror node JSON structure to Squiz component JSON structure.
214
+ * @param {ProsemirrorNode} node Remirror node to convert to component.
215
+ * @returns {FormattedText} The converted Squiz component JSON.
216
+ */
217
+ const remirrorNodeToSquizNode = (node) => {
218
+ if (node?.type?.name !== 'doc') {
219
+ throw new Error('Unable to convert from Remirror to Node data structure, unexpected node provided.');
220
+ }
221
+ // Squiz FormattedText should be set to undefined
222
+ // To allow validation on required values
223
+ if ((0, remirror_1.isDocNodeEmpty)(node) || node.childCount === 0) {
224
+ return undefined;
225
+ }
226
+ const transformedFragment = transformFragment(node.content);
227
+ return transformedFragment;
228
+ };
229
+ exports.remirrorNodeToSquizNode = remirrorNodeToSquizNode;
@@ -0,0 +1,9 @@
1
+ import { RemirrorJSON } from '@remirror/core';
2
+ import { FORMATTED_TEXT_MODELS as FormattedTextModels } from '@squiz/dx-json-schema-lib';
3
+ /**
4
+ * Converts Squiz component JSON structure to Remirror node JSON structure.
5
+ * @param {FormattedText} nodes Squiz nodes to convert to Remirror.
6
+ * @export
7
+ * @returns {RemirrorJSON} The converted Remirror JSON.
8
+ */
9
+ export declare const squizNodeToRemirrorNode: (nodes?: FormattedTextModels.v1.FormattedText) => RemirrorJSON;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.squizNodeToRemirrorNode = void 0;
4
+ const undefinedIfEmpty_1 = require("../../undefinedIfEmpty");
5
+ const Extensions_1 = require("../../../Extensions/Extensions");
6
+ const getNodeType = (node) => {
7
+ const typeMap = {
8
+ 'link-to-matrix-asset': Extensions_1.NodeName.Text,
9
+ 'matrix-image': Extensions_1.NodeName.AssetImage,
10
+ text: 'text',
11
+ };
12
+ const tagMap = {
13
+ h1: 'heading',
14
+ h2: 'heading',
15
+ h3: 'heading',
16
+ h4: 'heading',
17
+ h5: 'heading',
18
+ h6: 'heading',
19
+ img: 'image',
20
+ pre: 'preformatted',
21
+ p: 'paragraph',
22
+ ol: 'orderedList',
23
+ li: 'listItem',
24
+ ul: 'bulletList',
25
+ hr: 'horizontalRule',
26
+ table: 'table',
27
+ tr: 'tableRow',
28
+ th: 'tableHeaderCell',
29
+ td: 'tableCell',
30
+ a: Extensions_1.NodeName.Text,
31
+ em: Extensions_1.NodeName.Text,
32
+ span: Extensions_1.NodeName.Text,
33
+ strong: Extensions_1.NodeName.Text,
34
+ code: Extensions_1.NodeName.CodeBlock,
35
+ br: Extensions_1.NodeName.hardBreak,
36
+ };
37
+ if (typeMap[node.type]) {
38
+ return typeMap[node.type];
39
+ }
40
+ if (node.type === 'tag' && tagMap[node.tag]) {
41
+ // This is a specific check case for tables as there are some <th> tags which need to be returned
42
+ // as table controller cells.
43
+ if (node.attributes?.tableControllerCell) {
44
+ return 'tableControllerCell';
45
+ }
46
+ // Return regular tag for everything else
47
+ return tagMap[node.tag];
48
+ }
49
+ // Unsupported node type
50
+ throw new Error(node.type === 'tag'
51
+ ? `Unsupported node type provided: ${node.type} (tag: ${node.tag})`
52
+ : `Unsupported node type provided: ${node.type}`);
53
+ };
54
+ const getNodeAttributes = (node) => {
55
+ if (node.type === 'tag' && node.tag === 'table') {
56
+ return {
57
+ isControllersInjected: true,
58
+ };
59
+ }
60
+ if (node.type === 'tag' && (node.tag === 'th' || node.tag === 'td')) {
61
+ return {
62
+ colspan: parseInt(node.attributes?.colspan ?? '1'),
63
+ rowspan: parseInt(node.attributes?.rowspan ?? '1'),
64
+ colwidth: node.attributes?.colwidth ? [parseInt(node.attributes.colwidth)] : null,
65
+ background: null,
66
+ };
67
+ }
68
+ if (node.type === 'tag' && node.tag === 'img') {
69
+ return {
70
+ alt: node.attributes?.alt,
71
+ height: node.attributes?.height,
72
+ width: node.attributes?.width,
73
+ src: node.attributes?.src,
74
+ title: node.attributes?.title,
75
+ };
76
+ }
77
+ else if (node.type === 'tag' && node.tag === 'code') {
78
+ return {
79
+ language: node.attributes?.language || 'markup',
80
+ wrap: node.attributes?.wrap || true,
81
+ };
82
+ }
83
+ else if (node.type === 'matrix-image') {
84
+ return {
85
+ matrixAssetId: node.matrixAssetId,
86
+ matrixDomain: node.matrixDomain,
87
+ matrixIdentifier: node.matrixIdentifier,
88
+ };
89
+ }
90
+ else if (node.type === 'tag') {
91
+ return {
92
+ nodeIndent: null,
93
+ nodeTextAlignment: node.formattingOptions?.alignment || null,
94
+ nodeLineHeight: null,
95
+ style: '',
96
+ level: node.tag?.startsWith('h') ? parseInt(node.tag.substring(1)) : undefined,
97
+ };
98
+ }
99
+ return {};
100
+ };
101
+ const getNodeMarks = (node) => {
102
+ const marks = [];
103
+ if (node.type === 'tag' && node.tag === 'a') {
104
+ marks.push({
105
+ type: Extensions_1.MarkName.Link,
106
+ attrs: {
107
+ href: node.attributes?.href,
108
+ target: node.attributes?.target ?? null,
109
+ auto: false,
110
+ title: node.attributes?.title ?? null,
111
+ },
112
+ });
113
+ }
114
+ else if (node.type === 'link-to-matrix-asset') {
115
+ marks.push({
116
+ type: Extensions_1.MarkName.AssetLink,
117
+ attrs: {
118
+ matrixAssetId: node.matrixAssetId,
119
+ matrixDomain: node.matrixDomain,
120
+ matrixIdentifier: node.matrixIdentifier,
121
+ target: node.target,
122
+ },
123
+ });
124
+ }
125
+ else if (node.type === 'tag' && node.tag === 'strong') {
126
+ marks.push({ type: 'bold' });
127
+ }
128
+ else if (node.type === 'tag' && node.tag === 'em') {
129
+ marks.push({ type: 'italic' });
130
+ }
131
+ // Handle font formatting
132
+ if ('font' in node && node.font !== undefined) {
133
+ for (const [type, enabled] of Object.entries(node.font)) {
134
+ if (enabled) {
135
+ if (type === 'bold' || type === 'italics' || type === 'underline') {
136
+ marks.push({ type: type === 'italics' ? 'italic' : type });
137
+ }
138
+ else {
139
+ throw new Error(`Unsupported mark provided: ${type}`);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ return marks;
145
+ };
146
+ const unwrapNodeIfNeeded = (node) => {
147
+ if (node.type === 'text' && node.content?.length) {
148
+ return node.content.map((child) => {
149
+ return {
150
+ ...child,
151
+ marks: [...(child.marks || []), ...(node.marks || [])],
152
+ };
153
+ });
154
+ }
155
+ return [node];
156
+ };
157
+ const formatNode = (node) => {
158
+ const children = [];
159
+ if ('children' in node) {
160
+ node.children?.forEach((child) => {
161
+ children.push(...formatNode(child));
162
+ });
163
+ }
164
+ return unwrapNodeIfNeeded({
165
+ type: getNodeType(node),
166
+ attrs: (0, undefinedIfEmpty_1.undefinedIfEmpty)(getNodeAttributes(node)),
167
+ marks: (0, undefinedIfEmpty_1.undefinedIfEmpty)(getNodeMarks(node)),
168
+ text: node.type === 'text' ? node.value : undefined,
169
+ content: (0, undefinedIfEmpty_1.undefinedIfEmpty)(children),
170
+ });
171
+ };
172
+ /**
173
+ * Converts Squiz component JSON structure to Remirror node JSON structure.
174
+ * @param {FormattedText} nodes Squiz nodes to convert to Remirror.
175
+ * @export
176
+ * @returns {RemirrorJSON} The converted Remirror JSON.
177
+ */
178
+ const squizNodeToRemirrorNode = (nodes = []) => {
179
+ let children = [];
180
+ nodes.forEach((node) => {
181
+ try {
182
+ children.push(...formatNode(node));
183
+ }
184
+ catch (error) {
185
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
186
+ children.push({
187
+ type: 'paragraph',
188
+ content: [
189
+ {
190
+ type: Extensions_1.NodeName.Unsupported,
191
+ attrs: {
192
+ originalNode: node,
193
+ errorMessage,
194
+ },
195
+ },
196
+ ],
197
+ });
198
+ }
199
+ });
200
+ if (children.find((child) => child.type === 'text')) {
201
+ children = [{ type: 'paragraph', content: children }];
202
+ }
203
+ return { type: 'doc', content: children };
204
+ };
205
+ exports.squizNodeToRemirrorNode = squizNodeToRemirrorNode;
@@ -0,0 +1,18 @@
1
+ import { Positioner } from 'remirror/extensions';
2
+ import { Coords } from 'remirror';
3
+ export type ToolbarPositionerProps = {
4
+ types: string[];
5
+ };
6
+ export type ToolbarPositionerRange = {
7
+ isSelectionInView: boolean;
8
+ visible: boolean;
9
+ marks: Record<string, {
10
+ isExclusivelyActive: boolean;
11
+ isActive: boolean;
12
+ }>;
13
+ cursor: {
14
+ from: Coords;
15
+ to: Coords;
16
+ };
17
+ };
18
+ export declare const createToolbarPositioner: ({ types }: ToolbarPositionerProps) => Positioner<ToolbarPositionerRange>;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolbarPositioner = void 0;
4
+ const extensions_1 = require("remirror/extensions");
5
+ const remirror_1 = require("remirror");
6
+ const getCursorRect_1 = require("./getCursorRect");
7
+ /* istanbul ignore next */
8
+ const createToolbarPositioner = ({ types }) => {
9
+ // Inspired by "createMarkPositioner".
10
+ // See: https://github.com/remirror/remirror/blob/107cba/packages/remirror__extension-positioner/src/core-positioners.ts#L267
11
+ return extensions_1.Positioner.create({
12
+ hasChanged: extensions_1.hasStateChanged,
13
+ getActive: (props) => {
14
+ const { state, view } = props;
15
+ try {
16
+ const selection = (0, remirror_1.getTextSelection)(state.selection, state.doc);
17
+ const cursor = { from: view.coordsAtPos(selection.from), to: view.coordsAtPos(selection.to) };
18
+ const data = {
19
+ isSelectionInView: (0, extensions_1.isPositionVisible)((0, getCursorRect_1.getCursorRect)(cursor.from), view.dom) ||
20
+ (0, extensions_1.isPositionVisible)((0, getCursorRect_1.getCursorRect)(cursor.to), view.dom),
21
+ cursor: cursor,
22
+ visible: false,
23
+ marks: {},
24
+ };
25
+ data.visible = !selection.empty && data.isSelectionInView;
26
+ types.forEach((type) => {
27
+ const markRange = (0, remirror_1.getMarkRange)(selection.$from, type, selection.$to);
28
+ if (!markRange) {
29
+ data.marks[type] = { isActive: false, isExclusivelyActive: false };
30
+ return;
31
+ }
32
+ // exclusively active =
33
+ // the entire selection has the mark applied.
34
+ // active =
35
+ // at least part of the selection has the mark applied. "getMarkRanges" will return an empty array
36
+ // if this isn't the case. if there is no selection the cursor must be within the bounds of the mark,
37
+ // not on the edges.
38
+ const isExclusivelyActive = selection.empty
39
+ ? selection.from > markRange.from && selection.to < markRange.to
40
+ : selection.from >= markRange.from && selection.to <= markRange.to;
41
+ const isActive = selection.empty ? selection.from > markRange.from && selection.to < markRange.to : true;
42
+ // the toolbar will be visible if there is either a selection, or we are within the bounds of a mark
43
+ // we have formatting tools for.
44
+ data.visible = data.visible || isExclusivelyActive;
45
+ data.marks[type] = { isExclusivelyActive, isActive };
46
+ });
47
+ return data.visible ? [data] : extensions_1.Positioner.EMPTY;
48
+ }
49
+ catch {
50
+ return extensions_1.Positioner.EMPTY;
51
+ }
52
+ },
53
+ getPosition: (props) => {
54
+ const { element, data, view } = props;
55
+ const { cursor, visible } = data;
56
+ const { from, to } = cursor;
57
+ const parent = element.offsetParent ?? view.dom;
58
+ const parentRect = parent.getBoundingClientRect();
59
+ const height = Math.abs(to.bottom - from.top);
60
+ // Hack to get JSDOM to work, positioning doesn't work great here.
61
+ if (isNaN(parentRect.top)) {
62
+ return {
63
+ rect: new DOMRect(0, 0, 0, 0),
64
+ y: 0,
65
+ x: 0,
66
+ height: 0,
67
+ width: 0,
68
+ visible: false,
69
+ };
70
+ }
71
+ // True when the selection spans multiple lines.
72
+ const spansMultipleLines = height > from.bottom - from.top;
73
+ // The position furthest to the left.
74
+ const leftmost = Math.min(from.left, to.left);
75
+ // The position nearest the top.
76
+ const topmost = Math.min(from.top, to.top);
77
+ const bottommost = Math.max(from.bottom, to.bottom);
78
+ const left = parent.scrollLeft + (spansMultipleLines ? to.left - parentRect.left : leftmost - parentRect.left);
79
+ const top = parent.scrollTop + topmost - parentRect.top;
80
+ const width = spansMultipleLines ? 1 : Math.abs(from.left - to.right);
81
+ const rect = new DOMRect(spansMultipleLines ? to.left : leftmost, topmost, width, height);
82
+ // Get header toolbar by class inside the current element/editor
83
+ const headerToolbar = element.parentElement?.getElementsByClassName('header-toolbar')?.[0];
84
+ const headerBarRects = headerToolbar?.getBoundingClientRect();
85
+ const headerBarHeight = headerBarRects?.height ?? 0;
86
+ const headerBarBottom = (headerBarRects?.top ?? 0) + headerBarHeight;
87
+ // If floating toolbar will overlap fixed toolbar, set position to under selection
88
+ const isOverlapping = headerBarBottom + headerBarHeight > topmost;
89
+ // This is a good bottom position instead of it being on top of the toolbar when there is an overlap
90
+ const bottomPosition = parent.scrollTop + bottommost - parentRect.top + 62;
91
+ const y = isOverlapping ? bottomPosition : top;
92
+ return { rect, y, x: left, height, width, visible };
93
+ },
94
+ });
95
+ };
96
+ exports.createToolbarPositioner = createToolbarPositioner;
@@ -0,0 +1,2 @@
1
+ import { Coords } from 'remirror';
2
+ export declare const getCursorRect: (coords: Coords) => DOMRect;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCursorRect = void 0;
4
+ const getCursorRect = (coords) => {
5
+ return new DOMRect(coords.left, coords.top, 1, coords.top - coords.bottom);
6
+ };
7
+ exports.getCursorRect = getCursorRect;
@@ -0,0 +1,2 @@
1
+ import { EditorSchema, ExtensionTagType } from '@remirror/core';
2
+ export declare const getMarkNamesByGroup: (schema: EditorSchema, group: ExtensionTagType) => string[];
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMarkNamesByGroup = void 0;
4
+ const getMarkNamesByGroup = (schema, group) => {
5
+ return Object.values(schema.marks)
6
+ .filter((mark) => mark.spec.group?.includes(group))
7
+ .map((mark) => mark.name);
8
+ };
9
+ exports.getMarkNamesByGroup = getMarkNamesByGroup;
@@ -0,0 +1,2 @@
1
+ import { EditorSchema, ExtensionTagType } from '@remirror/core';
2
+ export declare const getNodeNamesByGroup: (schema: EditorSchema, group: ExtensionTagType) => string[];
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNodeNamesByGroup = void 0;
4
+ const getNodeNamesByGroup = (schema, group) => {
5
+ return Object.values(schema.nodes)
6
+ .filter((node) => node.spec.group?.includes(group))
7
+ .map((node) => node.name);
8
+ };
9
+ exports.getNodeNamesByGroup = getNodeNamesByGroup;
@@ -0,0 +1 @@
1
+ export declare const getShortcutSymbol: () => string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getShortcutSymbol = void 0;
4
+ const getShortcutSymbol = () => {
5
+ // If we can detect Mac then we return "⌘" otherwise default to "Ctrl"
6
+ return window.navigator.userAgent.toLowerCase().indexOf('mac') > -1 ? '⌘' : 'Ctrl';
7
+ };
8
+ exports.getShortcutSymbol = getShortcutSymbol;
@@ -0,0 +1 @@
1
+ export declare const undefinedIfEmpty: <T extends object>(object: T) => T | undefined;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.undefinedIfEmpty = void 0;
4
+ const undefinedIfEmpty = (object) => {
5
+ return Object.keys(object).length > 0 ? object : undefined;
6
+ };
7
+ exports.undefinedIfEmpty = undefinedIfEmpty;
@@ -0,0 +1,3 @@
1
+ export declare const noEmptySpacesValidation: (value: string | undefined) => "Empty space is not allowed" | undefined;
2
+ export declare const hasProperties: <T>(message: string, properties: (keyof T)[]) => (value: T) => string | undefined;
3
+ export declare const regexDataURI: RegExp;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.regexDataURI = exports.hasProperties = exports.noEmptySpacesValidation = void 0;
4
+ const noEmptySpacesValidation = (value) => {
5
+ if (value && !(value.trim().length > 0)) {
6
+ return 'Empty space is not allowed';
7
+ }
8
+ };
9
+ exports.noEmptySpacesValidation = noEmptySpacesValidation;
10
+ const hasProperties = (message, properties) => (value) => {
11
+ if (!value || properties.filter((property) => value[property]).length !== properties.length) {
12
+ return message;
13
+ }
14
+ };
15
+ exports.hasProperties = hasProperties;
16
+ exports.regexDataURI = /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*)$/i;