@gravity-ui/markdown-editor 13.17.0 → 13.18.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 (227) hide show
  1. package/README.md +2 -0
  2. package/build/cjs/bundle/config/action-names.d.ts +1 -1
  3. package/build/cjs/bundle/config/action-names.js +1 -0
  4. package/build/cjs/bundle/config/icons.d.ts +1 -1
  5. package/build/cjs/bundle/config/icons.js +3 -0
  6. package/build/cjs/bundle/config/wysiwyg.d.ts +1 -0
  7. package/build/cjs/bundle/config/wysiwyg.js +13 -1
  8. package/build/cjs/extensions/behavior/Resizable/Resizable.css +38 -0
  9. package/build/cjs/extensions/behavior/Resizable/Resizable.d.ts +9 -0
  10. package/build/cjs/extensions/behavior/Resizable/Resizable.js +14 -0
  11. package/build/cjs/extensions/markdown/Table/actions/innerActions.d.ts +1 -1
  12. package/build/cjs/extensions/markdown/Table/plugins/TableCellContextPlugin/index.js +19 -9
  13. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.css +18 -0
  14. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.d.ts +8 -0
  15. package/build/cjs/extensions/yfm/GPT/ErrorScreen/ErrorScreen.js +21 -0
  16. package/build/cjs/extensions/yfm/GPT/ErrorScreen/types.d.ts +14 -0
  17. package/build/cjs/extensions/yfm/GPT/ErrorScreen/types.js +2 -0
  18. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.css +75 -0
  19. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.d.ts +28 -0
  20. package/build/cjs/extensions/yfm/GPT/GptDialog/GptDialog.js +102 -0
  21. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.css +22 -0
  22. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.d.ts +3 -0
  23. package/build/cjs/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.js +21 -0
  24. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.d.ts +1 -0
  25. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.js +5 -0
  26. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.css +8 -0
  27. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.d.ts +14 -0
  28. package/build/cjs/extensions/yfm/GPT/IconRefuge/IconRefuge.js +28 -0
  29. package/build/cjs/extensions/yfm/GPT/IconRefuge/index.d.ts +2 -0
  30. package/build/cjs/extensions/yfm/GPT/IconRefuge/index.js +5 -0
  31. package/build/cjs/extensions/yfm/GPT/PresetList/PresetList.d.ts +9 -0
  32. package/build/cjs/extensions/yfm/GPT/PresetList/PresetList.js +29 -0
  33. package/build/cjs/extensions/yfm/GPT/PresetList/Presetlist.css +6 -0
  34. package/build/cjs/extensions/yfm/GPT/actions.d.ts +2 -0
  35. package/build/cjs/extensions/yfm/GPT/actions.js +14 -0
  36. package/build/cjs/extensions/yfm/GPT/commands.d.ts +2 -0
  37. package/build/cjs/extensions/yfm/GPT/commands.js +13 -0
  38. package/build/cjs/extensions/yfm/GPT/constants.d.ts +13 -0
  39. package/build/cjs/extensions/yfm/GPT/constants.js +15 -0
  40. package/build/cjs/extensions/yfm/GPT/gptExtension/gptExtension.d.ts +13 -0
  41. package/build/cjs/extensions/yfm/GPT/gptExtension/gptExtension.js +18 -0
  42. package/build/cjs/extensions/yfm/GPT/gptExtension/view.css +17 -0
  43. package/build/cjs/extensions/yfm/GPT/gptExtension/view.d.ts +36 -0
  44. package/build/cjs/extensions/yfm/GPT/gptExtension/view.js +171 -0
  45. package/build/cjs/extensions/yfm/GPT/hooks/useGpt.d.ts +27 -0
  46. package/build/cjs/extensions/yfm/GPT/hooks/useGpt.js +148 -0
  47. package/build/cjs/extensions/yfm/GPT/hooks/useGptHotKeys.d.ts +2 -0
  48. package/build/cjs/extensions/yfm/GPT/hooks/useGptHotKeys.js +8 -0
  49. package/build/cjs/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.d.ts +13 -0
  50. package/build/cjs/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.js +70 -0
  51. package/build/cjs/extensions/yfm/GPT/hooks/usePresetList.d.ts +14 -0
  52. package/build/cjs/extensions/yfm/GPT/hooks/usePresetList.js +36 -0
  53. package/build/cjs/extensions/yfm/GPT/index.d.ts +2 -0
  54. package/build/cjs/extensions/yfm/GPT/index.js +5 -0
  55. package/build/cjs/extensions/yfm/GPT/plugin.d.ts +13 -0
  56. package/build/cjs/extensions/yfm/GPT/plugin.js +47 -0
  57. package/build/cjs/extensions/yfm/GPT/toolbar.d.ts +3 -0
  58. package/build/cjs/extensions/yfm/GPT/toolbar.js +22 -0
  59. package/build/cjs/extensions/yfm/GPT/utils.d.ts +13 -0
  60. package/build/cjs/extensions/yfm/GPT/utils.js +31 -0
  61. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.css +6 -0
  62. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.d.ts +6 -1
  63. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js +21 -37
  64. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.d.ts +1 -1
  65. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js +62 -4
  66. package/build/cjs/extensions/yfm/Mermaid/MermaidNodeView/MermaidView.js +8 -7
  67. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.d.ts +1 -1
  68. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.js +0 -8
  69. package/build/cjs/extensions/yfm/index.d.ts +1 -0
  70. package/build/cjs/extensions/yfm/index.js +1 -0
  71. package/build/cjs/i18n/gpt/dialog/en.json +16 -0
  72. package/build/cjs/i18n/gpt/dialog/index.d.ts +19 -0
  73. package/build/cjs/i18n/gpt/dialog/index.js +8 -0
  74. package/build/cjs/i18n/gpt/dialog/ru.json +16 -0
  75. package/build/cjs/i18n/gpt/errors/en.json +5 -0
  76. package/build/cjs/i18n/gpt/errors/index.d.ts +8 -0
  77. package/build/cjs/i18n/gpt/errors/index.js +8 -0
  78. package/build/cjs/i18n/gpt/errors/ru.json +5 -0
  79. package/build/cjs/i18n/gpt/extension/en.json +6 -0
  80. package/build/cjs/i18n/gpt/extension/index.d.ts +9 -0
  81. package/build/cjs/i18n/gpt/extension/index.js +8 -0
  82. package/build/cjs/i18n/gpt/extension/ru.json +6 -0
  83. package/build/cjs/i18n/gpt/loading/en.json +3 -0
  84. package/build/cjs/i18n/gpt/loading/index.d.ts +6 -0
  85. package/build/cjs/i18n/gpt/loading/index.js +8 -0
  86. package/build/cjs/i18n/gpt/loading/ru.json +3 -0
  87. package/build/cjs/i18n/menubar/en.json +1 -0
  88. package/build/cjs/i18n/menubar/index.d.ts +2 -1
  89. package/build/cjs/i18n/menubar/ru.json +1 -0
  90. package/build/cjs/i18n/yfm-table/en.json +10 -1
  91. package/build/cjs/i18n/yfm-table/index.d.ts +10 -1
  92. package/build/cjs/i18n/yfm-table/ru.json +10 -1
  93. package/build/cjs/icons/GPT.d.ts +2 -0
  94. package/build/cjs/icons/GPT.js +22 -0
  95. package/build/cjs/icons/GPTLoading.d.ts +2 -0
  96. package/build/cjs/icons/GPTLoading.js +12 -0
  97. package/build/cjs/icons/index.d.ts +3 -1
  98. package/build/cjs/icons/index.js +5 -1
  99. package/build/cjs/react-utils/useAutoFocus.d.ts +1 -1
  100. package/build/cjs/react-utils/useAutoFocus.js +2 -2
  101. package/build/cjs/react-utils/useNodeEditing.d.ts +3 -2
  102. package/build/cjs/react-utils/useNodeEditing.js +1 -1
  103. package/build/cjs/react-utils/useNodeResizing.d.ts +22 -0
  104. package/build/cjs/react-utils/useNodeResizing.js +82 -0
  105. package/build/cjs/table-utils/commands/appendColumn.js +42 -33
  106. package/build/cjs/table-utils/commands/appendRow.js +40 -22
  107. package/build/cjs/table-utils/commands/removeColumn.js +18 -20
  108. package/build/cjs/table-utils/commands/removeRow.js +12 -9
  109. package/build/cjs/table-utils/table-desc.d.ts +53 -0
  110. package/build/cjs/table-utils/table-desc.js +149 -0
  111. package/build/cjs/table-utils/utils.d.ts +1 -1
  112. package/build/cjs/table-utils/utils.js +19 -12
  113. package/build/cjs/version.js +1 -1
  114. package/build/esm/bundle/config/action-names.d.ts +1 -1
  115. package/build/esm/bundle/config/action-names.js +1 -0
  116. package/build/esm/bundle/config/icons.d.ts +1 -1
  117. package/build/esm/bundle/config/icons.js +2 -0
  118. package/build/esm/bundle/config/wysiwyg.d.ts +1 -0
  119. package/build/esm/bundle/config/wysiwyg.js +12 -0
  120. package/build/esm/extensions/behavior/Resizable/Resizable.css +38 -0
  121. package/build/esm/extensions/behavior/Resizable/Resizable.d.ts +10 -0
  122. package/build/esm/extensions/behavior/Resizable/Resizable.js +10 -0
  123. package/build/esm/extensions/markdown/Table/actions/innerActions.d.ts +1 -1
  124. package/build/esm/extensions/markdown/Table/plugins/TableCellContextPlugin/index.js +19 -9
  125. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.css +18 -0
  126. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.d.ts +9 -0
  127. package/build/esm/extensions/yfm/GPT/ErrorScreen/ErrorScreen.js +17 -0
  128. package/build/esm/extensions/yfm/GPT/ErrorScreen/types.d.ts +14 -0
  129. package/build/esm/extensions/yfm/GPT/ErrorScreen/types.js +1 -0
  130. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.css +75 -0
  131. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.d.ts +29 -0
  132. package/build/esm/extensions/yfm/GPT/GptDialog/GptDialog.js +98 -0
  133. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.css +22 -0
  134. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.d.ts +4 -0
  135. package/build/esm/extensions/yfm/GPT/GptDialog/LoadingScreen/LoadingScreen.js +17 -0
  136. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.d.ts +1 -0
  137. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.classname.js +2 -0
  138. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.css +8 -0
  139. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.d.ts +15 -0
  140. package/build/esm/extensions/yfm/GPT/IconRefuge/IconRefuge.js +25 -0
  141. package/build/esm/extensions/yfm/GPT/IconRefuge/index.d.ts +2 -0
  142. package/build/esm/extensions/yfm/GPT/IconRefuge/index.js +1 -0
  143. package/build/esm/extensions/yfm/GPT/PresetList/PresetList.d.ts +10 -0
  144. package/build/esm/extensions/yfm/GPT/PresetList/PresetList.js +25 -0
  145. package/build/esm/extensions/yfm/GPT/PresetList/Presetlist.css +6 -0
  146. package/build/esm/extensions/yfm/GPT/actions.d.ts +2 -0
  147. package/build/esm/extensions/yfm/GPT/actions.js +10 -0
  148. package/build/esm/extensions/yfm/GPT/commands.d.ts +2 -0
  149. package/build/esm/extensions/yfm/GPT/commands.js +9 -0
  150. package/build/esm/extensions/yfm/GPT/constants.d.ts +13 -0
  151. package/build/esm/extensions/yfm/GPT/constants.js +12 -0
  152. package/build/esm/extensions/yfm/GPT/gptExtension/gptExtension.d.ts +13 -0
  153. package/build/esm/extensions/yfm/GPT/gptExtension/gptExtension.js +14 -0
  154. package/build/esm/extensions/yfm/GPT/gptExtension/view.css +17 -0
  155. package/build/esm/extensions/yfm/GPT/gptExtension/view.d.ts +37 -0
  156. package/build/esm/extensions/yfm/GPT/gptExtension/view.js +167 -0
  157. package/build/esm/extensions/yfm/GPT/hooks/useGpt.d.ts +27 -0
  158. package/build/esm/extensions/yfm/GPT/hooks/useGpt.js +144 -0
  159. package/build/esm/extensions/yfm/GPT/hooks/useGptHotKeys.d.ts +2 -0
  160. package/build/esm/extensions/yfm/GPT/hooks/useGptHotKeys.js +4 -0
  161. package/build/esm/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.d.ts +13 -0
  162. package/build/esm/extensions/yfm/GPT/hooks/useOverflowingHorizontalItems.js +65 -0
  163. package/build/esm/extensions/yfm/GPT/hooks/usePresetList.d.ts +14 -0
  164. package/build/esm/extensions/yfm/GPT/hooks/usePresetList.js +32 -0
  165. package/build/esm/extensions/yfm/GPT/index.d.ts +2 -0
  166. package/build/esm/extensions/yfm/GPT/index.js +2 -0
  167. package/build/esm/extensions/yfm/GPT/plugin.d.ts +13 -0
  168. package/build/esm/extensions/yfm/GPT/plugin.js +43 -0
  169. package/build/esm/extensions/yfm/GPT/toolbar.d.ts +3 -0
  170. package/build/esm/extensions/yfm/GPT/toolbar.js +18 -0
  171. package/build/esm/extensions/yfm/GPT/utils.d.ts +13 -0
  172. package/build/esm/extensions/yfm/GPT/utils.js +23 -0
  173. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.css +6 -0
  174. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.d.ts +7 -1
  175. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgSettingsButton.js +23 -38
  176. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.d.ts +1 -1
  177. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/NodeView.js +63 -5
  178. package/build/esm/extensions/yfm/Mermaid/MermaidNodeView/MermaidView.js +5 -4
  179. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.d.ts +1 -1
  180. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/actions.js +1 -9
  181. package/build/esm/extensions/yfm/index.d.ts +1 -0
  182. package/build/esm/extensions/yfm/index.js +1 -0
  183. package/build/esm/i18n/gpt/dialog/en.json +16 -0
  184. package/build/esm/i18n/gpt/dialog/index.d.ts +19 -0
  185. package/build/esm/i18n/gpt/dialog/index.js +4 -0
  186. package/build/esm/i18n/gpt/dialog/ru.json +16 -0
  187. package/build/esm/i18n/gpt/errors/en.json +5 -0
  188. package/build/esm/i18n/gpt/errors/index.d.ts +8 -0
  189. package/build/esm/i18n/gpt/errors/index.js +4 -0
  190. package/build/esm/i18n/gpt/errors/ru.json +5 -0
  191. package/build/esm/i18n/gpt/extension/en.json +6 -0
  192. package/build/esm/i18n/gpt/extension/index.d.ts +9 -0
  193. package/build/esm/i18n/gpt/extension/index.js +4 -0
  194. package/build/esm/i18n/gpt/extension/ru.json +6 -0
  195. package/build/esm/i18n/gpt/loading/en.json +3 -0
  196. package/build/esm/i18n/gpt/loading/index.d.ts +6 -0
  197. package/build/esm/i18n/gpt/loading/index.js +4 -0
  198. package/build/esm/i18n/gpt/loading/ru.json +3 -0
  199. package/build/esm/i18n/menubar/en.json +1 -0
  200. package/build/esm/i18n/menubar/index.d.ts +2 -1
  201. package/build/esm/i18n/menubar/ru.json +1 -0
  202. package/build/esm/i18n/yfm-table/en.json +10 -1
  203. package/build/esm/i18n/yfm-table/index.d.ts +10 -1
  204. package/build/esm/i18n/yfm-table/ru.json +10 -1
  205. package/build/esm/icons/GPT.d.ts +2 -0
  206. package/build/esm/icons/GPT.js +19 -0
  207. package/build/esm/icons/GPTLoading.d.ts +2 -0
  208. package/build/esm/icons/GPTLoading.js +9 -0
  209. package/build/esm/icons/index.d.ts +3 -1
  210. package/build/esm/icons/index.js +3 -1
  211. package/build/esm/react-utils/useAutoFocus.d.ts +1 -1
  212. package/build/esm/react-utils/useAutoFocus.js +2 -2
  213. package/build/esm/react-utils/useNodeEditing.d.ts +3 -2
  214. package/build/esm/react-utils/useNodeEditing.js +1 -1
  215. package/build/esm/react-utils/useNodeResizing.d.ts +22 -0
  216. package/build/esm/react-utils/useNodeResizing.js +77 -0
  217. package/build/esm/table-utils/commands/appendColumn.js +44 -35
  218. package/build/esm/table-utils/commands/appendRow.js +42 -24
  219. package/build/esm/table-utils/commands/removeColumn.js +18 -20
  220. package/build/esm/table-utils/commands/removeRow.js +14 -11
  221. package/build/esm/table-utils/table-desc.d.ts +53 -0
  222. package/build/esm/table-utils/table-desc.js +144 -0
  223. package/build/esm/table-utils/utils.d.ts +1 -1
  224. package/build/esm/table-utils/utils.js +18 -12
  225. package/build/esm/version.js +1 -1
  226. package/build/styles.css +190 -0
  227. package/package.json +3 -2
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresetList = exports.cnGptDialogPresetList = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
7
+ const classname_1 = require("../../../../classname");
8
+ const dialog_1 = require("../../../../i18n/gpt/dialog");
9
+ const constants_1 = require("../constants");
10
+ const useGptHotKeys_1 = require("../hooks/useGptHotKeys");
11
+ const usePresetList_1 = require("../hooks/usePresetList");
12
+ exports.cnGptDialogPresetList = (0, classname_1.cn)('gpt-dialog-preset-list');
13
+ const PresetItem = ({ preset, onPresetClick, disablePromptPresets, hotKey }) => {
14
+ (0, useGptHotKeys_1.useGptHotKeys)(hotKey, () => {
15
+ onPresetClick(preset.data);
16
+ }, { enableOnFormTags: true });
17
+ return (react_1.default.createElement(uikit_1.ActionTooltip, { title: preset.display, hotkey: hotKey },
18
+ react_1.default.createElement(uikit_1.Button, { className: (0, exports.cnGptDialogPresetList)('preset'), view: "normal", size: "m", disabled: disablePromptPresets, onClick: () => onPresetClick(preset.data) }, preset.display)));
19
+ };
20
+ const PresetList = ({ disablePromptPresets, promptPresets, onPresetClick, }) => {
21
+ const { presetsContainerRef, visiblePresets, hiddenPresets, showMoreButton, measured } = (0, usePresetList_1.usePresetList)({
22
+ promptPresets,
23
+ onPresetClick,
24
+ });
25
+ return (react_1.default.createElement("div", { className: (0, exports.cnGptDialogPresetList)({ measured }), ref: presetsContainerRef },
26
+ visiblePresets.map((preset, index) => (react_1.default.createElement(PresetItem, { preset: preset, key: preset.display, hotKey: preset.hotKey || constants_1.gptHotKeys.presetsKey(String(index + 1)), disablePromptPresets: disablePromptPresets, onPresetClick: onPresetClick }))),
27
+ showMoreButton && (react_1.default.createElement(uikit_1.DropdownMenu, { switcherWrapperClassName: (0, exports.cnGptDialogPresetList)('more-button-wrapper'), switcher: react_1.default.createElement(uikit_1.Button, { className: (0, exports.cnGptDialogPresetList)('more-button'), view: "normal", size: "m" }, (0, dialog_1.i18n)('more')), items: hiddenPresets }))));
28
+ };
29
+ exports.PresetList = PresetList;
@@ -0,0 +1,6 @@
1
+ .g-md-gpt-dialog-preset-list__preset + .g-md-gpt-dialog-preset-list__preset {
2
+ margin-left: var(--g-spacing-2);
3
+ }
4
+ .g-md-gpt-dialog-preset-list__more-button-wrapper {
5
+ margin-left: var(--g-spacing-2);
6
+ }
@@ -0,0 +1,2 @@
1
+ import type { ActionSpec, ExtensionDeps } from 'src/core';
2
+ export declare const showGptWidget: (deps: ExtensionDeps) => ActionSpec;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.showGptWidget = void 0;
4
+ const commands_1 = require("./commands");
5
+ const showGptWidget = (_deps) => ({
6
+ isActive() {
7
+ return false;
8
+ },
9
+ isEnable() {
10
+ return true;
11
+ },
12
+ run: commands_1.runGpt,
13
+ });
14
+ exports.showGptWidget = showGptWidget;
@@ -0,0 +1,2 @@
1
+ import { Command } from 'prosemirror-state';
2
+ export declare const runGpt: Command;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runGpt = void 0;
4
+ const prosemirror_state_1 = require("prosemirror-state");
5
+ const plugin_1 = require("./plugin");
6
+ const runGpt = (state, dispatch) => {
7
+ const { selection: sel } = state;
8
+ const meta = { action: 'show', from: sel.from, to: sel.to };
9
+ const tr = state.tr.setMeta(plugin_1.pluginKey, meta);
10
+ dispatch === null || dispatch === void 0 ? void 0 : dispatch(tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, sel.to)));
11
+ return true;
12
+ };
13
+ exports.runGpt = runGpt;
@@ -0,0 +1,13 @@
1
+ import type { PopupProps } from '@gravity-ui/uikit/build/esm/components/Popup/Popup';
2
+ export declare const WIDGET_DECO_CLASS_NAME = "g-md-gpt-widget-deco";
3
+ export declare const WIDGET_DECO_SPEC_FLAG = "gpt_widget_deco";
4
+ export declare const gptPopupPlacement: PopupProps['placement'];
5
+ export declare const gptHotKeys: {
6
+ openGptKey: string;
7
+ openGptKeyTooltip: string;
8
+ presetsKey: (key: string) => string;
9
+ tryAgainGpt: string;
10
+ freshStartGpt: string;
11
+ applyResultGpt: string;
12
+ closeGpt: string;
13
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gptHotKeys = exports.gptPopupPlacement = exports.WIDGET_DECO_SPEC_FLAG = exports.WIDGET_DECO_CLASS_NAME = void 0;
4
+ exports.WIDGET_DECO_CLASS_NAME = 'g-md-gpt-widget-deco';
5
+ exports.WIDGET_DECO_SPEC_FLAG = 'gpt_widget_deco';
6
+ exports.gptPopupPlacement = ['bottom-start', 'top-start'];
7
+ exports.gptHotKeys = {
8
+ openGptKey: 'Mod-h',
9
+ openGptKeyTooltip: 'Mod+h',
10
+ presetsKey: (key) => `Control+${key}`,
11
+ tryAgainGpt: 'Control+t',
12
+ freshStartGpt: 'Control+r',
13
+ applyResultGpt: 'Enter',
14
+ closeGpt: 'Escape',
15
+ };
@@ -0,0 +1,13 @@
1
+ import { Action, ExtensionWithOptions } from 'src/core';
2
+ import type { CommonAnswer } from '../ErrorScreen/types';
3
+ import type { GptWidgetDecoViewParams } from './view';
4
+ export declare const gptActionName = "addGptWidget";
5
+ export declare type GptWidgetOptions<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Pick<GptWidgetDecoViewParams<AnswerData, PromptData>, 'gptPopupContainer' | 'answerRender' | 'onApplyResult' | 'promptPresets' | 'customPromptPlaceholder' | 'disabledPromptPlaceholder' | 'onCustomPromptApply' | 'onPromptPresetClick' | 'onTryAgain' | 'onLike' | 'onDislike' | 'onClose' | 'onUpdate' | 'gptAlertProps'>;
6
+ export declare const gptExtension: ExtensionWithOptions<GptWidgetOptions>;
7
+ declare global {
8
+ namespace WysiwygEditor {
9
+ interface Actions {
10
+ [gptActionName]: Action<{}>;
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gptExtension = exports.gptActionName = void 0;
4
+ const actions_1 = require("../actions");
5
+ const commands_1 = require("../commands");
6
+ const constants_1 = require("../constants");
7
+ const plugin_1 = require("../plugin");
8
+ exports.gptActionName = 'addGptWidget';
9
+ const gptExtension = (builder, options) => {
10
+ builder.addAction(exports.gptActionName, actions_1.showGptWidget);
11
+ builder.addPlugin(({ serializer, markupParser }) => {
12
+ return (0, plugin_1.gptWidgetPlugin)(Object.assign(Object.assign({}, options), { serializer, parser: markupParser }));
13
+ });
14
+ builder.addKeymap(() => ({
15
+ [constants_1.gptHotKeys.openGptKey]: commands_1.runGpt,
16
+ }), builder.Priority.VeryLow);
17
+ };
18
+ exports.gptExtension = gptExtension;
@@ -0,0 +1,17 @@
1
+ .g-md-gpt-widget-deco {
2
+ background-color: var(--g-color-base-info-light-hover);
3
+ }
4
+
5
+ .g-md-gpt-popup {
6
+ --layer-navigation-bar: 900;
7
+ pointer-events: initial;
8
+ }
9
+ .g-md-gpt-popup[class] {
10
+ border-radius: var(--g-spacing-2);
11
+ }
12
+ .g-md-gpt-popup__content {
13
+ width: 720px;
14
+ padding: var(--g-spacing-3);
15
+ pointer-events: all;
16
+ box-shadow: -8px 2px 16px -4px var(--g-color-private-purple-150), 8px 2px 16px -4px var(--g-color-private-blue-150);
17
+ }
@@ -0,0 +1,36 @@
1
+ import type { PopupProps } from '@gravity-ui/uikit';
2
+ import type { EditorState, PluginView } from 'prosemirror-state';
3
+ import { EditorView } from 'prosemirror-view';
4
+ import { Parser, Serializer } from 'src/core';
5
+ import type { CommonAnswer } from '../ErrorScreen/types';
6
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
7
+ export declare const cnGptPopup: import("@bem-react/classname").ClassNameFormatter;
8
+ export declare type GptWidgetDecoViewParams<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Omit<GptDialogProps<AnswerData, PromptData>, 'markup' | 'onApplyResult'> & {
9
+ serializer: Serializer;
10
+ parser: Parser;
11
+ } & {
12
+ onApplyResult?: GptDialogProps['onApplyResult'];
13
+ gptPopupContainer?: PopupProps['container'];
14
+ };
15
+ export declare class GptWidgetDecoView implements Required<PluginView> {
16
+ private readonly _view;
17
+ private readonly _renderer;
18
+ private _decoElem;
19
+ private _params;
20
+ private _serializer;
21
+ private _parser;
22
+ private _confirmOpen;
23
+ constructor(view: EditorView, params: GptWidgetDecoViewParams);
24
+ update(view: EditorView, prevState: EditorState): void;
25
+ destroy(): void;
26
+ private _resetState;
27
+ private _onConfirmCancel;
28
+ private _onConfirmOk;
29
+ private _render;
30
+ private _onGptAnswerUpdate;
31
+ private _onSubmit;
32
+ private _onClose;
33
+ private _getContentOfDecoration;
34
+ private _getCurrentDecoration;
35
+ private _getPluginState;
36
+ }
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GptWidgetDecoView = exports.cnGptPopup = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
7
+ const prosemirror_model_1 = require("prosemirror-model");
8
+ const prosemirror_state_1 = require("prosemirror-state");
9
+ const react_use_1 = require("react-use");
10
+ const classname_1 = require("../../../../classname");
11
+ const behavior_1 = require("../../../behavior");
12
+ const GptDialog_1 = require("../GptDialog/GptDialog");
13
+ const constants_1 = require("../constants");
14
+ const plugin_1 = require("../plugin");
15
+ exports.cnGptPopup = (0, classname_1.cn)('gpt-popup');
16
+ class GptWidgetDecoView {
17
+ constructor(view, params) {
18
+ this._decoElem = null;
19
+ this._onConfirmCancel = () => {
20
+ this._confirmOpen = false;
21
+ this._renderer.rerender();
22
+ };
23
+ this._onConfirmOk = () => {
24
+ this._onClose();
25
+ };
26
+ this._onGptAnswerUpdate = (answer) => {
27
+ var _a, _b;
28
+ (_b = (_a = this._params).onUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, answer);
29
+ };
30
+ this._onSubmit = (answer) => {
31
+ var _a, _b;
32
+ const deco = this._getCurrentDecoration();
33
+ if (!deco)
34
+ return;
35
+ const { from, to } = deco;
36
+ const answerNode = this._parser.parse(answer);
37
+ const tr = this._view.state.tr;
38
+ const meta = { action: 'hide' };
39
+ tr.setMeta(plugin_1.pluginKey, meta);
40
+ tr.replace(from, to, new prosemirror_model_1.Slice(answerNode.content, 1, 1));
41
+ tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, tr.mapping.map(to)));
42
+ this._view.dispatch(tr);
43
+ setTimeout(() => {
44
+ this._view.focus();
45
+ }, 0);
46
+ (_b = (_a = this._params).onApplyResult) === null || _b === void 0 ? void 0 : _b.call(_a, answer);
47
+ this._resetState();
48
+ };
49
+ this._onClose = () => {
50
+ var _a, _b;
51
+ const deco = this._getCurrentDecoration();
52
+ if (!deco) {
53
+ return;
54
+ }
55
+ const tr = this._view.state.tr;
56
+ const meta = { action: 'hide' };
57
+ tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, deco.from, deco.to));
58
+ tr.setMeta(plugin_1.pluginKey, meta);
59
+ this._view.dispatch(tr);
60
+ setTimeout(() => {
61
+ this._view.focus();
62
+ }, 0);
63
+ (_b = (_a = this._params).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
64
+ this._resetState();
65
+ };
66
+ this._view = view;
67
+ this._params = params;
68
+ this._serializer = params.serializer;
69
+ this._parser = params.parser;
70
+ this._confirmOpen = false;
71
+ this._renderer = (0, behavior_1.getReactRendererFromState)(view.state).createItem('gpt-widget-view', this._render.bind(this));
72
+ }
73
+ update(view, prevState) {
74
+ var _a;
75
+ const { state, dispatch } = view;
76
+ if (this._decoElem && !state.selection.eq(prevState.selection)) {
77
+ const transaction = state.tr;
78
+ const meta = { action: 'hide' };
79
+ dispatch(transaction.setMeta(plugin_1.pluginKey, meta));
80
+ this._view.focus();
81
+ return;
82
+ }
83
+ const decoElements = Array.from(view.dom.querySelectorAll(`.${constants_1.WIDGET_DECO_CLASS_NAME}`));
84
+ this._decoElem = (_a = decoElements.at(-1)) !== null && _a !== void 0 ? _a : null;
85
+ this._renderer.rerender();
86
+ }
87
+ destroy() {
88
+ this._resetState();
89
+ this._renderer.remove();
90
+ }
91
+ _resetState() {
92
+ this._decoElem = null;
93
+ this._confirmOpen = false;
94
+ }
95
+ _render() {
96
+ if (!this._decoElem)
97
+ return null;
98
+ const markup = this._getContentOfDecoration();
99
+ if (markup === undefined) {
100
+ return null;
101
+ }
102
+ return (react_1.default.createElement(Widget, { markup: markup, anchorRef: { current: this._decoElem }, answerRender: this._params.answerRender, promptPresets: this._params.promptPresets, disablePromptPresets: this._params.disablePromptPresets, customPromptPlaceholder: this._params.customPromptPlaceholder, disabledPromptPlaceholder: this._params.disabledPromptPlaceholder, gptAlertProps: this._params.gptAlertProps,
103
+ /* eslint-disable-next-line react/jsx-handler-names */
104
+ onApplyResult: this._onSubmit,
105
+ /* eslint-disable-next-line react/jsx-handler-names */
106
+ onCustomPromptApply: this._params.onCustomPromptApply,
107
+ /* eslint-disable-next-line react/jsx-handler-names */
108
+ onPromptPresetClick: this._params.onPromptPresetClick,
109
+ /* eslint-disable-next-line react/jsx-handler-names */
110
+ onTryAgain: this._params.onTryAgain,
111
+ /* eslint-disable-next-line react/jsx-handler-names */
112
+ onLike: this._params.onLike,
113
+ /* eslint-disable-next-line react/jsx-handler-names */
114
+ onDislike: this._params.onDislike,
115
+ /* eslint-disable-next-line react/jsx-handler-names */
116
+ onClose: this._onClose,
117
+ /* eslint-disable-next-line react/jsx-handler-names */
118
+ onUpdate: this._onGptAnswerUpdate,
119
+ /* eslint-disable-next-line react/jsx-handler-names */
120
+ confirmOpen: this._confirmOpen,
121
+ /* eslint-disable-next-line react/jsx-handler-names */
122
+ onConfirmOk: this._onConfirmOk,
123
+ /* eslint-disable-next-line react/jsx-handler-names */
124
+ onConfirmCancel: this._onConfirmCancel, container: this._params.gptPopupContainer }));
125
+ }
126
+ _getContentOfDecoration() {
127
+ const deco = this._getCurrentDecoration();
128
+ if (!deco)
129
+ return undefined;
130
+ const { from, to } = deco;
131
+ try {
132
+ const fragment = this._view.state.doc.slice(from, to, true).content;
133
+ const yfmMarkup = this._serializer.serialize(fragment);
134
+ return yfmMarkup;
135
+ }
136
+ catch (error) {
137
+ console.error(error);
138
+ return this._view.state.doc.textBetween(from, to, '\n', '');
139
+ }
140
+ }
141
+ _getCurrentDecoration() {
142
+ var _a;
143
+ return (_a = this._getPluginState()) === null || _a === void 0 ? void 0 : _a.find(undefined, undefined,
144
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return
145
+ (spec) => spec[constants_1.WIDGET_DECO_SPEC_FLAG])[0];
146
+ }
147
+ _getPluginState() {
148
+ return plugin_1.pluginKey.getState(this._view.state);
149
+ }
150
+ }
151
+ exports.GptWidgetDecoView = GptWidgetDecoView;
152
+ function Widget({ markup, anchorRef, answerRender, promptPresets, disablePromptPresets, customPromptPlaceholder, disabledPromptPlaceholder, onCustomPromptApply, onApplyResult, onPromptPresetClick, onTryAgain, onLike, onDislike, onClose, onUpdate, container, gptAlertProps, }) {
153
+ (0, react_1.useEffect)(() => {
154
+ // rerender the popup
155
+ window.dispatchEvent(new CustomEvent('scroll'));
156
+ }, [anchorRef]);
157
+ (0, react_use_1.useMount)(() => {
158
+ if ((anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && 'scrollIntoView' in anchorRef.current) {
159
+ anchorRef.current.scrollIntoView({
160
+ behavior: 'smooth',
161
+ block: 'center',
162
+ });
163
+ }
164
+ });
165
+ const handleUpdate = (0, react_1.useCallback)((result) => {
166
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(result);
167
+ }, [onUpdate]);
168
+ return (react_1.default.createElement(react_1.default.Fragment, null,
169
+ react_1.default.createElement(uikit_1.Popup, { className: (0, exports.cnGptPopup)(), contentClassName: (0, exports.cnGptPopup)('content'), open: true, anchorRef: anchorRef, placement: constants_1.gptPopupPlacement, onOutsideClick: onClose, focusTrap: true, strategy: "absolute", container: container, onEscapeKeyDown: onClose },
170
+ react_1.default.createElement(GptDialog_1.GptDialog, { markup: markup, answerRender: answerRender, promptPresets: promptPresets, disablePromptPresets: disablePromptPresets, customPromptPlaceholder: customPromptPlaceholder, disabledPromptPlaceholder: disabledPromptPlaceholder, onApplyResult: onApplyResult, onCustomPromptApply: onCustomPromptApply, onPromptPresetClick: onPromptPresetClick, onTryAgain: onTryAgain, onLike: onLike, onDislike: onDislike, onClose: onClose, onUpdate: handleUpdate, gptAlertProps: gptAlertProps }))));
171
+ }
@@ -0,0 +1,27 @@
1
+ import type { CommonAnswer, GptRequestData } from '../ErrorScreen/types';
2
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
3
+ declare type UseGptProps<AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown> = Pick<GptDialogProps<AnswerData, PromptData>, 'markup' | 'promptPresets' | 'onCustomPromptApply' | 'onPromptPresetClick' | 'onTryAgain' | 'onLike' | 'onDislike' | 'onApplyResult' | 'onUpdate'>;
4
+ export declare const useGpt: <AnswerData extends CommonAnswer = CommonAnswer, PromptData extends unknown = unknown>({ markup, promptPresets, onCustomPromptApply, onPromptPresetClick, onTryAgain, onLike, onDislike, onApplyResult, onUpdate, }: UseGptProps<AnswerData, PromptData>) => {
5
+ answer: AnswerData | undefined;
6
+ customPrompt: string;
7
+ lastRequestData: GptRequestData<PromptData> | undefined;
8
+ loading: boolean;
9
+ error: boolean;
10
+ mode: "custom-and-presets" | "only-custom" | "only-presets";
11
+ feedbackType: "dislike" | "like" | undefined;
12
+ feedbackTypeLoading: "dislike" | "like" | undefined;
13
+ handleLike: () => Promise<void>;
14
+ handleDislike: () => Promise<void>;
15
+ handleCustomPromptUpdate: import("react").Dispatch<import("react").SetStateAction<string>>;
16
+ handleCustomPromptKeyPress: import("react").KeyboardEventHandler<HTMLInputElement>;
17
+ handleCustomPromptApply: () => Promise<void>;
18
+ handlePresetClick: (data: PromptData) => void;
19
+ handleTryAgain: () => Promise<void>;
20
+ handleFreshStart: () => void;
21
+ handleApplyResult: () => void;
22
+ showTryAgainButton: boolean;
23
+ showAnswer: boolean;
24
+ showError: boolean;
25
+ showAnswerActions: boolean | undefined;
26
+ };
27
+ export {};
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useGpt = void 0;
4
+ const react_1 = require("react");
5
+ const utils_1 = require("../utils");
6
+ const useGpt = ({ markup, promptPresets, onCustomPromptApply, onPromptPresetClick, onTryAgain, onLike, onDislike, onApplyResult, onUpdate, }) => {
7
+ const [answer, setAnswer] = (0, react_1.useState)();
8
+ const [lastRequestData, setLastRequestData] = (0, react_1.useState)();
9
+ const [customPrompt, setCustomPrompt] = (0, react_1.useState)('');
10
+ const [loading, setLoading] = (0, react_1.useState)(false);
11
+ const [error, setError] = (0, react_1.useState)(false);
12
+ const [feedbackType, setFeedbackType] = (0, react_1.useState)(undefined);
13
+ const [feedbackTypeLoading, setFeedbackTypeLoading] = (0, react_1.useState)(undefined);
14
+ const makeRequest = (0, react_1.useCallback)(async (requestFunction, data) => {
15
+ if (!requestFunction) {
16
+ return;
17
+ }
18
+ let result;
19
+ try {
20
+ setLoading(true);
21
+ setError(false);
22
+ setLastRequestData(data);
23
+ result = await requestFunction(data);
24
+ if (result) {
25
+ setAnswer(result);
26
+ setFeedbackType(undefined);
27
+ }
28
+ }
29
+ catch (error) {
30
+ console.error(error);
31
+ setError(true);
32
+ }
33
+ finally {
34
+ setLoading(false);
35
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(result);
36
+ }
37
+ }, [onUpdate]);
38
+ const handleLike = (0, react_1.useCallback)(async () => {
39
+ if (!onLike || !lastRequestData) {
40
+ return;
41
+ }
42
+ try {
43
+ setFeedbackType(undefined);
44
+ setFeedbackTypeLoading('like');
45
+ await onLike(lastRequestData);
46
+ setFeedbackType('like');
47
+ }
48
+ catch (error) {
49
+ console.error(error);
50
+ }
51
+ finally {
52
+ setFeedbackTypeLoading(undefined);
53
+ }
54
+ }, [lastRequestData, onLike]);
55
+ const handleDislike = (0, react_1.useCallback)(async () => {
56
+ if (!onDislike || !lastRequestData) {
57
+ return;
58
+ }
59
+ try {
60
+ setFeedbackType(undefined);
61
+ setFeedbackTypeLoading('dislike');
62
+ await onDislike(lastRequestData);
63
+ setFeedbackType('dislike');
64
+ }
65
+ catch (error) {
66
+ console.error(error);
67
+ }
68
+ finally {
69
+ setFeedbackTypeLoading(undefined);
70
+ }
71
+ }, [lastRequestData, onDislike]);
72
+ const handleCustomPromptApply = (0, react_1.useCallback)(async () => {
73
+ if (!customPrompt) {
74
+ return;
75
+ }
76
+ const gptRequestData = {
77
+ markup,
78
+ customPrompt,
79
+ };
80
+ await makeRequest(onCustomPromptApply, gptRequestData);
81
+ }, [customPrompt, makeRequest, markup, onCustomPromptApply]);
82
+ const handleCustomPromptKeyPress = (0, react_1.useCallback)(async (event) => {
83
+ if (!(0, utils_1.isEnter)(event)) {
84
+ return;
85
+ }
86
+ await handleCustomPromptApply();
87
+ }, [handleCustomPromptApply]);
88
+ const handlePresetClick = (0, react_1.useCallback)(async (data) => {
89
+ const gptRequestData = {
90
+ markup,
91
+ promptData: data,
92
+ };
93
+ await makeRequest(onPromptPresetClick, gptRequestData);
94
+ }, [makeRequest, markup, onPromptPresetClick]);
95
+ const handleTryAgain = (0, react_1.useCallback)(async () => {
96
+ if (!lastRequestData) {
97
+ return;
98
+ }
99
+ await makeRequest(onTryAgain, lastRequestData);
100
+ }, [lastRequestData, makeRequest, onTryAgain]);
101
+ const handleApplyResult = (0, react_1.useCallback)(() => {
102
+ var _a;
103
+ onApplyResult((_a = answer === null || answer === void 0 ? void 0 : answer.rawText) !== null && _a !== void 0 ? _a : '');
104
+ }, [answer === null || answer === void 0 ? void 0 : answer.rawText, onApplyResult]);
105
+ const handleFreshStart = (0, react_1.useCallback)(() => {
106
+ setError(false);
107
+ setLastRequestData(undefined);
108
+ setAnswer(undefined);
109
+ setCustomPrompt('');
110
+ setFeedbackType(undefined);
111
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(undefined);
112
+ }, [onUpdate]);
113
+ const showTryAgainButton = Boolean(lastRequestData && onTryAgain && !loading);
114
+ const showAnswer = Boolean(answer && !loading && !error);
115
+ const showError = error && !loading;
116
+ const showAnswerActions = (onLike || onDislike) && showAnswer;
117
+ let mode = 'custom-and-presets';
118
+ if (onCustomPromptApply && !(promptPresets === null || promptPresets === void 0 ? void 0 : promptPresets.length)) {
119
+ mode = 'only-custom';
120
+ }
121
+ else if (!onCustomPromptApply && (promptPresets === null || promptPresets === void 0 ? void 0 : promptPresets.length)) {
122
+ mode = 'only-presets';
123
+ }
124
+ return {
125
+ answer,
126
+ customPrompt,
127
+ lastRequestData,
128
+ loading,
129
+ error,
130
+ mode,
131
+ feedbackType,
132
+ feedbackTypeLoading,
133
+ handleLike,
134
+ handleDislike,
135
+ handleCustomPromptUpdate: setCustomPrompt,
136
+ handleCustomPromptKeyPress,
137
+ handleCustomPromptApply,
138
+ handlePresetClick,
139
+ handleTryAgain,
140
+ handleFreshStart,
141
+ handleApplyResult,
142
+ showTryAgainButton,
143
+ showAnswer,
144
+ showError,
145
+ showAnswerActions,
146
+ };
147
+ };
148
+ exports.useGpt = useGpt;
@@ -0,0 +1,2 @@
1
+ import type { Options } from 'react-hotkeys-hook';
2
+ export declare function useGptHotKeys(key: string, callback: () => void, options?: Options, dependencies?: unknown[]): void;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useGptHotKeys = void 0;
4
+ const react_hotkeys_hook_1 = require("react-hotkeys-hook");
5
+ function useGptHotKeys(key, callback, options = {}, dependencies) {
6
+ (0, react_hotkeys_hook_1.useHotkeys)(key, callback, Object.assign({ preventDefault: true }, options), dependencies);
7
+ }
8
+ exports.useGptHotKeys = useGptHotKeys;
@@ -0,0 +1,13 @@
1
+ import type { RefObject } from 'react';
2
+ export declare type UseOverflowingContainerListItemsProps<ItemType extends unknown> = {
3
+ containerRef: RefObject<HTMLElement>;
4
+ items?: ItemType[];
5
+ itemSelector: string;
6
+ moreButtonSelector: string;
7
+ marginBetweenItems?: number;
8
+ };
9
+ export declare function useOverflowingHorizontalItems<ItemType>({ containerRef, items, itemSelector, moreButtonSelector, marginBetweenItems, }: UseOverflowingContainerListItemsProps<ItemType>): {
10
+ visibleItems: ItemType[];
11
+ hiddenItems: ItemType[];
12
+ measured: boolean;
13
+ };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOverflowingHorizontalItems = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = require("react");
6
+ const debounce_1 = tslib_1.__importDefault(require("lodash/debounce"));
7
+ function useOverflowingHorizontalItems({ containerRef, items, itemSelector, moreButtonSelector, marginBetweenItems = 0, }) {
8
+ const [containerWidth, setContainerWidth] = (0, react_1.useState)(0);
9
+ const [itemWidths, setItemWidths] = (0, react_1.useState)([]);
10
+ const [moreButtonWidth, setMoreButtonWidth] = (0, react_1.useState)(0);
11
+ (0, react_1.useLayoutEffect)(() => {
12
+ const measureItemSizes = () => {
13
+ var _a, _b, _c;
14
+ const itemElements = Array.from((_b = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll(itemSelector)) !== null && _b !== void 0 ? _b : []);
15
+ const moreButton = (_c = containerRef.current) === null || _c === void 0 ? void 0 : _c.querySelector(moreButtonSelector);
16
+ setItemWidths(itemElements.map((item) => item.clientWidth));
17
+ if (moreButton) {
18
+ setMoreButtonWidth(moreButton.clientWidth);
19
+ }
20
+ };
21
+ requestAnimationFrame(measureItemSizes);
22
+ }, [containerRef, itemSelector, moreButtonSelector]);
23
+ (0, react_1.useLayoutEffect)(() => {
24
+ const container = containerRef.current;
25
+ if (!container) {
26
+ return;
27
+ }
28
+ const updateContainerSize = (entries) => {
29
+ if (entries.length > 0) {
30
+ setContainerWidth(entries[0].contentRect.width);
31
+ }
32
+ };
33
+ const updateContainerSizeDebounced = (0, debounce_1.default)(updateContainerSize, 100);
34
+ const containerResizeObserver = new ResizeObserver(updateContainerSizeDebounced);
35
+ containerResizeObserver.observe(container);
36
+ return () => containerResizeObserver.unobserve(container);
37
+ }, [containerRef]);
38
+ const isMeasured = itemWidths.length > 0;
39
+ const { visibleItems, hiddenItems } = (0, react_1.useMemo)(() => {
40
+ var _a, _b;
41
+ if (!isMeasured) {
42
+ return {
43
+ visibleItems: items !== null && items !== void 0 ? items : [],
44
+ hiddenItems: [],
45
+ };
46
+ }
47
+ const itemsCount = itemWidths.length;
48
+ let visibleItemsCount = 0;
49
+ const spaceForMoreButton = moreButtonWidth + marginBetweenItems;
50
+ let remainingContainerWidth = containerWidth;
51
+ for (const width of itemWidths) {
52
+ const itemWidthWithMargin = width + marginBetweenItems;
53
+ remainingContainerWidth -= itemWidthWithMargin;
54
+ if (remainingContainerWidth < spaceForMoreButton) {
55
+ const isMoreThanOneItemLeft = itemsCount !== visibleItemsCount + 1;
56
+ const hasNoSpaceForTheLastItem = remainingContainerWidth < 0;
57
+ if (isMoreThanOneItemLeft || hasNoSpaceForTheLastItem) {
58
+ break;
59
+ }
60
+ }
61
+ visibleItemsCount++;
62
+ }
63
+ return {
64
+ visibleItems: (_a = items === null || items === void 0 ? void 0 : items.slice(0, visibleItemsCount)) !== null && _a !== void 0 ? _a : [],
65
+ hiddenItems: (_b = items === null || items === void 0 ? void 0 : items.slice(visibleItemsCount)) !== null && _b !== void 0 ? _b : [],
66
+ };
67
+ }, [containerWidth, isMeasured, itemWidths, items, marginBetweenItems, moreButtonWidth]);
68
+ return { visibleItems, hiddenItems, measured: isMeasured };
69
+ }
70
+ exports.useOverflowingHorizontalItems = useOverflowingHorizontalItems;
@@ -0,0 +1,14 @@
1
+ import type { DropdownMenuItem } from '@gravity-ui/uikit';
2
+ import type { GptDialogProps } from '../GptDialog/GptDialog';
3
+ import type { PresetListProps } from '../PresetList/PresetList';
4
+ declare type UsePresetListProps = Pick<GptDialogProps, 'promptPresets'> & {
5
+ onPresetClick: PresetListProps['onPresetClick'];
6
+ };
7
+ export declare const usePresetList: ({ promptPresets, onPresetClick }: UsePresetListProps) => {
8
+ measured: boolean;
9
+ showMoreButton: boolean;
10
+ presetsContainerRef: import("react").RefObject<HTMLDivElement>;
11
+ visiblePresets: import("../ErrorScreen/types").PromptPreset<unknown>[];
12
+ hiddenPresets: DropdownMenuItem<unknown>[];
13
+ };
14
+ export {};