@gravity-ui/markdown-editor 15.3.0 → 15.4.0

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 (189) hide show
  1. package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
  2. package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  6. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +19 -2
  7. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  8. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  9. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
  10. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  11. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
  12. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
  13. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
  15. package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
  16. package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
  17. package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
  18. package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
  19. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  24. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  25. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
  26. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  27. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
  28. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  33. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
  34. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  35. package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
  36. package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
  37. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  38. package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
  39. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  40. package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  41. package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
  42. package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
  43. package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
  44. package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
  45. package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
  46. package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
  47. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  48. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
  49. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  50. package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  51. package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
  52. package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
  53. package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
  54. package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
  55. package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
  56. package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
  57. package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
  58. package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
  59. package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
  60. package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
  61. package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
  62. package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
  63. package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
  64. package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
  65. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  66. package/build/cjs/extensions/behavior/index.js +4 -0
  67. package/build/cjs/extensions/behavior/index.js.map +1 -1
  68. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
  69. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  70. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  71. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
  72. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  73. package/build/cjs/react-utils/index.d.ts +1 -0
  74. package/build/cjs/react-utils/index.js +1 -0
  75. package/build/cjs/react-utils/index.js.map +1 -1
  76. package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
  77. package/build/cjs/react-utils/useSharedEditingState.js +25 -0
  78. package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
  79. package/build/cjs/utils/descedants.d.ts +8 -0
  80. package/build/cjs/utils/descedants.js +15 -0
  81. package/build/cjs/utils/descedants.js.map +1 -0
  82. package/build/cjs/utils/entity-id.d.ts +11 -0
  83. package/build/cjs/utils/entity-id.js +21 -0
  84. package/build/cjs/utils/entity-id.js.map +1 -0
  85. package/build/cjs/utils/index.d.ts +2 -0
  86. package/build/cjs/utils/index.js +2 -0
  87. package/build/cjs/utils/index.js.map +1 -1
  88. package/build/cjs/version.js +1 -1
  89. package/build/cjs/version.js.map +1 -1
  90. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
  91. package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
  92. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  93. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  94. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  95. package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
  96. package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
  97. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
  98. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  99. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  100. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +18 -1
  101. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  102. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  103. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
  104. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  105. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
  106. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
  107. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  108. package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
  109. package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
  110. package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
  111. package/build/esm/extensions/additional/Mermaid/types.js +2 -0
  112. package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
  113. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  114. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  115. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  116. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
  117. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  118. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  119. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
  120. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  121. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
  122. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
  123. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  124. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  125. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  126. package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  127. package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
  128. package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  129. package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
  130. package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
  131. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  132. package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
  133. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  134. package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  135. package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
  136. package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
  137. package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
  138. package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
  139. package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
  140. package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
  141. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  142. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
  143. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  144. package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  145. package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
  146. package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
  147. package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
  148. package/build/esm/extensions/behavior/SharedState/index.js +2 -0
  149. package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
  150. package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
  151. package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
  152. package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
  153. package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
  154. package/build/esm/extensions/behavior/SharedState/types.js +2 -0
  155. package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
  156. package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
  157. package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
  158. package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
  159. package/build/esm/extensions/behavior/index.d.ts +2 -0
  160. package/build/esm/extensions/behavior/index.js +4 -0
  161. package/build/esm/extensions/behavior/index.js.map +1 -1
  162. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
  163. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  164. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  165. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
  166. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  167. package/build/esm/react-utils/index.d.ts +1 -0
  168. package/build/esm/react-utils/index.js +1 -0
  169. package/build/esm/react-utils/index.js.map +1 -1
  170. package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
  171. package/build/esm/react-utils/useSharedEditingState.js +22 -0
  172. package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
  173. package/build/esm/utils/descedants.d.ts +8 -0
  174. package/build/esm/utils/descedants.js +12 -0
  175. package/build/esm/utils/descedants.js.map +1 -0
  176. package/build/esm/utils/entity-id.d.ts +11 -0
  177. package/build/esm/utils/entity-id.js +16 -0
  178. package/build/esm/utils/entity-id.js.map +1 -0
  179. package/build/esm/utils/index.d.ts +2 -0
  180. package/build/esm/utils/index.js +2 -0
  181. package/build/esm/utils/index.js.map +1 -1
  182. package/build/esm/version.js +1 -1
  183. package/build/esm/version.js.map +1 -1
  184. package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
  185. package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
  186. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  187. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  188. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  189. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import autocomplete from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAC,oBAAoB,EAAC,mBAAgB;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import {autocomplete} from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport {getAutocompleteState} from './utils';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Options, Trigger } from 'prosemirror-autocomplete';
2
- export type { FromTo, AutocompleteAction, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
2
+ export type { FromTo, AutocompleteAction, AutocompleteState, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
3
3
  export { ActionKind as AutocompleteActionKind } from 'prosemirror-autocomplete';
4
4
  export interface AutocompleteHandler extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {
5
5
  onDestroy?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,UAAU,IAAI,sBAAsB,EAAC,MAAM,0BAA0B,CAAC","sourcesContent":["import type {Options, Trigger} from 'prosemirror-autocomplete';\n\nexport type {\n FromTo,\n AutocompleteAction,\n Trigger as AutocompleteTrigger,\n} from 'prosemirror-autocomplete';\n\nexport {ActionKind as AutocompleteActionKind} from 'prosemirror-autocomplete';\n\nexport interface AutocompleteHandler\n extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {\n onDestroy?: () => void;\n}\n\nexport type AutocompleteItem = {trigger: Trigger; handler: AutocompleteHandler};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,UAAU,IAAI,sBAAsB,EAAC,MAAM,0BAA0B,CAAC","sourcesContent":["import type {Options, Trigger} from 'prosemirror-autocomplete';\n\nexport type {\n FromTo,\n AutocompleteAction,\n AutocompleteState,\n Trigger as AutocompleteTrigger,\n} from 'prosemirror-autocomplete';\n\nexport {ActionKind as AutocompleteActionKind} from 'prosemirror-autocomplete';\n\nexport interface AutocompleteHandler\n extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {\n onDestroy?: () => void;\n}\n\nexport type AutocompleteItem = {trigger: Trigger; handler: AutocompleteHandler};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EditorState } from "../../../pm/state.js";
2
+ import type { AutocompleteState } from "./types.js";
3
+ export declare function getAutocompleteState(state: EditorState): AutocompleteState | null;
@@ -0,0 +1,5 @@
1
+ import { pluginKey } from 'prosemirror-autocomplete';
2
+ export function getAutocompleteState(state) {
3
+ return pluginKey.getState(state) || null;
4
+ }
5
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAMnD,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACnD,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC","sourcesContent":["import {pluginKey} from 'prosemirror-autocomplete';\n\nimport type {EditorState} from '#pm/state';\n\nimport type {AutocompleteState} from './types';\n\nexport function getAutocompleteState(state: EditorState): AutocompleteState | null {\n return pluginKey.getState(state) || null;\n}\n"]}
@@ -1,4 +1,10 @@
1
- import type { EditorState } from 'prosemirror-state';
1
+ import { type EditorState, Plugin } from "../../../pm/state.js";
2
2
  export declare function isInsideCode(state: EditorState): false | 'block' | 'inline';
3
3
  export declare function isInsideBlockCode(state: EditorState): boolean;
4
4
  export declare function isInsideInlineCode(state: EditorState): boolean;
5
+ /**
6
+ * This plugin handles paste into any type of code: code block or code mark.
7
+ * If selection is inside code, it always prevents execution of all next paste handlers.
8
+ * It takes a value from following clipboard data types: uri-list, files or text data.
9
+ */
10
+ export declare const handlePasteIntoCodePlugin: () => Plugin<any>;
@@ -1,3 +1,7 @@
1
+ import dd from 'ts-dedent';
2
+ import { getLoggerFromState } from "../../../core/index.js";
3
+ import { Plugin } from "../../../pm/state.js";
4
+ import { DataTransferType, isFilesOnly, isIosSafariShare } from "./utils.js";
1
5
  const isCodeMark = (mark) => mark.type.spec.code;
2
6
  export function isInsideCode(state) {
3
7
  if (isInsideBlockCode(state))
@@ -19,4 +23,57 @@ export function isInsideInlineCode(state) {
19
23
  }
20
24
  return fromHasCodeMark;
21
25
  }
26
+ /**
27
+ * This plugin handles paste into any type of code: code block or code mark.
28
+ * If selection is inside code, it always prevents execution of all next paste handlers.
29
+ * It takes a value from following clipboard data types: uri-list, files or text data.
30
+ */
31
+ export const handlePasteIntoCodePlugin = () => {
32
+ return new Plugin({
33
+ props: {
34
+ handleDOMEvents: {
35
+ paste(view, event) {
36
+ if (!event.clipboardData)
37
+ return false;
38
+ const { clipboardData } = event;
39
+ const codeType = isInsideCode(view.state);
40
+ if (!codeType)
41
+ return false;
42
+ let text;
43
+ let dataFormat;
44
+ if (isIosSafariShare(clipboardData)) {
45
+ dataFormat = DataTransferType.UriList;
46
+ text = clipboardData.getData(DataTransferType.UriList);
47
+ }
48
+ else if (isFilesOnly(clipboardData)) {
49
+ dataFormat = DataTransferType.Files;
50
+ text = Array.from(clipboardData.files)
51
+ .map((file) => file.name)
52
+ .join(' ');
53
+ }
54
+ else {
55
+ dataFormat = DataTransferType.Text;
56
+ text = dd(clipboardData.getData(DataTransferType.Text));
57
+ }
58
+ if (codeType === 'inline') {
59
+ text = text.replaceAll('\n', '↵');
60
+ }
61
+ const { state, dispatch } = view;
62
+ getLoggerFromState(state).event({
63
+ codeType,
64
+ dataFormat,
65
+ domEvent: 'paste',
66
+ event: 'paste-into-code',
67
+ dataTypes: clipboardData.types,
68
+ });
69
+ event.preventDefault();
70
+ dispatch(state.tr
71
+ .replaceSelectionWith(state.schema.text(text), true)
72
+ .scrollIntoView());
73
+ return true;
74
+ },
75
+ },
76
+ },
77
+ });
78
+ };
22
79
  //# sourceMappingURL=code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAEvD,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC3C,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAChD,mCAAmC;IACnC,8EAA8E;IAC9E,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACjD,yBAAyB;IACzB,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,eAAe,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC;AAC3B,CAAC","sourcesContent":["import type {Mark} from 'prosemirror-model';\nimport type {EditorState} from 'prosemirror-state';\n\nconst isCodeMark = (mark: Mark) => mark.type.spec.code;\n\nexport function isInsideCode(state: EditorState): false | 'block' | 'inline' {\n if (isInsideBlockCode(state)) return 'block';\n if (isInsideInlineCode(state)) return 'inline';\n return false;\n}\n\nexport function isInsideBlockCode(state: EditorState): boolean {\n // it is enough to check only $from\n // when pasting, the content is inserted into a block with the type from $from\n return Boolean(state.selection.$from.parent.type.spec.code);\n}\n\nexport function isInsideInlineCode(state: EditorState): boolean {\n // same as for block code\n const fromHasCodeMark = state.selection.$from.marks().some(isCodeMark);\n if (state.selection.empty) {\n return fromHasCodeMark || (state.storedMarks ?? []).some(isCodeMark);\n }\n return fromHasCodeMark;\n}\n"]}
1
+ {"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"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","sourcesContent":["import dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport type {Mark} from '#pm/model';\nimport {type EditorState, Plugin} from '#pm/state';\n\nimport {DataTransferType, isFilesOnly, isIosSafariShare} from './utils';\n\nconst isCodeMark = (mark: Mark) => mark.type.spec.code;\n\nexport function isInsideCode(state: EditorState): false | 'block' | 'inline' {\n if (isInsideBlockCode(state)) return 'block';\n if (isInsideInlineCode(state)) return 'inline';\n return false;\n}\n\nexport function isInsideBlockCode(state: EditorState): boolean {\n // it is enough to check only $from\n // when pasting, the content is inserted into a block with the type from $from\n return Boolean(state.selection.$from.parent.type.spec.code);\n}\n\nexport function isInsideInlineCode(state: EditorState): boolean {\n // same as for block code\n const fromHasCodeMark = state.selection.$from.marks().some(isCodeMark);\n if (state.selection.empty) {\n return fromHasCodeMark || (state.storedMarks ?? []).some(isCodeMark);\n }\n return fromHasCodeMark;\n}\n\n/**\n * This plugin handles paste into any type of code: code block or code mark.\n * If selection is inside code, it always prevents execution of all next paste handlers.\n * It takes a value from following clipboard data types: uri-list, files or text data.\n */\nexport const handlePasteIntoCodePlugin = () => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, event) {\n if (!event.clipboardData) return false;\n const {clipboardData} = event;\n\n const codeType = isInsideCode(view.state);\n if (!codeType) return false;\n\n let text: string;\n let dataFormat: string;\n\n if (isIosSafariShare(clipboardData)) {\n dataFormat = DataTransferType.UriList;\n text = clipboardData.getData(DataTransferType.UriList);\n } else if (isFilesOnly(clipboardData)) {\n dataFormat = DataTransferType.Files;\n text = Array.from(clipboardData.files)\n .map((file) => file.name)\n .join(' ');\n } else {\n dataFormat = DataTransferType.Text;\n text = dd(clipboardData.getData(DataTransferType.Text));\n }\n\n if (codeType === 'inline') {\n text = text.replaceAll('\\n', '↵');\n }\n\n const {state, dispatch} = view;\n\n getLoggerFromState(state).event({\n codeType,\n dataFormat,\n domEvent: 'paste',\n event: 'paste-into-code',\n dataTypes: clipboardData.types,\n });\n\n event.preventDefault();\n dispatch(\n state.tr\n .replaceSelectionWith(state.schema.text(text), true)\n .scrollIntoView(),\n );\n\n return true;\n },\n },\n },\n });\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import { clipboard } from "./clipboard.js";
2
+ import { handlePasteIntoCodePlugin } from "./code.js";
2
3
  import * as clipboardUtils from "./utils.js";
3
4
  export { clipboardUtils };
4
5
  export const Clipboard = (builder, opts) => {
@@ -12,5 +13,6 @@ export const Clipboard = (builder, opts) => {
12
13
  serializer: deps.serializer,
13
14
  pasteFileHandler: opts.pasteFileHandler,
14
15
  }), builder.Priority.VeryLow);
16
+ builder.addPlugin(handlePasteIntoCodePlugin, builder.Priority.Highest);
15
17
  };
16
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,EAAC,yBAAyB,EAAC,kBAAe;AACjD,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;IAEF,OAAO,CAAC,SAAS,CAAC,yBAAyB,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '#core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport {handlePasteIntoCodePlugin} from './code';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n\n builder.addPlugin(handlePasteIntoCodePlugin, builder.Priority.Highest);\n};\n"]}
@@ -2,7 +2,7 @@ import { isFunction } from "../../../lodash.js";
2
2
  import { globalLogger } from "../../../logger.js";
3
3
  import { AutocompletePopupCloser } from "../../../utils/autocomplete-popup.js";
4
4
  import { ArrayCarousel } from "../../../utils/carousel/index.js";
5
- import { AutocompleteActionKind, closeAutocomplete, } from "../Autocomplete/index.js";
5
+ import { AutocompleteActionKind, closeAutocomplete, getAutocompleteState, } from "../Autocomplete/index.js";
6
6
  import { getReactRendererFromState } from "../ReactRenderer/index.js";
7
7
  import { render } from "./component.js";
8
8
  import { findDecoElem } from "./utils.js";
@@ -14,7 +14,6 @@ export class CommandHandler {
14
14
  #filteredActionsCarousel;
15
15
  #view;
16
16
  #anchor = null;
17
- #range;
18
17
  #filterText;
19
18
  #popupCloser;
20
19
  #menuProps;
@@ -101,13 +100,16 @@ export class CommandHandler {
101
100
  return (parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name));
102
101
  }
103
102
  select() {
104
- if (!this.#view || !this.#range)
103
+ if (!this.#view)
105
104
  return;
106
105
  const action = this.#filteredActionsCarousel?.currentItem;
107
106
  if (!action)
108
107
  return;
108
+ const autocompleteState = getAutocompleteState(this.#view.state);
109
+ if (!autocompleteState || !autocompleteState.active)
110
+ return;
109
111
  const view = this.#view;
110
- const range = this.#range;
112
+ const { range } = autocompleteState;
111
113
  view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());
112
114
  action.exec(this.#actionStorage);
113
115
  view.focus();
@@ -153,13 +155,11 @@ export class CommandHandler {
153
155
  }
154
156
  this.#view?.focus();
155
157
  };
156
- updateState({ view, range }) {
158
+ updateState({ view }) {
157
159
  this.#view = view;
158
- this.#range = range;
159
160
  }
160
161
  clear() {
161
162
  this.#view = undefined;
162
- this.#range = undefined;
163
163
  this.#anchor = null;
164
164
  this.#filterText = undefined;
165
165
  this.#filteredActionsCarousel = undefined;
@@ -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,11 @@
1
+ import { Plugin } from "../../../pm/state.js";
2
+ import { pluginSpec } from "./plugin.js";
3
+ export { SharedStateKey } from "./utils.js";
4
+ /**
5
+ * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.
6
+ * You can get, change and subscribe to state changes using a SharedStateKey instance.
7
+ */
8
+ export const SharedState = (builder) => {
9
+ builder.addPlugin(() => new Plugin(pluginSpec));
10
+ };
11
+ //# sourceMappingURL=SharedState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedState.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/SharedState.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,6BAAkB;AAEjC,OAAO,EAAC,UAAU,EAAC,oBAAiB;AAEpC,OAAO,EAAC,cAAc,EAA0B,mBAAgB;AAEhE;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAc,CAAC,OAAO,EAAE,EAAE;IAC9C,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC","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,2 @@
1
+ export * from "./SharedState.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/index.ts"],"names":[],"mappings":"AAAA,iCAA8B","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,59 @@
1
+ import { PluginKey } from "../../../pm/state.js";
2
+ import { EventEmitter } from "../../../utils/event-emitter.js";
3
+ /** @internal */
4
+ export const pluginKey = new PluginKey('shared-state');
5
+ export const pluginSpec = {
6
+ key: pluginKey,
7
+ state: {
8
+ init() {
9
+ return {
10
+ map: new Map(),
11
+ changedKeys: null,
12
+ notifyBus: new EventEmitter(),
13
+ };
14
+ },
15
+ apply(tr, { map, notifyBus }) {
16
+ const meta = tr.getMeta(pluginKey);
17
+ if (!meta || !meta.actions.length)
18
+ return { changedKeys: null, map, notifyBus };
19
+ const changedKeys = new Set();
20
+ for (const action of meta.actions) {
21
+ switch (action.type) {
22
+ case 'delete': {
23
+ map.delete(action.key);
24
+ break;
25
+ }
26
+ case 'update': {
27
+ let value = map.get(action.key);
28
+ value = { ...value, ...action.data };
29
+ map.set(action.key, value);
30
+ break;
31
+ }
32
+ case 'set': {
33
+ map.set(action.key, action.data);
34
+ break;
35
+ }
36
+ default: {
37
+ continue;
38
+ }
39
+ }
40
+ changedKeys.add(action.key);
41
+ }
42
+ return { changedKeys, map, notifyBus };
43
+ },
44
+ },
45
+ view: () => {
46
+ return {
47
+ update(view) {
48
+ const state = pluginKey.getState(view.state);
49
+ if (!state || !state.changedKeys || !state.changedKeys.size)
50
+ return;
51
+ for (const key of state.changedKeys) {
52
+ const value = state.map.get(key);
53
+ state.notifyBus.emit(key, value);
54
+ }
55
+ },
56
+ };
57
+ },
58
+ };
59
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAkB,6BAAkB;AACrD,OAAO,EAAC,YAAY,EAAC,wCAAgC;AAIrD,gBAAgB;AAChB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAoB,cAAc,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,UAAU,GAAkC;IACrD,GAAG,EAAE,SAAS;IACd,KAAK,EAAE;QACH,IAAI;YACA,OAAO;gBACH,GAAG,EAAE,IAAI,GAAG,EAAE;gBACd,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI,YAAY,EAAE;aAChC,CAAC;QACN,CAAC;QACD,KAAK,CAAC,EAAE,EAAE,EAAC,GAAG,EAAE,SAAS,EAAC;YACtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,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,SAAS,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,2 @@
1
+ export {};
2
+ //# 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,56 @@
1
+ import { uniqueId } from "../../../lodash.js";
2
+ import { pluginKey } from "./plugin.js";
3
+ export class SharedStateKey {
4
+ /**
5
+ * Define a new key.
6
+ * If you create two keys with the same name, they will refer to the same value from the state.
7
+ * If name not passed, a unique one will be generated.
8
+ */
9
+ static define(spec = {}) {
10
+ const key = spec.name ?? uniqueId('shared_state_key');
11
+ return new this(key);
12
+ }
13
+ #key;
14
+ /** Add metadata to transaction to change data in state */
15
+ appendTransaction = Object.freeze({
16
+ /** Set or replace data stored by current key */
17
+ set: (tr, data) => {
18
+ return this.appendTrMeta(tr, { type: 'set', data });
19
+ },
20
+ /** Update (patch) data stored by current key */
21
+ update: (tr, data) => {
22
+ return this.appendTrMeta(tr, { type: 'update', data });
23
+ },
24
+ /** Delete data stored by current key */
25
+ delete: (tr) => {
26
+ return this.appendTrMeta(tr, { type: 'delete' });
27
+ },
28
+ });
29
+ constructor(key) {
30
+ this.#key = key;
31
+ }
32
+ getNotifier(state) {
33
+ const self = this;
34
+ const notifyBus = pluginKey.getState(state)?.notifyBus;
35
+ return {
36
+ subscribe(fn) {
37
+ notifyBus?.on(self.#key, fn);
38
+ return () => {
39
+ this.unsubscribe(fn);
40
+ };
41
+ },
42
+ unsubscribe(fn) {
43
+ notifyBus?.off(self.#key, fn);
44
+ },
45
+ };
46
+ }
47
+ getValue(state) {
48
+ return pluginKey.getState(state)?.map.get(this.#key);
49
+ }
50
+ appendTrMeta(tr, action) {
51
+ const meta = tr.getMeta(pluginKey) || { actions: [] };
52
+ meta.actions.push({ ...action, key: this.#key });
53
+ return tr.setMeta(pluginKey, meta);
54
+ }
55
+ }
56
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,2BAAmB;AAEpC,OAAO,EAAC,SAAS,EAAC,oBAAiB;AAOnC,MAAM,OAAO,cAAc;IACvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAmB,OAA2B,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,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,SAAS,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,SAAS,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,SAAS,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,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;CACJ","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;
@@ -8,7 +8,9 @@ import { Placeholder } from "./Placeholder/index.js";
8
8
  import { ReactRendererExtension } from "./ReactRenderer/index.js";
9
9
  import { Selection } from "./Selection/index.js";
10
10
  import { SelectionContext } from "./SelectionContext/index.js";
11
+ import { SharedState } from "./SharedState/index.js";
11
12
  import { WidgetDecoration } from "./WidgetDecoration/index.js";
13
+ export * from "./Autocomplete/index.js";
12
14
  export * from "./ClicksOnEdges/index.js";
13
15
  export * from "./Clipboard/index.js";
14
16
  export * from "./CommandMenu/index.js";
@@ -19,10 +21,12 @@ export * from "./Placeholder/index.js";
19
21
  export * from "./ReactRenderer/index.js";
20
22
  export * from "./Selection/index.js";
21
23
  export * from "./SelectionContext/index.js";
24
+ export * from "./SharedState/index.js";
22
25
  export * from "./WidgetDecoration/index.js";
23
26
  export const BehaviorPreset = (builder, opts) => {
24
27
  builder
25
28
  .use(Selection)
29
+ .use(SharedState)
26
30
  .use(Placeholder, opts.placeholder ?? {})
27
31
  .use(Cursor, opts.cursor ?? {})
28
32
  .use(History, opts.history ?? {})
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,iCAAwB;AAC9C,OAAO,EAAC,SAAS,EAAwB,6BAAoB;AAC7D,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,MAAM,EAAqB,0BAAiB;AACpD,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,OAAO,EAAsB,2BAAkB;AACvD,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAqB,sBAAsB,EAAC,iCAAwB;AAC3E,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,gBAAgB,EAA+B,oCAA2B;AAClF,OAAO,EAAC,gBAAgB,EAAC,oCAA2B;AAEpD,yCAAgC;AAChC,qCAA4B;AAC5B,uCAA8B;AAC9B,kCAAyB;AACzB,qCAA4B;AAC5B,mCAA0B;AAC1B,uCAA8B;AAC9B,yCAAgC;AAChC,qCAA4B;AAC5B,4CAAmC;AACnC,4CAAmC;AAanC,MAAM,CAAC,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,gBAAgB,CAAC;SACrB,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC/B,CAAC,CAAC","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,OAAO,EAAC,aAAa,EAAC,iCAAwB;AAC9C,OAAO,EAAC,SAAS,EAAwB,6BAAoB;AAC7D,OAAO,EAAC,WAAW,EAA0B,+BAAsB;AACnE,OAAO,EAAC,MAAM,EAAqB,0BAAiB;AACpD,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,OAAO,EAAsB,2BAAkB;AACvD,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAqB,sBAAsB,EAAC,iCAAwB;AAC3E,OAAO,EAAC,SAAS,EAAC,6BAAoB;AACtC,OAAO,EAAC,gBAAgB,EAA+B,oCAA2B;AAClF,OAAO,EAAC,WAAW,EAAC,+BAAsB;AAC1C,OAAO,EAAC,gBAAgB,EAAC,oCAA2B;AAEpD,wCAA+B;AAC/B,yCAAgC;AAChC,qCAA4B;AAC5B,uCAA8B;AAC9B,kCAAyB;AACzB,qCAA4B;AAC5B,mCAA0B;AAC1B,uCAA8B;AAC9B,yCAAgC;AAChC,qCAA4B;AAC5B,4CAAmC;AACnC,uCAA8B;AAC9B,4CAAmC;AAanC,MAAM,CAAC,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,gBAAgB,CAAC;SACrB,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC/B,CAAC,CAAC","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"]}