@atlaskit/editor-core 181.0.1 → 182.0.1

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 (318) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/codemods/140.0.0-rc-kraken-fix-type-errors.ts +0 -2
  3. package/codemods/__tests__/next-remove-allow-more-text-colors-prop.ts +0 -17
  4. package/codemods/migrates/next-remove-allow-more-text-colors-prop.ts +0 -4
  5. package/dist/cjs/create-editor/sort-by-order.js +12 -0
  6. package/dist/cjs/editor-next/editor-migration-component.js +4 -1
  7. package/dist/cjs/editor-next/utils/deprecationWarnings.js +0 -5
  8. package/dist/cjs/labs/next/full-page.js +2 -1
  9. package/dist/cjs/labs/next/presets/default.js +2 -1
  10. package/dist/cjs/labs/next/presets/universal.js +7 -1
  11. package/dist/cjs/plugins/alignment/ui/ToolbarAlignment/index.js +2 -1
  12. package/dist/cjs/plugins/alignment/ui/ToolbarAlignment/styles.js +4 -7
  13. package/dist/cjs/plugins/analytics/plugin.js +6 -6
  14. package/dist/cjs/plugins/avatar-group/index.js +5 -2
  15. package/dist/cjs/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +4 -2
  16. package/dist/cjs/plugins/base/index.js +4 -2
  17. package/dist/cjs/plugins/base/pm-plugins/disable-spell-checking.js +1 -3
  18. package/dist/cjs/plugins/block-type/ui/ToolbarBlockType/blocktype-button.js +1 -6
  19. package/dist/cjs/plugins/block-type/ui/ToolbarBlockType/index.js +2 -8
  20. package/dist/cjs/plugins/border/index.js +20 -0
  21. package/dist/cjs/plugins/card/index.js +4 -2
  22. package/dist/cjs/plugins/card/toolbar.js +12 -15
  23. package/dist/cjs/plugins/card/ui/EditLinkToolbar.js +7 -3
  24. package/dist/cjs/plugins/code-block/toolbar.js +1 -1
  25. package/dist/cjs/plugins/collab-edit/analytics.js +2 -3
  26. package/dist/cjs/plugins/collab-edit/events/handlers.js +2 -2
  27. package/dist/cjs/plugins/collab-edit/events/initialize.js +3 -2
  28. package/dist/cjs/plugins/collab-edit/index.js +5 -3
  29. package/dist/cjs/plugins/collab-edit/plugin.js +4 -3
  30. package/dist/cjs/plugins/collab-edit/ui/avatars-with-plugin-state.js +5 -3
  31. package/dist/cjs/plugins/collab-edit/ui/avatars.js +2 -3
  32. package/dist/cjs/plugins/date/index.js +90 -64
  33. package/dist/cjs/plugins/editor-disabled/index.js +8 -0
  34. package/dist/cjs/plugins/expand/index.js +4 -1
  35. package/dist/cjs/plugins/expand/nodeviews/index.js +6 -7
  36. package/dist/cjs/plugins/expand/pm-plugins/main.js +5 -2
  37. package/dist/cjs/plugins/extension/extension-api.js +27 -14
  38. package/dist/cjs/plugins/extension/pm-plugins/main.js +117 -177
  39. package/dist/cjs/plugins/extension/pm-plugins/utils.js +80 -0
  40. package/dist/cjs/plugins/feature-flags-context/get-enabled-feature-flag-keys.js +7 -11
  41. package/dist/cjs/plugins/find-replace/FindReplaceToolbarButtonWithState.js +3 -4
  42. package/dist/cjs/plugins/find-replace/index.js +5 -2
  43. package/dist/cjs/plugins/floating-toolbar/index.js +15 -7
  44. package/dist/cjs/plugins/floating-toolbar/ui/CheckboxModal.js +2 -1
  45. package/dist/cjs/plugins/floating-toolbar/ui/EmojiPickerButton.js +13 -3
  46. package/dist/cjs/plugins/floating-toolbar/ui/SimpleModal.js +2 -1
  47. package/dist/cjs/plugins/floating-toolbar/ui/Toolbar.js +6 -5
  48. package/dist/cjs/plugins/hyperlink/Toolbar.js +9 -12
  49. package/dist/cjs/plugins/hyperlink/index.js +6 -2
  50. package/dist/cjs/plugins/hyperlink/ui/HyperlinkAddToolbar/index.js +3 -4
  51. package/dist/cjs/plugins/index.js +7 -0
  52. package/dist/cjs/plugins/insert-block/ui/ToolbarInsertBlock/index.js +2 -1
  53. package/dist/cjs/plugins/list/actions/outdent-list-items-selected.js +5 -5
  54. package/dist/cjs/plugins/list/commands/index.js +31 -27
  55. package/dist/cjs/plugins/list/commands/outdent-list.js +2 -3
  56. package/dist/cjs/plugins/list/index.js +4 -3
  57. package/dist/cjs/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +3 -1
  58. package/dist/cjs/plugins/list/pm-plugins/input-rules/index.js +2 -1
  59. package/dist/cjs/plugins/list/pm-plugins/input-rules/wrapping-join-rule.js +58 -0
  60. package/dist/cjs/plugins/list/pm-plugins/keymap.js +4 -4
  61. package/dist/cjs/plugins/list/pm-plugins/main.js +23 -21
  62. package/dist/cjs/plugins/media/nodeviews/mediaNodeView/media.js +6 -1
  63. package/dist/cjs/plugins/media/nodeviews/styles.js +13 -1
  64. package/dist/cjs/plugins/media/toolbar/commands.js +105 -2
  65. package/dist/cjs/plugins/media/toolbar/imageBorder.js +20 -0
  66. package/dist/cjs/plugins/media/toolbar/index.js +33 -4
  67. package/dist/cjs/plugins/media/ui/ImageBorder/index.js +219 -0
  68. package/dist/cjs/plugins/media/ui/ImageBorder/messages.js +50 -0
  69. package/dist/cjs/plugins/media/ui/ImageBorder/styles.js +54 -0
  70. package/dist/cjs/plugins/media/utils/current-media-node.js +28 -5
  71. package/dist/cjs/plugins/paste/util/index.js +2 -0
  72. package/dist/cjs/plugins/rank.js +1 -1
  73. package/dist/cjs/plugins/rule/pm-plugins/input-rule.js +5 -0
  74. package/dist/cjs/plugins/text-formatting/ui/Toolbar/hooks/clear-formatting-icon.js +2 -1
  75. package/dist/cjs/plugins/toolbar-lists-indentation/index.js +3 -1
  76. package/dist/cjs/plugins/toolbar-lists-indentation/ui/Toolbar.js +2 -1
  77. package/dist/cjs/plugins/toolbar-lists-indentation/ui/ToolbarDropdown.js +2 -1
  78. package/dist/cjs/plugins/toolbar-lists-indentation/ui/index.js +6 -3
  79. package/dist/cjs/plugins/toolbar-lists-indentation/ui/onItemActivated.js +3 -2
  80. package/dist/cjs/test-utils.js +3 -1
  81. package/dist/cjs/ui/Appearance/FullPage/FullPageToolbar.js +4 -2
  82. package/dist/cjs/ui/styles.js +1 -1
  83. package/dist/cjs/utils/input-rules.js +0 -17
  84. package/dist/cjs/utils/insert.js +53 -7
  85. package/dist/cjs/version-wrapper.js +1 -1
  86. package/dist/cjs/version.json +1 -1
  87. package/dist/es2019/create-editor/sort-by-order.js +11 -0
  88. package/dist/es2019/editor-next/editor-migration-component.js +4 -1
  89. package/dist/es2019/editor-next/utils/deprecationWarnings.js +0 -5
  90. package/dist/es2019/labs/next/full-page.js +2 -1
  91. package/dist/es2019/labs/next/presets/default.js +2 -1
  92. package/dist/es2019/labs/next/presets/universal.js +8 -2
  93. package/dist/es2019/plugins/alignment/ui/ToolbarAlignment/index.js +3 -2
  94. package/dist/es2019/plugins/alignment/ui/ToolbarAlignment/styles.js +0 -8
  95. package/dist/es2019/plugins/analytics/plugin.js +45 -43
  96. package/dist/es2019/plugins/avatar-group/index.js +26 -21
  97. package/dist/es2019/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +4 -2
  98. package/dist/es2019/plugins/base/index.js +101 -97
  99. package/dist/es2019/plugins/base/pm-plugins/disable-spell-checking.js +1 -3
  100. package/dist/es2019/plugins/block-type/ui/ToolbarBlockType/blocktype-button.js +1 -6
  101. package/dist/es2019/plugins/block-type/ui/ToolbarBlockType/index.js +2 -7
  102. package/dist/es2019/plugins/border/index.js +11 -0
  103. package/dist/es2019/plugins/card/index.js +4 -2
  104. package/dist/es2019/plugins/card/toolbar.js +10 -11
  105. package/dist/es2019/plugins/card/ui/EditLinkToolbar.js +7 -3
  106. package/dist/es2019/plugins/code-block/toolbar.js +2 -2
  107. package/dist/es2019/plugins/collab-edit/analytics.js +2 -3
  108. package/dist/es2019/plugins/collab-edit/events/handlers.js +2 -2
  109. package/dist/es2019/plugins/collab-edit/events/initialize.js +3 -2
  110. package/dist/es2019/plugins/collab-edit/index.js +5 -3
  111. package/dist/es2019/plugins/collab-edit/plugin.js +4 -3
  112. package/dist/es2019/plugins/collab-edit/ui/avatars-with-plugin-state.js +5 -3
  113. package/dist/es2019/plugins/collab-edit/ui/avatars.js +2 -3
  114. package/dist/es2019/plugins/date/index.js +92 -64
  115. package/dist/es2019/plugins/editor-disabled/index.js +8 -0
  116. package/dist/es2019/plugins/expand/index.js +57 -53
  117. package/dist/es2019/plugins/expand/nodeviews/index.js +6 -9
  118. package/dist/es2019/plugins/expand/pm-plugins/main.js +5 -3
  119. package/dist/es2019/plugins/extension/extension-api.js +31 -13
  120. package/dist/es2019/plugins/extension/pm-plugins/main.js +77 -96
  121. package/dist/es2019/plugins/extension/pm-plugins/utils.js +30 -0
  122. package/dist/es2019/plugins/feature-flags-context/get-enabled-feature-flag-keys.js +1 -8
  123. package/dist/es2019/plugins/find-replace/FindReplaceToolbarButtonWithState.js +3 -3
  124. package/dist/es2019/plugins/find-replace/index.js +5 -2
  125. package/dist/es2019/plugins/floating-toolbar/index.js +159 -149
  126. package/dist/es2019/plugins/floating-toolbar/ui/CheckboxModal.js +4 -1
  127. package/dist/es2019/plugins/floating-toolbar/ui/EmojiPickerButton.js +13 -3
  128. package/dist/es2019/plugins/floating-toolbar/ui/SimpleModal.js +4 -1
  129. package/dist/es2019/plugins/floating-toolbar/ui/Toolbar.js +6 -5
  130. package/dist/es2019/plugins/hyperlink/Toolbar.js +7 -9
  131. package/dist/es2019/plugins/hyperlink/index.js +66 -62
  132. package/dist/es2019/plugins/hyperlink/ui/HyperlinkAddToolbar/index.js +3 -3
  133. package/dist/es2019/plugins/index.js +2 -1
  134. package/dist/es2019/plugins/insert-block/ui/ToolbarInsertBlock/index.js +2 -1
  135. package/dist/es2019/plugins/list/actions/outdent-list-items-selected.js +5 -5
  136. package/dist/es2019/plugins/list/commands/index.js +4 -4
  137. package/dist/es2019/plugins/list/commands/outdent-list.js +2 -4
  138. package/dist/es2019/plugins/list/index.js +80 -77
  139. package/dist/es2019/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +3 -1
  140. package/dist/es2019/plugins/list/pm-plugins/input-rules/index.js +2 -1
  141. package/dist/es2019/plugins/list/pm-plugins/input-rules/wrapping-join-rule.js +52 -0
  142. package/dist/es2019/plugins/list/pm-plugins/keymap.js +4 -4
  143. package/dist/es2019/plugins/list/pm-plugins/main.js +46 -46
  144. package/dist/es2019/plugins/media/nodeviews/mediaNodeView/media.js +4 -1
  145. package/dist/es2019/plugins/media/nodeviews/styles.js +12 -1
  146. package/dist/es2019/plugins/media/toolbar/commands.js +93 -0
  147. package/dist/es2019/plugins/media/toolbar/imageBorder.js +15 -0
  148. package/dist/es2019/plugins/media/toolbar/index.js +36 -5
  149. package/dist/es2019/plugins/media/ui/ImageBorder/index.js +206 -0
  150. package/dist/es2019/plugins/media/ui/ImageBorder/messages.js +43 -0
  151. package/dist/es2019/plugins/media/ui/ImageBorder/styles.js +124 -0
  152. package/dist/es2019/plugins/media/utils/current-media-node.js +22 -3
  153. package/dist/es2019/plugins/paste/util/index.js +2 -0
  154. package/dist/es2019/plugins/rank.js +1 -1
  155. package/dist/es2019/plugins/rule/pm-plugins/input-rule.js +7 -0
  156. package/dist/es2019/plugins/text-formatting/ui/Toolbar/hooks/clear-formatting-icon.js +2 -1
  157. package/dist/es2019/plugins/toolbar-lists-indentation/index.js +59 -55
  158. package/dist/es2019/plugins/toolbar-lists-indentation/ui/Toolbar.js +2 -1
  159. package/dist/es2019/plugins/toolbar-lists-indentation/ui/ToolbarDropdown.js +2 -1
  160. package/dist/es2019/plugins/toolbar-lists-indentation/ui/index.js +6 -3
  161. package/dist/es2019/plugins/toolbar-lists-indentation/ui/onItemActivated.js +3 -2
  162. package/dist/es2019/test-utils.js +3 -1
  163. package/dist/es2019/ui/Appearance/FullPage/FullPageToolbar.js +4 -2
  164. package/dist/es2019/ui/styles.js +1 -0
  165. package/dist/es2019/utils/input-rules.js +0 -17
  166. package/dist/es2019/utils/insert.js +61 -10
  167. package/dist/es2019/version-wrapper.js +1 -1
  168. package/dist/es2019/version.json +1 -1
  169. package/dist/esm/create-editor/sort-by-order.js +11 -0
  170. package/dist/esm/editor-next/editor-migration-component.js +3 -0
  171. package/dist/esm/editor-next/utils/deprecationWarnings.js +0 -5
  172. package/dist/esm/labs/next/full-page.js +2 -1
  173. package/dist/esm/labs/next/presets/default.js +2 -1
  174. package/dist/esm/labs/next/presets/universal.js +8 -2
  175. package/dist/esm/plugins/alignment/ui/ToolbarAlignment/index.js +3 -2
  176. package/dist/esm/plugins/alignment/ui/ToolbarAlignment/styles.js +3 -5
  177. package/dist/esm/plugins/analytics/plugin.js +6 -6
  178. package/dist/esm/plugins/avatar-group/index.js +5 -2
  179. package/dist/esm/plugins/avatar-group/ui/AvatarGroupPluginWrapper.js +4 -2
  180. package/dist/esm/plugins/base/index.js +4 -2
  181. package/dist/esm/plugins/base/pm-plugins/disable-spell-checking.js +1 -3
  182. package/dist/esm/plugins/block-type/ui/ToolbarBlockType/blocktype-button.js +1 -6
  183. package/dist/esm/plugins/block-type/ui/ToolbarBlockType/index.js +2 -8
  184. package/dist/esm/plugins/border/index.js +13 -0
  185. package/dist/esm/plugins/card/index.js +4 -2
  186. package/dist/esm/plugins/card/toolbar.js +12 -15
  187. package/dist/esm/plugins/card/ui/EditLinkToolbar.js +7 -3
  188. package/dist/esm/plugins/code-block/toolbar.js +2 -2
  189. package/dist/esm/plugins/collab-edit/analytics.js +2 -3
  190. package/dist/esm/plugins/collab-edit/events/handlers.js +2 -2
  191. package/dist/esm/plugins/collab-edit/events/initialize.js +3 -2
  192. package/dist/esm/plugins/collab-edit/index.js +5 -3
  193. package/dist/esm/plugins/collab-edit/plugin.js +4 -3
  194. package/dist/esm/plugins/collab-edit/ui/avatars-with-plugin-state.js +5 -3
  195. package/dist/esm/plugins/collab-edit/ui/avatars.js +2 -3
  196. package/dist/esm/plugins/date/index.js +90 -64
  197. package/dist/esm/plugins/editor-disabled/index.js +8 -0
  198. package/dist/esm/plugins/expand/index.js +4 -1
  199. package/dist/esm/plugins/expand/nodeviews/index.js +6 -7
  200. package/dist/esm/plugins/expand/pm-plugins/main.js +5 -2
  201. package/dist/esm/plugins/extension/extension-api.js +24 -12
  202. package/dist/esm/plugins/extension/pm-plugins/main.js +113 -173
  203. package/dist/esm/plugins/extension/pm-plugins/utils.js +72 -0
  204. package/dist/esm/plugins/feature-flags-context/get-enabled-feature-flag-keys.js +1 -10
  205. package/dist/esm/plugins/find-replace/FindReplaceToolbarButtonWithState.js +3 -4
  206. package/dist/esm/plugins/find-replace/index.js +5 -2
  207. package/dist/esm/plugins/floating-toolbar/index.js +15 -7
  208. package/dist/esm/plugins/floating-toolbar/ui/CheckboxModal.js +2 -1
  209. package/dist/esm/plugins/floating-toolbar/ui/EmojiPickerButton.js +13 -3
  210. package/dist/esm/plugins/floating-toolbar/ui/SimpleModal.js +2 -1
  211. package/dist/esm/plugins/floating-toolbar/ui/Toolbar.js +6 -5
  212. package/dist/esm/plugins/hyperlink/Toolbar.js +9 -13
  213. package/dist/esm/plugins/hyperlink/index.js +6 -2
  214. package/dist/esm/plugins/hyperlink/ui/HyperlinkAddToolbar/index.js +3 -4
  215. package/dist/esm/plugins/index.js +2 -1
  216. package/dist/esm/plugins/insert-block/ui/ToolbarInsertBlock/index.js +2 -1
  217. package/dist/esm/plugins/list/actions/outdent-list-items-selected.js +5 -5
  218. package/dist/esm/plugins/list/commands/index.js +31 -27
  219. package/dist/esm/plugins/list/commands/outdent-list.js +2 -3
  220. package/dist/esm/plugins/list/index.js +4 -3
  221. package/dist/esm/plugins/list/pm-plugins/input-rules/create-list-input-rule.js +3 -1
  222. package/dist/esm/plugins/list/pm-plugins/input-rules/index.js +2 -1
  223. package/dist/esm/plugins/list/pm-plugins/input-rules/wrapping-join-rule.js +51 -0
  224. package/dist/esm/plugins/list/pm-plugins/keymap.js +4 -4
  225. package/dist/esm/plugins/list/pm-plugins/main.js +23 -21
  226. package/dist/esm/plugins/media/nodeviews/mediaNodeView/media.js +6 -1
  227. package/dist/esm/plugins/media/nodeviews/styles.js +13 -1
  228. package/dist/esm/plugins/media/toolbar/commands.js +99 -0
  229. package/dist/esm/plugins/media/toolbar/imageBorder.js +14 -0
  230. package/dist/esm/plugins/media/toolbar/index.js +34 -5
  231. package/dist/esm/plugins/media/ui/ImageBorder/index.js +211 -0
  232. package/dist/esm/plugins/media/ui/ImageBorder/messages.js +43 -0
  233. package/dist/esm/plugins/media/ui/ImageBorder/styles.js +37 -0
  234. package/dist/esm/plugins/media/utils/current-media-node.js +24 -3
  235. package/dist/esm/plugins/paste/util/index.js +2 -0
  236. package/dist/esm/plugins/rank.js +1 -1
  237. package/dist/esm/plugins/rule/pm-plugins/input-rule.js +5 -0
  238. package/dist/esm/plugins/text-formatting/ui/Toolbar/hooks/clear-formatting-icon.js +2 -1
  239. package/dist/esm/plugins/toolbar-lists-indentation/index.js +3 -1
  240. package/dist/esm/plugins/toolbar-lists-indentation/ui/Toolbar.js +2 -1
  241. package/dist/esm/plugins/toolbar-lists-indentation/ui/ToolbarDropdown.js +2 -1
  242. package/dist/esm/plugins/toolbar-lists-indentation/ui/index.js +6 -3
  243. package/dist/esm/plugins/toolbar-lists-indentation/ui/onItemActivated.js +3 -2
  244. package/dist/esm/test-utils.js +3 -1
  245. package/dist/esm/ui/Appearance/FullPage/FullPageToolbar.js +4 -2
  246. package/dist/esm/ui/styles.js +1 -1
  247. package/dist/esm/utils/input-rules.js +0 -17
  248. package/dist/esm/utils/insert.js +56 -10
  249. package/dist/esm/version-wrapper.js +1 -1
  250. package/dist/esm/version.json +1 -1
  251. package/dist/types/create-editor/sort-by-order.d.ts +9 -0
  252. package/dist/types/editor-next/editor-migration-component.d.ts +1 -0
  253. package/dist/types/labs/next/presets/cxhtml.d.ts +36 -2
  254. package/dist/types/labs/next/presets/default.d.ts +72 -4
  255. package/dist/types/labs/next/presets/mobile.d.ts +36 -2
  256. package/dist/types/plugins/alignment/ui/ToolbarAlignment/styles.d.ts +0 -1
  257. package/dist/types/plugins/analytics/plugin.d.ts +2 -0
  258. package/dist/types/plugins/avatar-group/index.d.ts +2 -0
  259. package/dist/types/plugins/avatar-group/ui/AvatarGroupPluginWrapper.d.ts +2 -0
  260. package/dist/types/plugins/base/index.d.ts +2 -0
  261. package/dist/types/plugins/base/pm-plugins/disable-spell-checking.d.ts +2 -1
  262. package/dist/types/plugins/border/index.d.ts +3 -0
  263. package/dist/types/plugins/card/index.d.ts +2 -0
  264. package/dist/types/plugins/card/toolbar.d.ts +2 -1
  265. package/dist/types/plugins/card/ui/EditLinkToolbar.d.ts +5 -2
  266. package/dist/types/plugins/collab-edit/analytics.d.ts +2 -1
  267. package/dist/types/plugins/collab-edit/events/handlers.d.ts +2 -1
  268. package/dist/types/plugins/collab-edit/events/initialize.d.ts +3 -1
  269. package/dist/types/plugins/collab-edit/index.d.ts +2 -0
  270. package/dist/types/plugins/collab-edit/plugin.d.ts +2 -1
  271. package/dist/types/plugins/collab-edit/ui/avatars-with-plugin-state.d.ts +4 -0
  272. package/dist/types/plugins/collab-edit/ui/avatars.d.ts +2 -0
  273. package/dist/types/plugins/date/index.d.ts +9 -1
  274. package/dist/types/plugins/editor-disabled/index.d.ts +3 -1
  275. package/dist/types/plugins/expand/index.d.ts +2 -0
  276. package/dist/types/plugins/expand/nodeviews/index.d.ts +5 -2
  277. package/dist/types/plugins/expand/pm-plugins/main.d.ts +2 -1
  278. package/dist/types/plugins/extension/pm-plugins/main.d.ts +8 -2
  279. package/dist/types/plugins/extension/pm-plugins/utils.d.ts +3 -0
  280. package/dist/types/plugins/feature-flags-context/get-enabled-feature-flag-keys.d.ts +1 -7
  281. package/dist/types/plugins/find-replace/FindReplaceToolbarButtonWithState.d.ts +2 -0
  282. package/dist/types/plugins/find-replace/index.d.ts +2 -0
  283. package/dist/types/plugins/floating-toolbar/index.d.ts +4 -1
  284. package/dist/types/plugins/floating-toolbar/ui/Toolbar.d.ts +2 -0
  285. package/dist/types/plugins/hyperlink/Toolbar.d.ts +2 -1
  286. package/dist/types/plugins/hyperlink/index.d.ts +2 -0
  287. package/dist/types/plugins/hyperlink/ui/HyperlinkAddToolbar/index.d.ts +2 -0
  288. package/dist/types/plugins/index.d.ts +1 -0
  289. package/dist/types/plugins/list/actions/outdent-list-items-selected.d.ts +2 -1
  290. package/dist/types/plugins/list/commands/index.d.ts +3 -2
  291. package/dist/types/plugins/list/commands/outdent-list.d.ts +2 -1
  292. package/dist/types/plugins/list/index.d.ts +2 -0
  293. package/dist/types/plugins/list/pm-plugins/input-rules/create-list-input-rule.d.ts +1 -1
  294. package/dist/types/plugins/list/pm-plugins/input-rules/wrapping-join-rule.d.ts +13 -0
  295. package/dist/types/plugins/list/pm-plugins/keymap.d.ts +2 -1
  296. package/dist/types/plugins/list/pm-plugins/main.d.ts +3 -2
  297. package/dist/types/plugins/media/nodeviews/styles.d.ts +3 -1
  298. package/dist/types/plugins/media/toolbar/commands.d.ts +5 -0
  299. package/dist/types/plugins/media/toolbar/imageBorder.d.ts +2 -0
  300. package/dist/types/plugins/media/types.d.ts +3 -0
  301. package/dist/types/plugins/media/ui/ImageBorder/index.d.ts +13 -0
  302. package/dist/types/plugins/media/ui/ImageBorder/messages.d.ts +42 -0
  303. package/dist/types/plugins/media/ui/ImageBorder/styles.d.ts +15 -0
  304. package/dist/types/plugins/media/utils/current-media-node.d.ts +6 -0
  305. package/dist/types/plugins/text-color/pm-plugins/main.d.ts +0 -2
  306. package/dist/types/plugins/toolbar-lists-indentation/index.d.ts +2 -0
  307. package/dist/types/plugins/toolbar-lists-indentation/types.d.ts +2 -0
  308. package/dist/types/plugins/toolbar-lists-indentation/ui/index.d.ts +2 -0
  309. package/dist/types/plugins/toolbar-lists-indentation/ui/onItemActivated.d.ts +3 -1
  310. package/dist/types/test-utils.d.ts +4 -2
  311. package/dist/types/types/editor-props.d.ts +5 -0
  312. package/dist/types/ui/Appearance/FullPage/StyledComponents.d.ts +5 -5
  313. package/dist/types/ui/ConfigPanel/ConfigPanel.d.ts +1 -1
  314. package/dist/types/ui/ContentStyles/index.d.ts +2 -2
  315. package/package.json +12 -11
  316. package/report.api.md +12 -4
  317. package/codemods/__tests__/rename-experimental-text-color-prop.ts +0 -204
  318. package/codemods/migrates/rename-experimental-text-color-prop.ts +0 -6
@@ -0,0 +1,52 @@
1
+ import { canJoin, findWrapping } from 'prosemirror-transform';
2
+ import { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';
3
+ import { JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST } from '@atlaskit/editor-common/analytics';
4
+ import { createRule } from '../../../../utils/input-rules';
5
+ export const createWrappingJoinRule = ({
6
+ match,
7
+ nodeType,
8
+ getAttrs,
9
+ joinPredicate,
10
+ featureFlags
11
+ }) => {
12
+ const handler = (state, match, start, end) => {
13
+ const attrs = (getAttrs instanceof Function ? getAttrs(match) : getAttrs) || {};
14
+ const tr = state.tr;
15
+ const fixedStart = Math.max(start, 1);
16
+ tr.delete(fixedStart, end);
17
+ const $start = tr.doc.resolve(fixedStart);
18
+ const range = $start.blockRange();
19
+ const wrapping = range && findWrapping(range, nodeType, attrs);
20
+ if (!wrapping || !range) {
21
+ return null;
22
+ }
23
+ const parentNodePosMapped = tr.mapping.map(range.start);
24
+ const parentNode = tr.doc.nodeAt(parentNodePosMapped);
25
+ const lastWrap = wrapping[wrapping.length - 1];
26
+ if (parentNode && lastWrap) {
27
+ const allowedMarks = lastWrap.type.allowedMarks(parentNode.marks) || [];
28
+ tr.setNodeMarkup(parentNodePosMapped, parentNode.type, parentNode.attrs, allowedMarks);
29
+ }
30
+ tr.wrap(range, wrapping);
31
+ if (featureFlags !== null && featureFlags !== void 0 && featureFlags.restartNumberedLists && nodeType === state.schema.nodes.orderedList) {
32
+ // if an orderedList node would be inserted by the input rule match, and
33
+ // that orderedList node is being added directly before another orderedList
34
+ // node, then join those nodes
35
+ const $end = tr.doc.resolve(tr.mapping.map(end));
36
+ const node = findParentNodeOfTypeClosestToPos($end, nodeType);
37
+ if (node) {
38
+ const nodeEnd = node.pos + node.node.nodeSize;
39
+ const after = tr.doc.resolve(nodeEnd).nodeAfter;
40
+ if (after && after.type === nodeType && canJoin(tr.doc, nodeEnd) && (!joinPredicate || joinPredicate(match, after, JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST.JOINED_TO_LIST_BELOW))) {
41
+ tr.join(nodeEnd);
42
+ }
43
+ }
44
+ }
45
+ const before = tr.doc.resolve(fixedStart - 1).nodeBefore;
46
+ if (before && before.type === nodeType && canJoin(tr.doc, fixedStart - 1) && (!joinPredicate || joinPredicate(match, before, JOIN_SCENARIOS_WHEN_TYPING_TO_INSERT_LIST.JOINED_TO_LIST_ABOVE))) {
47
+ tr.join(fixedStart - 1);
48
+ }
49
+ return tr;
50
+ };
51
+ return createRule(match, handler);
52
+ };
@@ -3,14 +3,14 @@ import * as keymaps from '../../../keymaps';
3
3
  import { indentList, enterKeyCommand, toggleList, backspaceKeyCommand, deleteKeyCommand } from '../commands';
4
4
  import { outdentList } from '../commands/outdent-list';
5
5
  import { INPUT_METHOD } from '../../analytics';
6
- export function keymapPlugin() {
6
+ export function keymapPlugin(featureFlags) {
7
7
  const list = {};
8
8
  keymaps.bindKeymapWithCommand(keymaps.findShortcutByKeymap(keymaps.toggleOrderedList), toggleList(INPUT_METHOD.KEYBOARD, 'orderedList'), list);
9
9
  keymaps.bindKeymapWithCommand(keymaps.findShortcutByKeymap(keymaps.toggleBulletList), toggleList(INPUT_METHOD.KEYBOARD, 'bulletList'), list);
10
10
  keymaps.bindKeymapWithCommand(keymaps.indentList.common, indentList(INPUT_METHOD.KEYBOARD), list);
11
- keymaps.bindKeymapWithCommand(keymaps.outdentList.common, outdentList(INPUT_METHOD.KEYBOARD), list);
12
- keymaps.bindKeymapWithCommand(keymaps.enter.common, enterKeyCommand, list);
13
- keymaps.bindKeymapWithCommand(keymaps.backspace.common, backspaceKeyCommand, list);
11
+ keymaps.bindKeymapWithCommand(keymaps.outdentList.common, outdentList(INPUT_METHOD.KEYBOARD, featureFlags), list);
12
+ keymaps.bindKeymapWithCommand(keymaps.enter.common, enterKeyCommand(featureFlags), list);
13
+ keymaps.bindKeymapWithCommand(keymaps.backspace.common, backspaceKeyCommand(featureFlags), list);
14
14
  keymaps.bindKeymapWithCommand(keymaps.deleteKey.common, deleteKeyCommand, list);
15
15
 
16
16
  // This shortcut is Mac only
@@ -9,7 +9,6 @@ import { setGapCursorSelection } from '../../../utils';
9
9
  import { Side } from '../../selection/gap-cursor-selection';
10
10
  import { listItemCounterPadding, CodeBlockSharedCssClassName, getOrderedListInlineStyles } from '@atlaskit/editor-common/styles';
11
11
  import { getItemCounterDigitsSize } from '@atlaskit/editor-common/utils';
12
- import { getFeatureFlags } from '../../feature-flags-context';
13
12
  const listPluginKey = new PluginKey('listPlugin');
14
13
  export const pluginKey = listPluginKey;
15
14
  const initialState = {
@@ -19,9 +18,8 @@ const initialState = {
19
18
  orderedListDisabled: false,
20
19
  decorationSet: DecorationSet.empty
21
20
  };
22
- export const getDecorations = (doc, state) => {
21
+ export const getDecorations = (doc, state, featureFlags) => {
23
22
  const decorations = [];
24
- const featureFlags = getFeatureFlags(state);
25
23
 
26
24
  // this stack keeps track of each (nested) list to calculate the indentation level
27
25
  const processedListsStack = [];
@@ -74,9 +72,9 @@ export const getDecorations = (doc, state) => {
74
72
  });
75
73
  return DecorationSet.empty.add(doc, decorations);
76
74
  };
77
- const handleDocChanged = (tr, pluginState, editorState) => {
75
+ const handleDocChanged = featureFlags => (tr, pluginState, editorState) => {
78
76
  const nextPluginState = handleSelectionChanged(tr, pluginState);
79
- const decorationSet = getDecorations(tr.doc, editorState);
77
+ const decorationSet = getDecorations(tr.doc, editorState, featureFlags);
80
78
  return {
81
79
  ...nextPluginState,
82
80
  decorationSet
@@ -107,53 +105,55 @@ const handleSelectionChanged = (tr, pluginState) => {
107
105
  const reducer = () => state => {
108
106
  return state;
109
107
  };
110
- const {
111
- getPluginState,
112
- createPluginState
113
- } = pluginFactory(listPluginKey, reducer(), {
114
- onDocChanged: handleDocChanged,
115
- onSelectionChanged: handleSelectionChanged
116
- });
117
- const createInitialState = state => {
108
+ const createInitialState = featureFlags => state => {
118
109
  return {
119
110
  ...initialState,
120
- decorationSet: getDecorations(state.doc, state)
111
+ decorationSet: getDecorations(state.doc, state, featureFlags)
121
112
  };
122
113
  };
123
- export const createPlugin = eventDispatch => new SafePlugin({
124
- state: createPluginState(eventDispatch, createInitialState),
125
- key: listPluginKey,
126
- props: {
127
- decorations(state) {
128
- const {
129
- decorationSet
130
- } = getPluginState(state);
131
- return decorationSet;
132
- },
133
- handleClick: (view, pos, event) => {
134
- const {
135
- state
136
- } = view;
137
- if (['LI', 'UL'].includes((event === null || event === void 0 ? void 0 : event.target).tagName)) {
138
- var _nodeAtPos$firstChild;
139
- const nodeAtPos = state.tr.doc.nodeAt(pos);
114
+ export const createPlugin = (eventDispatch, featureFlags) => {
115
+ const {
116
+ getPluginState,
117
+ createPluginState
118
+ } = pluginFactory(listPluginKey, reducer(), {
119
+ onDocChanged: handleDocChanged(featureFlags),
120
+ onSelectionChanged: handleSelectionChanged
121
+ });
122
+ return new SafePlugin({
123
+ state: createPluginState(eventDispatch, createInitialState(featureFlags)),
124
+ key: listPluginKey,
125
+ props: {
126
+ decorations(state) {
127
+ const {
128
+ decorationSet
129
+ } = getPluginState(state);
130
+ return decorationSet;
131
+ },
132
+ handleClick: (view, pos, event) => {
140
133
  const {
141
- listItem,
142
- codeBlock
143
- } = view.state.schema.nodes;
144
- if ((nodeAtPos === null || nodeAtPos === void 0 ? void 0 : nodeAtPos.type) === listItem && (nodeAtPos === null || nodeAtPos === void 0 ? void 0 : (_nodeAtPos$firstChild = nodeAtPos.firstChild) === null || _nodeAtPos$firstChild === void 0 ? void 0 : _nodeAtPos$firstChild.type) === codeBlock) {
145
- var _document, _document$elementFrom;
146
- const bufferPx = 50;
147
- const isCodeBlockNextToListMarker = Boolean((_document = document) === null || _document === void 0 ? void 0 : (_document$elementFrom = _document.elementFromPoint(event.clientX + (listItemCounterPadding + bufferPx), event.clientY)) === null || _document$elementFrom === void 0 ? void 0 : _document$elementFrom.closest(`.${CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER}`));
148
- if (isCodeBlockNextToListMarker) {
149
- // +1 needed to put cursor inside li
150
- // otherwise gap cursor markup will be injected as immediate child of ul resulting in invalid html
151
- setGapCursorSelection(view, pos + 1, Side.LEFT);
152
- return true;
134
+ state
135
+ } = view;
136
+ if (['LI', 'UL'].includes((event === null || event === void 0 ? void 0 : event.target).tagName)) {
137
+ var _nodeAtPos$firstChild;
138
+ const nodeAtPos = state.tr.doc.nodeAt(pos);
139
+ const {
140
+ listItem,
141
+ codeBlock
142
+ } = view.state.schema.nodes;
143
+ if ((nodeAtPos === null || nodeAtPos === void 0 ? void 0 : nodeAtPos.type) === listItem && (nodeAtPos === null || nodeAtPos === void 0 ? void 0 : (_nodeAtPos$firstChild = nodeAtPos.firstChild) === null || _nodeAtPos$firstChild === void 0 ? void 0 : _nodeAtPos$firstChild.type) === codeBlock) {
144
+ var _document, _document$elementFrom;
145
+ const bufferPx = 50;
146
+ const isCodeBlockNextToListMarker = Boolean((_document = document) === null || _document === void 0 ? void 0 : (_document$elementFrom = _document.elementFromPoint(event.clientX + (listItemCounterPadding + bufferPx), event.clientY)) === null || _document$elementFrom === void 0 ? void 0 : _document$elementFrom.closest(`.${CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER}`));
147
+ if (isCodeBlockNextToListMarker) {
148
+ // +1 needed to put cursor inside li
149
+ // otherwise gap cursor markup will be injected as immediate child of ul resulting in invalid html
150
+ setGapCursorSelection(view, pos + 1, Side.LEFT);
151
+ return true;
152
+ }
153
153
  }
154
154
  }
155
+ return false;
155
156
  }
156
- return false;
157
157
  }
158
- }
159
- });
158
+ });
159
+ };
@@ -103,6 +103,7 @@ export class MediaNode extends Component {
103
103
  maxDimensions,
104
104
  mediaOptions
105
105
  } = this.props;
106
+ const borderMark = node.marks.find(m => m.type.name === 'border');
106
107
  const {
107
108
  viewMediaClientConfig,
108
109
  contextIdentifierProvider
@@ -138,7 +139,9 @@ export class MediaNode extends Component {
138
139
  };
139
140
  return /*#__PURE__*/React.createElement(MediaCardWrapper, {
140
141
  dimensions: originalDimensions,
141
- onContextMenu: this.selectMediaSingle
142
+ onContextMenu: this.selectMediaSingle,
143
+ borderWidth: borderMark === null || borderMark === void 0 ? void 0 : borderMark.attrs.size,
144
+ selected: selected
142
145
  }, /*#__PURE__*/React.createElement(Card, {
143
146
  mediaClientConfig: mediaClientConfig,
144
147
  resizeMode: "stretchy-fit",
@@ -18,9 +18,20 @@ const forcedDimensions = css`
18
18
  export const MediaCardWrapper = ({
19
19
  dimensions,
20
20
  children,
21
+ selected,
22
+ borderWidth = 0,
21
23
  onContextMenu
22
24
  }) => {
25
+ const calculatedBorderWidth = selected && borderWidth > 0 ? borderWidth + 1 : borderWidth;
23
26
  return jsx("div", {
27
+ "data-testid": "media-card-wrapper",
28
+ style: {
29
+ borderColor: `var(--custom-palette-color)`,
30
+ borderWidth: `${calculatedBorderWidth}px`,
31
+ borderStyle: 'solid',
32
+ borderRadius: `${calculatedBorderWidth * 2}px`
33
+ }
34
+ }, jsx("div", {
24
35
  css: forcedDimensions,
25
36
  style: {
26
37
  paddingBottom: `${dimensions.height / dimensions.width * 100}%`
@@ -28,5 +39,5 @@ export const MediaCardWrapper = ({
28
39
  onContextMenuCapture: onContextMenu
29
40
  }, jsx("div", {
30
41
  css: absoluteDiv
31
- }, children));
42
+ }, children)));
32
43
  };
@@ -3,6 +3,9 @@ import { NodeSelection } from 'prosemirror-state';
3
3
  import { isNodeSelection, removeSelectedNode, safeInsert } from 'prosemirror-utils';
4
4
  import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, addAnalytics, EVENT_TYPE } from '../../analytics';
5
5
  import { removeMediaGroupNode } from './utils';
6
+ import { currentMediaNodeWithPos } from '../utils/current-media-node';
7
+ export const DEFAULT_BORDER_COLOR = '#091e4224';
8
+ export const DEFAULT_BORDER_SIZE = 2;
6
9
  export const changeInlineToMediaCard = (state, dispatch) => {
7
10
  const {
8
11
  media,
@@ -84,4 +87,94 @@ export const removeInlineCard = (state, dispatch) => {
84
87
  return true;
85
88
  }
86
89
  return false;
90
+ };
91
+ export const toggleBorderMark = (state, dispatch) => {
92
+ const nodeWithPos = currentMediaNodeWithPos(state);
93
+ if (!nodeWithPos) {
94
+ return false;
95
+ }
96
+ const {
97
+ node,
98
+ pos
99
+ } = nodeWithPos;
100
+ const borderMark = node.marks.find(m => m.type.name === 'border');
101
+ const marks = node.marks.filter(m => m.type.name !== 'border').concat(borderMark ? [] : state.schema.marks.border.create({
102
+ color: DEFAULT_BORDER_COLOR,
103
+ size: DEFAULT_BORDER_SIZE
104
+ }));
105
+ const tr = state.tr.setNodeMarkup(pos, node.type, node.attrs, marks);
106
+ tr.setMeta('scrollIntoView', false);
107
+ if (state.selection instanceof NodeSelection) {
108
+ if (state.selection.$anchor.pos === state.selection.from) {
109
+ tr.setSelection(NodeSelection.create(tr.doc, state.selection.from));
110
+ }
111
+ }
112
+ if (dispatch) {
113
+ if (borderMark !== null && borderMark !== void 0 && borderMark.attrs) {
114
+ addAnalytics(state, tr, {
115
+ action: ACTION.DELETED,
116
+ actionSubject: ACTION_SUBJECT.MEDIA,
117
+ actionSubjectId: ACTION_SUBJECT_ID.BORDER,
118
+ eventType: EVENT_TYPE.TRACK,
119
+ attributes: {
120
+ previousColor: borderMark.attrs.color,
121
+ previousSize: borderMark.attrs.size
122
+ }
123
+ });
124
+ } else {
125
+ addAnalytics(state, tr, {
126
+ action: ACTION.ADDED,
127
+ actionSubject: ACTION_SUBJECT.MEDIA,
128
+ actionSubjectId: ACTION_SUBJECT_ID.BORDER,
129
+ eventType: EVENT_TYPE.TRACK,
130
+ attributes: {
131
+ color: DEFAULT_BORDER_COLOR,
132
+ size: DEFAULT_BORDER_SIZE
133
+ }
134
+ });
135
+ }
136
+ dispatch(tr);
137
+ }
138
+ return true;
139
+ };
140
+ export const setBorderMark = attrs => (state, dispatch) => {
141
+ var _node$marks$find, _ref, _attrs$color, _ref2, _attrs$size;
142
+ const nodeWithPos = currentMediaNodeWithPos(state);
143
+ if (!nodeWithPos) {
144
+ return false;
145
+ }
146
+ const {
147
+ node,
148
+ pos
149
+ } = nodeWithPos;
150
+ const borderMark = (_node$marks$find = node.marks.find(m => m.type.name === 'border')) === null || _node$marks$find === void 0 ? void 0 : _node$marks$find.attrs;
151
+ const color = (_ref = (_attrs$color = attrs.color) !== null && _attrs$color !== void 0 ? _attrs$color : borderMark === null || borderMark === void 0 ? void 0 : borderMark.color) !== null && _ref !== void 0 ? _ref : DEFAULT_BORDER_COLOR;
152
+ const size = (_ref2 = (_attrs$size = attrs.size) !== null && _attrs$size !== void 0 ? _attrs$size : borderMark === null || borderMark === void 0 ? void 0 : borderMark.size) !== null && _ref2 !== void 0 ? _ref2 : DEFAULT_BORDER_SIZE;
153
+ const marks = node.marks.filter(m => m.type.name !== 'border').concat(state.schema.marks.border.create({
154
+ color,
155
+ size
156
+ }));
157
+ const tr = state.tr.setNodeMarkup(pos, node.type, node.attrs, marks);
158
+ tr.setMeta('scrollIntoView', false);
159
+ if (state.selection instanceof NodeSelection) {
160
+ if (state.selection.$anchor.pos === state.selection.from) {
161
+ tr.setSelection(NodeSelection.create(tr.doc, state.selection.from));
162
+ }
163
+ }
164
+ if (dispatch) {
165
+ addAnalytics(state, tr, {
166
+ action: ACTION.UPDATED,
167
+ actionSubject: ACTION_SUBJECT.MEDIA,
168
+ actionSubjectId: ACTION_SUBJECT_ID.BORDER,
169
+ eventType: EVENT_TYPE.TRACK,
170
+ attributes: {
171
+ previousColor: borderMark === null || borderMark === void 0 ? void 0 : borderMark.color,
172
+ previousSize: borderMark === null || borderMark === void 0 ? void 0 : borderMark.size,
173
+ newColor: color,
174
+ newSize: size
175
+ }
176
+ });
177
+ dispatch(tr);
178
+ }
179
+ return true;
87
180
  };
@@ -0,0 +1,15 @@
1
+ import { currentMediaNodeWithPos } from '../utils/current-media-node';
2
+ export function shouldShowImageBorder(editorState) {
3
+ const border = editorState.schema.marks.border;
4
+ if (!border) {
5
+ return false;
6
+ }
7
+ const nodeWithPos = currentMediaNodeWithPos(editorState);
8
+ if (!nodeWithPos) {
9
+ return false;
10
+ }
11
+ let {
12
+ parent
13
+ } = editorState.doc.resolve(nodeWithPos.pos);
14
+ return parent && parent.type.allowsMarkType(border);
15
+ }
@@ -19,8 +19,11 @@ import { messages } from '@atlaskit/media-ui';
19
19
  import { messages as cardMessages } from '../../card/messages';
20
20
  import { FilePreviewItem } from './filePreviewItem';
21
21
  import { downloadMedia, removeMediaGroupNode } from './utils';
22
- import { changeInlineToMediaCard, changeMediaCardToInline, removeInlineCard } from './commands';
22
+ import { changeInlineToMediaCard, changeMediaCardToInline, removeInlineCard, setBorderMark, toggleBorderMark } from './commands';
23
23
  import { MediaInlineNodeSelector, MediaSingleNodeSelector } from '../nodeviews/styles';
24
+ import ImageBorderItem from '../ui/ImageBorder';
25
+ import { currentMediaNodeBorderMark } from '../utils/current-media-node';
26
+ import { shouldShowImageBorder } from './imageBorder';
24
27
  const remove = (state, dispatch) => {
25
28
  if (dispatch) {
26
29
  dispatch(removeSelectedNode(state.tr));
@@ -184,7 +187,7 @@ const generateMediaInlineFloatingToolbar = (state, intl, mediaPluginState) => {
184
187
  }];
185
188
  return items;
186
189
  };
187
- const generateMediaSingleFloatingToolbar = (state, intl, options, pluginState, mediaLinkingState) => {
190
+ const generateMediaSingleFloatingToolbar = (state, intl, options, pluginState, mediaLinkingState, getEditorFeatureFlags) => {
188
191
  const {
189
192
  mediaSingle
190
193
  } = state.schema.nodes;
@@ -196,8 +199,35 @@ const generateMediaSingleFloatingToolbar = (state, intl, options, pluginState, m
196
199
  allowAltTextOnImages
197
200
  } = options;
198
201
  let toolbarButtons = [];
202
+ if (shouldShowImageBorder(state)) {
203
+ toolbarButtons.push({
204
+ type: 'custom',
205
+ fallback: [],
206
+ render: editorView => {
207
+ if (!editorView) {
208
+ return null;
209
+ }
210
+ const {
211
+ dispatch,
212
+ state
213
+ } = editorView;
214
+ const borderMark = currentMediaNodeBorderMark(state);
215
+ return /*#__PURE__*/React.createElement(ImageBorderItem, {
216
+ toggleBorder: () => {
217
+ toggleBorderMark(state, dispatch);
218
+ },
219
+ setBorder: attrs => {
220
+ setBorderMark(attrs)(state, dispatch);
221
+ },
222
+ showSomewhatSemanticTooltips: getEditorFeatureFlags === null || getEditorFeatureFlags === void 0 ? void 0 : getEditorFeatureFlags().useSomewhatSemanticTextColorNames,
223
+ borderMark: borderMark,
224
+ intl: intl
225
+ });
226
+ }
227
+ });
228
+ }
199
229
  if (allowAdvancedToolBarOptions) {
200
- toolbarButtons = buildLayoutButtons(state, intl, state.schema.nodes.mediaSingle, allowResizing, allowResizingInTables);
230
+ toolbarButtons = [...toolbarButtons, ...buildLayoutButtons(state, intl, state.schema.nodes.mediaSingle, allowResizing, allowResizingInTables)];
201
231
  if (toolbarButtons.length) {
202
232
  toolbarButtons.push({
203
233
  type: 'separator'
@@ -291,7 +321,8 @@ export const floatingToolbar = (state, intl, options = {}) => {
291
321
  allowLinking,
292
322
  allowAltTextOnImages,
293
323
  providerFactory,
294
- allowMediaInline
324
+ allowMediaInline,
325
+ getEditorFeatureFlags
295
326
  } = options;
296
327
  const mediaPluginState = stateKey.getState(state);
297
328
  const mediaLinkingState = getMediaLinkingState(state);
@@ -345,7 +376,7 @@ export const floatingToolbar = (state, intl, options = {}) => {
345
376
  const element = (_mediaPluginState$ele3 = mediaPluginState.element) === null || _mediaPluginState$ele3 === void 0 ? void 0 : _mediaPluginState$ele3.querySelector(`.${MediaSingleNodeSelector}`);
346
377
  return element || mediaPluginState.element;
347
378
  };
348
- items = generateMediaSingleFloatingToolbar(state, intl, options, mediaPluginState, mediaLinkingState);
379
+ items = generateMediaSingleFloatingToolbar(state, intl, options, mediaPluginState, mediaLinkingState, getEditorFeatureFlags);
349
380
  }
350
381
  return {
351
382
  ...baseToolbar,
@@ -0,0 +1,206 @@
1
+ /** @jsx jsx */
2
+ import { jsx } from '@emotion/react';
3
+ import ExpandIcon from '@atlaskit/icon/glyph/chevron-down';
4
+ import { DropdownMenuSharedCssClassName } from '@atlaskit/editor-common/styles';
5
+ import { BorderIcon } from '@atlaskit/editor-common/icons';
6
+ import { useRef, useState } from 'react';
7
+ import { ColorPalette, borderPaletteTooltipMessages } from '@atlaskit/editor-common/ui-color';
8
+ import { hexToEditorBorderPaletteColor } from '@atlaskit/editor-palette';
9
+ import { borderColorPalette } from '@atlaskit/editor-common/ui-color';
10
+ import { ArrowKeyNavigationType, DropdownMenu } from '@atlaskit/editor-common/ui-menu';
11
+ import Tooltip from '@atlaskit/tooltip';
12
+ import { Popup } from '@atlaskit/editor-common/ui';
13
+ import ToolbarButton from '../../../../ui/ToolbarButton';
14
+ import { buttonStyle, buttonWrapperStyle, contextualMenuArrow, contextualMenuColorIcon, contextualSubMenu, itemSpacing, line, menuItemDimensions, toolbarButtonWrapper } from './styles';
15
+ import { messages } from './messages';
16
+ const ImageBorder = ({
17
+ intl: {
18
+ formatMessage
19
+ },
20
+ toggleBorder,
21
+ showSomewhatSemanticTooltips,
22
+ borderMark,
23
+ setBorder
24
+ }) => {
25
+ const popupTarget = useRef(null);
26
+ const enabled = !!borderMark;
27
+ const color = borderMark === null || borderMark === void 0 ? void 0 : borderMark.color;
28
+ const size = borderMark === null || borderMark === void 0 ? void 0 : borderMark.size;
29
+ const [isOpen, setIsOpen] = useState(false);
30
+ const [isColorSubmenuOpen, setIsColorSubmenuOpen] = useState(false);
31
+ const [isSizeSubmenuOpen, setIsSizeSubmenuOpen] = useState(false);
32
+ const borderSizeOptions = [{
33
+ name: formatMessage(messages.borderSizeSubtle),
34
+ value: 1
35
+ }, {
36
+ name: formatMessage(messages.borderSizeMedium),
37
+ value: 2
38
+ }, {
39
+ name: formatMessage(messages.borderSizeBold),
40
+ value: 3
41
+ }];
42
+ const items = [{
43
+ content: formatMessage(messages.borderColor),
44
+ value: {
45
+ name: 'color'
46
+ },
47
+ elemAfter: jsx("div", {
48
+ className: DropdownMenuSharedCssClassName.SUBMENU
49
+ }, jsx("div", {
50
+ css: contextualMenuColorIcon(color && hexToEditorBorderPaletteColor(color))
51
+ }), isColorSubmenuOpen && jsx("div", {
52
+ css: contextualSubMenu(0)
53
+ }, jsx(ColorPalette, {
54
+ onClick: color => {
55
+ setBorder({
56
+ color
57
+ });
58
+ setIsOpen(!isOpen);
59
+ },
60
+ selectedColor: color !== null && color !== void 0 ? color : null,
61
+ paletteOptions: {
62
+ palette: borderColorPalette,
63
+ paletteColorTooltipMessages: borderPaletteTooltipMessages,
64
+ hexToPaletteColor: hexToEditorBorderPaletteColor,
65
+ showSomewhatSemanticTooltips
66
+ }
67
+ })))
68
+ }, {
69
+ content: formatMessage(messages.borderSize),
70
+ value: {
71
+ name: 'size'
72
+ },
73
+ elemAfter: jsx("div", {
74
+ className: DropdownMenuSharedCssClassName.SUBMENU
75
+ }, jsx("div", {
76
+ css: contextualMenuArrow
77
+ }), isSizeSubmenuOpen && jsx("div", {
78
+ css: contextualSubMenu(1)
79
+ }, borderSizeOptions.map(({
80
+ name,
81
+ value
82
+ }, idx) => jsx(Tooltip, {
83
+ key: idx,
84
+ content: name
85
+ }, jsx("span", {
86
+ css: buttonWrapperStyle
87
+ }, jsx("button", {
88
+ css: buttonStyle(value === size),
89
+ "aria-label": name,
90
+ role: "radio",
91
+ "aria-checked": value === size,
92
+ onClick: () => {
93
+ setBorder({
94
+ size: value
95
+ });
96
+ setIsOpen(false);
97
+ },
98
+ onMouseDown: e => {
99
+ e.preventDefault();
100
+ }
101
+ }, jsx("div", {
102
+ css: line(value, value === size),
103
+ role: "presentation"
104
+ })))))))
105
+ }];
106
+
107
+ /**
108
+ * We want to change direction of our dropdowns a bit early,
109
+ * not exactly when it hits the boundary.
110
+ */
111
+ const fitTolerance = 10;
112
+ const fitWidth = menuItemDimensions.width;
113
+ const fitHeight = items.length * (menuItemDimensions.height + itemSpacing);
114
+ return jsx("div", null, jsx("div", {
115
+ css: toolbarButtonWrapper({
116
+ enabled,
117
+ isOpen
118
+ })
119
+ }, jsx(ToolbarButton, {
120
+ className: "image-border-toolbar-btn",
121
+ selected: enabled,
122
+ onClick: toggleBorder,
123
+ spacing: "compact",
124
+ "aria-label": enabled ? formatMessage(messages.removeBorder) : formatMessage(messages.addBorder),
125
+ iconBefore: jsx(BorderIcon, {
126
+ label: ""
127
+ }),
128
+ title: enabled ? formatMessage(messages.removeBorder) : formatMessage(messages.addBorder)
129
+ }), jsx("div", {
130
+ ref: popupTarget
131
+ }, jsx(ToolbarButton, {
132
+ className: "image-border-toolbar-dropdown",
133
+ selected: isOpen,
134
+ "aria-label": formatMessage(messages.borderOptions),
135
+ title: formatMessage(messages.borderOptions),
136
+ spacing: "compact",
137
+ iconBefore: jsx(ExpandIcon, {
138
+ label: ""
139
+ }),
140
+ onClick: () => {
141
+ setIsOpen(!isOpen);
142
+ }
143
+ }))), jsx(Popup, {
144
+ target: popupTarget.current ? popupTarget.current : undefined,
145
+ fitWidth: fitWidth + fitTolerance,
146
+ fitHeight: fitHeight + fitTolerance,
147
+ forcePlacement: true,
148
+ stick: true
149
+ }, jsx("div", {
150
+ onMouseLeave: () => {
151
+ setIsColorSubmenuOpen(false);
152
+ setIsSizeSubmenuOpen(false);
153
+ }
154
+ }, jsx(DropdownMenu
155
+ //This needs be removed when the a11y is completely handled
156
+ //Disabling key navigation now as it works only partially
157
+ //Same with packages/editor/editor-plugin-table/src/plugins/table/ui/FloatingContextualMenu/ContextualMenu.tsx
158
+ , {
159
+ arrowKeyNavigationProviderOptions: {
160
+ type: ArrowKeyNavigationType.MENU,
161
+ disableArrowKeyNavigation: true
162
+ },
163
+ items: [{
164
+ items
165
+ }],
166
+ isOpen: isOpen,
167
+ onOpenChange: () => {
168
+ setIsOpen(false);
169
+ setIsColorSubmenuOpen(false);
170
+ setIsSizeSubmenuOpen(false);
171
+ },
172
+ onItemActivated: ({
173
+ item
174
+ }) => {
175
+ if (item.value.name === 'color') {
176
+ setIsColorSubmenuOpen(!isColorSubmenuOpen);
177
+ }
178
+ if (item.value.name === 'size') {
179
+ setIsSizeSubmenuOpen(!isSizeSubmenuOpen);
180
+ }
181
+ },
182
+ onMouseEnter: ({
183
+ item
184
+ }) => {
185
+ if (item.value.name === 'color') {
186
+ setIsColorSubmenuOpen(true);
187
+ }
188
+ if (item.value.name === 'size') {
189
+ setIsSizeSubmenuOpen(true);
190
+ }
191
+ },
192
+ onMouseLeave: ({
193
+ item
194
+ }) => {
195
+ if (item.value.name === 'color') {
196
+ setIsColorSubmenuOpen(false);
197
+ }
198
+ if (item.value.name === 'size') {
199
+ setIsSizeSubmenuOpen(false);
200
+ }
201
+ },
202
+ fitWidth: fitWidth + fitTolerance,
203
+ fitHeight: fitHeight + fitTolerance
204
+ }))));
205
+ };
206
+ export default ImageBorder;