@copilotkit/react-textarea 0.18.0 → 0.19.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/.turbo/turbo-build.log +303 -189
  2. package/CHANGELOG.md +19 -0
  3. package/dist/chunk-2NURR2DX.mjs +47 -0
  4. package/dist/chunk-2NURR2DX.mjs.map +1 -0
  5. package/dist/chunk-3YJ63D5D.mjs +106 -0
  6. package/dist/chunk-3YJ63D5D.mjs.map +1 -0
  7. package/dist/chunk-4S5ZJH3I.mjs +18 -0
  8. package/dist/chunk-4S5ZJH3I.mjs.map +1 -0
  9. package/dist/chunk-55EGOC5T.mjs +87 -0
  10. package/dist/chunk-55EGOC5T.mjs.map +1 -0
  11. package/dist/{chunk-3A2CNIG5.mjs → chunk-5ARCOTW3.mjs} +8 -5
  12. package/dist/chunk-5ARCOTW3.mjs.map +1 -0
  13. package/dist/chunk-5EJ5XOGP.mjs +22 -0
  14. package/dist/chunk-5EJ5XOGP.mjs.map +1 -0
  15. package/dist/chunk-5FO6ISW4.mjs +3 -0
  16. package/dist/{chunk-5GGCWNTT.mjs → chunk-5SL5L4VS.mjs} +67 -29
  17. package/dist/chunk-5SL5L4VS.mjs.map +1 -0
  18. package/dist/{chunk-JWN2VEE3.mjs → chunk-A2RRLD23.mjs} +13 -12
  19. package/dist/chunk-A2RRLD23.mjs.map +1 -0
  20. package/dist/chunk-CDB7HFCY.mjs +65 -0
  21. package/dist/chunk-CDB7HFCY.mjs.map +1 -0
  22. package/dist/{chunk-MFJNLKRC.mjs → chunk-D7SEV5PR.mjs} +4 -3
  23. package/dist/chunk-D7SEV5PR.mjs.map +1 -0
  24. package/dist/chunk-HAFHLU4N.mjs +55 -0
  25. package/dist/chunk-HAFHLU4N.mjs.map +1 -0
  26. package/dist/chunk-ITZHK3YV.mjs +477 -0
  27. package/dist/chunk-ITZHK3YV.mjs.map +1 -0
  28. package/dist/{chunk-3UQM3NLM.mjs → chunk-IXJ2HCOA.mjs} +42 -7
  29. package/dist/chunk-IXJ2HCOA.mjs.map +1 -0
  30. package/dist/{chunk-UW3ITU2Y.mjs → chunk-JAFCXEPU.mjs} +1 -1
  31. package/dist/chunk-JAFCXEPU.mjs.map +1 -0
  32. package/dist/chunk-KDFCAQGV.mjs +44 -0
  33. package/dist/chunk-KDFCAQGV.mjs.map +1 -0
  34. package/dist/chunk-L7VVZH4Q.mjs +3 -0
  35. package/dist/chunk-ND5PXTAW.mjs +17 -0
  36. package/dist/chunk-ND5PXTAW.mjs.map +1 -0
  37. package/dist/chunk-O5OWT5GE.mjs +114 -0
  38. package/dist/chunk-O5OWT5GE.mjs.map +1 -0
  39. package/dist/chunk-OD7ZMOVE.mjs +45 -0
  40. package/dist/chunk-OD7ZMOVE.mjs.map +1 -0
  41. package/dist/chunk-OM5WQQOU.mjs +47 -0
  42. package/dist/chunk-OM5WQQOU.mjs.map +1 -0
  43. package/dist/chunk-QL2GYGG5.mjs +19 -0
  44. package/dist/chunk-QL2GYGG5.mjs.map +1 -0
  45. package/dist/chunk-RPDVSCLO.mjs +107 -0
  46. package/dist/chunk-RPDVSCLO.mjs.map +1 -0
  47. package/dist/{chunk-HZGSG7ST.mjs → chunk-UHD44NC5.mjs} +10 -5
  48. package/dist/chunk-UHD44NC5.mjs.map +1 -0
  49. package/dist/chunk-VBIJPE3H.mjs +108 -0
  50. package/dist/chunk-VBIJPE3H.mjs.map +1 -0
  51. package/dist/chunk-XDT7BF3V.mjs +81 -0
  52. package/dist/chunk-XDT7BF3V.mjs.map +1 -0
  53. package/dist/chunk-XHUMROEY.mjs +91 -0
  54. package/dist/chunk-XHUMROEY.mjs.map +1 -0
  55. package/dist/{chunk-LWVCQYWV.mjs → chunk-YQU7WG7T.mjs} +2 -2
  56. package/dist/chunk-YTOPHPSG.mjs +45 -0
  57. package/dist/chunk-YTOPHPSG.mjs.map +1 -0
  58. package/dist/chunk-YW3REYX6.mjs +23 -0
  59. package/dist/chunk-YW3REYX6.mjs.map +1 -0
  60. package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +3 -5
  61. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +21 -7
  62. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.d.ts +6 -0
  63. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +5 -0
  64. package/dist/components/copilot-textarea/copilot-textarea.d.ts +13 -10
  65. package/dist/components/copilot-textarea/copilot-textarea.mjs +31 -12
  66. package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +13 -0
  67. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +4 -0
  68. package/dist/components/hovering-toolbar/hovering-toolbar-components.d.ts +18 -0
  69. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +4 -0
  70. package/dist/components/hovering-toolbar/hovering-toolbar.d.ts +8 -0
  71. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +17 -0
  72. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -0
  73. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.d.ts +12 -0
  74. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +12 -0
  75. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -0
  76. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.d.ts +3 -0
  77. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +13 -0
  78. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -0
  79. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.d.ts +16 -0
  80. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.mjs +5 -0
  81. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.mjs.map +1 -0
  82. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.d.ts +37 -0
  83. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.mjs +10 -0
  84. package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.mjs.map +1 -0
  85. package/dist/components/index.d.ts +9 -4
  86. package/dist/components/index.mjs +31 -12
  87. package/dist/components/manual-ui/chip-with-icon.d.ts +10 -0
  88. package/dist/components/manual-ui/chip-with-icon.mjs +29 -0
  89. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -0
  90. package/dist/components/source-search-box/source-search-box.d.ts +17 -0
  91. package/dist/components/source-search-box/source-search-box.mjs +10 -0
  92. package/dist/components/source-search-box/source-search-box.mjs.map +1 -0
  93. package/dist/components/ui/button.d.ts +14 -0
  94. package/dist/components/ui/button.mjs +5 -0
  95. package/dist/components/ui/button.mjs.map +1 -0
  96. package/dist/components/ui/card.d.ts +10 -0
  97. package/dist/components/ui/card.mjs +63 -0
  98. package/dist/components/ui/card.mjs.map +1 -0
  99. package/dist/components/ui/command.d.ts +48 -0
  100. package/dist/components/ui/command.mjs +6 -0
  101. package/dist/components/ui/command.mjs.map +1 -0
  102. package/dist/components/ui/dialog.d.ts +18 -0
  103. package/dist/components/ui/dialog.mjs +5 -0
  104. package/dist/components/ui/dialog.mjs.map +1 -0
  105. package/dist/components/ui/label.d.ts +8 -0
  106. package/dist/components/ui/label.mjs +5 -0
  107. package/dist/components/ui/label.mjs.map +1 -0
  108. package/dist/components/ui/separator.d.ts +6 -0
  109. package/dist/components/ui/separator.mjs +26 -0
  110. package/dist/components/ui/separator.mjs.map +1 -0
  111. package/dist/components/ui/textarea.d.ts +7 -0
  112. package/dist/components/ui/textarea.mjs +22 -0
  113. package/dist/components/ui/textarea.mjs.map +1 -0
  114. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +2 -2
  115. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.d.ts +2 -2
  116. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +2 -2
  117. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.d.ts +5 -7
  118. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +2 -1
  119. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.d.ts +23 -0
  120. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +5 -0
  121. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -0
  122. package/dist/hooks/misc/use-autosize-textarea.d.ts +5 -0
  123. package/dist/hooks/misc/use-autosize-textarea.mjs +4 -0
  124. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -0
  125. package/dist/index.css +674 -0
  126. package/dist/index.css.map +1 -1
  127. package/dist/index.d.ts +8 -3
  128. package/dist/index.mjs +31 -12
  129. package/dist/lib/editor-to-text.mjs +1 -42
  130. package/dist/lib/editor-to-text.mjs.map +1 -1
  131. package/dist/lib/get-text-around-cursor.d.ts +10 -3
  132. package/dist/lib/get-text-around-cursor.mjs +1 -1
  133. package/dist/lib/retry.d.ts +3 -0
  134. package/dist/lib/retry.mjs +4 -0
  135. package/dist/lib/retry.mjs.map +1 -0
  136. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.d.ts +25 -0
  137. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +3 -0
  138. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -0
  139. package/dist/types/autosuggestions-config/autosuggestions-config.d.ts +20 -0
  140. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +10 -0
  141. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -0
  142. package/dist/types/autosuggestions-config/editing-api-config.d.ts +17 -0
  143. package/dist/types/autosuggestions-config/editing-api-config.mjs +5 -0
  144. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -0
  145. package/dist/types/autosuggestions-config/index.d.ts +10 -0
  146. package/dist/types/autosuggestions-config/index.mjs +11 -0
  147. package/dist/types/autosuggestions-config/index.mjs.map +1 -0
  148. package/dist/types/autosuggestions-config/insertions-api-config.d.ts +17 -0
  149. package/dist/types/autosuggestions-config/insertions-api-config.mjs +5 -0
  150. package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -0
  151. package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/chatlike-api-endpoint.d.ts +7 -4
  152. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +4 -0
  153. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -0
  154. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.d.ts +3 -0
  155. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +3 -0
  156. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -0
  157. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -0
  158. package/dist/types/autosuggestions-config/suggestions-api-config.d.ts +17 -0
  159. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +5 -0
  160. package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -0
  161. package/dist/types/base/autosuggestions-bare-function.d.ts +16 -2
  162. package/dist/types/base/base-autosuggestions-config.d.ts +5 -1
  163. package/dist/types/base/base-autosuggestions-config.mjs +1 -1
  164. package/dist/types/base/base-copilot-textarea-props.d.ts +3 -1
  165. package/dist/types/base/editor-autocomplete-state.mjs +1 -1
  166. package/dist/types/base/index.mjs +1 -1
  167. package/dist/types/index.d.ts +8 -3
  168. package/dist/types/index.mjs +7 -4
  169. package/package.json +19 -5
  170. package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +64 -13
  171. package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +61 -0
  172. package/src/components/copilot-textarea/copilot-textarea.tsx +29 -17
  173. package/src/components/hovering-toolbar/hovering-editor-provider.tsx +29 -0
  174. package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +115 -0
  175. package/src/components/hovering-toolbar/hovering-toolbar.tsx +156 -0
  176. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx +73 -0
  177. package/src/components/hovering-toolbar/text-insertion-prompt-box/index.ts +2 -0
  178. package/src/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.tsx +83 -0
  179. package/src/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.tsx +410 -0
  180. package/src/components/manual-ui/chip-with-icon.tsx +28 -0
  181. package/src/components/source-search-box/source-search-box.tsx +133 -0
  182. package/src/components/ui/button.tsx +56 -0
  183. package/src/components/ui/card.tsx +86 -0
  184. package/src/components/ui/command.tsx +155 -0
  185. package/src/components/ui/dialog.tsx +123 -0
  186. package/src/components/ui/label.tsx +26 -0
  187. package/src/components/ui/separator.tsx +31 -0
  188. package/src/components/ui/textarea.tsx +24 -0
  189. package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +10 -3
  190. package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +29 -44
  191. package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +150 -0
  192. package/src/hooks/misc/use-autosize-textarea.tsx +21 -0
  193. package/src/lib/get-text-around-cursor.ts +71 -6
  194. package/src/lib/retry.tsx +23 -0
  195. package/src/styles.css +2 -0
  196. package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +27 -0
  197. package/src/types/autosuggestions-config/autosuggestions-config.tsx +43 -0
  198. package/src/types/autosuggestions-config/editing-api-config.tsx +102 -0
  199. package/src/types/autosuggestions-config/index.ts +11 -0
  200. package/src/types/autosuggestions-config/insertions-api-config.tsx +95 -0
  201. package/src/types/{standard-autosuggestions → autosuggestions-config/subtypes}/chatlike-api-endpoint.tsx +19 -7
  202. package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +4 -0
  203. package/src/types/{standard-autosuggestions/autosuggestions-config.tsx → autosuggestions-config/suggestions-api-config.tsx} +12 -23
  204. package/src/types/base/autosuggestions-bare-function.ts +24 -2
  205. package/src/types/base/base-autosuggestions-config.tsx +7 -2
  206. package/src/types/base/base-copilot-textarea-props.tsx +3 -1
  207. package/src/types/base/editor-autocomplete-state.ts +1 -0
  208. package/src/types/index.ts +1 -1
  209. package/tailwind.config.js +2 -0
  210. package/dist/chunk-3A2CNIG5.mjs.map +0 -1
  211. package/dist/chunk-3UQM3NLM.mjs.map +0 -1
  212. package/dist/chunk-5GGCWNTT.mjs.map +0 -1
  213. package/dist/chunk-BLRD23HM.mjs +0 -32
  214. package/dist/chunk-BLRD23HM.mjs.map +0 -1
  215. package/dist/chunk-BTAUKCBN.mjs +0 -60
  216. package/dist/chunk-BTAUKCBN.mjs.map +0 -1
  217. package/dist/chunk-HZGSG7ST.mjs.map +0 -1
  218. package/dist/chunk-JWN2VEE3.mjs.map +0 -1
  219. package/dist/chunk-MFJNLKRC.mjs.map +0 -1
  220. package/dist/chunk-SL4J5HMW.mjs +0 -3
  221. package/dist/chunk-UW3ITU2Y.mjs.map +0 -1
  222. package/dist/types/standard-autosuggestions/autosuggestions-config.d.ts +0 -19
  223. package/dist/types/standard-autosuggestions/autosuggestions-config.mjs +0 -6
  224. package/dist/types/standard-autosuggestions/chatlike-api-endpoint.mjs +0 -4
  225. package/dist/types/standard-autosuggestions/index.d.ts +0 -4
  226. package/dist/types/standard-autosuggestions/index.mjs +0 -8
  227. package/src/types/standard-autosuggestions/index.ts +0 -14
  228. /package/dist/{chunk-SL4J5HMW.mjs.map → chunk-5FO6ISW4.mjs.map} +0 -0
  229. /package/dist/{types/standard-autosuggestions/autosuggestions-config.mjs.map → chunk-L7VVZH4Q.mjs.map} +0 -0
  230. /package/dist/{chunk-LWVCQYWV.mjs.map → chunk-YQU7WG7T.mjs.map} +0 -0
  231. /package/dist/{types/standard-autosuggestions/chatlike-api-endpoint.mjs.map → components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map} +0 -0
  232. /package/dist/{types/standard-autosuggestions/index.mjs.map → components/hovering-toolbar/hovering-editor-provider.mjs.map} +0 -0
  233. /package/dist/{types/standard-autosuggestions/minimal-chat-gpt-message.mjs.map → components/hovering-toolbar/hovering-toolbar-components.mjs.map} +0 -0
  234. /package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.d.ts +0 -0
  235. /package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.mjs +0 -0
  236. /package/src/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.tsx +0 -0
@@ -2,7 +2,12 @@ export { BaseAutosuggestionsConfig, defaultBaseAutosuggestionsConfig } from './b
2
2
  export { AutosuggestionsBareFunction } from './base/autosuggestions-bare-function.js';
3
3
  export { BaseCopilotTextareaProps } from './base/base-copilot-textarea-props.js';
4
4
  export { HTMLCopilotTextAreaElement } from './html-copilot-textarea-element.js';
5
- export { AutosuggestionsConfig, MakeSystemPrompt, defaultAutosuggestionsConfig, defaultFewShotMessages, defaultMakeSystemPrompt } from './standard-autosuggestions/autosuggestions-config.js';
6
- export { MinimalChatGPTMessage } from './standard-autosuggestions/minimal-chat-gpt-message.js';
7
- export { ChatlikeApiEndpoint, ChatlikeApiEndpointImpl } from './standard-autosuggestions/chatlike-api-endpoint.js';
5
+ export { AutosuggestionsConfig, defaultAutosuggestionsConfig } from './autosuggestions-config/autosuggestions-config.js';
6
+ export { MinimalChatGPTMessage } from './autosuggestions-config/subtypes/minimal-chat-gpt-message.js';
7
+ export { MakeSystemPrompt } from './autosuggestions-config/subtypes/make-system-prompt.js';
8
+ export { ChatlikeApiEndpoint, ChatlikeApiEndpointImpl } from './autosuggestions-config/subtypes/chatlike-api-endpoint.js';
9
+ export { AutosuggestionsConfigUserSpecified, InsertionsApiConfigUserSpecified, SuggestionsApiConfigUserSpecified } from './autosuggestions-config/autosuggestions-config-user-specified.js';
8
10
  import 'react';
11
+ import './autosuggestions-config/suggestions-api-config.js';
12
+ import './autosuggestions-config/insertions-api-config.js';
13
+ import './autosuggestions-config/editing-api-config.js';
@@ -1,10 +1,13 @@
1
1
  import '../chunk-DE5K76I2.mjs';
2
2
  import '../chunk-WADHCMPK.mjs';
3
- import '../chunk-SL4J5HMW.mjs';
4
- export { ChatlikeApiEndpoint } from '../chunk-3A2CNIG5.mjs';
5
- export { defaultAutosuggestionsConfig, defaultFewShotMessages, defaultMakeSystemPrompt } from '../chunk-JWN2VEE3.mjs';
3
+ import '../chunk-5FO6ISW4.mjs';
4
+ export { defaultAutosuggestionsConfig } from '../chunk-QL2GYGG5.mjs';
5
+ import '../chunk-55EGOC5T.mjs';
6
+ import '../chunk-XDT7BF3V.mjs';
7
+ import '../chunk-A2RRLD23.mjs';
8
+ export { ChatlikeApiEndpoint } from '../chunk-5ARCOTW3.mjs';
6
9
  import '../chunk-WJHSY5T6.mjs';
7
- export { defaultBaseAutosuggestionsConfig } from '../chunk-MFJNLKRC.mjs';
10
+ export { defaultBaseAutosuggestionsConfig } from '../chunk-D7SEV5PR.mjs';
8
11
  import '../chunk-MRXNTQOX.mjs';
9
12
  //# sourceMappingURL=out.js.map
10
13
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.18.0",
7
+ "version": "0.19.0-alpha.1",
8
8
  "sideEffects": [
9
9
  "**/*.css"
10
10
  ],
@@ -20,7 +20,9 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/jest": "^29.5.4",
23
+ "@types/lodash.merge": "^4.6.7",
23
24
  "@types/react": "^18.2.5",
25
+ "@types/react-dom": "^18.2.4",
24
26
  "@types/react-syntax-highlighter": "^15.5.7",
25
27
  "eslint": "^7.32.0",
26
28
  "jest": "^29.6.4",
@@ -31,13 +33,25 @@
31
33
  "tsup": "^6.1.3",
32
34
  "typescript": "^4.9.4",
33
35
  "eslint-config-custom": "0.2.0",
34
- "tailwind-config": "0.1.0",
35
- "tsconfig": "0.3.0"
36
+ "tsconfig": "0.3.0",
37
+ "tailwind-config": "0.1.0"
36
38
  },
37
39
  "dependencies": {
38
- "ai": "^2.1.22",
40
+ "@emotion/css": "^11.11.2",
41
+ "@emotion/react": "^11.11.1",
42
+ "@emotion/styled": "^11.11.0",
43
+ "@mui/material": "^5.14.11",
44
+ "@radix-ui/react-dialog": "^1.0.4",
45
+ "@radix-ui/react-label": "^2.0.2",
46
+ "@radix-ui/react-separator": "^1.0.3",
47
+ "@radix-ui/react-slot": "^1.0.2",
48
+ "ai": "^2.2.12",
39
49
  "class-variance-authority": "^0.6.1",
40
50
  "clsx": "^1.2.1",
51
+ "cmdk": "^0.2.0",
52
+ "lodash.merge": "^4.6.2",
53
+ "lucide-react": "^0.274.0",
54
+ "material-icons": "^1.13.10",
41
55
  "nanoid": "^4.0.2",
42
56
  "next": "^13.4.1",
43
57
  "next-themes": "^0.2.1",
@@ -46,7 +60,7 @@
46
60
  "slate-history": "^0.93.0",
47
61
  "slate-react": "^0.98.1",
48
62
  "tailwind-merge": "^1.13.2",
49
- "@copilotkit/react-core": "0.7.0"
63
+ "@copilotkit/react-core": "0.8.0-alpha.1"
50
64
  },
51
65
  "scripts": {
52
66
  "build": "tsup --treeshake",
@@ -7,22 +7,28 @@ import { useCopilotTextareaEditor } from "../../hooks/base-copilot-textarea-impl
7
7
  import { usePopulateCopilotTextareaRef } from "../../hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref";
8
8
  import {
9
9
  getFullEditorTextWithNewlines,
10
- getTextAroundCursor,
10
+ getTextAroundCollapsedCursor,
11
11
  } from "../../lib/get-text-around-cursor";
12
12
  import { addAutocompletionsToEditor } from "../../lib/slatejs-edits/add-autocompletions";
13
13
  import { clearAutocompletionsFromEditor } from "../../lib/slatejs-edits/clear-autocompletions";
14
14
  import { replaceEditorText } from "../../lib/slatejs-edits/replace-text";
15
15
  import {
16
- AutosuggestionsBareFunction,
17
16
  BaseAutosuggestionsConfig,
18
17
  defaultBaseAutosuggestionsConfig,
19
18
  } from "../../types/base";
20
19
  import { AutosuggestionState } from "../../types/base/autosuggestion-state";
21
20
  import { BaseCopilotTextareaProps } from "../../types/base/base-copilot-textarea-props";
22
21
  import "./base-copilot-textarea.css";
22
+ import { HoveringToolbar } from "../hovering-toolbar/hovering-toolbar";
23
23
  import { makeRenderElementFunction } from "./render-element";
24
24
  import { makeRenderPlaceholderFunction } from "./render-placeholder";
25
25
  import { useAddBrandingCss } from "./use-add-branding-css";
26
+ import {
27
+ HoveringEditorProvider,
28
+ useHoveringEditorContext,
29
+ } from "../hovering-toolbar/hovering-editor-provider";
30
+ import { EditorAutocompleteState } from "../../types/base/editor-autocomplete-state";
31
+ import { TrackerTextEditedSinceLastCursorMovement } from "./track-cursor-moved-since-last-text-change";
26
32
 
27
33
  export interface HTMLCopilotTextAreaElement extends HTMLElement {
28
34
  value: string;
@@ -30,21 +36,26 @@ export interface HTMLCopilotTextAreaElement extends HTMLElement {
30
36
  blur: () => void;
31
37
  }
32
38
 
33
- export const BaseCopilotTextarea = React.forwardRef(
39
+ const BaseCopilotTextareaWithHoveringContext = React.forwardRef(
34
40
  (
35
- props: BaseCopilotTextareaProps & {
36
- autosuggestionsFunction: AutosuggestionsBareFunction;
37
- },
41
+ props: BaseCopilotTextareaProps,
38
42
  ref: React.Ref<HTMLCopilotTextAreaElement>
39
43
  ): JSX.Element => {
40
44
  const autosuggestionsConfig: BaseAutosuggestionsConfig = {
41
45
  ...defaultBaseAutosuggestionsConfig,
42
- ...props.autosuggestionsConfig,
46
+ ...props.baseAutosuggestionsConfig,
43
47
  };
44
48
 
45
49
  const valueOnInitialRender = useMemo(() => props.value ?? "", []);
46
50
  const [lastKnownFullEditorText, setLastKnownFullEditorText] =
47
51
  useState(valueOnInitialRender);
52
+ const [cursorMovedSinceLastTextChange, setCursorMovedSinceLastTextChange] =
53
+ useState(false);
54
+
55
+ // // When the editor text changes, we want to reset the `textEditedSinceLastCursorMovement` state.
56
+ // useEffect(() => {
57
+ // setCursorMovedSinceLastTextChange(false);
58
+ // }, [lastKnownFullEditorText]);
48
59
 
49
60
  const initialValue: Descendant[] = useMemo(() => {
50
61
  return [
@@ -57,6 +68,11 @@ export const BaseCopilotTextarea = React.forwardRef(
57
68
 
58
69
  const editor = useCopilotTextareaEditor();
59
70
 
71
+ const {
72
+ isDisplayed: hoveringEditorIsDisplayed,
73
+ setIsDisplayed: setHoveringEditorIsDisplayed,
74
+ } = useHoveringEditorContext();
75
+
60
76
  const insertText = useCallback(
61
77
  (autosuggestion: AutosuggestionState) => {
62
78
  Editor.insertText(editor, autosuggestion.text, {
@@ -73,10 +89,23 @@ export const BaseCopilotTextarea = React.forwardRef(
73
89
  } = useAutosuggestions(
74
90
  autosuggestionsConfig.debounceTime,
75
91
  autosuggestionsConfig.acceptAutosuggestionKey,
76
- props.autosuggestionsFunction,
92
+ autosuggestionsConfig.apiConfig.autosuggestionsFunction,
77
93
  insertText,
78
94
  autosuggestionsConfig.disableWhenEmpty,
79
- autosuggestionsConfig.disabled
95
+ autosuggestionsConfig.disabled ||
96
+ hoveringEditorIsDisplayed || // disable autosuggestions when the hovering editor is displayed
97
+ (cursorMovedSinceLastTextChange &&
98
+ autosuggestionsConfig.temporarilyDisableWhenMovingCursorWithoutChangingText) // disable autosuggestions when the cursor has moved since the last text change
99
+ );
100
+ const onKeyDownHandlerForHoveringEditor = useCallback(
101
+ (event: React.KeyboardEvent<HTMLDivElement>) => {
102
+ // if command-k, toggle the hovering editor
103
+ if (event.key === "k" && event.metaKey) {
104
+ event.preventDefault();
105
+ setHoveringEditorIsDisplayed(!hoveringEditorIsDisplayed);
106
+ }
107
+ },
108
+ [hoveringEditorIsDisplayed, setHoveringEditorIsDisplayed]
80
109
  );
81
110
 
82
111
  // sync autosuggestions state with the editor
@@ -132,8 +161,7 @@ export const BaseCopilotTextarea = React.forwardRef(
132
161
  placeholderStyle,
133
162
  value,
134
163
  onValueChange,
135
- autosuggestionsConfig: autosuggestionsConfigFromProps,
136
- autosuggestionsFunction,
164
+ baseAutosuggestionsConfig: autosuggestionsConfigFromProps,
137
165
  className,
138
166
  onChange,
139
167
  onKeyDown,
@@ -160,23 +188,33 @@ export const BaseCopilotTextarea = React.forwardRef(
160
188
  editor={editor}
161
189
  initialValue={initialValue}
162
190
  onChange={(value) => {
163
- const newEditorState = getTextAroundCursor(editor);
191
+ const newEditorState = getTextAroundCollapsedCursor(editor);
164
192
 
165
193
  const fullEditorText = newEditorState
166
194
  ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor
167
195
  : getFullEditorTextWithNewlines(editor); // we don't double-parse the editor. When `newEditorState` is null, we didn't parse the editor yet.
168
196
 
169
- setLastKnownFullEditorText(fullEditorText);
197
+ setLastKnownFullEditorText((prev) => {
198
+ if (prev !== fullEditorText) {
199
+ setCursorMovedSinceLastTextChange(false);
200
+ }
201
+ return fullEditorText;
202
+ });
170
203
  onChangeHandlerForAutocomplete(newEditorState);
171
204
 
172
205
  props.onValueChange?.(fullEditorText);
173
206
  props.onChange?.(makeSemiFakeReactTextAreaEvent(fullEditorText));
174
207
  }}
175
208
  >
209
+ <TrackerTextEditedSinceLastCursorMovement
210
+ setCursorMovedSinceLastTextChange={setCursorMovedSinceLastTextChange}
211
+ />
212
+ <HoveringToolbar apiConfig={autosuggestionsConfig.apiConfig} />
176
213
  <Editable
177
214
  renderElement={renderElementMemoized}
178
215
  renderPlaceholder={renderPlaceholderMemoized}
179
216
  onKeyDown={(event) => {
217
+ onKeyDownHandlerForHoveringEditor(event); // forward the event for internal use
180
218
  onKeyDownHandlerForAutocomplete(event); // forward the event for internal use
181
219
  props.onKeyDown?.(event); // forward the event for external use
182
220
  }}
@@ -213,3 +251,16 @@ function makeSemiFakeReactTextAreaEvent(
213
251
  },
214
252
  } as React.ChangeEvent<HTMLTextAreaElement>;
215
253
  }
254
+
255
+ export const BaseCopilotTextarea = React.forwardRef(
256
+ (
257
+ props: BaseCopilotTextareaProps,
258
+ ref: React.Ref<HTMLCopilotTextAreaElement>
259
+ ): JSX.Element => {
260
+ return (
261
+ <HoveringEditorProvider>
262
+ <BaseCopilotTextareaWithHoveringContext {...props} ref={ref} />
263
+ </HoveringEditorProvider>
264
+ );
265
+ }
266
+ );
@@ -0,0 +1,61 @@
1
+ import React, { useEffect, useRef } from "react";
2
+ import { BaseSelection } from "slate";
3
+ import { useSlateSelector } from "slate-react";
4
+ import { Range } from "slate";
5
+ import { editorToText } from "../../lib/editor-to-text";
6
+
7
+ interface TrackerTextEditedSinceLastCursorMovementProps {
8
+ setCursorMovedSinceLastTextChange: (value: boolean) => void;
9
+ }
10
+ export function TrackerTextEditedSinceLastCursorMovement(
11
+ props: TrackerTextEditedSinceLastCursorMovementProps
12
+ ): JSX.Element {
13
+ const cursorState: RelevantEditorState = useSlateSelector((state) => ({
14
+ selection: state.selection,
15
+ text: editorToText(state),
16
+ }));
17
+
18
+ const previousState = usePrevious(cursorState);
19
+
20
+ useEffect(() => {
21
+ if (!previousState) {
22
+ return;
23
+ }
24
+
25
+ if (cursorChangedWithoutTextChanged(previousState, cursorState)) {
26
+ props.setCursorMovedSinceLastTextChange(true);
27
+ }
28
+ }, [props.setCursorMovedSinceLastTextChange, cursorState]);
29
+
30
+ return <></>;
31
+ }
32
+ type RelevantEditorState = {
33
+ selection: BaseSelection;
34
+ text: string;
35
+ };
36
+ const cursorChangedWithoutTextChanged = (
37
+ prev: RelevantEditorState,
38
+ next: RelevantEditorState
39
+ ) => {
40
+ // Check if the selection has changed
41
+ const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);
42
+
43
+ // Check if the text content remains the same
44
+ const isTextSame = prev.text === next.text;
45
+
46
+ return isSelectionChanged && isTextSame;
47
+ };
48
+ const isSelectionEqual = (a: BaseSelection, b: BaseSelection) => {
49
+ if (!a && !b) return true;
50
+ if (!a || !b) return false;
51
+ return Range.equals(a, b);
52
+ };
53
+ function usePrevious<T>(value: T): T | undefined {
54
+ const ref = useRef<T>();
55
+
56
+ useEffect(() => {
57
+ ref.current = value;
58
+ });
59
+
60
+ return ref.current;
61
+ }
@@ -5,16 +5,18 @@ import { HTMLCopilotTextAreaElement } from "../../types";
5
5
  import { BaseCopilotTextareaProps } from "../../types/base/base-copilot-textarea-props";
6
6
  import {
7
7
  AutosuggestionsConfig,
8
- ChatlikeApiEndpoint,
9
8
  defaultAutosuggestionsConfig,
10
- } from "../../types/standard-autosuggestions";
9
+ } from "../../types/autosuggestions-config";
11
10
  import { BaseCopilotTextarea } from "../base-copilot-textarea/base-copilot-textarea";
11
+ import { useMakeStandardInsertionOrEditingFunction } from "../../hooks/make-autosuggestions-function/use-make-standard-insertion-function";
12
+ import merge from "lodash.merge";
13
+ import { AutosuggestionsConfigUserSpecified } from "../../types/autosuggestions-config/autosuggestions-config-user-specified";
12
14
 
13
- export interface CopilotTextareaProps extends BaseCopilotTextareaProps {
14
- autosuggestionsConfig: Partial<AutosuggestionsConfig> & {
15
- textareaPurpose: string;
16
- apiEndpoint: ChatlikeApiEndpoint;
17
- };
15
+ // Like the base copilot textarea props,
16
+ // but with baseAutosuggestionsConfig replaced with autosuggestionsConfig.
17
+ export interface CopilotTextareaProps
18
+ extends Omit<BaseCopilotTextareaProps, "baseAutosuggestionsConfig"> {
19
+ autosuggestionsConfig: AutosuggestionsConfigUserSpecified;
18
20
  }
19
21
 
20
22
  export const CopilotTextarea = React.forwardRef(
@@ -22,27 +24,37 @@ export const CopilotTextarea = React.forwardRef(
22
24
  props: CopilotTextareaProps,
23
25
  ref: React.Ref<HTMLCopilotTextAreaElement>
24
26
  ): JSX.Element => {
25
- const autosuggestionsConfig: AutosuggestionsConfig = {
26
- ...defaultAutosuggestionsConfig,
27
- ...props.autosuggestionsConfig,
28
- };
27
+ const autosuggestionsConfig: AutosuggestionsConfig = merge(
28
+ defaultAutosuggestionsConfig,
29
+ props.autosuggestionsConfig
30
+ );
29
31
 
30
32
  const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(
31
33
  autosuggestionsConfig.textareaPurpose,
32
- autosuggestionsConfig.apiEndpoint,
33
- autosuggestionsConfig.makeSystemPrompt,
34
- autosuggestionsConfig.fewShotMessages,
35
34
  autosuggestionsConfig.externalContextCategories,
36
- autosuggestionsConfig.forwardedParams
35
+ autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig
37
36
  );
38
37
 
38
+ const insertionOrEditingFunction =
39
+ useMakeStandardInsertionOrEditingFunction(
40
+ autosuggestionsConfig.textareaPurpose,
41
+ autosuggestionsConfig.externalContextCategories,
42
+ autosuggestionsConfig.chatApiConfigs.insertionApiConfig,
43
+ autosuggestionsConfig.chatApiConfigs.editingApiConfig
44
+ );
45
+
39
46
  return (
40
47
  <>
41
48
  <BaseCopilotTextarea
42
49
  ref={ref}
43
50
  {...props}
44
- autosuggestionsConfig={autosuggestionsConfig}
45
- autosuggestionsFunction={autosuggestionsFunction}
51
+ baseAutosuggestionsConfig={{
52
+ ...autosuggestionsConfig,
53
+ apiConfig: {
54
+ insertionOrEditingFunction: insertionOrEditingFunction,
55
+ autosuggestionsFunction: autosuggestionsFunction,
56
+ },
57
+ }}
46
58
  />
47
59
  </>
48
60
  );
@@ -0,0 +1,29 @@
1
+ import React, { createContext, useState, useContext, ReactNode } from "react";
2
+
3
+ interface HoveringEditorContextProps {
4
+ isDisplayed: boolean;
5
+ setIsDisplayed: (value: boolean) => void;
6
+ }
7
+
8
+ const HoveringEditorContext = createContext<HoveringEditorContextProps>({
9
+ isDisplayed: false,
10
+ setIsDisplayed: () => {},
11
+ });
12
+
13
+ interface HoveringEditorProviderProps {
14
+ children: ReactNode;
15
+ }
16
+
17
+ export const HoveringEditorProvider = ({
18
+ children,
19
+ }: HoveringEditorProviderProps) => {
20
+ const [isDisplayed, setIsDisplayed] = useState(false);
21
+
22
+ return (
23
+ <HoveringEditorContext.Provider value={{ isDisplayed, setIsDisplayed }}>
24
+ {children}
25
+ </HoveringEditorContext.Provider>
26
+ );
27
+ };
28
+
29
+ export const useHoveringEditorContext = () => useContext(HoveringEditorContext);
@@ -0,0 +1,115 @@
1
+ import { css, cx } from "@emotion/css";
2
+ import React, { PropsWithChildren, Ref } from "react";
3
+ import ReactDOM from "react-dom";
4
+
5
+ interface BaseProps {
6
+ className: string;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ export const Button = React.forwardRef(
11
+ (
12
+ {
13
+ className,
14
+ active,
15
+ reversed,
16
+ ...props
17
+ }: PropsWithChildren<
18
+ {
19
+ active: boolean;
20
+ reversed: boolean;
21
+ } & BaseProps
22
+ >,
23
+ ref: Ref<HTMLSpanElement | null>
24
+ ) => (
25
+ <span
26
+ {...props}
27
+ ref={ref as Ref<HTMLSpanElement>}
28
+ className={cx(
29
+ className,
30
+ css`
31
+ cursor: pointer;
32
+ color: ${reversed
33
+ ? active
34
+ ? "white"
35
+ : "#aaa"
36
+ : active
37
+ ? "black"
38
+ : "#ccc"};
39
+ `
40
+ )}
41
+ />
42
+ )
43
+ );
44
+
45
+ export const Icon = React.forwardRef(
46
+ (
47
+ { className, ...props }: PropsWithChildren<BaseProps>,
48
+ ref: Ref<HTMLSpanElement | null>
49
+ ) => (
50
+ <span
51
+ {...props}
52
+ ref={ref as Ref<HTMLSpanElement>}
53
+ className={cx(
54
+ "material-icons",
55
+ className,
56
+ css`
57
+ font-size: 18px;
58
+ vertical-align: text-bottom;
59
+ `
60
+ )}
61
+ />
62
+ )
63
+ );
64
+
65
+ export const Menu = React.forwardRef(
66
+ (
67
+ { className, ...props }: PropsWithChildren<BaseProps>,
68
+ ref: Ref<HTMLDivElement | null>
69
+ ) => (
70
+ <div
71
+ {...props}
72
+ data-test-id="menu"
73
+ ref={ref as Ref<HTMLDivElement>}
74
+ className={cx(
75
+ className,
76
+ css`
77
+ & > * {
78
+ display: inline-block;
79
+ }
80
+
81
+ & > * + * {
82
+ margin-left: 15px;
83
+ }
84
+ `
85
+ )}
86
+ />
87
+ )
88
+ );
89
+ export const Portal = ({ children }: { children: React.ReactNode }) => {
90
+ return typeof document === "object"
91
+ ? ReactDOM.createPortal(children, document.body)
92
+ : null;
93
+ };
94
+
95
+ export const Toolbar = React.forwardRef(
96
+ (
97
+ { className, ...props }: PropsWithChildren<BaseProps>,
98
+ ref?: Ref<HTMLDivElement>
99
+ ) => (
100
+ <Menu
101
+ {...props}
102
+ ref={ref}
103
+ className={cx(
104
+ className,
105
+ css`
106
+ position: relative;
107
+ padding: 1px 18px 17px;
108
+ margin: 0 -20px;
109
+ border-bottom: 2px solid #eee;
110
+ margin-bottom: 20px;
111
+ `
112
+ )}
113
+ />
114
+ )
115
+ );