@gravity-ui/markdown-editor 15.3.1 → 15.4.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 (195) hide show
  1. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
  2. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +15 -2
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  6. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  7. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
  8. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  9. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
  10. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
  11. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  12. package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
  13. package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
  15. package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
  16. package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
  17. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  18. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  19. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
  24. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  25. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
  26. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
  27. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  28. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  33. package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
  34. package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
  35. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  36. package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
  37. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  38. package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  39. package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
  40. package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
  41. package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
  42. package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
  43. package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
  45. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  46. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
  47. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  48. package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  49. package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
  50. package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
  51. package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
  52. package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
  53. package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
  54. package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
  55. package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
  56. package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
  57. package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
  58. package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
  59. package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
  60. package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
  61. package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
  62. package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
  63. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  64. package/build/cjs/extensions/behavior/index.js +4 -0
  65. package/build/cjs/extensions/behavior/index.js.map +1 -1
  66. package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
  67. package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
  68. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  69. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
  70. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  71. package/build/cjs/react-utils/index.d.ts +1 -0
  72. package/build/cjs/react-utils/index.js +1 -0
  73. package/build/cjs/react-utils/index.js.map +1 -1
  74. package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
  75. package/build/cjs/react-utils/useSharedEditingState.js +25 -0
  76. package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
  77. package/build/cjs/toolbar/ToolbarButton.d.ts +6 -8
  78. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  79. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  80. package/build/cjs/toolbar/ToolbarListButton.js +7 -8
  81. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  82. package/build/cjs/utils/descedants.d.ts +8 -0
  83. package/build/cjs/utils/descedants.js +15 -0
  84. package/build/cjs/utils/descedants.js.map +1 -0
  85. package/build/cjs/utils/entity-id.d.ts +11 -0
  86. package/build/cjs/utils/entity-id.js +21 -0
  87. package/build/cjs/utils/entity-id.js.map +1 -0
  88. package/build/cjs/utils/index.d.ts +2 -0
  89. package/build/cjs/utils/index.js +2 -0
  90. package/build/cjs/utils/index.js.map +1 -1
  91. package/build/cjs/version.js +1 -1
  92. package/build/cjs/version.js.map +1 -1
  93. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
  94. package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
  95. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  96. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  97. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  98. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
  99. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  100. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  101. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +14 -1
  102. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  103. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  104. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
  105. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  106. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
  107. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
  108. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  109. package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
  110. package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
  111. package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
  112. package/build/esm/extensions/additional/Mermaid/types.js +2 -0
  113. package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
  114. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  115. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  116. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  117. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
  118. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  119. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  120. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
  121. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  122. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
  123. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
  124. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  125. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  126. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  127. package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  128. package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
  129. package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  130. package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
  131. package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
  132. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  133. package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
  134. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  135. package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  136. package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
  137. package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
  138. package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
  139. package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
  140. package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
  141. package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
  142. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  143. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
  144. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  145. package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  146. package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
  147. package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
  148. package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
  149. package/build/esm/extensions/behavior/SharedState/index.js +2 -0
  150. package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
  151. package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
  152. package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
  153. package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
  154. package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
  155. package/build/esm/extensions/behavior/SharedState/types.js +2 -0
  156. package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
  157. package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
  158. package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
  159. package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
  160. package/build/esm/extensions/behavior/index.d.ts +2 -0
  161. package/build/esm/extensions/behavior/index.js +4 -0
  162. package/build/esm/extensions/behavior/index.js.map +1 -1
  163. package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
  164. package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
  165. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  166. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
  167. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  168. package/build/esm/react-utils/index.d.ts +1 -0
  169. package/build/esm/react-utils/index.js +1 -0
  170. package/build/esm/react-utils/index.js.map +1 -1
  171. package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
  172. package/build/esm/react-utils/useSharedEditingState.js +22 -0
  173. package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
  174. package/build/esm/toolbar/ToolbarButton.d.ts +6 -8
  175. package/build/esm/toolbar/ToolbarButton.js +2 -2
  176. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  177. package/build/esm/toolbar/ToolbarListButton.js +8 -9
  178. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  179. package/build/esm/utils/descedants.d.ts +8 -0
  180. package/build/esm/utils/descedants.js +12 -0
  181. package/build/esm/utils/descedants.js.map +1 -0
  182. package/build/esm/utils/entity-id.d.ts +11 -0
  183. package/build/esm/utils/entity-id.js +16 -0
  184. package/build/esm/utils/entity-id.js.map +1 -0
  185. package/build/esm/utils/index.d.ts +2 -0
  186. package/build/esm/utils/index.js +2 -0
  187. package/build/esm/utils/index.js.map +1 -1
  188. package/build/esm/version.js +1 -1
  189. package/build/esm/version.js.map +1 -1
  190. package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
  191. package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
  192. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  193. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  194. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  195. package/package.json +15 -4
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {AutocompletePopupCloser} from '../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../utils/carousel';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n type FromTo,\n closeAutocomplete,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n logger: Logger2.ILogger;\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #logger: Logger2.ILogger;\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #range?: FromTo;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({logger, actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#logger = logger;\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view || !this.#range) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const view = this.#view;\n const range = this.#range;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n globalLogger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n this.#logger.action({source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view, range}: AutocompleteAction) {\n this.#view = view;\n this.#range = range;\n }\n\n private clear() {\n this.#view = undefined;\n this.#range = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {AutocompletePopupCloser} from '../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../utils/carousel';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n closeAutocomplete,\n getAutocompleteState,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n logger: Logger2.ILogger;\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #logger: Logger2.ILogger;\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({logger, actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#logger = logger;\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const autocompleteState = getAutocompleteState(this.#view.state);\n if (!autocompleteState || !autocompleteState.active) return;\n\n const view = this.#view;\n const {range} = autocompleteState;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n globalLogger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n this.#logger.action({source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view}: AutocompleteAction) {\n this.#view = view;\n }\n\n private clear() {\n this.#view = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Extension } from "../../../core/index.js";
2
+ export { SharedStateKey, type SharedStateKeySpec } from "./utils.js";
3
+ /**
4
+ * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.
5
+ * You can get, change and subscribe to state changes using a SharedStateKey instance.
6
+ */
7
+ export declare const SharedState: Extension;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedState = exports.SharedStateKey = void 0;
4
+ const state_1 = require("../../../pm/state.js");
5
+ const plugin_1 = require("./plugin.js");
6
+ var utils_1 = require("./utils.js");
7
+ Object.defineProperty(exports, "SharedStateKey", { enumerable: true, get: function () { return utils_1.SharedStateKey; } });
8
+ /**
9
+ * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.
10
+ * You can get, change and subscribe to state changes using a SharedStateKey instance.
11
+ */
12
+ const SharedState = (builder) => {
13
+ builder.addPlugin(() => new state_1.Plugin(plugin_1.pluginSpec));
14
+ };
15
+ exports.SharedState = SharedState;
16
+ //# sourceMappingURL=SharedState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedState.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/SharedState.ts"],"names":[],"mappings":";;;AACA,gDAAiC;AAEjC,wCAAoC;AAEpC,oCAAgE;AAAxD,uGAAA,cAAc,OAAA;AAEtB;;;GAGG;AACI,MAAM,WAAW,GAAc,CAAC,OAAO,EAAE,EAAE;IAC9C,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,cAAM,CAAC,mBAAU,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB","sourcesContent":["import type {Extension} from '#core';\nimport {Plugin} from '#pm/state';\n\nimport {pluginSpec} from './plugin';\n\nexport {SharedStateKey, type SharedStateKeySpec} from './utils';\n\n/**\n * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.\n * You can get, change and subscribe to state changes using a SharedStateKey instance.\n */\nexport const SharedState: Extension = (builder) => {\n builder.addPlugin(() => new Plugin(pluginSpec));\n};\n"]}
@@ -0,0 +1 @@
1
+ export * from "./SharedState.js";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./SharedState.js"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/index.ts"],"names":[],"mappings":";;;AAAA,2DAA8B","sourcesContent":["export * from './SharedState';\n"]}
@@ -0,0 +1,3 @@
1
+ import { type PluginSpec } from "../../../pm/state.js";
2
+ import type { SharedPluginState } from "./types.js";
3
+ export declare const pluginSpec: PluginSpec<SharedPluginState>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pluginSpec = exports.pluginKey = void 0;
4
+ const state_1 = require("../../../pm/state.js");
5
+ const event_emitter_1 = require("../../../utils/event-emitter.js");
6
+ /** @internal */
7
+ exports.pluginKey = new state_1.PluginKey('shared-state');
8
+ exports.pluginSpec = {
9
+ key: exports.pluginKey,
10
+ state: {
11
+ init() {
12
+ return {
13
+ map: new Map(),
14
+ changedKeys: null,
15
+ notifyBus: new event_emitter_1.EventEmitter(),
16
+ };
17
+ },
18
+ apply(tr, { map, notifyBus }) {
19
+ const meta = tr.getMeta(exports.pluginKey);
20
+ if (!meta || !meta.actions.length)
21
+ return { changedKeys: null, map, notifyBus };
22
+ const changedKeys = new Set();
23
+ for (const action of meta.actions) {
24
+ switch (action.type) {
25
+ case 'delete': {
26
+ map.delete(action.key);
27
+ break;
28
+ }
29
+ case 'update': {
30
+ let value = map.get(action.key);
31
+ value = { ...value, ...action.data };
32
+ map.set(action.key, value);
33
+ break;
34
+ }
35
+ case 'set': {
36
+ map.set(action.key, action.data);
37
+ break;
38
+ }
39
+ default: {
40
+ continue;
41
+ }
42
+ }
43
+ changedKeys.add(action.key);
44
+ }
45
+ return { changedKeys, map, notifyBus };
46
+ },
47
+ },
48
+ view: () => {
49
+ return {
50
+ update(view) {
51
+ const state = exports.pluginKey.getState(view.state);
52
+ if (!state || !state.changedKeys || !state.changedKeys.size)
53
+ return;
54
+ for (const key of state.changedKeys) {
55
+ const value = state.map.get(key);
56
+ state.notifyBus.emit(key, value);
57
+ }
58
+ },
59
+ };
60
+ },
61
+ };
62
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/plugin.ts"],"names":[],"mappings":";;;AAAA,gDAAqD;AACrD,mEAAqD;AAIrD,gBAAgB;AACH,QAAA,SAAS,GAAG,IAAI,iBAAS,CAAoB,cAAc,CAAC,CAAC;AAE7D,QAAA,UAAU,GAAkC;IACrD,GAAG,EAAE,iBAAS;IACd,KAAK,EAAE;QACH,IAAI;YACA,OAAO;gBACH,GAAG,EAAE,IAAI,GAAG,EAAE;gBACd,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI,4BAAY,EAAE;aAChC,CAAC;QACN,CAAC;QACD,KAAK,CAAC,EAAE,EAAE,EAAC,GAAG,EAAE,SAAS,EAAC;YACtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAS,CAAuB,CAAC;YACzD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,EAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAC,CAAC;YAE9E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;wBACZ,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACvB,MAAM;oBACV,CAAC;oBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;wBACZ,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChC,KAAK,GAAG,EAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,EAAC,CAAC;wBACnC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBAC3B,MAAM;oBACV,CAAC;oBACD,KAAK,KAAK,CAAC,CAAC,CAAC;wBACT,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;wBACjC,MAAM;oBACV,CAAC;oBACD,OAAO,CAAC,CAAC,CAAC;wBACN,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YAED,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,SAAS,EAAC,CAAC;QACzC,CAAC;KACJ;IACD,IAAI,EAAE,GAAG,EAAE;QACP,OAAO;YACH,MAAM,CAAC,IAAI;gBACP,MAAM,KAAK,GAAG,iBAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;oBAAE,OAAO;gBAEpE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC;SACJ,CAAC;IACN,CAAC;CACJ,CAAC","sourcesContent":["import {PluginKey, type PluginSpec} from '#pm/state';\nimport {EventEmitter} from 'src/utils/event-emitter';\n\nimport type {SharedPluginState, TrMeta} from './types';\n\n/** @internal */\nexport const pluginKey = new PluginKey<SharedPluginState>('shared-state');\n\nexport const pluginSpec: PluginSpec<SharedPluginState> = {\n key: pluginKey,\n state: {\n init() {\n return {\n map: new Map(),\n changedKeys: null,\n notifyBus: new EventEmitter(),\n };\n },\n apply(tr, {map, notifyBus}) {\n const meta = tr.getMeta(pluginKey) as TrMeta | undefined;\n if (!meta || !meta.actions.length) return {changedKeys: null, map, notifyBus};\n\n const changedKeys = new Set<string>();\n for (const action of meta.actions) {\n switch (action.type) {\n case 'delete': {\n map.delete(action.key);\n break;\n }\n case 'update': {\n let value = map.get(action.key);\n value = {...value, ...action.data};\n map.set(action.key, value);\n break;\n }\n case 'set': {\n map.set(action.key, action.data);\n break;\n }\n default: {\n continue;\n }\n }\n changedKeys.add(action.key);\n }\n\n return {changedKeys, map, notifyBus};\n },\n },\n view: () => {\n return {\n update(view) {\n const state = pluginKey.getState(view.state);\n if (!state || !state.changedKeys || !state.changedKeys.size) return;\n\n for (const key of state.changedKeys) {\n const value = state.map.get(key);\n state.notifyBus.emit(key, value);\n }\n },\n };\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {EventEmitter} from 'src/utils/event-emitter';\n\n/** @internal */\nexport type SharedPluginState = {\n map: Map<string, object>;\n changedKeys: Set<string> | null;\n notifyBus: EventEmitter<{[key: string]: object | undefined}>;\n};\n\n/** @internal */\nexport type TrMeta = {\n actions: SharedStateAction<object>[];\n};\n\n/** @internal */\nexport type SharedStateAction<T extends object> =\n | {\n type: 'set';\n key: string;\n data: T;\n }\n | {\n type: 'update';\n key: string;\n data: Partial<T>;\n }\n | {\n type: 'delete';\n key: string;\n };\n"]}
@@ -0,0 +1,29 @@
1
+ import type { EditorState, Transaction } from "../../../pm/state.js";
2
+ export type SharedStateKeySpec = {
3
+ name?: string;
4
+ };
5
+ export declare class SharedStateKey<T extends object> {
6
+ #private;
7
+ /**
8
+ * Define a new key.
9
+ * If you create two keys with the same name, they will refer to the same value from the state.
10
+ * If name not passed, a unique one will be generated.
11
+ */
12
+ static define<T extends object>(spec?: SharedStateKeySpec): SharedStateKey<T>;
13
+ /** Add metadata to transaction to change data in state */
14
+ readonly appendTransaction: Readonly<{
15
+ /** Set or replace data stored by current key */
16
+ set: (tr: Transaction, data: T) => Transaction;
17
+ /** Update (patch) data stored by current key */
18
+ update: (tr: Transaction, data: Partial<T>) => Transaction;
19
+ /** Delete data stored by current key */
20
+ delete: (tr: Transaction) => Transaction;
21
+ }>;
22
+ private constructor();
23
+ getNotifier(state: EditorState): {
24
+ subscribe(fn: (data: T | undefined) => void): () => void;
25
+ unsubscribe(fn: (data: T | undefined) => void): void;
26
+ };
27
+ getValue(state: EditorState): T | undefined;
28
+ private appendTrMeta;
29
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedStateKey = void 0;
4
+ const lodash_1 = require("../../../lodash.js");
5
+ const plugin_1 = require("./plugin.js");
6
+ class SharedStateKey {
7
+ /**
8
+ * Define a new key.
9
+ * If you create two keys with the same name, they will refer to the same value from the state.
10
+ * If name not passed, a unique one will be generated.
11
+ */
12
+ static define(spec = {}) {
13
+ const key = spec.name ?? (0, lodash_1.uniqueId)('shared_state_key');
14
+ return new this(key);
15
+ }
16
+ #key;
17
+ /** Add metadata to transaction to change data in state */
18
+ appendTransaction = Object.freeze({
19
+ /** Set or replace data stored by current key */
20
+ set: (tr, data) => {
21
+ return this.appendTrMeta(tr, { type: 'set', data });
22
+ },
23
+ /** Update (patch) data stored by current key */
24
+ update: (tr, data) => {
25
+ return this.appendTrMeta(tr, { type: 'update', data });
26
+ },
27
+ /** Delete data stored by current key */
28
+ delete: (tr) => {
29
+ return this.appendTrMeta(tr, { type: 'delete' });
30
+ },
31
+ });
32
+ constructor(key) {
33
+ this.#key = key;
34
+ }
35
+ getNotifier(state) {
36
+ const self = this;
37
+ const notifyBus = plugin_1.pluginKey.getState(state)?.notifyBus;
38
+ return {
39
+ subscribe(fn) {
40
+ notifyBus?.on(self.#key, fn);
41
+ return () => {
42
+ this.unsubscribe(fn);
43
+ };
44
+ },
45
+ unsubscribe(fn) {
46
+ notifyBus?.off(self.#key, fn);
47
+ },
48
+ };
49
+ }
50
+ getValue(state) {
51
+ return plugin_1.pluginKey.getState(state)?.map.get(this.#key);
52
+ }
53
+ appendTrMeta(tr, action) {
54
+ const meta = tr.getMeta(plugin_1.pluginKey) || { actions: [] };
55
+ meta.actions.push({ ...action, key: this.#key });
56
+ return tr.setMeta(plugin_1.pluginKey, meta);
57
+ }
58
+ }
59
+ exports.SharedStateKey = SharedStateKey;
60
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/utils.ts"],"names":[],"mappings":";;;AACA,+CAAoC;AAEpC,wCAAmC;AAOnC,MAAa,cAAc;IACvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAmB,OAA2B,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAQ,EAAC,kBAAkB,CAAC,CAAC;QACtD,OAAO,IAAI,IAAI,CAAI,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAS;IAEb,0DAA0D;IACjD,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;QACvC,gDAAgD;QAChD,GAAG,EAAE,CAAC,EAAe,EAAE,IAAO,EAAe,EAAE;YAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;QACtD,CAAC;QACD,gDAAgD;QAChD,MAAM,EAAE,CAAC,EAAe,EAAE,IAAgB,EAAe,EAAE;YACvD,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;QACzD,CAAC;QACD,wCAAwC;QACxC,MAAM,EAAE,CAAC,EAAe,EAAe,EAAE;YACrC,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QACnD,CAAC;KACJ,CAAC,CAAC;IAEH,YAAoB,GAAW;QAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAkB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,MAAM,SAAS,GAAG,kBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QACvD,OAAO;YACH,SAAS,CAAC,EAAiC;gBACvC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAA4B,CAAC,CAAC;gBACvD,OAAO,GAAG,EAAE;oBACR,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC,CAAC;YACN,CAAC;YACD,WAAW,CAAC,EAAiC;gBACzC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAA4B,CAAC,CAAC;YAC5D,CAAC;SACJ,CAAC;IACN,CAAC;IAED,QAAQ,CAAC,KAAkB;QACvB,OAAO,kBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAkB,CAAC;IAC1E,CAAC;IAEO,YAAY,CAAC,EAAe,EAAE,MAAiB;QACnD,MAAM,IAAI,GAAW,EAAE,CAAC,OAAO,CAAC,kBAAS,CAAC,IAAI,EAAC,OAAO,EAAE,EAAE,EAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC,OAAO,CAAC,kBAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;CACJ;AA1DD,wCA0DC","sourcesContent":["import type {EditorState, Transaction} from '#pm/state';\nimport {uniqueId} from 'src/lodash';\n\nimport {pluginKey} from './plugin';\nimport type {TrMeta} from './types';\n\nexport type SharedStateKeySpec = {\n name?: string;\n};\n\nexport class SharedStateKey<T extends object> {\n /**\n * Define a new key.\n * If you create two keys with the same name, they will refer to the same value from the state.\n * If name not passed, a unique one will be generated.\n */\n static define<T extends object>(spec: SharedStateKeySpec = {}) {\n const key = spec.name ?? uniqueId('shared_state_key');\n return new this<T>(key);\n }\n\n #key: string;\n\n /** Add metadata to transaction to change data in state */\n readonly appendTransaction = Object.freeze({\n /** Set or replace data stored by current key */\n set: (tr: Transaction, data: T): Transaction => {\n return this.appendTrMeta(tr, {type: 'set', data});\n },\n /** Update (patch) data stored by current key */\n update: (tr: Transaction, data: Partial<T>): Transaction => {\n return this.appendTrMeta(tr, {type: 'update', data});\n },\n /** Delete data stored by current key */\n delete: (tr: Transaction): Transaction => {\n return this.appendTrMeta(tr, {type: 'delete'});\n },\n });\n\n private constructor(key: string) {\n this.#key = key;\n }\n\n getNotifier(state: EditorState) {\n const self = this;\n const notifyBus = pluginKey.getState(state)?.notifyBus;\n return {\n subscribe(fn: (data: T | undefined) => void) {\n notifyBus?.on(self.#key, fn as (arg: unknown) => void);\n return () => {\n this.unsubscribe(fn);\n };\n },\n unsubscribe(fn: (data: T | undefined) => void) {\n notifyBus?.off(self.#key, fn as (arg: unknown) => void);\n },\n };\n }\n\n getValue(state: EditorState): T | undefined {\n return pluginKey.getState(state)?.map.get(this.#key) as T | undefined;\n }\n\n private appendTrMeta(tr: Transaction, action: Action<T>) {\n const meta: TrMeta = tr.getMeta(pluginKey) || {actions: []};\n meta.actions.push({...action, key: this.#key});\n return tr.setMeta(pluginKey, meta);\n }\n}\n\n/** @internal */\ntype Action<T extends object> =\n | {\n type: 'set';\n data: T;\n }\n | {\n type: 'update';\n data: Partial<T>;\n }\n | {\n type: 'delete';\n };\n"]}
@@ -6,6 +6,7 @@ import { type CursorOptions } from "./Cursor/index.js";
6
6
  import { type HistoryOptions } from "./History/index.js";
7
7
  import { type ReactRenderer } from "./ReactRenderer/index.js";
8
8
  import { type SelectionContextOptions } from "./SelectionContext/index.js";
9
+ export * from "./Autocomplete/index.js";
9
10
  export * from "./ClicksOnEdges/index.js";
10
11
  export * from "./Clipboard/index.js";
11
12
  export * from "./CommandMenu/index.js";
@@ -16,6 +17,7 @@ export * from "./Placeholder/index.js";
16
17
  export * from "./ReactRenderer/index.js";
17
18
  export * from "./Selection/index.js";
18
19
  export * from "./SelectionContext/index.js";
20
+ export * from "./SharedState/index.js";
19
21
  export * from "./WidgetDecoration/index.js";
20
22
  export type BehaviorPresetOptions = {
21
23
  cursor?: CursorOptions;
@@ -12,7 +12,9 @@ const Placeholder_1 = require("./Placeholder/index.js");
12
12
  const ReactRenderer_1 = require("./ReactRenderer/index.js");
13
13
  const Selection_1 = require("./Selection/index.js");
14
14
  const SelectionContext_1 = require("./SelectionContext/index.js");
15
+ const SharedState_1 = require("./SharedState/index.js");
15
16
  const WidgetDecoration_1 = require("./WidgetDecoration/index.js");
17
+ tslib_1.__exportStar(require("./Autocomplete/index.js"), exports);
16
18
  tslib_1.__exportStar(require("./ClicksOnEdges/index.js"), exports);
17
19
  tslib_1.__exportStar(require("./Clipboard/index.js"), exports);
18
20
  tslib_1.__exportStar(require("./CommandMenu/index.js"), exports);
@@ -23,10 +25,12 @@ tslib_1.__exportStar(require("./Placeholder/index.js"), exports);
23
25
  tslib_1.__exportStar(require("./ReactRenderer/index.js"), exports);
24
26
  tslib_1.__exportStar(require("./Selection/index.js"), exports);
25
27
  tslib_1.__exportStar(require("./SelectionContext/index.js"), exports);
28
+ tslib_1.__exportStar(require("./SharedState/index.js"), exports);
26
29
  tslib_1.__exportStar(require("./WidgetDecoration/index.js"), exports);
27
30
  const BehaviorPreset = (builder, opts) => {
28
31
  builder
29
32
  .use(Selection_1.Selection)
33
+ .use(SharedState_1.SharedState)
30
34
  .use(Placeholder_1.Placeholder, opts.placeholder ?? {})
31
35
  .use(Cursor_1.Cursor, opts.cursor ?? {})
32
36
  .use(History_1.History, opts.history ?? {})
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":";;;;AAGA,4DAA8C;AAC9C,oDAA6D;AAC7D,wDAAmE;AACnE,8CAAoD;AACpD,oDAAsC;AACtC,gDAAuD;AACvD,wDAA0C;AAC1C,4DAA2E;AAC3E,oDAAsC;AACtC,kEAAkF;AAClF,kEAAoD;AAEpD,mEAAgC;AAChC,+DAA4B;AAC5B,iEAA8B;AAC9B,4DAAyB;AACzB,+DAA4B;AAC5B,6DAA0B;AAC1B,iEAA8B;AAC9B,mEAAgC;AAChC,+DAA4B;AAC5B,sEAAmC;AACnC,sEAAmC;AAa5B,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,qBAAS,CAAC;SACd,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,eAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,iBAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,qBAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sCAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,mCAAgB,CAAC;SACrB,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAdW,QAAA,cAAc,kBAczB","sourcesContent":["import type {ExtensionAuto} from '../../core';\nimport type {PlaceholderOptions} from '../../utils/placeholder';\n\nimport {ClicksOnEdges} from './ClicksOnEdges';\nimport {Clipboard, type ClipboardOptions} from './Clipboard';\nimport {CommandMenu, type CommandMenuOptions} from './CommandMenu';\nimport {Cursor, type CursorOptions} from './Cursor';\nimport {FilePaste} from './FilePaste';\nimport {History, type HistoryOptions} from './History';\nimport {Placeholder} from './Placeholder';\nimport {type ReactRenderer, ReactRendererExtension} from './ReactRenderer';\nimport {Selection} from './Selection';\nimport {SelectionContext, type SelectionContextOptions} from './SelectionContext';\nimport {WidgetDecoration} from './WidgetDecoration';\n\nexport * from './ClicksOnEdges';\nexport * from './Clipboard';\nexport * from './CommandMenu';\nexport * from './Cursor';\nexport * from './FilePaste';\nexport * from './History';\nexport * from './Placeholder';\nexport * from './ReactRenderer';\nexport * from './Selection';\nexport * from './SelectionContext';\nexport * from './WidgetDecoration';\n\nexport type BehaviorPresetOptions = {\n cursor?: CursorOptions;\n history?: HistoryOptions;\n clipboard?: ClipboardOptions;\n placeholder?: PlaceholderOptions;\n reactRenderer: ReactRenderer;\n selectionContext?: SelectionContextOptions;\n\n commandMenu?: CommandMenuOptions;\n};\n\nexport const BehaviorPreset: ExtensionAuto<BehaviorPresetOptions> = (builder, opts) => {\n builder\n .use(Selection)\n .use(Placeholder, opts.placeholder ?? {})\n .use(Cursor, opts.cursor ?? {})\n .use(History, opts.history ?? {})\n .use(Clipboard, opts.clipboard ?? {})\n .use(ReactRendererExtension, opts.reactRenderer)\n .use(WidgetDecoration)\n .use(SelectionContext, opts.selectionContext ?? {});\n\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":";;;;AAGA,4DAA8C;AAC9C,oDAA6D;AAC7D,wDAAmE;AACnE,8CAAoD;AACpD,oDAAsC;AACtC,gDAAuD;AACvD,wDAA0C;AAC1C,4DAA2E;AAC3E,oDAAsC;AACtC,kEAAkF;AAClF,wDAA0C;AAC1C,kEAAoD;AAEpD,kEAA+B;AAC/B,mEAAgC;AAChC,+DAA4B;AAC5B,iEAA8B;AAC9B,4DAAyB;AACzB,+DAA4B;AAC5B,6DAA0B;AAC1B,iEAA8B;AAC9B,mEAAgC;AAChC,+DAA4B;AAC5B,sEAAmC;AACnC,iEAA8B;AAC9B,sEAAmC;AAa5B,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,qBAAS,CAAC;SACd,GAAG,CAAC,yBAAW,CAAC;SAChB,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,eAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,iBAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,qBAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sCAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,mCAAgB,CAAC;SACrB,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAfW,QAAA,cAAc,kBAezB","sourcesContent":["import type {ExtensionAuto} from '../../core';\nimport type {PlaceholderOptions} from '../../utils/placeholder';\n\nimport {ClicksOnEdges} from './ClicksOnEdges';\nimport {Clipboard, type ClipboardOptions} from './Clipboard';\nimport {CommandMenu, type CommandMenuOptions} from './CommandMenu';\nimport {Cursor, type CursorOptions} from './Cursor';\nimport {FilePaste} from './FilePaste';\nimport {History, type HistoryOptions} from './History';\nimport {Placeholder} from './Placeholder';\nimport {type ReactRenderer, ReactRendererExtension} from './ReactRenderer';\nimport {Selection} from './Selection';\nimport {SelectionContext, type SelectionContextOptions} from './SelectionContext';\nimport {SharedState} from './SharedState';\nimport {WidgetDecoration} from './WidgetDecoration';\n\nexport * from './Autocomplete';\nexport * from './ClicksOnEdges';\nexport * from './Clipboard';\nexport * from './CommandMenu';\nexport * from './Cursor';\nexport * from './FilePaste';\nexport * from './History';\nexport * from './Placeholder';\nexport * from './ReactRenderer';\nexport * from './Selection';\nexport * from './SelectionContext';\nexport * from './SharedState';\nexport * from './WidgetDecoration';\n\nexport type BehaviorPresetOptions = {\n cursor?: CursorOptions;\n history?: HistoryOptions;\n clipboard?: ClipboardOptions;\n placeholder?: PlaceholderOptions;\n reactRenderer: ReactRenderer;\n selectionContext?: SelectionContextOptions;\n\n commandMenu?: CommandMenuOptions;\n};\n\nexport const BehaviorPreset: ExtensionAuto<BehaviorPresetOptions> = (builder, opts) => {\n builder\n .use(Selection)\n .use(SharedState)\n .use(Placeholder, opts.placeholder ?? {})\n .use(Cursor, opts.cursor ?? {})\n .use(History, opts.history ?? {})\n .use(Clipboard, opts.clipboard ?? {})\n .use(ReactRendererExtension, opts.reactRenderer)\n .use(WidgetDecoration)\n .use(SelectionContext, opts.selectionContext ?? {});\n\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
@@ -89,12 +89,10 @@ class SelectionTooltip {
89
89
  const { state } = view;
90
90
  if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))
91
91
  return;
92
- const prevTextNode = this.textNode;
93
92
  this.textNode = getTextNode(view.state);
94
93
  const prevRef = this.textNodeRef;
95
94
  this.updateTextNodeRef();
96
95
  if (!this.textNode || !this.textNodeRef) {
97
- this.removePlaceholderLink(prevTextNode);
98
96
  this.hideTooltip();
99
97
  return;
100
98
  }
@@ -159,14 +157,9 @@ class SelectionTooltip {
159
157
  }
160
158
  };
161
159
  onOutisdeClick = () => {
162
- // after all updates of the editor state
163
- setTimeout(() => {
164
- if (!this.view.hasFocus()) {
165
- this.removePlaceholderLink(this.textNode);
166
- this.hideTooltip();
167
- this.manualHidden = false;
168
- }
169
- });
160
+ this.removePlaceholderLink(this.textNode);
161
+ this.hideTooltip();
162
+ this.manualHidden = true;
170
163
  };
171
164
  cancelPopup() {
172
165
  this.removePlaceholderLink(this.textNode, { returnSelection: true });
@@ -197,8 +190,10 @@ class SelectionTooltip {
197
190
  if (normalizeResult) {
198
191
  const { url } = normalizeResult;
199
192
  const { from, to } = textNode;
200
- view.dispatch(view.state.tr.addMark(from, to, (0, index_1.linkType)(view.state.schema).create({ href: url })));
201
- setTimeout(this.cancelPopup.bind(this));
193
+ const tr = view.state.tr;
194
+ tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, tr.mapping.map(to)));
195
+ tr.addMark(from, to, (0, index_1.linkType)(view.state.schema).create({ href: url }));
196
+ view.dispatch(tr);
202
197
  }
203
198
  }
204
199
  createRenderItem() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/Link/plugins/LinkTooltipPlugin/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {type EditorState, Plugin, type PluginView, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByMark, findParentNode} from 'prosemirror-utils';\nimport {Decoration, DecorationSet, type EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {ErrorLoggerBoundary} from '../../../../../react-utils/ErrorBoundary';\nimport {findMark, isMarkActive} from '../../../../../utils/marks';\nimport {type RendererItem, getReactRendererFromState} from '../../../../behavior/ReactRenderer';\nimport {LinkAttr, linkType, normalizeUrlFactory} from '../../../index';\n\nimport {LinkForm} from './TooltipView';\n\nconst className = 'pm-link-focus-deco';\nconst placement: PopupPlacement = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];\n\nfunction getTextNode(state: EditorState) {\n if (\n !(state.selection instanceof TextSelection) ||\n !state.selection.empty ||\n !isMarkActive(state, linkType(state.schema))\n )\n return null;\n\n const parent = findParentNode(Boolean)(state.selection);\n\n if (!parent) {\n return null;\n }\n\n const textNodes = findChildrenByMark(parent?.node, linkType(state.schema));\n\n const textNode = textNodes.find((n: {node: Node; pos: number}) => {\n const start = n.pos + parent.pos;\n const end = start + n.node.nodeSize;\n return start <= state.selection.from && end >= state.selection.from;\n })!;\n\n if (!textNode) return null;\n\n const absolutePos = textNode.pos + parent.pos + 1;\n\n return {\n ...textNode,\n absolutePos,\n parent,\n from: absolutePos,\n to: absolutePos + textNode.node.nodeSize,\n };\n}\n\nexport const linkTooltipPlugin = (deps: ExtensionDeps) => {\n let viewTooltip: SelectionTooltip | null = null;\n return new Plugin({\n view(view) {\n viewTooltip = new SelectionTooltip(view, deps);\n return viewTooltip;\n },\n props: {\n handleKeyDown: keydownHandler({\n Escape: () => viewTooltip?.onEscapeDown() ?? false,\n }),\n decorations(state) {\n const textNode = getTextNode(state);\n if (!textNode) return DecorationSet.empty;\n\n const {from, to} = textNode;\n return DecorationSet.create(state.doc, [\n Decoration.inline(from, to, {\n class: `pm-node-selected ${className}`,\n }),\n ]);\n },\n },\n });\n};\n\nclass SelectionTooltip implements PluginView {\n private normalizeUrl;\n\n private view: EditorView;\n\n private textNode?: ReturnType<typeof getTextNode>;\n private textNodeRef: HTMLElement | undefined;\n\n private isTooltipOpen = false;\n private manualHidden = false;\n\n private renderItem?: RendererItem;\n private selectionTooltipProps: SelectionTooltipViewBaseProps = {show: false};\n\n constructor(view: EditorView, deps: ExtensionDeps) {\n this.normalizeUrl = normalizeUrlFactory(deps);\n\n this.view = view;\n\n this.update(view, null);\n }\n\n update(view: EditorView, prevState?: EditorState | null) {\n if (!view.dom.parentNode) {\n this.hideTooltip();\n return;\n }\n\n const {state} = view;\n\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const prevTextNode = this.textNode;\n this.textNode = getTextNode(view.state);\n\n const prevRef = this.textNodeRef;\n this.updateTextNodeRef();\n\n if (!this.textNode || !this.textNodeRef) {\n this.removePlaceholderLink(prevTextNode);\n this.hideTooltip();\n return;\n }\n\n if (prevRef !== this.textNodeRef) {\n this.manualHidden = false;\n }\n\n if (this.manualHidden) {\n this.hideTooltip();\n } else {\n this.renderTooltip({\n show: true,\n domElem: this.textNodeRef,\n onCancel: () => this.cancelPopup(),\n attrs: this.getMarkAttrs(),\n onChange: this.changeAttrs.bind(this),\n onOpenChange: this.onOpenChange,\n });\n }\n }\n\n destroy() {\n this.isTooltipOpen = false;\n this.selectionTooltipProps = {show: false};\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown(): boolean {\n if (this.isTooltipOpen) {\n this.removePlaceholderLink(this.textNode);\n this.manualHidden = true;\n this.hideTooltip();\n return true;\n }\n\n return false;\n }\n\n private updateTextNodeRef() {\n const decoElem = this.view.dom.getElementsByClassName(className)[0];\n this.textNodeRef = decoElem as HTMLElement | undefined;\n }\n\n private getMarkAttrs() {\n const {textNode} = this;\n const linkMark = textNode && findMark(textNode.node, linkType(this.view.state.schema));\n return linkMark?.attrs;\n }\n\n private hideTooltip() {\n this.renderTooltip({show: false});\n }\n\n private renderTooltip(props: SelectionTooltipViewBaseProps) {\n this.isTooltipOpen = props.show;\n this.selectionTooltipProps = props;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n private onOpenChange: NonNullable<PopupProps['onOpenChange']> = (open, _e, reason) => {\n if (open) return;\n if (reason === 'escape-key') {\n this.cancelPopup();\n } else {\n this.onOutisdeClick();\n }\n };\n\n private onOutisdeClick = () => {\n // after all updates of the editor state\n setTimeout(() => {\n if (!this.view.hasFocus()) {\n this.removePlaceholderLink(this.textNode);\n this.hideTooltip();\n this.manualHidden = false;\n }\n });\n };\n\n private cancelPopup() {\n this.removePlaceholderLink(this.textNode, {returnSelection: true});\n this.manualHidden = true;\n this.hideTooltip();\n this.view.focus();\n }\n\n private removePlaceholderLink(\n textNode?: ReturnType<typeof getTextNode>,\n opts?: {returnSelection?: boolean},\n ) {\n if (textNode) {\n const {view} = this;\n const {state} = view;\n const attrs = findMark(textNode.node, linkType(state.schema))?.attrs;\n if (attrs?.[LinkAttr.IsPlaceholder]) {\n const {from, to} = textNode;\n let tr = state.tr.removeMark(from, to, linkType(state.schema));\n if (opts?.returnSelection) {\n tr = tr.setSelection(TextSelection.create(tr.doc, from, to));\n }\n view.dispatch(tr);\n }\n }\n }\n\n private changeAttrs({href}: {href: string}) {\n const {view, textNode} = this;\n if (!textNode) return;\n\n const normalizeResult = this.normalizeUrl(href);\n if (normalizeResult) {\n const {url} = normalizeResult;\n const {from, to} = textNode;\n view.dispatch(\n view.state.tr.addMark(from, to, linkType(view.state.schema).create({href: url})),\n );\n\n setTimeout(this.cancelPopup.bind(this));\n }\n }\n\n private createRenderItem() {\n return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltipView {...this.selectionTooltipProps} />\n </ErrorLoggerBoundary>\n ));\n }\n}\ntype SelectionTooltipViewBaseProps<T = boolean> = T extends false\n ? {\n show: T;\n }\n : {\n show: T;\n domElem: HTMLElement;\n onCancel: () => void;\n onChange: (opts: {href: string}) => void;\n attrs?: {[LinkAttr.Href]?: string; [LinkAttr.IsPlaceholder]?: boolean};\n } & Pick<PopupProps, 'onOpenChange'>;\n\ntype SelectionTooltipViewProps = SelectionTooltipViewBaseProps;\n\nconst SelectionTooltipView: React.FC<SelectionTooltipViewProps> = (props) => {\n const {show} = props;\n\n if (!show) return null;\n\n const {domElem, onChange, onCancel, onOpenChange, attrs = {}} = props;\n const href = attrs[LinkAttr.Href];\n const autoFocus = attrs[LinkAttr.IsPlaceholder];\n\n return (\n <Popup\n open\n key={href}\n anchorElement={domElem}\n placement={placement}\n onOpenChange={onOpenChange}\n >\n <LinkForm\n href={href ?? ''}\n autoFocus={autoFocus}\n onChange={onChange}\n onCancel={onCancel}\n />\n </Popup>\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/Link/plugins/LinkTooltipPlugin/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {type EditorState, Plugin, type PluginView, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByMark, findParentNode} from 'prosemirror-utils';\nimport {Decoration, DecorationSet, type EditorView} from 'prosemirror-view';\n\nimport type {ExtensionDeps} from '../../../../../core';\nimport {ErrorLoggerBoundary} from '../../../../../react-utils/ErrorBoundary';\nimport {findMark, isMarkActive} from '../../../../../utils/marks';\nimport {type RendererItem, getReactRendererFromState} from '../../../../behavior/ReactRenderer';\nimport {LinkAttr, linkType, normalizeUrlFactory} from '../../../index';\n\nimport {LinkForm} from './TooltipView';\n\nconst className = 'pm-link-focus-deco';\nconst placement: PopupPlacement = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];\n\nfunction getTextNode(state: EditorState) {\n if (\n !(state.selection instanceof TextSelection) ||\n !state.selection.empty ||\n !isMarkActive(state, linkType(state.schema))\n )\n return null;\n\n const parent = findParentNode(Boolean)(state.selection);\n\n if (!parent) {\n return null;\n }\n\n const textNodes = findChildrenByMark(parent?.node, linkType(state.schema));\n\n const textNode = textNodes.find((n: {node: Node; pos: number}) => {\n const start = n.pos + parent.pos;\n const end = start + n.node.nodeSize;\n return start <= state.selection.from && end >= state.selection.from;\n })!;\n\n if (!textNode) return null;\n\n const absolutePos = textNode.pos + parent.pos + 1;\n\n return {\n ...textNode,\n absolutePos,\n parent,\n from: absolutePos,\n to: absolutePos + textNode.node.nodeSize,\n };\n}\n\nexport const linkTooltipPlugin = (deps: ExtensionDeps) => {\n let viewTooltip: SelectionTooltip | null = null;\n return new Plugin({\n view(view) {\n viewTooltip = new SelectionTooltip(view, deps);\n return viewTooltip;\n },\n props: {\n handleKeyDown: keydownHandler({\n Escape: () => viewTooltip?.onEscapeDown() ?? false,\n }),\n decorations(state) {\n const textNode = getTextNode(state);\n if (!textNode) return DecorationSet.empty;\n\n const {from, to} = textNode;\n return DecorationSet.create(state.doc, [\n Decoration.inline(from, to, {\n class: `pm-node-selected ${className}`,\n }),\n ]);\n },\n },\n });\n};\n\nclass SelectionTooltip implements PluginView {\n private normalizeUrl;\n\n private view: EditorView;\n\n private textNode?: ReturnType<typeof getTextNode>;\n private textNodeRef: HTMLElement | undefined;\n\n private isTooltipOpen = false;\n private manualHidden = false;\n\n private renderItem?: RendererItem;\n private selectionTooltipProps: SelectionTooltipViewBaseProps = {show: false};\n\n constructor(view: EditorView, deps: ExtensionDeps) {\n this.normalizeUrl = normalizeUrlFactory(deps);\n\n this.view = view;\n\n this.update(view, null);\n }\n\n update(view: EditorView, prevState?: EditorState | null) {\n if (!view.dom.parentNode) {\n this.hideTooltip();\n return;\n }\n\n const {state} = view;\n\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n this.textNode = getTextNode(view.state);\n\n const prevRef = this.textNodeRef;\n this.updateTextNodeRef();\n\n if (!this.textNode || !this.textNodeRef) {\n this.hideTooltip();\n return;\n }\n\n if (prevRef !== this.textNodeRef) {\n this.manualHidden = false;\n }\n\n if (this.manualHidden) {\n this.hideTooltip();\n } else {\n this.renderTooltip({\n show: true,\n domElem: this.textNodeRef,\n onCancel: () => this.cancelPopup(),\n attrs: this.getMarkAttrs(),\n onChange: this.changeAttrs.bind(this),\n onOpenChange: this.onOpenChange,\n });\n }\n }\n\n destroy() {\n this.isTooltipOpen = false;\n this.selectionTooltipProps = {show: false};\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown(): boolean {\n if (this.isTooltipOpen) {\n this.removePlaceholderLink(this.textNode);\n this.manualHidden = true;\n this.hideTooltip();\n return true;\n }\n\n return false;\n }\n\n private updateTextNodeRef() {\n const decoElem = this.view.dom.getElementsByClassName(className)[0];\n this.textNodeRef = decoElem as HTMLElement | undefined;\n }\n\n private getMarkAttrs() {\n const {textNode} = this;\n const linkMark = textNode && findMark(textNode.node, linkType(this.view.state.schema));\n return linkMark?.attrs;\n }\n\n private hideTooltip() {\n this.renderTooltip({show: false});\n }\n\n private renderTooltip(props: SelectionTooltipViewBaseProps) {\n this.isTooltipOpen = props.show;\n this.selectionTooltipProps = props;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n private onOpenChange: NonNullable<PopupProps['onOpenChange']> = (open, _e, reason) => {\n if (open) return;\n if (reason === 'escape-key') {\n this.cancelPopup();\n } else {\n this.onOutisdeClick();\n }\n };\n\n private onOutisdeClick = () => {\n this.removePlaceholderLink(this.textNode);\n this.hideTooltip();\n this.manualHidden = true;\n };\n\n private cancelPopup() {\n this.removePlaceholderLink(this.textNode, {returnSelection: true});\n this.manualHidden = true;\n this.hideTooltip();\n this.view.focus();\n }\n\n private removePlaceholderLink(\n textNode?: ReturnType<typeof getTextNode>,\n opts?: {returnSelection?: boolean},\n ) {\n if (textNode) {\n const {view} = this;\n const {state} = view;\n const attrs = findMark(textNode.node, linkType(state.schema))?.attrs;\n if (attrs?.[LinkAttr.IsPlaceholder]) {\n const {from, to} = textNode;\n let tr = state.tr.removeMark(from, to, linkType(state.schema));\n if (opts?.returnSelection) {\n tr = tr.setSelection(TextSelection.create(tr.doc, from, to));\n }\n view.dispatch(tr);\n }\n }\n }\n\n private changeAttrs({href}: {href: string}) {\n const {view, textNode} = this;\n if (!textNode) return;\n\n const normalizeResult = this.normalizeUrl(href);\n if (normalizeResult) {\n const {url} = normalizeResult;\n const {from, to} = textNode;\n\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(to)));\n tr.addMark(from, to, linkType(view.state.schema).create({href: url}));\n view.dispatch(tr);\n }\n }\n\n private createRenderItem() {\n return getReactRendererFromState(this.view.state).createItem('link-tooltip', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltipView {...this.selectionTooltipProps} />\n </ErrorLoggerBoundary>\n ));\n }\n}\ntype SelectionTooltipViewBaseProps<T = boolean> = T extends false\n ? {\n show: T;\n }\n : {\n show: T;\n domElem: HTMLElement;\n onCancel: () => void;\n onChange: (opts: {href: string}) => void;\n attrs?: {[LinkAttr.Href]?: string; [LinkAttr.IsPlaceholder]?: boolean};\n } & Pick<PopupProps, 'onOpenChange'>;\n\ntype SelectionTooltipViewProps = SelectionTooltipViewBaseProps;\n\nconst SelectionTooltipView: React.FC<SelectionTooltipViewProps> = (props) => {\n const {show} = props;\n\n if (!show) return null;\n\n const {domElem, onChange, onCancel, onOpenChange, attrs = {}} = props;\n const href = attrs[LinkAttr.Href];\n const autoFocus = attrs[LinkAttr.IsPlaceholder];\n\n return (\n <Popup\n open\n key={href}\n anchorElement={domElem}\n placement={placement}\n onOpenChange={onOpenChange}\n >\n <LinkForm\n href={href ?? ''}\n autoFocus={autoFocus}\n onChange={onChange}\n onCancel={onCancel}\n />\n </Popup>\n );\n};\n"]}
@@ -8,7 +8,6 @@ export declare class EmojiHandler implements AutocompleteHandler {
8
8
  private _emojiCarousel?;
9
9
  private _view?;
10
10
  private _anchor;
11
- private _range?;
12
11
  private _popupCloser?;
13
12
  private _suggestProps?;
14
13
  private _suggestRenderItem?;
@@ -14,7 +14,6 @@ class EmojiHandler {
14
14
  _emojiCarousel;
15
15
  _view;
16
16
  _anchor = null;
17
- _range;
18
17
  _popupCloser;
19
18
  _suggestProps;
20
19
  _suggestRenderItem;
@@ -92,12 +91,16 @@ class EmojiHandler {
92
91
  });
93
92
  }
94
93
  select() {
95
- const { _view: view, _range: range } = this;
96
- if (!view || !range)
94
+ const { _view: view } = this;
95
+ if (!view)
97
96
  return;
98
97
  const emojiDef = this._emojiCarousel?.currentItem;
99
98
  if (!emojiDef)
100
99
  return;
100
+ const autocompleteState = (0, Autocomplete_1.getAutocompleteState)(view.state);
101
+ if (!autocompleteState || !autocompleteState.active)
102
+ return;
103
+ const { range } = autocompleteState;
101
104
  const { tr, schema } = view.state;
102
105
  view.dispatch(tr.replaceWith(range.from, range.to, createEmoji(schema, emojiDef)).scrollIntoView());
103
106
  view.focus();
@@ -139,13 +142,11 @@ class EmojiHandler {
139
142
  }
140
143
  this._view?.focus();
141
144
  };
142
- updateState({ view, range }) {
145
+ updateState({ view }) {
143
146
  this._view = view;
144
- this._range = range;
145
147
  }
146
148
  clear() {
147
149
  this._view = undefined;
148
- this._range = undefined;
149
150
  this._anchor = null;
150
151
  this._emojiCarousel = undefined;
151
152
  this._popupCloser?.cancelTimer();