@copilotkit/react-textarea 0.24.0 → 0.26.0-alpha.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 (277) hide show
  1. package/.turbo/turbo-build.log +313 -309
  2. package/CHANGELOG.md +22 -0
  3. package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +29 -0
  4. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +1745 -35
  5. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
  6. package/dist/components/base-copilot-textarea/render-element.mjs +51 -3
  7. package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
  8. package/dist/components/base-copilot-textarea/render-placeholder.mjs +49 -3
  9. package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
  10. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +86 -4
  11. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
  12. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +57 -3
  13. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
  14. package/dist/components/copilot-textarea/copilot-textarea.d.ts +3 -0
  15. package/dist/components/copilot-textarea/copilot-textarea.mjs +2202 -47
  16. package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
  17. package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +7 -3
  18. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +17 -3
  19. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
  20. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +137 -3
  21. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
  22. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +875 -18
  23. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
  24. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +558 -12
  25. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
  26. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +581 -13
  27. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
  28. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +102 -5
  29. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -1
  30. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +581 -14
  31. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
  32. package/dist/components/index.mjs +2203 -48
  33. package/dist/components/index.mjs.map +1 -1
  34. package/dist/components/manual-ui/chip-with-icon.mjs +11 -27
  35. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
  36. package/dist/components/source-search-box/source-search-box.mjs +211 -6
  37. package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
  38. package/dist/components/ui/button.mjs +85 -4
  39. package/dist/components/ui/button.mjs.map +1 -1
  40. package/dist/components/ui/card.mjs +96 -52
  41. package/dist/components/ui/card.mjs.map +1 -1
  42. package/dist/components/ui/command.mjs +244 -5
  43. package/dist/components/ui/command.mjs.map +1 -1
  44. package/dist/components/ui/dialog.mjs +144 -4
  45. package/dist/components/ui/dialog.mjs.map +1 -1
  46. package/dist/components/ui/label.mjs +60 -4
  47. package/dist/components/ui/label.mjs.map +1 -1
  48. package/dist/components/ui/separator.mjs +58 -15
  49. package/dist/components/ui/separator.mjs.map +1 -1
  50. package/dist/components/ui/textarea.mjs +58 -14
  51. package/dist/components/ui/textarea.mjs.map +1 -1
  52. package/dist/context/index.d.ts +1 -0
  53. package/dist/context/index.mjs +0 -2
  54. package/dist/context/index.mjs.map +1 -1
  55. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.d.ts +1 -1
  56. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +158 -6
  57. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
  58. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +168 -4
  59. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
  60. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +148 -5
  61. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
  62. package/dist/hooks/index.d.ts +1 -0
  63. package/dist/hooks/index.mjs +0 -2
  64. package/dist/hooks/index.mjs.map +1 -1
  65. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +147 -14
  66. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
  67. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +193 -14
  68. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
  69. package/dist/hooks/misc/use-autosize-textarea.mjs +15 -3
  70. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
  71. package/dist/index.mjs +2206 -50
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/lib/debouncer.mjs +51 -3
  74. package/dist/lib/debouncer.mjs.map +1 -1
  75. package/dist/lib/editor-to-text.mjs +43 -3
  76. package/dist/lib/editor-to-text.mjs.map +1 -1
  77. package/dist/lib/get-text-around-cursor.mjs +102 -3
  78. package/dist/lib/get-text-around-cursor.mjs.map +1 -1
  79. package/dist/lib/retry.mjs +17 -3
  80. package/dist/lib/retry.mjs.map +1 -1
  81. package/dist/lib/slatejs-edits/add-autocompletions.mjs +25 -3
  82. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
  83. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +20 -3
  84. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
  85. package/dist/lib/slatejs-edits/replace-text.mjs +27 -3
  86. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
  87. package/dist/lib/slatejs-edits/with-partial-history.mjs +106 -3
  88. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
  89. package/dist/lib/stream-promise-flatten.mjs +47 -3
  90. package/dist/lib/stream-promise-flatten.mjs.map +1 -1
  91. package/dist/lib/utils.mjs +71 -3
  92. package/dist/lib/utils.mjs.map +1 -1
  93. package/dist/lib/utils.test.d.ts +1 -0
  94. package/dist/lib/utils.test.mjs +0 -1
  95. package/dist/lib/utils.test.mjs.map +1 -1
  96. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +0 -2
  97. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
  98. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +265 -8
  99. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
  100. package/dist/types/autosuggestions-config/editing-api-config.mjs +81 -3
  101. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
  102. package/dist/types/autosuggestions-config/index.mjs +327 -10
  103. package/dist/types/autosuggestions-config/index.mjs.map +1 -1
  104. package/dist/types/autosuggestions-config/insertions-api-config.mjs +75 -3
  105. package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
  106. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +83 -3
  107. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -1
  108. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +0 -2
  109. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
  110. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +0 -2
  111. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
  112. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +64 -3
  113. package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
  114. package/dist/types/base/autosuggestion-state.mjs +0 -2
  115. package/dist/types/base/autosuggestion-state.mjs.map +1 -1
  116. package/dist/types/base/autosuggestions-bare-function.mjs +0 -2
  117. package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
  118. package/dist/types/base/base-autosuggestions-config.d.ts +55 -2
  119. package/dist/types/base/base-autosuggestions-config.mjs +26 -3
  120. package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
  121. package/dist/types/base/base-copilot-textarea-props.mjs +0 -2
  122. package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
  123. package/dist/types/base/custom-editor.mjs +0 -2
  124. package/dist/types/base/custom-editor.mjs.map +1 -1
  125. package/dist/types/base/editor-autocomplete-state.mjs +17 -4
  126. package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
  127. package/dist/types/base/index.mjs +26 -4
  128. package/dist/types/base/index.mjs.map +1 -1
  129. package/dist/types/html-copilot-textarea-element.mjs +0 -2
  130. package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
  131. package/dist/types/index.mjs +328 -12
  132. package/dist/types/index.mjs.map +1 -1
  133. package/package.json +7 -7
  134. package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +79 -45
  135. package/src/components/base-copilot-textarea/render-element.tsx +3 -5
  136. package/src/components/base-copilot-textarea/render-placeholder.tsx +2 -4
  137. package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +22 -3
  138. package/src/components/base-copilot-textarea/use-add-branding-css.tsx +2 -4
  139. package/src/components/copilot-textarea/copilot-textarea.tsx +14 -18
  140. package/src/components/hovering-toolbar/hovering-editor-provider.tsx +7 -5
  141. package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +14 -31
  142. package/src/components/hovering-toolbar/hovering-toolbar.tsx +4 -16
  143. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +11 -25
  144. package/src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx +2 -7
  145. package/src/components/manual-ui/chip-with-icon.tsx +3 -12
  146. package/src/components/source-search-box/source-search-box.tsx +2 -12
  147. package/src/components/ui/button.tsx +6 -13
  148. package/src/components/ui/card.tsx +35 -65
  149. package/src/components/ui/command.tsx +8 -21
  150. package/src/components/ui/dialog.tsx +8 -29
  151. package/src/components/ui/label.tsx +3 -8
  152. package/src/components/ui/separator.tsx +13 -18
  153. package/src/components/ui/textarea.tsx +3 -4
  154. package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +13 -27
  155. package/src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx +1 -5
  156. package/src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts +4 -11
  157. package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +5 -10
  158. package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +15 -35
  159. package/src/hooks/misc/use-autosize-textarea.tsx +1 -4
  160. package/src/lib/debouncer.ts +1 -3
  161. package/src/lib/editor-to-text.ts +4 -7
  162. package/src/lib/get-text-around-cursor.ts +2 -14
  163. package/src/lib/retry.tsx +1 -1
  164. package/src/lib/slatejs-edits/add-autocompletions.ts +2 -2
  165. package/src/lib/slatejs-edits/clear-autocompletions.ts +1 -4
  166. package/src/lib/slatejs-edits/replace-text.ts +1 -1
  167. package/src/lib/slatejs-edits/with-partial-history.ts +4 -11
  168. package/src/lib/stream-promise-flatten.ts +1 -3
  169. package/src/lib/utils.ts +4 -8
  170. package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +3 -7
  171. package/src/types/autosuggestions-config/autosuggestions-config.tsx +5 -18
  172. package/src/types/autosuggestions-config/editing-api-config.tsx +3 -5
  173. package/src/types/autosuggestions-config/insertions-api-config.tsx +2 -3
  174. package/src/types/autosuggestions-config/subtypes/chatlike-api-endpoint.tsx +18 -26
  175. package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +1 -4
  176. package/src/types/autosuggestions-config/suggestions-api-config.tsx +2 -3
  177. package/src/types/base/autosuggestions-bare-function.ts +2 -2
  178. package/src/types/base/base-autosuggestions-config.tsx +80 -3
  179. package/src/types/base/editor-autocomplete-state.ts +1 -1
  180. package/dist/chunk-2NURR2DX.mjs +0 -47
  181. package/dist/chunk-2NURR2DX.mjs.map +0 -1
  182. package/dist/chunk-3L6CNVCE.mjs +0 -108
  183. package/dist/chunk-3L6CNVCE.mjs.map +0 -1
  184. package/dist/chunk-463BFNUP.mjs +0 -77
  185. package/dist/chunk-463BFNUP.mjs.map +0 -1
  186. package/dist/chunk-4HHYJGZE.mjs +0 -117
  187. package/dist/chunk-4HHYJGZE.mjs.map +0 -1
  188. package/dist/chunk-4LOLCQGR.mjs +0 -50
  189. package/dist/chunk-4LOLCQGR.mjs.map +0 -1
  190. package/dist/chunk-4S5ZJH3I.mjs +0 -18
  191. package/dist/chunk-4S5ZJH3I.mjs.map +0 -1
  192. package/dist/chunk-4UYKBG35.mjs +0 -57
  193. package/dist/chunk-4UYKBG35.mjs.map +0 -1
  194. package/dist/chunk-5EJ5XOGP.mjs +0 -22
  195. package/dist/chunk-5EJ5XOGP.mjs.map +0 -1
  196. package/dist/chunk-5FO6ISW4.mjs +0 -3
  197. package/dist/chunk-5FO6ISW4.mjs.map +0 -1
  198. package/dist/chunk-6Z2ATUNY.mjs +0 -15
  199. package/dist/chunk-6Z2ATUNY.mjs.map +0 -1
  200. package/dist/chunk-AQHORK66.mjs +0 -49
  201. package/dist/chunk-AQHORK66.mjs.map +0 -1
  202. package/dist/chunk-AXN37AHC.mjs +0 -80
  203. package/dist/chunk-AXN37AHC.mjs.map +0 -1
  204. package/dist/chunk-CSGFJU3L.mjs +0 -65
  205. package/dist/chunk-CSGFJU3L.mjs.map +0 -1
  206. package/dist/chunk-DE5K76I2.mjs +0 -3
  207. package/dist/chunk-DE5K76I2.mjs.map +0 -1
  208. package/dist/chunk-F3MHL6ZY.mjs +0 -25
  209. package/dist/chunk-F3MHL6ZY.mjs.map +0 -1
  210. package/dist/chunk-GCMQHIRF.mjs +0 -29
  211. package/dist/chunk-GCMQHIRF.mjs.map +0 -1
  212. package/dist/chunk-GIJ3JZ4P.mjs +0 -224
  213. package/dist/chunk-GIJ3JZ4P.mjs.map +0 -1
  214. package/dist/chunk-GUH3Y2H4.mjs +0 -19
  215. package/dist/chunk-GUH3Y2H4.mjs.map +0 -1
  216. package/dist/chunk-H4VKQGVU.mjs +0 -3
  217. package/dist/chunk-H4VKQGVU.mjs.map +0 -1
  218. package/dist/chunk-IU3WTXLQ.mjs +0 -3
  219. package/dist/chunk-IU3WTXLQ.mjs.map +0 -1
  220. package/dist/chunk-IXJ2HCOA.mjs +0 -101
  221. package/dist/chunk-IXJ2HCOA.mjs.map +0 -1
  222. package/dist/chunk-JAFCXEPU.mjs +0 -10
  223. package/dist/chunk-JAFCXEPU.mjs.map +0 -1
  224. package/dist/chunk-JHTAOLEW.mjs +0 -63
  225. package/dist/chunk-JHTAOLEW.mjs.map +0 -1
  226. package/dist/chunk-JYVC4AW3.mjs +0 -205
  227. package/dist/chunk-JYVC4AW3.mjs.map +0 -1
  228. package/dist/chunk-KCHYD3EB.mjs +0 -107
  229. package/dist/chunk-KCHYD3EB.mjs.map +0 -1
  230. package/dist/chunk-KGKLUWKW.mjs +0 -47
  231. package/dist/chunk-KGKLUWKW.mjs.map +0 -1
  232. package/dist/chunk-L7VVZH4Q.mjs +0 -3
  233. package/dist/chunk-L7VVZH4Q.mjs.map +0 -1
  234. package/dist/chunk-LNAIMEB2.mjs +0 -34
  235. package/dist/chunk-LNAIMEB2.mjs.map +0 -1
  236. package/dist/chunk-MMVDU6DF.mjs +0 -3
  237. package/dist/chunk-MMVDU6DF.mjs.map +0 -1
  238. package/dist/chunk-MPME5BW2.mjs +0 -59
  239. package/dist/chunk-MPME5BW2.mjs.map +0 -1
  240. package/dist/chunk-MRXNTQOX.mjs +0 -55
  241. package/dist/chunk-MRXNTQOX.mjs.map +0 -1
  242. package/dist/chunk-ND5PXTAW.mjs +0 -17
  243. package/dist/chunk-ND5PXTAW.mjs.map +0 -1
  244. package/dist/chunk-NKW5OU2S.mjs +0 -33
  245. package/dist/chunk-NKW5OU2S.mjs.map +0 -1
  246. package/dist/chunk-O4MHJSK2.mjs +0 -21
  247. package/dist/chunk-O4MHJSK2.mjs.map +0 -1
  248. package/dist/chunk-O5OWT5GE.mjs +0 -114
  249. package/dist/chunk-O5OWT5GE.mjs.map +0 -1
  250. package/dist/chunk-OD7ZMOVE.mjs +0 -45
  251. package/dist/chunk-OD7ZMOVE.mjs.map +0 -1
  252. package/dist/chunk-OELUUJZY.mjs +0 -16
  253. package/dist/chunk-OELUUJZY.mjs.map +0 -1
  254. package/dist/chunk-QJDMIGLU.mjs +0 -38
  255. package/dist/chunk-QJDMIGLU.mjs.map +0 -1
  256. package/dist/chunk-RQHOUUXQ.mjs +0 -29
  257. package/dist/chunk-RQHOUUXQ.mjs.map +0 -1
  258. package/dist/chunk-RR6OQGTI.mjs +0 -74
  259. package/dist/chunk-RR6OQGTI.mjs.map +0 -1
  260. package/dist/chunk-UHD44NC5.mjs +0 -101
  261. package/dist/chunk-UHD44NC5.mjs.map +0 -1
  262. package/dist/chunk-WADHCMPK.mjs +0 -3
  263. package/dist/chunk-WADHCMPK.mjs.map +0 -1
  264. package/dist/chunk-WJHSY5T6.mjs +0 -3
  265. package/dist/chunk-WJHSY5T6.mjs.map +0 -1
  266. package/dist/chunk-WJYQWL4I.mjs +0 -27
  267. package/dist/chunk-WJYQWL4I.mjs.map +0 -1
  268. package/dist/chunk-WLPYYGES.mjs +0 -109
  269. package/dist/chunk-WLPYYGES.mjs.map +0 -1
  270. package/dist/chunk-XHUMROEY.mjs +0 -91
  271. package/dist/chunk-XHUMROEY.mjs.map +0 -1
  272. package/dist/chunk-YQU7WG7T.mjs +0 -83
  273. package/dist/chunk-YQU7WG7T.mjs.map +0 -1
  274. package/dist/chunk-YTOPHPSG.mjs +0 -45
  275. package/dist/chunk-YTOPHPSG.mjs.map +0 -1
  276. package/dist/chunk-YW3REYX6.mjs +0 -23
  277. package/dist/chunk-YW3REYX6.mjs.map +0 -1
@@ -13,10 +13,7 @@ export function clearAutocompletionsFromEditor(editor: CustomEditor) {
13
13
  try {
14
14
  Transforms.removeNodes(editor, { at: path });
15
15
  } catch (e) {
16
- console.log(
17
- "CopilotTextarea.clearAutocompletionsFromEditor: error removing node",
18
- e
19
- );
16
+ console.log("CopilotTextarea.clearAutocompletionsFromEditor: error removing node", e);
20
17
  }
21
18
  }
22
19
  }
@@ -22,7 +22,7 @@ export function replaceEditorText(editor: Editor, newText: string) {
22
22
  ],
23
23
  {
24
24
  at: [0],
25
- }
25
+ },
26
26
  );
27
27
  }
28
28
  }
@@ -3,14 +3,11 @@ import { HistoryEditor } from "slate-history";
3
3
 
4
4
  // Copy-pasted from `https://github.com/ianstormtaylor/slate/blob/main/packages/slate-history/src/with-history.ts`
5
5
  // With one exception: the `shouldSave` function is passed in as an argument to `withPartialHistory` instead of being hardcoded
6
- export type ShouldSaveToHistory = (
7
- op: Operation,
8
- prev: Operation | undefined
9
- ) => boolean;
6
+ export type ShouldSaveToHistory = (op: Operation, prev: Operation | undefined) => boolean;
10
7
 
11
8
  export const withPartialHistory = <T extends Editor>(
12
9
  editor: T,
13
- shouldSave: ShouldSaveToHistory
10
+ shouldSave: ShouldSaveToHistory,
14
11
  ) => {
15
12
  const e = editor as T & HistoryEditor;
16
13
  const { apply } = e;
@@ -69,8 +66,7 @@ export const withPartialHistory = <T extends Editor>(
69
66
  const { operations, history } = e;
70
67
  const { undos } = history;
71
68
  const lastBatch = undos[undos.length - 1];
72
- const lastOp =
73
- lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
69
+ const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
74
70
  let save = HistoryEditor.isSaving(e);
75
71
  let merge = HistoryEditor.isMerging(e);
76
72
 
@@ -144,10 +140,7 @@ const shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {
144
140
  return false;
145
141
  };
146
142
 
147
- export const defaultShouldSave = (
148
- op: Operation,
149
- prev: Operation | undefined
150
- ): boolean => {
143
+ export const defaultShouldSave = (op: Operation, prev: Operation | undefined): boolean => {
151
144
  if (op.type === "set_selection") {
152
145
  return false;
153
146
  }
@@ -8,9 +8,7 @@
8
8
  * @returns {ReadableStream<A>} - The flattened stream.
9
9
  */
10
10
 
11
- export function streamPromiseFlatten<A>(
12
- promise: Promise<ReadableStream<A>>
13
- ): ReadableStream<A> {
11
+ export function streamPromiseFlatten<A>(promise: Promise<ReadableStream<A>>): ReadableStream<A> {
14
12
  return new ReadableStream<A>({
15
13
  async start(controller) {
16
14
  try {
package/src/lib/utils.ts CHANGED
@@ -8,13 +8,10 @@ export function cn(...inputs: ClassValue[]) {
8
8
 
9
9
  export const nanoid = customAlphabet(
10
10
  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
11
- 7
11
+ 7,
12
12
  ); // 7-character random string
13
13
 
14
- export async function fetcher<JSON = any>(
15
- input: RequestInfo,
16
- init?: RequestInit
17
- ): Promise<JSON> {
14
+ export async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {
18
15
  const res = await fetch(input, init);
19
16
 
20
17
  if (!res.ok) {
@@ -43,13 +40,12 @@ export function formatDate(input: string | number | Date): string {
43
40
  }
44
41
 
45
42
  export const arraysAreEqual = (arr1: number[], arr2: number[]): boolean =>
46
- arr1.length === arr2.length &&
47
- arr1.every((value, index) => value === arr2[index]);
43
+ arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
48
44
 
49
45
  export function nullableCompatibleEqualityCheck<T>(
50
46
  naiveEqualityCheck: (a: T, b: T) => boolean,
51
47
  a: T | null | undefined,
52
- b: T | null | undefined
48
+ b: T | null | undefined,
53
49
  ): boolean {
54
50
  if (a === null || a === undefined || b === null || b === undefined) {
55
51
  return a === b;
@@ -3,18 +3,14 @@ import { InsertionsApiConfig } from "./insertions-api-config";
3
3
  import { SuggestionsApiConfig } from "./suggestions-api-config";
4
4
 
5
5
  // Mostly mirrors a partial SuggestionsApiConfig, but with some fields MANDATORY.
6
- export interface SuggestionsApiConfigUserSpecified
7
- extends Partial<SuggestionsApiConfig> {}
6
+ export interface SuggestionsApiConfigUserSpecified extends Partial<SuggestionsApiConfig> {}
8
7
 
9
8
  // Mostly mirrors a partial InsertionsApiConfig, but with some fields MANDATORY.
10
- export interface InsertionsApiConfigUserSpecified
11
- extends Partial<InsertionsApiConfig> {}
9
+ export interface InsertionsApiConfigUserSpecified extends Partial<InsertionsApiConfig> {}
12
10
 
13
11
  // Mostly mirrors a partial AutosuggestionsConfig, but with some fields MANDATORY.
14
12
  export interface AutosuggestionsConfigUserSpecified
15
- extends Partial<
16
- Omit<AutosuggestionsConfig, "chatApiConfigs" | "textareaPurpose">
17
- > {
13
+ extends Partial<Omit<AutosuggestionsConfig, "chatApiConfigs" | "textareaPurpose">> {
18
14
  textareaPurpose: string; // the user MUST specify textareaPurpose - it's not optional
19
15
  chatApiConfigs: {
20
16
  suggestionsApiConfig?: SuggestionsApiConfigUserSpecified;
@@ -1,27 +1,14 @@
1
- import {
2
- BaseAutosuggestionsConfig,
3
- defaultBaseAutosuggestionsConfig,
4
- } from "../base";
5
- import {
6
- SuggestionsApiConfig,
7
- defaultSuggestionsApiConfig,
8
- } from "./suggestions-api-config";
9
- import {
10
- InsertionsApiConfig,
11
- defaultInsertionsApiConfig,
12
- } from "./insertions-api-config";
1
+ import { BaseAutosuggestionsConfig, defaultBaseAutosuggestionsConfig } from "../base";
2
+ import { SuggestionsApiConfig, defaultSuggestionsApiConfig } from "./suggestions-api-config";
3
+ import { InsertionsApiConfig, defaultInsertionsApiConfig } from "./insertions-api-config";
13
4
  import { ChatlikeApiEndpoint } from ".";
14
- import {
15
- EditingApiConfig,
16
- defaultEditingApiConfig,
17
- } from "./editing-api-config";
5
+ import { EditingApiConfig, defaultEditingApiConfig } from "./editing-api-config";
18
6
  import { defaultCopilotContextCategories } from "@copilotkit/react-core";
19
7
 
20
8
  // Like the base autosuggestions config, with 2 additional fields:
21
9
  // 1. contextCategories: string[] | undefined;
22
10
  // 2. instead of apiConfigs, we have chatApiConfigs: a higher-level abstraction that uses a ChatGPT-like API endpoint.
23
- export interface AutosuggestionsConfig
24
- extends Omit<BaseAutosuggestionsConfig, "apiConfig"> {
11
+ export interface AutosuggestionsConfig extends Omit<BaseAutosuggestionsConfig, "apiConfig"> {
25
12
  contextCategories: string[];
26
13
  chatApiConfigs: {
27
14
  suggestionsApiConfig: SuggestionsApiConfig;
@@ -9,7 +9,7 @@ export interface EditingApiConfig {
9
9
 
10
10
  export const defaultEditingMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -45,14 +45,12 @@ export const defaultEditingFewShotMessages: MinimalChatGPTMessage[] = [
45
45
  {
46
46
  role: "user",
47
47
  name: "TextToEdit",
48
- content:
49
- "While I was there I also picked up some apples, oranges, and bananas. ",
48
+ content: "While I was there I also picked up some apples, oranges, and bananas. ",
50
49
  },
51
50
  {
52
51
  role: "user",
53
52
  name: "TextAfterCursor",
54
- content:
55
- "The grocery store was having a sale on fruit, so I decided to stock up.",
53
+ content: "The grocery store was having a sale on fruit, so I decided to stock up.",
56
54
  },
57
55
  {
58
56
  role: "user",
@@ -9,7 +9,7 @@ export interface InsertionsApiConfig {
9
9
 
10
10
  export const defaultInsertionsMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -39,8 +39,7 @@ export const defaultInsertionsFewShotMessages: MinimalChatGPTMessage[] = [
39
39
  {
40
40
  role: "user",
41
41
  name: "TextAfterCursor",
42
- content:
43
- "While I was there I also picked up some apples, oranges, and bananas.",
42
+ content: "While I was there I also picked up some apples, oranges, and bananas.",
44
43
  },
45
44
  {
46
45
  role: "user",
@@ -1,19 +1,16 @@
1
- import {
2
- CopilotApiConfig,
3
- copilotApiConfigExtrapolator,
4
- } from "@copilotkit/react-core";
1
+ import { CopilotApiConfig, copilotApiConfigExtrapolator } from "@copilotkit/react-core";
5
2
  import { MinimalChatGPTMessage } from "./minimal-chat-gpt-message";
6
3
 
7
4
  export type ChatlikeApiEndpointImpl = (
8
5
  abortSignal: AbortSignal,
9
6
  messages: MinimalChatGPTMessage[],
10
- forwardedProps?: { [key: string]: any }
7
+ forwardedProps?: { [key: string]: any },
11
8
  ) => Promise<string>;
12
9
 
13
10
  export type StreamingChatlikeApiEndpointImpl = (
14
11
  abortSignal: AbortSignal,
15
12
  messages: MinimalChatGPTMessage[],
16
- forwardedProps?: { [key: string]: any }
13
+ forwardedProps?: { [key: string]: any },
17
14
  ) => Promise<ReadableStream<string>>;
18
15
 
19
16
  export class ChatlikeApiEndpoint {
@@ -28,30 +25,25 @@ export class ChatlikeApiEndpoint {
28
25
  * @param apiEndpoint The URL of the OpenAI-compatible API endpoint.
29
26
  * @returns A new instance of ChatlikeApiEndpoint.
30
27
  */
31
- static fromCopilotApiConfig(
32
- copilotApiConfig: CopilotApiConfig
33
- ): ChatlikeApiEndpoint {
28
+ static fromCopilotApiConfig(copilotApiConfig: CopilotApiConfig): ChatlikeApiEndpoint {
34
29
  return new ChatlikeApiEndpoint(
35
30
  async (
36
31
  abortSignal: AbortSignal,
37
32
  messages: MinimalChatGPTMessage[],
38
- forwardedProps?: { [key: string]: any }
33
+ forwardedProps?: { [key: string]: any },
39
34
  ) => {
40
- const res = await fetch(
41
- copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint,
42
- {
43
- method: "POST",
44
- headers: {
45
- ...copilotApiConfig.headers,
46
- },
47
- body: JSON.stringify({
48
- ...forwardedProps,
49
- ...copilotApiConfig.body,
50
- messages: messages,
51
- }),
52
- signal: abortSignal,
53
- }
54
- );
35
+ const res = await fetch(copilotApiConfigExtrapolator(copilotApiConfig).chatApiEndpoint, {
36
+ method: "POST",
37
+ headers: {
38
+ ...copilotApiConfig.headers,
39
+ },
40
+ body: JSON.stringify({
41
+ ...forwardedProps,
42
+ ...copilotApiConfig.body,
43
+ messages: messages,
44
+ }),
45
+ signal: abortSignal,
46
+ });
55
47
 
56
48
  const bodySteram: ReadableStream<Uint8Array> | null = res.body;
57
49
  if (!bodySteram) {
@@ -62,7 +54,7 @@ export class ChatlikeApiEndpoint {
62
54
  const stringStream = bodySteram.pipeThrough(new TextDecoderStream());
63
55
 
64
56
  return stringStream;
65
- }
57
+ },
66
58
  );
67
59
  }
68
60
 
@@ -1,4 +1 @@
1
- export type MakeSystemPrompt = (
2
- textareaPurpose: string,
3
- contextString: string
4
- ) => string;
1
+ export type MakeSystemPrompt = (textareaPurpose: string, contextString: string) => string;
@@ -9,7 +9,7 @@ export interface SuggestionsApiConfig {
9
9
 
10
10
  export const defaultSuggestionsMakeSystemPrompt: MakeSystemPrompt = (
11
11
  textareaPurpose,
12
- contextString
12
+ contextString,
13
13
  ) => {
14
14
  return `You are a versatile writing assistant.
15
15
 
@@ -39,8 +39,7 @@ export const defaultSuggestionsFewShotMessages: MinimalChatGPTMessage[] = [
39
39
  {
40
40
  role: "user",
41
41
  name: "TextAfterCursor",
42
- content:
43
- "While I was there I also picked up some apples, oranges, and bananas.",
42
+ content: "While I was there I also picked up some apples, oranges, and bananas.",
44
43
  },
45
44
  {
46
45
  role: "user",
@@ -11,14 +11,14 @@ export interface EditingEditorState extends InsertionEditorState {
11
11
 
12
12
  export type AutosuggestionsBareFunction = (
13
13
  editorState: InsertionEditorState,
14
- abortSignal: AbortSignal
14
+ abortSignal: AbortSignal,
15
15
  ) => Promise<string>;
16
16
 
17
17
  export type Generator_InsertionOrEditingSuggestion = (
18
18
  editorState: EditingEditorState,
19
19
  prompt: string,
20
20
  documents: DocumentPointer[],
21
- abortSignal: AbortSignal
21
+ abortSignal: AbortSignal,
22
22
  ) => Promise<ReadableStream<string>>;
23
23
 
24
24
  export interface InsertionEditorApiConfig {
@@ -1,25 +1,102 @@
1
1
  import { BaseCopilotTextareaApiConfig } from "./autosuggestions-bare-function";
2
2
  import { defaultCopilotContextCategories } from "@copilotkit/react-core";
3
3
 
4
+ /**
5
+ * @interface BaseAutosuggestionsConfig
6
+ *
7
+ * @property {string} textareaPurpose - The purpose of the textarea. This is used to guide the autosuggestions.
8
+ *
9
+ * @property {string[]} contextCategories - The categories of context to consider when providing autosuggestions.
10
+ *
11
+ * @property {number} debounceTime - The amount of time (in milliseconds) to wait before triggering autosuggestions after the user has stopped typing.
12
+ *
13
+ * @property {BaseCopilotTextareaApiConfig} apiConfig - The configuration for the API that provides the autosuggestions.
14
+ *
15
+ * @property {boolean} disableWhenEmpty - Whether to disable autosuggestions when the textarea is empty.
16
+ *
17
+ * @property {boolean} disabled - Whether to disable autosuggestions entirely.
18
+ *
19
+ * @property {boolean} temporarilyDisableWhenMovingCursorWithoutChangingText - Whether to temporarily disable autosuggestions when the user moves the cursor without changing the text.
20
+ *
21
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldAcceptAutosuggestionOnKeyPress - A function that determines whether to accept the current autosuggestion based on a key press event. By default, the Tab key is used to accept the autosuggestion. Example code:
22
+ *
23
+ * ```typescript
24
+ * const defaultShouldAcceptAutosuggestionOnKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {
25
+ * // if tab, accept the autosuggestion
26
+ * if (event.key === "Tab") {
27
+ * return true;
28
+ * }
29
+ * return false;
30
+ * }
31
+ * ```
32
+ *
33
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldToggleHoveringEditorOnKeyPress - A function that determines whether to toggle the hovering editor based on a key press event. By default, the Command + K key combination is used to toggle the hovering editor. Example code:
34
+ *
35
+ * ```typescript
36
+ * const defaultShouldToggleHoveringEditorOnKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {
37
+ * // if command-k, toggle the hovering editor
38
+ * if (event.key === "k" && event.metaKey) {
39
+ * return true;
40
+ * }
41
+ * return false;
42
+ * }
43
+ * ```
44
+ */
4
45
  export interface BaseAutosuggestionsConfig {
5
46
  textareaPurpose: string;
6
47
  contextCategories: string[];
7
48
  debounceTime: number;
8
- acceptAutosuggestionKey: string;
49
+ apiConfig: BaseCopilotTextareaApiConfig;
50
+
9
51
  disableWhenEmpty: boolean;
10
52
  disabled: boolean;
11
53
  temporarilyDisableWhenMovingCursorWithoutChangingText: boolean;
12
- apiConfig: BaseCopilotTextareaApiConfig;
54
+ shouldAcceptAutosuggestionOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean;
55
+ shouldToggleHoveringEditorOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean;
13
56
  }
14
57
 
58
+ // by default, command-k toggles the hovering editor
59
+ const defaultShouldToggleHoveringEditorOnKeyPress = (
60
+ event: React.KeyboardEvent<HTMLDivElement>,
61
+ ) => {
62
+ // if command-k, toggle the hovering editor
63
+ if (event.key === "k" && event.metaKey) {
64
+ return true;
65
+ }
66
+ return false;
67
+ };
68
+
69
+ const defaultShouldAcceptAutosuggestionOnKeyPress = (
70
+ event: React.KeyboardEvent<HTMLDivElement>,
71
+ ) => {
72
+ // if tab, accept the autosuggestion
73
+ if (event.key === "Tab") {
74
+ return true;
75
+ }
76
+ return false;
77
+ };
78
+
79
+ /**
80
+ * Default configuration for the BaseAutosuggestions.
81
+ *
82
+ * @property {number} debounceTime - The amount of time to wait before triggering the autosuggestions API call.
83
+ * @property {string[]} contextCategories - The categories to use for context when making the autosuggestions API call.
84
+ * @property {boolean} disableWhenEmpty - Whether to disable the autosuggestions when the textarea is empty.
85
+ * @property {boolean} disabled - Whether to disable the autosuggestions feature entirely.
86
+ * @property {boolean} temporarilyDisableWhenMovingCursorWithoutChangingText - Whether to temporarily disable the autosuggestions when the cursor is moved without changing the text.
87
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldToggleHoveringEditorOnKeyPress - A function that determines whether to toggle the hovering editor based on a key press event.
88
+ * @property {(event: React.KeyboardEvent<HTMLDivElement>) => boolean} shouldAcceptAutosuggestionOnKeyPress - A function that determines whether to accept the autosuggestion based on a key press event.
89
+ */
90
+
15
91
  export const defaultBaseAutosuggestionsConfig: Omit<
16
92
  BaseAutosuggestionsConfig,
17
93
  "textareaPurpose" | "apiConfig"
18
94
  > = {
19
95
  debounceTime: 250,
20
96
  contextCategories: defaultCopilotContextCategories,
21
- acceptAutosuggestionKey: "Tab",
22
97
  disableWhenEmpty: true,
23
98
  disabled: false,
24
99
  temporarilyDisableWhenMovingCursorWithoutChangingText: true,
100
+ shouldToggleHoveringEditorOnKeyPress: defaultShouldToggleHoveringEditorOnKeyPress,
101
+ shouldAcceptAutosuggestionOnKeyPress: defaultShouldAcceptAutosuggestionOnKeyPress,
25
102
  };
@@ -9,7 +9,7 @@ export interface EditorAutocompleteState {
9
9
 
10
10
  export function areEqual_autocompleteState(
11
11
  prev: EditorAutocompleteState,
12
- next: EditorAutocompleteState
12
+ next: EditorAutocompleteState,
13
13
  ) {
14
14
  return (
15
15
  prev.cursorPoint.offset === next.cursorPoint.offset &&
@@ -1,47 +0,0 @@
1
- import { cn } from './chunk-KGKLUWKW.mjs';
2
- import { __objRest, __spreadValues } from './chunk-MRXNTQOX.mjs';
3
- import * as React from 'react';
4
- import { Slot } from '@radix-ui/react-slot';
5
- import { cva } from 'class-variance-authority';
6
- import { jsx } from 'react/jsx-runtime';
7
-
8
- var buttonVariants = cva(
9
- "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
10
- {
11
- variants: {
12
- variant: {
13
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
14
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
15
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
16
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
17
- ghost: "hover:bg-accent hover:text-accent-foreground",
18
- link: "text-primary underline-offset-4 hover:underline"
19
- },
20
- size: {
21
- default: "h-10 px-4 py-2",
22
- sm: "h-9 rounded-md px-3",
23
- lg: "h-11 rounded-md px-8",
24
- icon: "h-10 w-10"
25
- }
26
- },
27
- defaultVariants: {
28
- variant: "default",
29
- size: "default"
30
- }
31
- }
32
- );
33
- var Button = React.forwardRef(
34
- (_a, ref) => {
35
- var _b = _a, { className, variant, size, asChild = false } = _b, props = __objRest(_b, ["className", "variant", "size", "asChild"]);
36
- const Comp = asChild ? Slot : "button";
37
- return /* @__PURE__ */ jsx(Comp, __spreadValues({
38
- className: cn(buttonVariants({ variant, size, className })),
39
- ref
40
- }, props));
41
- }
42
- );
43
- Button.displayName = "Button";
44
-
45
- export { Button, buttonVariants };
46
- //# sourceMappingURL=out.js.map
47
- //# sourceMappingURL=chunk-2NURR2DX.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ui/button.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;AA2CjC;AAvCN,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,IAAyD,QAAQ;AAAjE,iBAAE,aAAW,SAAS,MAAM,UAAU,MA1CzC,IA0CG,IAAgD,kBAAhD,IAAgD,CAA9C,aAAW,WAAS,QAAM;AAC3B,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE,oBAAC;AAAA,MACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MAC1D;AAAA,OACI,MACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc","sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"]}
@@ -1,108 +0,0 @@
1
- import { HoveringInsertionPromptBox } from './chunk-O4MHJSK2.mjs';
2
- import { useHoveringEditorContext } from './chunk-YW3REYX6.mjs';
3
- import { Portal, Menu } from './chunk-XHUMROEY.mjs';
4
- import { getTextAroundSelection, getFullEditorTextWithNewlines } from './chunk-IXJ2HCOA.mjs';
5
- import { useRef, useState, useEffect } from 'react';
6
- import { Transforms } from 'slate';
7
- import { useSlate, useSlateSelection } from 'slate-react';
8
- import { jsx } from 'react/jsx-runtime';
9
-
10
- var HoveringToolbar = (props) => {
11
- const ref = useRef(null);
12
- const editor = useSlate();
13
- const selection = useSlateSelection();
14
- const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();
15
- const [isClient, setIsClient] = useState(false);
16
- useEffect(() => {
17
- setIsClient(true);
18
- }, []);
19
- useEffect(() => {
20
- const el = ref.current;
21
- const { selection: selection2 } = editor;
22
- if (!el) {
23
- return;
24
- }
25
- if (!selection2) {
26
- el.removeAttribute("style");
27
- return;
28
- }
29
- const domSelection = window.getSelection();
30
- if (!domSelection) {
31
- return;
32
- }
33
- const domRange = domSelection.getRangeAt(0);
34
- const rect = domRange.getBoundingClientRect();
35
- if (rect.top === 0 && rect.left === 0 && rect.width === 0 && rect.height === 0) {
36
- return;
37
- }
38
- const minGapFromEdge = 60;
39
- const verticalOffsetFromCorner = 35;
40
- const horizontalOffsetFromCorner = 15;
41
- let top = rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;
42
- if (top < minGapFromEdge) {
43
- top = rect.bottom + window.scrollY + minGapFromEdge;
44
- } else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {
45
- top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;
46
- }
47
- let left = rect.left + window.scrollX - el.offsetWidth / 2 + rect.width / 2 + horizontalOffsetFromCorner;
48
- if (left < minGapFromEdge) {
49
- left = minGapFromEdge;
50
- } else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {
51
- left = window.innerWidth - el.offsetWidth - minGapFromEdge;
52
- }
53
- el.style.opacity = "1";
54
- el.style.top = `${top}px`;
55
- el.style.left = `${left}px`;
56
- });
57
- useEffect(() => {
58
- const handleClickOutside = (event) => {
59
- if (ref.current && !ref.current.contains(event.target)) {
60
- setIsDisplayed(false);
61
- }
62
- };
63
- document.addEventListener("mousedown", handleClickOutside);
64
- return () => {
65
- document.removeEventListener("mousedown", handleClickOutside);
66
- };
67
- }, [ref, setIsDisplayed]);
68
- if (!isClient) {
69
- return null;
70
- }
71
- return /* @__PURE__ */ jsx(Portal, {
72
- children: /* @__PURE__ */ jsx(Menu, {
73
- ref,
74
- className: props.hoverMenuClassname || "p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700",
75
- children: isDisplayed && selection && /* @__PURE__ */ jsx(HoveringInsertionPromptBox, {
76
- editorState: editorState(editor),
77
- apiConfig: props.apiConfig,
78
- closeWindow: () => {
79
- setIsDisplayed(false);
80
- },
81
- performInsertion: (insertedText) => {
82
- console.log("inserted text", insertedText);
83
- Transforms.delete(editor, { at: selection });
84
- Transforms.insertText(editor, insertedText, {
85
- at: selection
86
- });
87
- setIsDisplayed(false);
88
- },
89
- contextCategories: props.contextCategories
90
- })
91
- })
92
- });
93
- };
94
- function editorState(editor, selection) {
95
- const textAroundCursor = getTextAroundSelection(editor);
96
- if (textAroundCursor) {
97
- return textAroundCursor;
98
- }
99
- return {
100
- textBeforeCursor: getFullEditorTextWithNewlines(editor),
101
- textAfterCursor: "",
102
- selectedText: ""
103
- };
104
- }
105
-
106
- export { HoveringToolbar };
107
- //# sourceMappingURL=out.js.map
108
- //# sourceMappingURL=chunk-3L6CNVCE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/hovering-toolbar/hovering-toolbar.tsx"],"names":["selection"],"mappings":"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","sourcesContent":["import { css } from \"@emotion/css\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { BaseSelection, Editor, Range, Location, Transforms } from \"slate\";\nimport { useSlate, useSlateSelection } from \"slate-react\";\nimport { HoveringInsertionPromptBox } from \"./text-insertion-prompt-box\";\nimport { Button, Icon, Menu, Portal } from \"./hovering-toolbar-components\";\nimport { useHoveringEditorContext } from \"./hovering-editor-provider\";\nimport {\n getFullEditorTextWithNewlines,\n getTextAroundSelection,\n} from \"../../lib/get-text-around-cursor\";\nimport {\n EditingEditorState,\n InsertionEditorApiConfig,\n} from \"../../types/base/autosuggestions-bare-function\";\n\nexport interface HoveringToolbarProps {\n apiConfig: InsertionEditorApiConfig;\n contextCategories: string[];\n hoverMenuClassname: string | undefined;\n}\n\nexport const HoveringToolbar: (\n props: HoveringToolbarProps\n) => JSX.Element | null = (props) => {\n const ref = useRef<HTMLDivElement>(null);\n const editor = useSlate();\n const selection = useSlateSelection();\n const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();\n\n // only render on client\n const [isClient, setIsClient] = useState(false);\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n useEffect(() => {\n const el = ref.current;\n const { selection } = editor;\n\n if (!el) {\n return;\n }\n\n if (!selection) {\n el.removeAttribute(\"style\");\n return;\n }\n\n const domSelection = window.getSelection();\n if (!domSelection) {\n return;\n }\n\n const domRange = domSelection.getRangeAt(0);\n const rect = domRange.getBoundingClientRect();\n\n // We use window = (0,0,0,0) as a signal that the selection is not in the original copilot-textarea,\n // but inside the hovering window.\n //\n // in such case, we simply do nothing.\n if (\n rect.top === 0 &&\n rect.left === 0 &&\n rect.width === 0 &&\n rect.height === 0\n ) {\n return;\n }\n\n const minGapFromEdge = 60;\n const verticalOffsetFromCorner = 35;\n const horizontalOffsetFromCorner = 15;\n let top =\n rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;\n // make sure top is in the viewport and not too close to the edge\n if (top < minGapFromEdge) {\n top = rect.bottom + window.scrollY + minGapFromEdge;\n } else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {\n top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;\n }\n\n let left =\n rect.left +\n window.scrollX -\n el.offsetWidth / 2 +\n rect.width / 2 +\n horizontalOffsetFromCorner;\n // make sure left is in the viewport and not too close to the edge\n if (left < minGapFromEdge) {\n left = minGapFromEdge;\n } else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {\n left = window.innerWidth - el.offsetWidth - minGapFromEdge;\n }\n\n el.style.opacity = \"1\";\n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n });\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setIsDisplayed(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, setIsDisplayed]);\n\n if (!isClient) {\n return null;\n }\n\n return (\n <Portal>\n <Menu\n ref={ref}\n className={\n props.hoverMenuClassname ||\n \"p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700\"\n }\n >\n {isDisplayed && selection && (\n <HoveringInsertionPromptBox\n editorState={editorState(editor, selection)}\n apiConfig={props.apiConfig}\n closeWindow={() => {\n setIsDisplayed(false);\n }}\n performInsertion={(insertedText) => {\n console.log(\"inserted text\", insertedText);\n // replace the selection with the inserted text\n Transforms.delete(editor, { at: selection });\n Transforms.insertText(editor, insertedText, {\n at: selection,\n });\n setIsDisplayed(false);\n }}\n contextCategories={props.contextCategories}\n />\n )}\n </Menu>\n </Portal>\n );\n};\n\nfunction editorState(editor: Editor, selection: Location): EditingEditorState {\n const textAroundCursor = getTextAroundSelection(editor);\n if (textAroundCursor) {\n return textAroundCursor;\n }\n\n return {\n textBeforeCursor: getFullEditorTextWithNewlines(editor),\n textAfterCursor: \"\",\n selectedText: \"\",\n };\n}\n"]}