@gravity-ui/markdown-editor 15.26.1 → 15.27.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 (206) hide show
  1. package/build/cjs/bundle/MarkdownEditorView.js +1 -1
  2. package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
  3. package/build/cjs/bundle/types.d.ts +5 -0
  4. package/build/cjs/bundle/types.js.map +1 -1
  5. package/build/cjs/bundle/useMarkdownEditor.js +1 -0
  6. package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
  7. package/build/cjs/bundle/wysiwyg-preset.d.ts +1 -0
  8. package/build/cjs/bundle/wysiwyg-preset.js +1 -0
  9. package/build/cjs/bundle/wysiwyg-preset.js.map +1 -1
  10. package/build/cjs/extensions/behavior/Search/Search.d.ts +4 -0
  11. package/build/cjs/extensions/behavior/Search/Search.js +10 -0
  12. package/build/cjs/extensions/behavior/Search/Search.js.map +1 -0
  13. package/build/cjs/extensions/behavior/Search/SearchViewPlugin.d.ts +7 -0
  14. package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js +157 -0
  15. package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js.map +1 -0
  16. package/build/cjs/extensions/behavior/Search/commands.d.ts +7 -0
  17. package/build/cjs/extensions/behavior/Search/commands.js +42 -0
  18. package/build/cjs/extensions/behavior/Search/commands.js.map +1 -0
  19. package/build/cjs/extensions/behavior/Search/const.d.ts +7 -0
  20. package/build/cjs/extensions/behavior/Search/const.js +10 -0
  21. package/build/cjs/extensions/behavior/Search/const.js.map +1 -0
  22. package/build/cjs/extensions/behavior/Search/index.d.ts +1 -0
  23. package/build/cjs/extensions/behavior/Search/index.js +5 -0
  24. package/build/cjs/extensions/behavior/Search/index.js.map +1 -0
  25. package/build/cjs/extensions/behavior/Search/key-handler.d.ts +1 -0
  26. package/build/cjs/extensions/behavior/Search/key-handler.js +14 -0
  27. package/build/cjs/extensions/behavior/Search/key-handler.js.map +1 -0
  28. package/build/cjs/extensions/behavior/Search/search-plugin.css +7 -0
  29. package/build/cjs/extensions/behavior/Search/types.d.ts +3 -0
  30. package/build/cjs/extensions/behavior/Search/types.js +3 -0
  31. package/build/cjs/extensions/behavior/Search/types.js.map +1 -0
  32. package/build/cjs/extensions/behavior/Search/utils/connect-tracker.d.ts +7 -0
  33. package/build/cjs/extensions/behavior/Search/utils/connect-tracker.js +24 -0
  34. package/build/cjs/extensions/behavior/Search/utils/connect-tracker.js.map +1 -0
  35. package/build/cjs/extensions/behavior/Search/utils/focus-manager.d.ts +6 -0
  36. package/build/cjs/extensions/behavior/Search/utils/focus-manager.js +18 -0
  37. package/build/cjs/extensions/behavior/Search/utils/focus-manager.js.map +1 -0
  38. package/build/cjs/extensions/behavior/Search/utils/search-counter.d.ts +3 -0
  39. package/build/cjs/extensions/behavior/Search/utils/search-counter.js +18 -0
  40. package/build/cjs/extensions/behavior/Search/utils/search-counter.js.map +1 -0
  41. package/build/cjs/extensions/behavior/Search/utils/wrap-command.d.ts +4 -0
  42. package/build/cjs/extensions/behavior/Search/utils/wrap-command.js +16 -0
  43. package/build/cjs/extensions/behavior/Search/utils/wrap-command.js.map +1 -0
  44. package/build/cjs/extensions/behavior/SelectionContext/index.d.ts +2 -0
  45. package/build/cjs/extensions/behavior/SelectionContext/index.js +20 -2
  46. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  47. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  48. package/build/cjs/extensions/behavior/index.js +3 -0
  49. package/build/cjs/extensions/behavior/index.js.map +1 -1
  50. package/build/cjs/i18n/search/en.json +9 -2
  51. package/build/cjs/i18n/search/index.d.ts +9 -2
  52. package/build/cjs/i18n/search/ru.json +10 -3
  53. package/build/cjs/markup/codemirror/create.js +1 -1
  54. package/build/cjs/markup/codemirror/create.js.map +1 -1
  55. package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +7 -9
  56. package/build/cjs/markup/codemirror/search-plugin/plugin.js +44 -55
  57. package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
  58. package/build/cjs/markup/codemirror/search-plugin/theme.d.ts +1 -0
  59. package/build/cjs/markup/codemirror/search-plugin/theme.js +15 -0
  60. package/build/cjs/markup/codemirror/search-plugin/theme.js.map +1 -0
  61. package/build/cjs/modules/search/components/SearchCardView.css +7 -0
  62. package/build/cjs/modules/search/components/SearchCardView.d.ts +17 -0
  63. package/build/cjs/modules/search/components/SearchCardView.js +22 -0
  64. package/build/cjs/modules/search/components/SearchCardView.js.map +1 -0
  65. package/build/cjs/modules/search/components/SearchCompactView.css +5 -0
  66. package/build/cjs/modules/search/components/SearchCompactView.d.ts +13 -0
  67. package/build/cjs/modules/search/components/SearchCompactView.js +26 -0
  68. package/build/cjs/modules/search/components/SearchCompactView.js.map +1 -0
  69. package/build/cjs/modules/search/components/SearchCounter.d.ts +6 -0
  70. package/build/cjs/modules/search/components/SearchCounter.js +15 -0
  71. package/build/cjs/modules/search/components/SearchCounter.js.map +1 -0
  72. package/build/cjs/modules/search/components/SearchPopup.css +9 -0
  73. package/build/cjs/modules/search/components/SearchPopup.d.ts +15 -0
  74. package/build/cjs/modules/search/components/SearchPopup.js +29 -0
  75. package/build/cjs/modules/search/components/SearchPopup.js.map +1 -0
  76. package/build/cjs/modules/search/components/SearchTextInput.d.ts +10 -0
  77. package/build/cjs/modules/search/components/SearchTextInput.js +24 -0
  78. package/build/cjs/modules/search/components/SearchTextInput.js.map +1 -0
  79. package/build/cjs/modules/search/hooks/use-search.d.ts +24 -0
  80. package/build/cjs/modules/search/hooks/use-search.js +47 -0
  81. package/build/cjs/modules/search/hooks/use-search.js.map +1 -0
  82. package/build/cjs/modules/search/index.d.ts +3 -0
  83. package/build/cjs/modules/search/index.js +9 -0
  84. package/build/cjs/modules/search/index.js.map +1 -0
  85. package/build/cjs/modules/search/qa.d.ts +14 -0
  86. package/build/cjs/modules/search/qa.js +18 -0
  87. package/build/cjs/modules/search/qa.js.map +1 -0
  88. package/build/cjs/modules/search/types.d.ts +10 -0
  89. package/build/cjs/modules/search/types.js +3 -0
  90. package/build/cjs/modules/search/types.js.map +1 -0
  91. package/build/cjs/react-utils/useAutoFocus.d.ts +1 -1
  92. package/build/cjs/react-utils/useAutoFocus.js +8 -10
  93. package/build/cjs/react-utils/useAutoFocus.js.map +1 -1
  94. package/build/cjs/version.js +1 -1
  95. package/build/cjs/version.js.map +1 -1
  96. package/build/esm/bundle/MarkdownEditorView.js +1 -1
  97. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  98. package/build/esm/bundle/types.d.ts +5 -0
  99. package/build/esm/bundle/types.js.map +1 -1
  100. package/build/esm/bundle/useMarkdownEditor.js +1 -0
  101. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  102. package/build/esm/bundle/wysiwyg-preset.d.ts +1 -0
  103. package/build/esm/bundle/wysiwyg-preset.js +1 -0
  104. package/build/esm/bundle/wysiwyg-preset.js.map +1 -1
  105. package/build/esm/extensions/behavior/Search/Search.d.ts +4 -0
  106. package/build/esm/extensions/behavior/Search/Search.js +6 -0
  107. package/build/esm/extensions/behavior/Search/Search.js.map +1 -0
  108. package/build/esm/extensions/behavior/Search/SearchViewPlugin.d.ts +7 -0
  109. package/build/esm/extensions/behavior/Search/SearchViewPlugin.js +153 -0
  110. package/build/esm/extensions/behavior/Search/SearchViewPlugin.js.map +1 -0
  111. package/build/esm/extensions/behavior/Search/commands.d.ts +7 -0
  112. package/build/esm/extensions/behavior/Search/commands.js +37 -0
  113. package/build/esm/extensions/behavior/Search/commands.js.map +1 -0
  114. package/build/esm/extensions/behavior/Search/const.d.ts +7 -0
  115. package/build/esm/extensions/behavior/Search/const.js +7 -0
  116. package/build/esm/extensions/behavior/Search/const.js.map +1 -0
  117. package/build/esm/extensions/behavior/Search/index.d.ts +1 -0
  118. package/build/esm/extensions/behavior/Search/index.js +2 -0
  119. package/build/esm/extensions/behavior/Search/index.js.map +1 -0
  120. package/build/esm/extensions/behavior/Search/key-handler.d.ts +1 -0
  121. package/build/esm/extensions/behavior/Search/key-handler.js +11 -0
  122. package/build/esm/extensions/behavior/Search/key-handler.js.map +1 -0
  123. package/build/esm/extensions/behavior/Search/search-plugin.css +7 -0
  124. package/build/esm/extensions/behavior/Search/types.d.ts +3 -0
  125. package/build/esm/extensions/behavior/Search/types.js +2 -0
  126. package/build/esm/extensions/behavior/Search/types.js.map +1 -0
  127. package/build/esm/extensions/behavior/Search/utils/connect-tracker.d.ts +7 -0
  128. package/build/esm/extensions/behavior/Search/utils/connect-tracker.js +21 -0
  129. package/build/esm/extensions/behavior/Search/utils/connect-tracker.js.map +1 -0
  130. package/build/esm/extensions/behavior/Search/utils/focus-manager.d.ts +6 -0
  131. package/build/esm/extensions/behavior/Search/utils/focus-manager.js +14 -0
  132. package/build/esm/extensions/behavior/Search/utils/focus-manager.js.map +1 -0
  133. package/build/esm/extensions/behavior/Search/utils/search-counter.d.ts +3 -0
  134. package/build/esm/extensions/behavior/Search/utils/search-counter.js +15 -0
  135. package/build/esm/extensions/behavior/Search/utils/search-counter.js.map +1 -0
  136. package/build/esm/extensions/behavior/Search/utils/wrap-command.d.ts +4 -0
  137. package/build/esm/extensions/behavior/Search/utils/wrap-command.js +13 -0
  138. package/build/esm/extensions/behavior/Search/utils/wrap-command.js.map +1 -0
  139. package/build/esm/extensions/behavior/SelectionContext/index.d.ts +2 -0
  140. package/build/esm/extensions/behavior/SelectionContext/index.js +19 -2
  141. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  142. package/build/esm/extensions/behavior/index.d.ts +2 -0
  143. package/build/esm/extensions/behavior/index.js +3 -0
  144. package/build/esm/extensions/behavior/index.js.map +1 -1
  145. package/build/esm/i18n/search/en.json +9 -2
  146. package/build/esm/i18n/search/index.d.ts +9 -2
  147. package/build/esm/i18n/search/ru.json +10 -3
  148. package/build/esm/markup/codemirror/create.js +1 -1
  149. package/build/esm/markup/codemirror/create.js.map +1 -1
  150. package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +7 -9
  151. package/build/esm/markup/codemirror/search-plugin/plugin.js +44 -55
  152. package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
  153. package/build/esm/markup/codemirror/search-plugin/theme.d.ts +1 -0
  154. package/build/esm/markup/codemirror/search-plugin/theme.js +12 -0
  155. package/build/esm/markup/codemirror/search-plugin/theme.js.map +1 -0
  156. package/build/esm/modules/search/components/SearchCardView.css +7 -0
  157. package/build/esm/modules/search/components/SearchCardView.d.ts +17 -0
  158. package/build/esm/modules/search/components/SearchCardView.js +18 -0
  159. package/build/esm/modules/search/components/SearchCardView.js.map +1 -0
  160. package/build/esm/modules/search/components/SearchCompactView.css +5 -0
  161. package/build/esm/modules/search/components/SearchCompactView.d.ts +13 -0
  162. package/build/esm/modules/search/components/SearchCompactView.js +22 -0
  163. package/build/esm/modules/search/components/SearchCompactView.js.map +1 -0
  164. package/build/esm/modules/search/components/SearchCounter.d.ts +6 -0
  165. package/build/esm/modules/search/components/SearchCounter.js +11 -0
  166. package/build/esm/modules/search/components/SearchCounter.js.map +1 -0
  167. package/build/esm/modules/search/components/SearchPopup.css +9 -0
  168. package/build/esm/modules/search/components/SearchPopup.d.ts +15 -0
  169. package/build/esm/modules/search/components/SearchPopup.js +24 -0
  170. package/build/esm/modules/search/components/SearchPopup.js.map +1 -0
  171. package/build/esm/modules/search/components/SearchTextInput.d.ts +10 -0
  172. package/build/esm/modules/search/components/SearchTextInput.js +20 -0
  173. package/build/esm/modules/search/components/SearchTextInput.js.map +1 -0
  174. package/build/esm/modules/search/hooks/use-search.d.ts +24 -0
  175. package/build/esm/modules/search/hooks/use-search.js +44 -0
  176. package/build/esm/modules/search/hooks/use-search.js.map +1 -0
  177. package/build/esm/modules/search/index.d.ts +3 -0
  178. package/build/esm/modules/search/index.js +4 -0
  179. package/build/esm/modules/search/index.js.map +1 -0
  180. package/build/esm/modules/search/qa.d.ts +14 -0
  181. package/build/esm/modules/search/qa.js +15 -0
  182. package/build/esm/modules/search/qa.js.map +1 -0
  183. package/build/esm/modules/search/types.d.ts +10 -0
  184. package/build/esm/modules/search/types.js +2 -0
  185. package/build/esm/modules/search/types.js.map +1 -0
  186. package/build/esm/react-utils/useAutoFocus.d.ts +1 -1
  187. package/build/esm/react-utils/useAutoFocus.js +7 -8
  188. package/build/esm/react-utils/useAutoFocus.js.map +1 -1
  189. package/build/esm/version.js +1 -1
  190. package/build/esm/version.js.map +1 -1
  191. package/build/styles.css +28 -10
  192. package/package.json +2 -4
  193. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +0 -3
  194. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +0 -9
  195. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +0 -1
  196. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +0 -10
  197. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +0 -27
  198. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +0 -83
  199. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +0 -1
  200. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +0 -3
  201. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +0 -4
  202. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +0 -1
  203. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +0 -10
  204. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +0 -27
  205. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +0 -77
  206. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.closeSearch = exports.openSearch = exports.replaceAll = exports.replaceNext = exports.findPrev = exports.findNext = void 0;
4
+ const prosemirror_search_1 = require("prosemirror-search");
5
+ const SelectionContext_1 = require("../SelectionContext/index.js");
6
+ const const_1 = require("./const.js");
7
+ const wrap_command_1 = require("./utils/wrap-command.js");
8
+ exports.findNext = (0, wrap_command_1.wrapCommand)(prosemirror_search_1.findNext, SelectionContext_1.hideSelectionMenu);
9
+ exports.findPrev = (0, wrap_command_1.wrapCommand)(prosemirror_search_1.findPrev, SelectionContext_1.hideSelectionMenu);
10
+ exports.replaceNext = (0, wrap_command_1.wrapCommand)(prosemirror_search_1.replaceNext, SelectionContext_1.hideSelectionMenu);
11
+ exports.replaceAll = (0, wrap_command_1.wrapCommand)(prosemirror_search_1.replaceAll, SelectionContext_1.hideSelectionMenu);
12
+ const openSearch = (state, dispatch) => {
13
+ if (dispatch) {
14
+ const searchState = (0, prosemirror_search_1.getSearchState)(state);
15
+ const search = state.doc.textBetween(state.selection.from, state.selection.to, ' ');
16
+ const meta = { open: true };
17
+ dispatch((0, prosemirror_search_1.setSearchState)((0, SelectionContext_1.hideSelectionMenu)(state.tr.setMeta(const_1.pluginKey, meta)), new prosemirror_search_1.SearchQuery({
18
+ ...(searchState
19
+ ? {
20
+ regexp: searchState.query.regexp,
21
+ replace: searchState.query.replace,
22
+ literal: searchState.query.literal,
23
+ wholeWord: searchState.query.wholeWord,
24
+ caseSensitive: searchState.query.caseSensitive,
25
+ filter: searchState.query.filter || undefined,
26
+ }
27
+ : undefined),
28
+ search,
29
+ })));
30
+ }
31
+ return true;
32
+ };
33
+ exports.openSearch = openSearch;
34
+ const closeSearch = (state, dispatch) => {
35
+ if (dispatch) {
36
+ const meta = { open: false };
37
+ dispatch((0, prosemirror_search_1.setSearchState)(state.tr.setMeta(const_1.pluginKey, meta), new prosemirror_search_1.SearchQuery({ search: '' })));
38
+ }
39
+ return true;
40
+ };
41
+ exports.closeSearch = closeSearch;
42
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/commands.ts"],"names":[],"mappings":";;;AAAA,2DAQ4B;AAI5B,mEAAsD;AAEtD,sCAAkC;AAElC,0DAAiD;AAEpC,QAAA,QAAQ,GAAG,IAAA,0BAAW,EAAC,6BAAc,EAAE,oCAAiB,CAAC,CAAC;AAC1D,QAAA,QAAQ,GAAG,IAAA,0BAAW,EAAC,6BAAc,EAAE,oCAAiB,CAAC,CAAC;AAC1D,QAAA,WAAW,GAAG,IAAA,0BAAW,EAAC,gCAAiB,EAAE,oCAAiB,CAAC,CAAC;AAChE,QAAA,UAAU,GAAG,IAAA,0BAAW,EAAC,+BAAgB,EAAE,oCAAiB,CAAC,CAAC;AAEpE,MAAM,UAAU,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACnD,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,IAAA,mCAAc,EAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACpF,MAAM,IAAI,GAAoB,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC;QAC3C,QAAQ,CACJ,IAAA,mCAAc,EACV,IAAA,oCAAiB,EAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAS,EAAE,IAAI,CAAC,CAAC,EACpD,IAAI,gCAAW,CAAC;YACZ,GAAG,CAAC,WAAW;gBACX,CAAC,CAAC;oBACI,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;oBAChC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO;oBAClC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO;oBAClC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS;oBACtC,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,aAAa;oBAC9C,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS;iBAChD;gBACH,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM;SACT,CAAC,CACL,CACJ,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAzBW,QAAA,UAAU,cAyBrB;AAEK,MAAM,WAAW,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACpD,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,IAAI,GAAoB,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;QAC5C,QAAQ,CAAC,IAAA,mCAAc,EAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAS,EAAE,IAAI,CAAC,EAAE,IAAI,gCAAW,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AANW,QAAA,WAAW,eAMtB","sourcesContent":["import {\n SearchQuery,\n findNext as findNextSearch,\n findPrev as findPrevSearch,\n getSearchState,\n replaceAll as replaceAllSearch,\n replaceNext as replaceNextSearch,\n setSearchState,\n} from 'prosemirror-search';\n\nimport type {Command} from '#pm/state';\n\nimport {hideSelectionMenu} from '../SelectionContext';\n\nimport {pluginKey} from './const';\nimport type {SearchViewState} from './types';\nimport {wrapCommand} from './utils/wrap-command';\n\nexport const findNext = wrapCommand(findNextSearch, hideSelectionMenu);\nexport const findPrev = wrapCommand(findPrevSearch, hideSelectionMenu);\nexport const replaceNext = wrapCommand(replaceNextSearch, hideSelectionMenu);\nexport const replaceAll = wrapCommand(replaceAllSearch, hideSelectionMenu);\n\nexport const openSearch: Command = (state, dispatch) => {\n if (dispatch) {\n const searchState = getSearchState(state);\n const search = state.doc.textBetween(state.selection.from, state.selection.to, ' ');\n const meta: SearchViewState = {open: true};\n dispatch(\n setSearchState(\n hideSelectionMenu(state.tr.setMeta(pluginKey, meta)),\n new SearchQuery({\n ...(searchState\n ? {\n regexp: searchState.query.regexp,\n replace: searchState.query.replace,\n literal: searchState.query.literal,\n wholeWord: searchState.query.wholeWord,\n caseSensitive: searchState.query.caseSensitive,\n filter: searchState.query.filter || undefined,\n }\n : undefined),\n search,\n }),\n ),\n );\n }\n return true;\n};\n\nexport const closeSearch: Command = (state, dispatch) => {\n if (dispatch) {\n const meta: SearchViewState = {open: false};\n dispatch(setSearchState(state.tr.setMeta(pluginKey, meta), new SearchQuery({search: ''})));\n }\n return true;\n};\n"]}
@@ -0,0 +1,7 @@
1
+ import { PluginKey } from "../../../pm/state.js";
2
+ import type { SearchViewState } from "./types.js";
3
+ export declare const SearchClassName: {
4
+ readonly Match: "ProseMirror-search-match";
5
+ readonly ActiveMatch: "ProseMirror-active-search-match";
6
+ };
7
+ export declare const pluginKey: PluginKey<SearchViewState>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pluginKey = exports.SearchClassName = void 0;
4
+ const state_1 = require("../../../pm/state.js");
5
+ exports.SearchClassName = {
6
+ Match: 'ProseMirror-search-match',
7
+ ActiveMatch: 'ProseMirror-active-search-match',
8
+ };
9
+ exports.pluginKey = new state_1.PluginKey('search-view');
10
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/const.ts"],"names":[],"mappings":";;;AAAA,gDAAoC;AAIvB,QAAA,eAAe,GAAG;IAC3B,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,iCAAiC;CACxC,CAAC;AAEE,QAAA,SAAS,GAAG,IAAI,iBAAS,CAAkB,aAAa,CAAC,CAAC","sourcesContent":["import {PluginKey} from '#pm/state';\n\nimport type {SearchViewState} from './types';\n\nexport const SearchClassName = {\n Match: 'ProseMirror-search-match',\n ActiveMatch: 'ProseMirror-active-search-match',\n} as const;\n\nexport const pluginKey = new PluginKey<SearchViewState>('search-view');\n"]}
@@ -0,0 +1 @@
1
+ export * from "./Search.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("./Search.js"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/index.ts"],"names":[],"mappings":";;;AAAA,sDAAyB","sourcesContent":["export * from './Search';\n"]}
@@ -0,0 +1 @@
1
+ export declare const searchKeyHandler: (view: import("prosemirror-view").EditorView, event: KeyboardEvent) => boolean;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchKeyHandler = void 0;
4
+ const keymap_1 = require("../../../pm/keymap.js");
5
+ const commands_1 = require("./commands.js");
6
+ exports.searchKeyHandler = (0, keymap_1.keydownHandler)({
7
+ 'Mod-f': commands_1.openSearch,
8
+ Escape: commands_1.closeSearch,
9
+ F3: commands_1.findNext,
10
+ 'Shift-F3': commands_1.findPrev,
11
+ 'Mod-g': commands_1.findNext,
12
+ 'Shift-Mod-g': commands_1.findPrev,
13
+ });
14
+ //# sourceMappingURL=key-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/key-handler.ts"],"names":[],"mappings":";;;AAAA,kDAA0C;AAE1C,4CAAuE;AAE1D,QAAA,gBAAgB,GAAG,IAAA,uBAAc,EAAC;IAC3C,OAAO,EAAE,qBAAU;IACnB,MAAM,EAAE,sBAAW;IACnB,EAAE,EAAE,mBAAQ;IACZ,UAAU,EAAE,mBAAQ;IACpB,OAAO,EAAE,mBAAQ;IACjB,aAAa,EAAE,mBAAQ;CAC1B,CAAC,CAAC","sourcesContent":["import {keydownHandler} from '#pm/keymap';\n\nimport {closeSearch, findNext, findPrev, openSearch} from './commands';\n\nexport const searchKeyHandler = keydownHandler({\n 'Mod-f': openSearch,\n Escape: closeSearch,\n F3: findNext,\n 'Shift-F3': findPrev,\n 'Mod-g': findNext,\n 'Shift-Mod-g': findPrev,\n});\n"]}
@@ -0,0 +1,7 @@
1
+ .ProseMirror-search-match {
2
+ background-color: var(--g-color-base-info-light);
3
+ }
4
+
5
+ .ProseMirror-active-search-match {
6
+ background-color: var(--g-color-base-info-heavy);
7
+ }
@@ -0,0 +1,3 @@
1
+ export type SearchViewState = {
2
+ open: boolean;
3
+ };
@@ -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/Search/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SearchViewState = {open: boolean};\n"]}
@@ -0,0 +1,7 @@
1
+ type TrackingOptions = {
2
+ onConnect?: () => void;
3
+ onDisconnect?: () => void;
4
+ };
5
+ type Dispose = () => void;
6
+ export declare function startTracking(elem: HTMLElement, options: TrackingOptions): Dispose;
7
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startTracking = startTracking;
4
+ function startTracking(elem, options) {
5
+ const document = elem.ownerDocument;
6
+ let connected = document.contains(elem);
7
+ const observer = new MutationObserver(() => {
8
+ if (connected) {
9
+ if (!document.contains(elem)) {
10
+ connected = false;
11
+ options.onDisconnect?.();
12
+ }
13
+ }
14
+ else if (document.contains(elem)) {
15
+ connected = true;
16
+ options.onConnect?.();
17
+ }
18
+ });
19
+ observer.observe(document.body, { childList: true, subtree: true });
20
+ return () => {
21
+ observer.disconnect();
22
+ };
23
+ }
24
+ //# sourceMappingURL=connect-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-tracker.js","sourceRoot":"../../../../../../src","sources":["extensions/behavior/Search/utils/connect-tracker.ts"],"names":[],"mappings":";;AAOA,sCAsBC;AAtBD,SAAgB,aAAa,CAAC,IAAiB,EAAE,OAAwB;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;IAEpC,IAAI,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;QACvC,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,SAAS,GAAG,KAAK,CAAC;gBAClB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;YAC7B,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAC1B,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;IAElE,OAAO,GAAG,EAAE;QACR,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC,CAAC;AACN,CAAC","sourcesContent":["type TrackingOptions = {\n onConnect?: () => void;\n onDisconnect?: () => void;\n};\n\ntype Dispose = () => void;\n\nexport function startTracking(elem: HTMLElement, options: TrackingOptions): Dispose {\n const document = elem.ownerDocument;\n\n let connected = document.contains(elem);\n\n const observer = new MutationObserver(() => {\n if (connected) {\n if (!document.contains(elem)) {\n connected = false;\n options.onDisconnect?.();\n }\n } else if (document.contains(elem)) {\n connected = true;\n options.onConnect?.();\n }\n });\n\n observer.observe(document.body, {childList: true, subtree: true});\n\n return () => {\n observer.disconnect();\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare class FocusManager {
2
+ #private;
3
+ constructor(doc?: Document);
4
+ storeFocus(): void;
5
+ restoreFocus(options?: FocusOptions): void;
6
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FocusManager = void 0;
4
+ class FocusManager {
5
+ #doc;
6
+ #previousFocused = null;
7
+ constructor(doc = document) {
8
+ this.#doc = doc;
9
+ }
10
+ storeFocus() {
11
+ this.#previousFocused = this.#doc.activeElement;
12
+ }
13
+ restoreFocus(options) {
14
+ this.#previousFocused?.focus?.(options);
15
+ }
16
+ }
17
+ exports.FocusManager = FocusManager;
18
+ //# sourceMappingURL=focus-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-manager.js","sourceRoot":"../../../../../../src","sources":["extensions/behavior/Search/utils/focus-manager.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IACrB,IAAI,CAAW;IACf,gBAAgB,GAAuB,IAAI,CAAC;IAE5C,YAAY,MAAgB,QAAQ;QAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,UAAU;QACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAmC,CAAC;IAC1E,CAAC;IAED,YAAY,CAAC,OAAsB;QAC/B,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;CACJ;AAfD,oCAeC","sourcesContent":["export class FocusManager {\n #doc: Document;\n #previousFocused: HTMLElement | null = null;\n\n constructor(doc: Document = document) {\n this.#doc = doc;\n }\n\n storeFocus() {\n this.#previousFocused = this.#doc.activeElement as HTMLElement | null;\n }\n\n restoreFocus(options?: FocusOptions) {\n this.#previousFocused?.focus?.(options);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EditorState } from "../../../../pm/state.js";
2
+ import type { SearchCounter } from "../../../../modules/search/index.js";
3
+ export declare function getCounter(state: EditorState): SearchCounter;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCounter = getCounter;
4
+ const prosemirror_search_1 = require("prosemirror-search");
5
+ const const_1 = require("../const.js");
6
+ function getCounter(state) {
7
+ const decoSet = (0, prosemirror_search_1.getMatchHighlights)(state);
8
+ const searchDecos = decoSet.find(undefined, undefined, () => true);
9
+ const activeIndex = searchDecos.findIndex((deco) => {
10
+ const d = deco;
11
+ return d.type?.attrs?.class === const_1.SearchClassName.ActiveMatch;
12
+ });
13
+ return {
14
+ total: searchDecos.length,
15
+ current: activeIndex + 1,
16
+ };
17
+ }
18
+ //# sourceMappingURL=search-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-counter.js","sourceRoot":"../../../../../../src","sources":["extensions/behavior/Search/utils/search-counter.ts"],"names":[],"mappings":";;AAOA,gCAWC;AAlBD,2DAAsD;AAKtD,uCAAyC;AAEzC,SAAgB,UAAU,CAAC,KAAkB;IACzC,MAAM,OAAO,GAAG,IAAA,uCAAkB,EAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/C,MAAM,CAAC,GAAG,IAA8C,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,uBAAe,CAAC,WAAW,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,OAAO;QACH,KAAK,EAAE,WAAW,CAAC,MAAM;QACzB,OAAO,EAAE,WAAW,GAAG,CAAC;KAC3B,CAAC;AACN,CAAC","sourcesContent":["import {getMatchHighlights} from 'prosemirror-search';\n\nimport type {EditorState} from '#pm/state';\nimport type {SearchCounter} from 'src/modules/search';\n\nimport {SearchClassName} from '../const';\n\nexport function getCounter(state: EditorState): SearchCounter {\n const decoSet = getMatchHighlights(state);\n const searchDecos = decoSet.find(undefined, undefined, () => true);\n const activeIndex = searchDecos.findIndex((deco) => {\n const d = deco as {type?: {attrs?: Record<string, any>}};\n return d.type?.attrs?.class === SearchClassName.ActiveMatch;\n });\n return {\n total: searchDecos.length,\n current: activeIndex + 1,\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Command, Transaction } from "../../../../pm/state.js";
2
+ type Wrapper = (tr: Transaction) => void;
3
+ export declare function wrapCommand(command: Command, ...wrappers: [Wrapper, ...Wrapper[]]): Command;
4
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapCommand = wrapCommand;
4
+ function wrapCommand(command, ...wrappers) {
5
+ return (state, dispatch, view) => {
6
+ return command(state, dispatch
7
+ ? function dispatchWithWrappers(tr) {
8
+ for (const wrapper of wrappers) {
9
+ wrapper(tr);
10
+ }
11
+ return dispatch(tr);
12
+ }
13
+ : undefined, view);
14
+ };
15
+ }
16
+ //# sourceMappingURL=wrap-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-command.js","sourceRoot":"../../../../../../src","sources":["extensions/behavior/Search/utils/wrap-command.ts"],"names":[],"mappings":";;AAIA,kCAeC;AAfD,SAAgB,WAAW,CAAC,OAAgB,EAAE,GAAG,QAAiC;IAC9E,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC7B,OAAO,OAAO,CACV,KAAK,EACL,QAAQ;YACJ,CAAC,CAAC,SAAS,oBAAoB,CAAC,EAAE;gBAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC7B,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;gBACD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;YACH,CAAC,CAAC,SAAS,EACf,IAAI,CACP,CAAC;IACN,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type {Command, Transaction} from '#pm/state';\n\ntype Wrapper = (tr: Transaction) => void;\n\nexport function wrapCommand(command: Command, ...wrappers: [Wrapper, ...Wrapper[]]): Command {\n return (state, dispatch, view) => {\n return command(\n state,\n dispatch\n ? function dispatchWithWrappers(tr) {\n for (const wrapper of wrappers) {\n wrapper(tr);\n }\n return dispatch(tr);\n }\n : undefined,\n view,\n );\n };\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { type Transaction } from 'prosemirror-state';
1
2
  import type { ExtensionAuto } from "../../../core/index.js";
2
3
  import { type ContextConfig } from "./tooltip.js";
3
4
  export type { ContextConfig as SelectionContextConfig, ContextGroupItemData as SelectionContextItemData, } from "./tooltip.js";
@@ -17,6 +18,7 @@ export type SelectionContextOptions = {
17
18
  flip?: boolean;
18
19
  };
19
20
  export declare const SelectionContext: ExtensionAuto<SelectionContextOptions>;
21
+ export declare const hideSelectionMenu: (tr: Transaction) => Transaction;
20
22
  declare module 'prosemirror-model' {
21
23
  interface NodeSpec {
22
24
  /** Set false to disable the selection-context menu within this node */
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SelectionContext = void 0;
3
+ exports.hideSelectionMenu = exports.SelectionContext = void 0;
4
4
  const prosemirror_keymap_1 = require("prosemirror-keymap");
5
5
  const prosemirror_state_1 = require("prosemirror-state");
6
6
  // @ts-ignore // TODO: fix cjs build
@@ -14,6 +14,12 @@ const SelectionContext = (builder, opts) => {
14
14
  }
15
15
  };
16
16
  exports.SelectionContext = SelectionContext;
17
+ const HideMetaKey = 'hide-selection-menu';
18
+ const hideSelectionMenu = (tr) => {
19
+ return tr.setMeta(HideMetaKey, true);
20
+ };
21
+ exports.hideSelectionMenu = hideSelectionMenu;
22
+ const pluginKey = new prosemirror_state_1.PluginKey('selection-context');
17
23
  class SelectionTooltip {
18
24
  destroyed = false;
19
25
  tooltip;
@@ -22,6 +28,9 @@ class SelectionTooltip {
22
28
  constructor(actions, menuConfig, logger, options) {
23
29
  this.tooltip = new tooltip_1.TooltipView(actions, menuConfig, logger, options);
24
30
  }
31
+ get key() {
32
+ return pluginKey;
33
+ }
25
34
  get props() {
26
35
  return {
27
36
  // same as keymap({})
@@ -55,6 +64,14 @@ class SelectionTooltip {
55
64
  },
56
65
  };
57
66
  }
67
+ get state() {
68
+ return {
69
+ init: () => ({ disabled: false }),
70
+ apply(tr) {
71
+ return { disabled: Boolean(tr.getMeta(HideMetaKey)) };
72
+ },
73
+ };
74
+ }
58
75
  view(view) {
59
76
  this.update(view);
60
77
  return {
@@ -70,9 +87,10 @@ class SelectionTooltip {
70
87
  if (this._isMousePressed)
71
88
  return;
72
89
  this.cancelTooltipHiding();
90
+ const hideFromTr = pluginKey.getState(view.state)?.disabled;
73
91
  // Don't show tooltip if editor not mounted to the DOM
74
92
  // or when view is out of focus
75
- if (!view.dom.parentNode || !view.hasFocus()) {
93
+ if (hideFromTr || !view.dom.parentNode || !view.hasFocus()) {
76
94
  this.tooltip.hide(view);
77
95
  return;
78
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n type PluginSpec,\n TextSelection,\n} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNode} from 'prosemirror-utils';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n /**\n * Placement of context popup\n *\n * @default 'bottom'\n */\n placement?: 'top' | 'bottom';\n /**\n * Prevents context popup from overflowing\n *\n * @default false\n */\n flip?: boolean;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, opts) => {\n const {config} = opts;\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(\n ({actions}) => new Plugin(new SelectionTooltip(actions, config, builder.logger, opts)),\n );\n }\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<unknown> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n options: SelectionContextOptions,\n ) {\n this.tooltip = new TooltipView(actions, menuConfig, logger, options);\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (!view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n if (\n // Hide tooltip when one side of selection is inside a codeblock\n isCodeBlock(selection.$from.parent) ||\n isCodeBlock(selection.$to.parent) ||\n // or when selection is inside node where context menu is disabled\n hasParentNode((node: Node) => node.type.spec.selectionContext === false)(selection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n /** Set false to disable the selection-context menu within this node */\n selectionContext?: boolean | undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport type {Node} from 'prosemirror-model';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n PluginKey,\n type PluginSpec,\n type StateField,\n TextSelection,\n type Transaction,\n} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {hasParentNode} from 'prosemirror-utils';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n /**\n * Placement of context popup\n *\n * @default 'bottom'\n */\n placement?: 'top' | 'bottom';\n /**\n * Prevents context popup from overflowing\n *\n * @default false\n */\n flip?: boolean;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, opts) => {\n const {config} = opts;\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(\n ({actions}) => new Plugin(new SelectionTooltip(actions, config, builder.logger, opts)),\n );\n }\n};\n\nconst HideMetaKey = 'hide-selection-menu';\n\nexport const hideSelectionMenu = (tr: Transaction) => {\n return tr.setMeta(HideMetaKey, true);\n};\n\nconst pluginKey = new PluginKey<PluginState>('selection-context');\n\ntype PluginState = {\n disabled: boolean;\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<PluginState> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n options: SelectionContextOptions,\n ) {\n this.tooltip = new TooltipView(actions, menuConfig, logger, options);\n }\n\n get key(): PluginKey<PluginState> {\n return pluginKey;\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n get state(): StateField<PluginState> {\n return {\n init: () => ({disabled: false}),\n apply(tr) {\n return {disabled: Boolean(tr.getMeta(HideMetaKey))};\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n const hideFromTr = pluginKey.getState(view.state)?.disabled;\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (hideFromTr || !view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n if (\n // Hide tooltip when one side of selection is inside a codeblock\n isCodeBlock(selection.$from.parent) ||\n isCodeBlock(selection.$to.parent) ||\n // or when selection is inside node where context menu is disabled\n hasParentNode((node: Node) => node.type.spec.selectionContext === false)(selection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n /** Set false to disable the selection-context menu within this node */\n selectionContext?: boolean | undefined;\n }\n}\n"]}
@@ -5,6 +5,7 @@ import { type CommandMenuOptions } from "./CommandMenu/index.js";
5
5
  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
+ import { type SearchOptions } from "./Search/index.js";
8
9
  import { type SelectionContextOptions } from "./SelectionContext/index.js";
9
10
  export * from "./Autocomplete/index.js";
10
11
  export * from "./ClicksOnEdges/index.js";
@@ -26,6 +27,7 @@ export type BehaviorPresetOptions = {
26
27
  placeholder?: PlaceholderOptions;
27
28
  reactRenderer: ReactRenderer;
28
29
  selectionContext?: SelectionContextOptions;
30
+ search?: SearchOptions;
29
31
  commandMenu?: CommandMenuOptions;
30
32
  mobile?: boolean;
31
33
  };
@@ -10,6 +10,7 @@ const FilePaste_1 = require("./FilePaste/index.js");
10
10
  const History_1 = require("./History/index.js");
11
11
  const Placeholder_1 = require("./Placeholder/index.js");
12
12
  const ReactRenderer_1 = require("./ReactRenderer/index.js");
13
+ const Search_1 = require("./Search/index.js");
13
14
  const Selection_1 = require("./Selection/index.js");
14
15
  const SelectionContext_1 = require("./SelectionContext/index.js");
15
16
  const SharedState_1 = require("./SharedState/index.js");
@@ -41,6 +42,8 @@ const BehaviorPreset = (builder, opts) => {
41
42
  builder.use(SelectionContext_1.SelectionContext, opts.selectionContext ?? {});
42
43
  if (opts.commandMenu)
43
44
  builder.use(CommandMenu_1.CommandMenu, opts.commandMenu);
45
+ if (opts.search)
46
+ builder.use(Search_1.Search, opts.search);
44
47
  }
45
48
  builder.use(FilePaste_1.FilePaste);
46
49
  builder.use(ClicksOnEdges_1.ClicksOnEdges);
@@ -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,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;AAc5B,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,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAlBW,QAAA,cAAc,kBAkBzB","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 mobile?: boolean;\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\n if (!opts.mobile) {\n builder.use(SelectionContext, opts.selectionContext ?? {});\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n }\n\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,8CAAoD;AACpD,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;AAc5B,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,CAAC;IAE3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,eAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAnBW,QAAA,cAAc,kBAmBzB","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 {Search, type SearchOptions} from './Search';\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 search?: SearchOptions;\n commandMenu?: CommandMenuOptions;\n mobile?: boolean;\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\n if (!opts.mobile) {\n builder.use(SelectionContext, opts.selectionContext ?? {});\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n if (opts.search) builder.use(Search, opts.search);\n }\n\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "label_case-sensitive": "Case sensitive",
3
3
  "label_whole-word": "Whole word",
4
- "title": "Search in code",
4
+ "title": "Search and replace",
5
+ "action_close": "Close",
5
6
  "action_replace": "Replace",
6
7
  "action_replace_all": "Replace all",
7
- "replace_placeholder": "Replacement text"
8
+ "action_next": "Find next",
9
+ "action_prev": "Find previous",
10
+ "action_expand": "Expand the replacement form",
11
+ "title_search": "Find",
12
+ "title_replace": "Replace with",
13
+ "search_counter": "{{current}} of {{total}}",
14
+ "search_placeholder": "Text search"
8
15
  }
@@ -1,10 +1,17 @@
1
- export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word" | "action_replace" | "action_replace_all" | "replace_placeholder", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word" | "action_close" | "action_replace" | "action_replace_all" | "action_next" | "action_prev" | "action_expand" | "title_search" | "title_replace" | "search_counter" | "search_placeholder", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  }) => S extends G ? {
4
4
  "label_case-sensitive": string;
5
5
  "label_whole-word": string;
6
6
  title: string;
7
+ action_close: string;
7
8
  action_replace: string;
8
9
  action_replace_all: string;
9
- replace_placeholder: string;
10
+ action_next: string;
11
+ action_prev: string;
12
+ action_expand: string;
13
+ title_search: string;
14
+ title_replace: string;
15
+ search_counter: string;
16
+ search_placeholder: string;
10
17
  }[G] : string;
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "label_case-sensitive": "С учетом регистра",
3
- "label_whole-word": "Слово целиком",
4
- "title": "Найти в коде",
3
+ "label_whole-word": "Точное совпадение",
4
+ "title": "Поиск и замена",
5
+ "action_close": "Закрыть",
5
6
  "action_replace": "Заменить",
6
7
  "action_replace_all": "Заменить всё",
7
- "replace_placeholder": "Текст замены"
8
+ "action_next": "Следующий",
9
+ "action_prev": "Предыдущий",
10
+ "action_expand": "Раскрыть окно замены",
11
+ "title_search": "Найти",
12
+ "title_replace": "Заменить на",
13
+ "search_counter": "{{current}} из {{total}}",
14
+ "search_placeholder": "Поиск по тексту"
8
15
  }
@@ -165,7 +165,7 @@ function createCodemirror(params) {
165
165
  }));
166
166
  if (searchPanel) {
167
167
  extensions.push((0, plugin_1.SearchPanelPlugin)({
168
- anchorSelector: '.g-md-search-anchor',
168
+ anchorSelector: '.g-md-search-markup-anchor',
169
169
  receiver,
170
170
  }));
171
171
  }