@copilotkit/react-textarea 0.0.0-feat-dynamic-copilotcloud-qa-20250117190454

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 (451) hide show
  1. package/CHANGELOG.md +2456 -0
  2. package/README.md +46 -0
  3. package/dist/chunk-23Q6A46J.mjs +103 -0
  4. package/dist/chunk-23Q6A46J.mjs.map +1 -0
  5. package/dist/chunk-2C7O2EVM.mjs +27 -0
  6. package/dist/chunk-2C7O2EVM.mjs.map +1 -0
  7. package/dist/chunk-2QDCE7PD.mjs +32 -0
  8. package/dist/chunk-2QDCE7PD.mjs.map +1 -0
  9. package/dist/chunk-2VMZ5ZWT.mjs +229 -0
  10. package/dist/chunk-2VMZ5ZWT.mjs.map +1 -0
  11. package/dist/chunk-3PQ7GSFE.mjs +17 -0
  12. package/dist/chunk-3PQ7GSFE.mjs.map +1 -0
  13. package/dist/chunk-4CVSOOJY.mjs +30 -0
  14. package/dist/chunk-4CVSOOJY.mjs.map +1 -0
  15. package/dist/chunk-4NHVQZ67.mjs +108 -0
  16. package/dist/chunk-4NHVQZ67.mjs.map +1 -0
  17. package/dist/chunk-4PDYALMP.mjs +52 -0
  18. package/dist/chunk-4PDYALMP.mjs.map +1 -0
  19. package/dist/chunk-4XXU5BSA.mjs +125 -0
  20. package/dist/chunk-4XXU5BSA.mjs.map +1 -0
  21. package/dist/chunk-5UNJXFUO.mjs +29 -0
  22. package/dist/chunk-5UNJXFUO.mjs.map +1 -0
  23. package/dist/chunk-7L6GIHDM.mjs +39 -0
  24. package/dist/chunk-7L6GIHDM.mjs.map +1 -0
  25. package/dist/chunk-7LSRNPNI.mjs +59 -0
  26. package/dist/chunk-7LSRNPNI.mjs.map +1 -0
  27. package/dist/chunk-ABYCGF77.mjs +31 -0
  28. package/dist/chunk-ABYCGF77.mjs.map +1 -0
  29. package/dist/chunk-AJ5OMEXM.mjs +13 -0
  30. package/dist/chunk-AJ5OMEXM.mjs.map +1 -0
  31. package/dist/chunk-BNBGJBBM.mjs +60 -0
  32. package/dist/chunk-BNBGJBBM.mjs.map +1 -0
  33. package/dist/chunk-D47EKHIF.mjs +26 -0
  34. package/dist/chunk-D47EKHIF.mjs.map +1 -0
  35. package/dist/chunk-DE5K76I2.mjs +1 -0
  36. package/dist/chunk-DE5K76I2.mjs.map +1 -0
  37. package/dist/chunk-DFTV4TST.mjs +36 -0
  38. package/dist/chunk-DFTV4TST.mjs.map +1 -0
  39. package/dist/chunk-DRV2FOHZ.mjs +70 -0
  40. package/dist/chunk-DRV2FOHZ.mjs.map +1 -0
  41. package/dist/chunk-ECR45NSD.mjs +104 -0
  42. package/dist/chunk-ECR45NSD.mjs.map +1 -0
  43. package/dist/chunk-EJGGLWWR.mjs +82 -0
  44. package/dist/chunk-EJGGLWWR.mjs.map +1 -0
  45. package/dist/chunk-F6GMWOLE.mjs +93 -0
  46. package/dist/chunk-F6GMWOLE.mjs.map +1 -0
  47. package/dist/chunk-GQN2HYFJ.mjs +22 -0
  48. package/dist/chunk-GQN2HYFJ.mjs.map +1 -0
  49. package/dist/chunk-H4VKQGVU.mjs +1 -0
  50. package/dist/chunk-H4VKQGVU.mjs.map +1 -0
  51. package/dist/chunk-HDBI2WN5.mjs +113 -0
  52. package/dist/chunk-HDBI2WN5.mjs.map +1 -0
  53. package/dist/chunk-I72DKFHD.mjs +114 -0
  54. package/dist/chunk-I72DKFHD.mjs.map +1 -0
  55. package/dist/chunk-IU3WTXLQ.mjs +1 -0
  56. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  57. package/dist/chunk-KMVGEY7Q.mjs +51 -0
  58. package/dist/chunk-KMVGEY7Q.mjs.map +1 -0
  59. package/dist/chunk-KNQIEOFP.mjs +19 -0
  60. package/dist/chunk-KNQIEOFP.mjs.map +1 -0
  61. package/dist/chunk-L7VVZH4Q.mjs +1 -0
  62. package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
  63. package/dist/chunk-LQ2OWQU7.mjs +49 -0
  64. package/dist/chunk-LQ2OWQU7.mjs.map +1 -0
  65. package/dist/chunk-LYB4B6MK.mjs +19 -0
  66. package/dist/chunk-LYB4B6MK.mjs.map +1 -0
  67. package/dist/chunk-MCNXIA4Q.mjs +75 -0
  68. package/dist/chunk-MCNXIA4Q.mjs.map +1 -0
  69. package/dist/chunk-MGYT7RNL.mjs +32 -0
  70. package/dist/chunk-MGYT7RNL.mjs.map +1 -0
  71. package/dist/chunk-MMVDU6DF.mjs +1 -0
  72. package/dist/chunk-MMVDU6DF.mjs.map +1 -0
  73. package/dist/chunk-MRXNTQOX.mjs +59 -0
  74. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  75. package/dist/chunk-PZYM7K4Y.mjs +265 -0
  76. package/dist/chunk-PZYM7K4Y.mjs.map +1 -0
  77. package/dist/chunk-QFXR6DOA.mjs +64 -0
  78. package/dist/chunk-QFXR6DOA.mjs.map +1 -0
  79. package/dist/chunk-QJNFNPWH.mjs +85 -0
  80. package/dist/chunk-QJNFNPWH.mjs.map +1 -0
  81. package/dist/chunk-RUV6NBIF.mjs +1 -0
  82. package/dist/chunk-RUV6NBIF.mjs.map +1 -0
  83. package/dist/chunk-RXV67GJN.mjs +168 -0
  84. package/dist/chunk-RXV67GJN.mjs.map +1 -0
  85. package/dist/chunk-T6MTDQZ7.mjs +45 -0
  86. package/dist/chunk-T6MTDQZ7.mjs.map +1 -0
  87. package/dist/chunk-VSVQZUPW.mjs +124 -0
  88. package/dist/chunk-VSVQZUPW.mjs.map +1 -0
  89. package/dist/chunk-WADHCMPK.mjs +1 -0
  90. package/dist/chunk-WADHCMPK.mjs.map +1 -0
  91. package/dist/chunk-WGWQRALG.mjs +83 -0
  92. package/dist/chunk-WGWQRALG.mjs.map +1 -0
  93. package/dist/chunk-WJHSY5T6.mjs +1 -0
  94. package/dist/chunk-WJHSY5T6.mjs.map +1 -0
  95. package/dist/chunk-XW3ICO4S.mjs +25 -0
  96. package/dist/chunk-XW3ICO4S.mjs.map +1 -0
  97. package/dist/chunk-YLFAIYRY.mjs +50 -0
  98. package/dist/chunk-YLFAIYRY.mjs.map +1 -0
  99. package/dist/components/base-copilot-textarea/base-copilot-textarea.css +9 -0
  100. package/dist/components/base-copilot-textarea/base-copilot-textarea.css.map +1 -0
  101. package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +43 -0
  102. package/dist/components/base-copilot-textarea/base-copilot-textarea.js +1795 -0
  103. package/dist/components/base-copilot-textarea/base-copilot-textarea.js.map +1 -0
  104. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +40 -0
  105. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -0
  106. package/dist/components/base-copilot-textarea/render-element.d.ts +6 -0
  107. package/dist/components/base-copilot-textarea/render-element.js +75 -0
  108. package/dist/components/base-copilot-textarea/render-element.js.map +1 -0
  109. package/dist/components/base-copilot-textarea/render-element.mjs +8 -0
  110. package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -0
  111. package/dist/components/base-copilot-textarea/render-placeholder.d.ts +6 -0
  112. package/dist/components/base-copilot-textarea/render-placeholder.js +72 -0
  113. package/dist/components/base-copilot-textarea/render-placeholder.js.map +1 -0
  114. package/dist/components/base-copilot-textarea/render-placeholder.mjs +8 -0
  115. package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -0
  116. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.d.ts +8 -0
  117. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.js +112 -0
  118. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.js.map +1 -0
  119. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +9 -0
  120. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -0
  121. package/dist/components/base-copilot-textarea/use-add-branding-css.d.ts +3 -0
  122. package/dist/components/base-copilot-textarea/use-add-branding-css.js +83 -0
  123. package/dist/components/base-copilot-textarea/use-add-branding-css.js.map +1 -0
  124. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +8 -0
  125. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -0
  126. package/dist/components/copilot-textarea/copilot-textarea.css +9 -0
  127. package/dist/components/copilot-textarea/copilot-textarea.css.map +1 -0
  128. package/dist/components/copilot-textarea/copilot-textarea.d.ts +171 -0
  129. package/dist/components/copilot-textarea/copilot-textarea.js +2289 -0
  130. package/dist/components/copilot-textarea/copilot-textarea.js.map +1 -0
  131. package/dist/components/copilot-textarea/copilot-textarea.mjs +49 -0
  132. package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -0
  133. package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +18 -0
  134. package/dist/components/hovering-toolbar/hovering-editor-provider.js +44 -0
  135. package/dist/components/hovering-toolbar/hovering-editor-provider.js.map +1 -0
  136. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +10 -0
  137. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -0
  138. package/dist/components/hovering-toolbar/hovering-toolbar-components.d.ts +18 -0
  139. package/dist/components/hovering-toolbar/hovering-toolbar-components.js +174 -0
  140. package/dist/components/hovering-toolbar/hovering-toolbar-components.js.map +1 -0
  141. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +16 -0
  142. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -0
  143. package/dist/components/hovering-toolbar/hovering-toolbar.d.ts +12 -0
  144. package/dist/components/hovering-toolbar/hovering-toolbar.js +912 -0
  145. package/dist/components/hovering-toolbar/hovering-toolbar.js.map +1 -0
  146. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +23 -0
  147. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -0
  148. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.d.ts +16 -0
  149. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.js +606 -0
  150. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.js.map +1 -0
  151. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +18 -0
  152. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -0
  153. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.d.ts +14 -0
  154. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.js +629 -0
  155. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.js.map +1 -0
  156. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +19 -0
  157. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -0
  158. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.d.ts +16 -0
  159. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.js +133 -0
  160. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.js.map +1 -0
  161. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +12 -0
  162. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -0
  163. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.d.ts +4 -0
  164. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.js +629 -0
  165. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.js.map +1 -0
  166. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +20 -0
  167. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -0
  168. package/dist/components/index.css +9 -0
  169. package/dist/components/index.css.map +1 -0
  170. package/dist/components/index.d.ts +15 -0
  171. package/dist/components/index.js +2293 -0
  172. package/dist/components/index.js.map +1 -0
  173. package/dist/components/index.mjs +53 -0
  174. package/dist/components/index.mjs.map +1 -0
  175. package/dist/components/manual-ui/chip-with-icon.d.ts +10 -0
  176. package/dist/components/manual-ui/chip-with-icon.js +38 -0
  177. package/dist/components/manual-ui/chip-with-icon.js.map +1 -0
  178. package/dist/components/manual-ui/chip-with-icon.mjs +15 -0
  179. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -0
  180. package/dist/components/source-search-box/source-search-box.d.ts +16 -0
  181. package/dist/components/source-search-box/source-search-box.js +240 -0
  182. package/dist/components/source-search-box/source-search-box.js.map +1 -0
  183. package/dist/components/source-search-box/source-search-box.mjs +13 -0
  184. package/dist/components/source-search-box/source-search-box.mjs.map +1 -0
  185. package/dist/components/ui/button.d.ts +14 -0
  186. package/dist/components/ui/button.js +114 -0
  187. package/dist/components/ui/button.js.map +1 -0
  188. package/dist/components/ui/button.mjs +11 -0
  189. package/dist/components/ui/button.mjs.map +1 -0
  190. package/dist/components/ui/command.d.ts +53 -0
  191. package/dist/components/ui/command.js +285 -0
  192. package/dist/components/ui/command.js.map +1 -0
  193. package/dist/components/ui/command.mjs +26 -0
  194. package/dist/components/ui/command.mjs.map +1 -0
  195. package/dist/components/ui/dialog.d.ts +19 -0
  196. package/dist/components/ui/dialog.js +183 -0
  197. package/dist/components/ui/dialog.js.map +1 -0
  198. package/dist/components/ui/dialog.mjs +21 -0
  199. package/dist/components/ui/dialog.mjs.map +1 -0
  200. package/dist/components/ui/label.d.ts +8 -0
  201. package/dist/components/ui/label.js +87 -0
  202. package/dist/components/ui/label.js.map +1 -0
  203. package/dist/components/ui/label.mjs +9 -0
  204. package/dist/components/ui/label.mjs.map +1 -0
  205. package/dist/context/index.d.ts +2 -0
  206. package/dist/context/index.js +19 -0
  207. package/dist/context/index.js.map +1 -0
  208. package/dist/context/index.mjs +2 -0
  209. package/dist/context/index.mjs.map +1 -0
  210. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.d.ts +15 -0
  211. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.js +180 -0
  212. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.js.map +1 -0
  213. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +11 -0
  214. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -0
  215. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.d.ts +8 -0
  216. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.js +194 -0
  217. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.js.map +1 -0
  218. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +9 -0
  219. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -0
  220. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.d.ts +7 -0
  221. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.js +180 -0
  222. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.js.map +1 -0
  223. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +10 -0
  224. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -0
  225. package/dist/hooks/index.d.ts +2 -0
  226. package/dist/hooks/index.js +19 -0
  227. package/dist/hooks/index.js.map +1 -0
  228. package/dist/hooks/index.mjs +2 -0
  229. package/dist/hooks/index.mjs.map +1 -0
  230. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.d.ts +22 -0
  231. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.js +153 -0
  232. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.js.map +1 -0
  233. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +9 -0
  234. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -0
  235. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.d.ts +23 -0
  236. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.js +228 -0
  237. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.js.map +1 -0
  238. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +9 -0
  239. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -0
  240. package/dist/hooks/misc/use-autosize-textarea.d.ts +5 -0
  241. package/dist/hooks/misc/use-autosize-textarea.js +37 -0
  242. package/dist/hooks/misc/use-autosize-textarea.js.map +1 -0
  243. package/dist/hooks/misc/use-autosize-textarea.mjs +8 -0
  244. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -0
  245. package/dist/index.css +644 -0
  246. package/dist/index.css.map +1 -0
  247. package/dist/index.d.ts +15 -0
  248. package/dist/index.js +2298 -0
  249. package/dist/index.js.map +1 -0
  250. package/dist/index.mjs +64 -0
  251. package/dist/index.mjs.map +1 -0
  252. package/dist/lib/debouncer.d.ts +11 -0
  253. package/dist/lib/debouncer.js +76 -0
  254. package/dist/lib/debouncer.js.map +1 -0
  255. package/dist/lib/debouncer.mjs +8 -0
  256. package/dist/lib/debouncer.mjs.map +1 -0
  257. package/dist/lib/editor-to-text.d.ts +7 -0
  258. package/dist/lib/editor-to-text.js +69 -0
  259. package/dist/lib/editor-to-text.js.map +1 -0
  260. package/dist/lib/editor-to-text.mjs +8 -0
  261. package/dist/lib/editor-to-text.mjs.map +1 -0
  262. package/dist/lib/get-text-around-cursor.d.ts +15 -0
  263. package/dist/lib/get-text-around-cursor.js +131 -0
  264. package/dist/lib/get-text-around-cursor.js.map +1 -0
  265. package/dist/lib/get-text-around-cursor.mjs +14 -0
  266. package/dist/lib/get-text-around-cursor.mjs.map +1 -0
  267. package/dist/lib/retry.d.ts +3 -0
  268. package/dist/lib/retry.js +43 -0
  269. package/dist/lib/retry.js.map +1 -0
  270. package/dist/lib/retry.mjs +8 -0
  271. package/dist/lib/retry.mjs.map +1 -0
  272. package/dist/lib/slatejs-edits/add-autocompletions.d.ts +8 -0
  273. package/dist/lib/slatejs-edits/add-autocompletions.js +51 -0
  274. package/dist/lib/slatejs-edits/add-autocompletions.js.map +1 -0
  275. package/dist/lib/slatejs-edits/add-autocompletions.mjs +8 -0
  276. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -0
  277. package/dist/lib/slatejs-edits/clear-autocompletions.d.ts +8 -0
  278. package/dist/lib/slatejs-edits/clear-autocompletions.js +46 -0
  279. package/dist/lib/slatejs-edits/clear-autocompletions.js.map +1 -0
  280. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +8 -0
  281. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -0
  282. package/dist/lib/slatejs-edits/replace-text.d.ts +5 -0
  283. package/dist/lib/slatejs-edits/replace-text.js +53 -0
  284. package/dist/lib/slatejs-edits/replace-text.js.map +1 -0
  285. package/dist/lib/slatejs-edits/replace-text.mjs +8 -0
  286. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -0
  287. package/dist/lib/slatejs-edits/with-partial-history.d.ts +8 -0
  288. package/dist/lib/slatejs-edits/with-partial-history.js +133 -0
  289. package/dist/lib/slatejs-edits/with-partial-history.js.map +1 -0
  290. package/dist/lib/slatejs-edits/with-partial-history.mjs +10 -0
  291. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -0
  292. package/dist/lib/stream-promise-flatten.d.ts +12 -0
  293. package/dist/lib/stream-promise-flatten.js +72 -0
  294. package/dist/lib/stream-promise-flatten.js.map +1 -0
  295. package/dist/lib/stream-promise-flatten.mjs +8 -0
  296. package/dist/lib/stream-promise-flatten.mjs.map +1 -0
  297. package/dist/lib/utils.d.ts +9 -0
  298. package/dist/lib/utils.js +94 -0
  299. package/dist/lib/utils.js.map +1 -0
  300. package/dist/lib/utils.mjs +16 -0
  301. package/dist/lib/utils.mjs.map +1 -0
  302. package/dist/lib/utils.test.d.ts +2 -0
  303. package/dist/lib/utils.test.js +9 -0
  304. package/dist/lib/utils.test.js.map +1 -0
  305. package/dist/lib/utils.test.mjs +7 -0
  306. package/dist/lib/utils.test.mjs.map +1 -0
  307. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.d.ts +23 -0
  308. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.js +19 -0
  309. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.js.map +1 -0
  310. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +1 -0
  311. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -0
  312. package/dist/types/autosuggestions-config/autosuggestions-config.d.ts +20 -0
  313. package/dist/types/autosuggestions-config/autosuggestions-config.js +287 -0
  314. package/dist/types/autosuggestions-config/autosuggestions-config.js.map +1 -0
  315. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +13 -0
  316. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -0
  317. package/dist/types/autosuggestions-config/editing-api-config.d.ts +15 -0
  318. package/dist/types/autosuggestions-config/editing-api-config.js +108 -0
  319. package/dist/types/autosuggestions-config/editing-api-config.js.map +1 -0
  320. package/dist/types/autosuggestions-config/editing-api-config.mjs +12 -0
  321. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -0
  322. package/dist/types/autosuggestions-config/index.d.ts +10 -0
  323. package/dist/types/autosuggestions-config/index.js +287 -0
  324. package/dist/types/autosuggestions-config/index.js.map +1 -0
  325. package/dist/types/autosuggestions-config/index.mjs +14 -0
  326. package/dist/types/autosuggestions-config/index.mjs.map +1 -0
  327. package/dist/types/autosuggestions-config/insertions-api-config.d.ts +15 -0
  328. package/dist/types/autosuggestions-config/insertions-api-config.js +101 -0
  329. package/dist/types/autosuggestions-config/insertions-api-config.js.map +1 -0
  330. package/dist/types/autosuggestions-config/insertions-api-config.mjs +12 -0
  331. package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -0
  332. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.d.ts +3 -0
  333. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.js +19 -0
  334. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.js.map +1 -0
  335. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +1 -0
  336. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -0
  337. package/dist/types/autosuggestions-config/suggestions-api-config.d.ts +15 -0
  338. package/dist/types/autosuggestions-config/suggestions-api-config.js +90 -0
  339. package/dist/types/autosuggestions-config/suggestions-api-config.js.map +1 -0
  340. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +12 -0
  341. package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -0
  342. package/dist/types/base/autosuggestion-state.d.ts +8 -0
  343. package/dist/types/base/autosuggestion-state.js +19 -0
  344. package/dist/types/base/autosuggestion-state.js.map +1 -0
  345. package/dist/types/base/autosuggestion-state.mjs +1 -0
  346. package/dist/types/base/autosuggestion-state.mjs.map +1 -0
  347. package/dist/types/base/autosuggestions-bare-function.d.ts +19 -0
  348. package/dist/types/base/autosuggestions-bare-function.js +19 -0
  349. package/dist/types/base/autosuggestions-bare-function.js.map +1 -0
  350. package/dist/types/base/autosuggestions-bare-function.mjs +1 -0
  351. package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -0
  352. package/dist/types/base/base-autosuggestions-config.d.ts +83 -0
  353. package/dist/types/base/base-autosuggestions-config.js +54 -0
  354. package/dist/types/base/base-autosuggestions-config.js.map +1 -0
  355. package/dist/types/base/base-autosuggestions-config.mjs +8 -0
  356. package/dist/types/base/base-autosuggestions-config.mjs.map +1 -0
  357. package/dist/types/base/base-copilot-textarea-props.d.ts +5 -0
  358. package/dist/types/base/base-copilot-textarea-props.js +19 -0
  359. package/dist/types/base/base-copilot-textarea-props.js.map +1 -0
  360. package/dist/types/base/base-copilot-textarea-props.mjs +1 -0
  361. package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -0
  362. package/dist/types/base/custom-editor.d.ts +29 -0
  363. package/dist/types/base/custom-editor.js +19 -0
  364. package/dist/types/base/custom-editor.js.map +1 -0
  365. package/dist/types/base/custom-editor.mjs +1 -0
  366. package/dist/types/base/custom-editor.mjs.map +1 -0
  367. package/dist/types/base/editor-autocomplete-state.d.ts +10 -0
  368. package/dist/types/base/editor-autocomplete-state.js +40 -0
  369. package/dist/types/base/editor-autocomplete-state.js.map +1 -0
  370. package/dist/types/base/editor-autocomplete-state.mjs +9 -0
  371. package/dist/types/base/editor-autocomplete-state.mjs.map +1 -0
  372. package/dist/types/base/index.d.ts +54 -0
  373. package/dist/types/base/index.js +56 -0
  374. package/dist/types/base/index.js.map +1 -0
  375. package/dist/types/base/index.mjs +9 -0
  376. package/dist/types/base/index.mjs.map +1 -0
  377. package/dist/types/html-copilot-textarea-element.d.ts +7 -0
  378. package/dist/types/html-copilot-textarea-element.js +19 -0
  379. package/dist/types/html-copilot-textarea-element.js.map +1 -0
  380. package/dist/types/html-copilot-textarea-element.mjs +2 -0
  381. package/dist/types/html-copilot-textarea-element.mjs.map +1 -0
  382. package/dist/types/index.d.ts +13 -0
  383. package/dist/types/index.js +289 -0
  384. package/dist/types/index.js.map +1 -0
  385. package/dist/types/index.mjs +19 -0
  386. package/dist/types/index.mjs.map +1 -0
  387. package/jest.config.js +5 -0
  388. package/package.json +95 -0
  389. package/postcss.config.js +12 -0
  390. package/src/components/base-copilot-textarea/base-copilot-textarea.css +9 -0
  391. package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +317 -0
  392. package/src/components/base-copilot-textarea/render-element.tsx +39 -0
  393. package/src/components/base-copilot-textarea/render-placeholder.tsx +23 -0
  394. package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +80 -0
  395. package/src/components/base-copilot-textarea/use-add-branding-css.tsx +74 -0
  396. package/src/components/copilot-textarea/copilot-textarea.tsx +210 -0
  397. package/src/components/hovering-toolbar/hovering-editor-provider.tsx +31 -0
  398. package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +100 -0
  399. package/src/components/hovering-toolbar/hovering-toolbar.tsx +151 -0
  400. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +276 -0
  401. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx +31 -0
  402. package/src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx +55 -0
  403. package/src/components/hovering-toolbar/text-insertion-prompt-box/index.ts +2 -0
  404. package/src/components/index.ts +4 -0
  405. package/src/components/manual-ui/chip-with-icon.tsx +17 -0
  406. package/src/components/source-search-box/source-search-box.tsx +117 -0
  407. package/src/components/ui/button.tsx +49 -0
  408. package/src/components/ui/command.tsx +141 -0
  409. package/src/components/ui/dialog.tsx +107 -0
  410. package/src/components/ui/label.tsx +19 -0
  411. package/src/context/index.ts +1 -0
  412. package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +142 -0
  413. package/src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx +100 -0
  414. package/src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts +93 -0
  415. package/src/hooks/index.ts +1 -0
  416. package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +114 -0
  417. package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +214 -0
  418. package/src/hooks/misc/use-autosize-textarea.tsx +18 -0
  419. package/src/index.tsx +7 -0
  420. package/src/lib/debouncer.ts +36 -0
  421. package/src/lib/editor-to-text.ts +61 -0
  422. package/src/lib/get-text-around-cursor.ts +135 -0
  423. package/src/lib/retry.tsx +23 -0
  424. package/src/lib/slatejs-edits/add-autocompletions.ts +30 -0
  425. package/src/lib/slatejs-edits/clear-autocompletions.ts +19 -0
  426. package/src/lib/slatejs-edits/replace-text.ts +28 -0
  427. package/src/lib/slatejs-edits/with-partial-history.ts +149 -0
  428. package/src/lib/stream-promise-flatten.ts +33 -0
  429. package/src/lib/utils.test.ts +7 -0
  430. package/src/lib/utils.ts +49 -0
  431. package/src/styles.css +3 -0
  432. package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +19 -0
  433. package/src/types/autosuggestions-config/autosuggestions-config.tsx +30 -0
  434. package/src/types/autosuggestions-config/editing-api-config.tsx +96 -0
  435. package/src/types/autosuggestions-config/index.ts +8 -0
  436. package/src/types/autosuggestions-config/insertions-api-config.tsx +87 -0
  437. package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +1 -0
  438. package/src/types/autosuggestions-config/suggestions-api-config.tsx +76 -0
  439. package/src/types/base/autosuggestion-state.ts +6 -0
  440. package/src/types/base/autosuggestions-bare-function.ts +30 -0
  441. package/src/types/base/base-autosuggestions-config.tsx +123 -0
  442. package/src/types/base/base-copilot-textarea-props.tsx +58 -0
  443. package/src/types/base/custom-editor.tsx +29 -0
  444. package/src/types/base/editor-autocomplete-state.ts +20 -0
  445. package/src/types/base/index.ts +6 -0
  446. package/src/types/html-copilot-textarea-element.ts +5 -0
  447. package/src/types/index.ts +3 -0
  448. package/tailwind.config.js +9 -0
  449. package/tsconfig.json +12 -0
  450. package/tsup.config.ts +16 -0
  451. package/typedoc.json +4 -0
@@ -0,0 +1,317 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { Descendant, Editor } from "slate";
3
+ import { Editable, Slate } from "slate-react";
4
+ import { twMerge } from "tailwind-merge";
5
+ import { useAutosuggestions } from "../../hooks/base-copilot-textarea-implementation/use-autosuggestions";
6
+ import { useCopilotTextareaEditor } from "../../hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor";
7
+ import { usePopulateCopilotTextareaRef } from "../../hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref";
8
+ import {
9
+ getFullEditorTextWithNewlines,
10
+ getTextAroundCollapsedCursor,
11
+ } from "../../lib/get-text-around-cursor";
12
+ import { addAutocompletionsToEditor } from "../../lib/slatejs-edits/add-autocompletions";
13
+ import { clearAutocompletionsFromEditor } from "../../lib/slatejs-edits/clear-autocompletions";
14
+ import { replaceEditorText } from "../../lib/slatejs-edits/replace-text";
15
+ import { BaseAutosuggestionsConfig, defaultBaseAutosuggestionsConfig } from "../../types/base";
16
+ import { AutosuggestionState } from "../../types/base/autosuggestion-state";
17
+ import { BaseCopilotTextareaProps } from "../../types/base/base-copilot-textarea-props";
18
+ import "./base-copilot-textarea.css";
19
+ import { HoveringToolbar } from "../hovering-toolbar/hovering-toolbar";
20
+ import { makeRenderElementFunction } from "./render-element";
21
+ import { makeRenderPlaceholderFunction } from "./render-placeholder";
22
+ import { useAddBrandingCss } from "./use-add-branding-css";
23
+ import {
24
+ HoveringEditorProvider,
25
+ useHoveringEditorContext,
26
+ } from "../hovering-toolbar/hovering-editor-provider";
27
+ import { TrackerTextEditedSinceLastCursorMovement } from "./track-cursor-moved-since-last-text-change";
28
+
29
+ /**
30
+ * Purpose: to be used as the `ref` type for `CopilotTextarea` and `BaseCopilotTextarea`.
31
+ *
32
+ * This interface extends `HTMLElement`, and is the subset of `HTMLTextAreaElement` that "actually matters".
33
+ * It provides the core functionality that consumers of `HTMLTextAreaElement` need 99.9% of the time:
34
+ * - `value`: the current value of the textarea
35
+ * - `focus`: make the textarea focused
36
+ * - `blur`: make the textarea unfocused
37
+ */
38
+ export interface HTMLCopilotTextAreaElement extends HTMLElement {
39
+ /**
40
+ * The current value of the textarea.
41
+ */
42
+ value: string;
43
+
44
+ /**
45
+ * focus on the textarea
46
+ */
47
+ focus: () => void;
48
+
49
+ /**
50
+ * unfocus the textarea.
51
+ *
52
+ * Called `blur` for syntactic compatibility with `HTMLTextAreaElement`.
53
+ */
54
+ blur: () => void;
55
+ }
56
+
57
+ /**
58
+ * Not intended for direct use. Use CopilotTextarea instead.
59
+ *
60
+ * The `BaseCopilotTextarea` includes the basic UX component,
61
+ * without the business logic / AI logic that makes the content useful and coherent.
62
+ *
63
+ * It is useful if you want to build your own backend, with fully custom business logic
64
+ * for figuring out which contnet to fill in.
65
+ */
66
+ export const BaseCopilotTextarea = React.forwardRef(
67
+ (props: BaseCopilotTextareaProps, ref: React.Ref<HTMLCopilotTextAreaElement>) => {
68
+ return (
69
+ <HoveringEditorProvider>
70
+ <BaseCopilotTextareaWithHoveringContext {...props} ref={ref} />
71
+ </HoveringEditorProvider>
72
+ );
73
+ },
74
+ );
75
+
76
+ /**
77
+ * Not intended for direct use. Use `CopilotTextarea` instead.
78
+ *
79
+ * This is the private core of the `BaseCopilotTextarea` component.
80
+ * For practical purposes the implementation is cleaner assuming containment in a `HoveringEditorProviderContext`.
81
+ *
82
+ * Therefore we separate the core logic into this component,
83
+ * and wrap it in a `HoveringEditorProviderContext` in `BaseCopilotTextarea`.
84
+ */
85
+ const BaseCopilotTextareaWithHoveringContext = React.forwardRef(
86
+ (props: BaseCopilotTextareaProps, ref: React.Ref<HTMLCopilotTextAreaElement>) => {
87
+ const autosuggestionsConfig: BaseAutosuggestionsConfig = {
88
+ ...defaultBaseAutosuggestionsConfig,
89
+ ...props.baseAutosuggestionsConfig,
90
+ };
91
+
92
+ const valueOnInitialRender = useMemo(() => props.value ?? "", []);
93
+ const [lastKnownFullEditorText, setLastKnownFullEditorText] = useState(valueOnInitialRender);
94
+ const [cursorMovedSinceLastTextChange, setCursorMovedSinceLastTextChange] = useState(false);
95
+
96
+ // // When the editor text changes, we want to reset the `textEditedSinceLastCursorMovement` state.
97
+ // useEffect(() => {
98
+ // setCursorMovedSinceLastTextChange(false);
99
+ // }, [lastKnownFullEditorText]);
100
+
101
+ const initialValue: Descendant[] = useMemo(() => {
102
+ return [
103
+ {
104
+ type: "paragraph",
105
+ children: [{ text: valueOnInitialRender }],
106
+ },
107
+ ];
108
+ }, [valueOnInitialRender]);
109
+
110
+ const editor = useCopilotTextareaEditor();
111
+
112
+ const { isDisplayed: hoveringEditorIsDisplayed, setIsDisplayed: setHoveringEditorIsDisplayed } =
113
+ useHoveringEditorContext();
114
+
115
+ const insertText = useCallback(
116
+ (autosuggestion: AutosuggestionState) => {
117
+ Editor.insertText(editor, autosuggestion.text, {
118
+ at: autosuggestion.point,
119
+ });
120
+ },
121
+ [editor],
122
+ );
123
+
124
+ const shouldDisableAutosuggestions =
125
+ // textarea is manually disabled:
126
+ autosuggestionsConfig.disabled ||
127
+ // hovering editor is displayed:
128
+ hoveringEditorIsDisplayed ||
129
+ // the cursor has moved since the last text change AND we are configured to disable autosuggestions in this case:
130
+ (cursorMovedSinceLastTextChange &&
131
+ autosuggestionsConfig.temporarilyDisableWhenMovingCursorWithoutChangingText);
132
+
133
+ const {
134
+ currentAutocompleteSuggestion,
135
+ onChangeHandler: onChangeHandlerForAutocomplete,
136
+ onKeyDownHandler: onKeyDownHandlerForAutocomplete,
137
+ onTouchStartHandler: onTouchStartHandlerForAutocomplete,
138
+ } = useAutosuggestions(
139
+ autosuggestionsConfig.debounceTime,
140
+ autosuggestionsConfig.shouldAcceptAutosuggestionOnKeyPress,
141
+ autosuggestionsConfig.shouldAcceptAutosuggestionOnTouch,
142
+ autosuggestionsConfig.apiConfig.autosuggestionsFunction,
143
+ insertText,
144
+ autosuggestionsConfig.disableWhenEmpty,
145
+ shouldDisableAutosuggestions,
146
+ );
147
+
148
+ const onKeyDownHandlerForHoveringEditor = useCallback(
149
+ (event: React.KeyboardEvent<HTMLDivElement>) => {
150
+ if (
151
+ autosuggestionsConfig.shouldToggleHoveringEditorOnKeyPress(event, props.shortcut ?? "k")
152
+ ) {
153
+ event.preventDefault();
154
+ setHoveringEditorIsDisplayed(!hoveringEditorIsDisplayed);
155
+ }
156
+ },
157
+ [
158
+ hoveringEditorIsDisplayed,
159
+ setHoveringEditorIsDisplayed,
160
+ autosuggestionsConfig.shouldToggleHoveringEditorOnKeyPress,
161
+ ],
162
+ );
163
+
164
+ // sync autosuggestions state with the editor
165
+ useEffect(() => {
166
+ clearAutocompletionsFromEditor(editor);
167
+ if (currentAutocompleteSuggestion) {
168
+ addAutocompletionsToEditor(
169
+ editor,
170
+ currentAutocompleteSuggestion.text,
171
+ currentAutocompleteSuggestion.point,
172
+ );
173
+ }
174
+ }, [currentAutocompleteSuggestion]);
175
+
176
+ const suggestionStyleAugmented: React.CSSProperties = useMemo(() => {
177
+ return {
178
+ fontStyle: "italic",
179
+ color: "gray",
180
+ ...props.suggestionsStyle,
181
+ };
182
+ }, [props.suggestionsStyle]);
183
+
184
+ const renderElementMemoized = useMemo(() => {
185
+ return makeRenderElementFunction(suggestionStyleAugmented);
186
+ }, [suggestionStyleAugmented]);
187
+
188
+ const renderPlaceholderMemoized = useMemo(() => {
189
+ // For some reason slateJS specifies a top value of 0, which makes for strange styling. We override this here.
190
+ const placeholderStyleSlatejsOverrides: React.CSSProperties = {
191
+ top: undefined,
192
+ };
193
+
194
+ const placeholderStyleAugmented: React.CSSProperties = {
195
+ ...placeholderStyleSlatejsOverrides,
196
+ ...props.placeholderStyle,
197
+ };
198
+
199
+ return makeRenderPlaceholderFunction(placeholderStyleAugmented);
200
+ }, [props.placeholderStyle]);
201
+
202
+ // update the editor text, but only when the value changes from outside the component
203
+ useEffect(() => {
204
+ if (props.value === lastKnownFullEditorText) {
205
+ return;
206
+ }
207
+
208
+ setLastKnownFullEditorText(props.value ?? "");
209
+ replaceEditorText(editor, props.value ?? "");
210
+ }, [props.value]);
211
+
212
+ // separate into TextareaHTMLAttributes<HTMLDivElement> and CopilotTextareaProps
213
+ const {
214
+ placeholderStyle,
215
+ value,
216
+ hoverMenuClassname,
217
+ onValueChange,
218
+ baseAutosuggestionsConfig: autosuggestionsConfigFromProps,
219
+ className,
220
+ onChange,
221
+ onKeyDown,
222
+ disableBranding,
223
+ ...propsToForward
224
+ } = props;
225
+
226
+ useAddBrandingCss(suggestionStyleAugmented, disableBranding);
227
+ usePopulateCopilotTextareaRef(editor, ref);
228
+
229
+ const moddedClassName = (() => {
230
+ const baseClassName = "copilot-textarea";
231
+ const brandingClass = disableBranding ? "no-branding" : "with-branding";
232
+ const defaultTailwindClassName = "bg-white overflow-y-auto resize-y";
233
+ const mergedClassName = twMerge(defaultTailwindClassName, className ?? "");
234
+ return `${baseClassName} ${brandingClass} ${mergedClassName}`;
235
+ })();
236
+
237
+ return (
238
+ <Slate
239
+ editor={editor}
240
+ initialValue={initialValue}
241
+ onChange={(value) => {
242
+ const newEditorState = getTextAroundCollapsedCursor(editor);
243
+
244
+ const fullEditorText = newEditorState
245
+ ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor
246
+ : getFullEditorTextWithNewlines(editor); // we don't double-parse the editor. When `newEditorState` is null, we didn't parse the editor yet.
247
+
248
+ setLastKnownFullEditorText((prev) => {
249
+ if (prev !== fullEditorText) {
250
+ setCursorMovedSinceLastTextChange(false);
251
+ }
252
+ return fullEditorText;
253
+ });
254
+ onChangeHandlerForAutocomplete(newEditorState);
255
+
256
+ props.onValueChange?.(fullEditorText);
257
+ props.onChange?.(makeSemiFakeReactTextAreaEvent(fullEditorText));
258
+ }}
259
+ >
260
+ <TrackerTextEditedSinceLastCursorMovement
261
+ setCursorMovedSinceLastTextChange={setCursorMovedSinceLastTextChange}
262
+ />
263
+ <HoveringToolbar
264
+ apiConfig={autosuggestionsConfig.apiConfig}
265
+ contextCategories={autosuggestionsConfig.contextCategories}
266
+ hoverMenuClassname={hoverMenuClassname}
267
+ />
268
+ <Editable
269
+ renderElement={renderElementMemoized}
270
+ renderPlaceholder={renderPlaceholderMemoized}
271
+ onKeyDown={(event) => {
272
+ onKeyDownHandlerForHoveringEditor(event); // forward the event for internal use
273
+ onKeyDownHandlerForAutocomplete(event); // forward the event for internal use
274
+ props.onKeyDown?.(event); // forward the event for external use
275
+ }}
276
+ onTouchStart={(event) => {
277
+ onTouchStartHandlerForAutocomplete(event); // forward the event for internal use
278
+ }}
279
+ data-testid="copilot-textarea-editable"
280
+ className={moddedClassName}
281
+ onBlur={(ev) => {
282
+ // clear autocompletion on blur
283
+ props.onBlur?.(ev);
284
+ clearAutocompletionsFromEditor(editor);
285
+ }}
286
+ {...propsToForward}
287
+ />
288
+ </Slate>
289
+ );
290
+ },
291
+ );
292
+
293
+ // Consumers of <textarea> expect a `onChange: (React.ChangeEvent<HTMLTextAreaElement>) => void` event handler to be passed in.
294
+ // This is *extremely* common, and we want to support it.
295
+ //
296
+ // We can't support the full functionality, but in 99% of cases, the consumer only cares about the `event.target.value` property --
297
+ // that's how they get the new value of the textarea.
298
+ //
299
+ // So, the tradeoff we are making is minimizing compiler complaint, with a small chance of runtime error.
300
+ // The alternative would be defining a different onChange entrypoint (we actually do have that in `onValueChange`),
301
+ // And starting to explain subtleties to users the moment they try to use the component for the first time for very basic functionality.
302
+ //
303
+ // If this proves problematic, we can always revisit this decision.
304
+ function makeSemiFakeReactTextAreaEvent(
305
+ currentText: string,
306
+ ): React.ChangeEvent<HTMLTextAreaElement> {
307
+ return {
308
+ target: {
309
+ value: currentText,
310
+ type: "copilot-textarea",
311
+ },
312
+ currentTarget: {
313
+ value: currentText,
314
+ type: "copilot-textarea",
315
+ },
316
+ } as React.ChangeEvent<HTMLTextAreaElement>;
317
+ }
@@ -0,0 +1,39 @@
1
+ import { RenderElementProps } from "slate-react";
2
+
3
+ export type RenderElementFunction = (props: RenderElementProps) => JSX.Element;
4
+
5
+ export function makeRenderElementFunction(
6
+ suggestionsStyle: React.CSSProperties,
7
+ ): RenderElementFunction {
8
+ return (props: RenderElementProps) => {
9
+ switch (props.element.type) {
10
+ case "paragraph":
11
+ return <DefaultElement {...props} />;
12
+ case "suggestion":
13
+ return <SuggestionElement {...props} suggestionsStyle={suggestionsStyle} />;
14
+ }
15
+ };
16
+ }
17
+
18
+ const DefaultElement = (props: RenderElementProps) => {
19
+ return <div {...props.attributes}>{props.children}</div>;
20
+ };
21
+ const SuggestionElement = (
22
+ props: RenderElementProps & {
23
+ suggestionsStyle: React.CSSProperties;
24
+ },
25
+ ) => {
26
+ return (
27
+ <span
28
+ {...props.attributes}
29
+ style={{
30
+ ...props.suggestionsStyle,
31
+ }}
32
+ data-testid="suggestion"
33
+ contentEditable={false}
34
+ >
35
+ {props.children /* https://github.com/ianstormtaylor/slate/issues/3930 */}
36
+ {props.element.type === "suggestion" && props.element.content}
37
+ </span>
38
+ );
39
+ };
@@ -0,0 +1,23 @@
1
+ import { RenderPlaceholderProps } from "slate-react";
2
+
3
+ export type RenderPlaceholderFunction = (props: RenderPlaceholderProps) => JSX.Element;
4
+
5
+ export function makeRenderPlaceholderFunction(
6
+ placeholderStyle?: React.CSSProperties,
7
+ ): RenderPlaceholderFunction {
8
+ return (props: RenderPlaceholderProps) => {
9
+ const { style, ...restAttributes } = props.attributes;
10
+
11
+ return (
12
+ <div
13
+ {...restAttributes}
14
+ style={{
15
+ ...style,
16
+ ...placeholderStyle,
17
+ }}
18
+ >
19
+ {props.children}
20
+ </div>
21
+ );
22
+ };
23
+ }
@@ -0,0 +1,80 @@
1
+ import { 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
+ ) {
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
+
33
+ type RelevantEditorState = {
34
+ selection: BaseSelection;
35
+ text: string;
36
+ };
37
+
38
+ const cursorChangedWithoutTextChanged = (
39
+ prev: RelevantEditorState,
40
+ next: RelevantEditorState,
41
+ ): boolean => {
42
+ // Check if the selection has changed
43
+ const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);
44
+
45
+ // Check if the text content remains the same
46
+ const isTextSame = prev.text === next.text;
47
+
48
+ return isSelectionChanged && isTextSame;
49
+ };
50
+
51
+ const isSelectionEqual = (a: BaseSelection, b: BaseSelection) => {
52
+ if (!a && !b) return true;
53
+ if (!a || !b) return false;
54
+ return Range.equals(a, b);
55
+ };
56
+
57
+ /**
58
+ * Easily keep track of the *previous* value of a variable.
59
+ *
60
+ * Example:
61
+ * ```
62
+ * const [count, setCount] = useState(0);
63
+ * const prevCount = usePrevious(count);
64
+ *
65
+ * useEffect(() => {
66
+ * if (count > prevCount) {
67
+ * console.log('Now I know that count is bigger than before');
68
+ * }
69
+ * }, [count, prevCount]);
70
+ * ```
71
+ */
72
+ function usePrevious<T>(value: T): T | undefined {
73
+ const ref = useRef<T>();
74
+
75
+ useEffect(() => {
76
+ ref.current = value;
77
+ });
78
+
79
+ return ref.current;
80
+ }
@@ -0,0 +1,74 @@
1
+ import { useEffect } from "react";
2
+
3
+ export function useAddBrandingCss(
4
+ suggestionStyleAugmented: React.CSSProperties,
5
+ disableBranding: boolean | undefined,
6
+ ) {
7
+ const cssSelector = ".copilot-textarea.with-branding";
8
+ useEffect(() => {
9
+ if (disableBranding) {
10
+ return;
11
+ }
12
+
13
+ // ---
14
+ // 1: Add the CSS to the DOM
15
+ const styleEl = document.createElement("style");
16
+ styleEl.id = "dynamic-styles";
17
+
18
+ // Build the CSS string dynamically
19
+ let dynamicStyles = Object.entries(suggestionStyleAugmented)
20
+ .map(([key, value]) => {
21
+ const kebabCaseKey = key.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, "$1-$2").toLowerCase();
22
+ return `${kebabCaseKey}: ${value};`;
23
+ })
24
+ .join(" ");
25
+
26
+ // Append overrides for italics and font-size
27
+ dynamicStyles += `font-style: normal; font-size: x-small;`;
28
+ dynamicStyles += `content: "CopilotKit";`;
29
+ dynamicStyles += `bottom: 6px;`;
30
+ dynamicStyles += `right: 6px;`;
31
+ dynamicStyles += `pointer-events: none;`;
32
+ dynamicStyles += `font-weight: 200;`;
33
+ dynamicStyles += `padding: 0;`;
34
+ dynamicStyles += `margin: 0;`;
35
+ dynamicStyles += `border: 0;`;
36
+ dynamicStyles += `line-height: 1;`;
37
+ dynamicStyles += `position: absolute;`;
38
+
39
+ // Append it to the ::after class
40
+ styleEl.innerHTML = `
41
+ ${cssSelector}::after {
42
+ ${dynamicStyles}
43
+ }
44
+ `;
45
+
46
+ document.head.appendChild(styleEl);
47
+
48
+ // ---
49
+ // 2: Add the scroll listener (to keep the branding in the bottom right as the textarea scrolls)
50
+ const textarea = document.querySelector(cssSelector);
51
+ const handleScroll = () => {
52
+ const styleEl = document.getElementById("dynamic-styles");
53
+ if (styleEl && textarea) {
54
+ const offsetFromBottom = -textarea.scrollTop + 6;
55
+ const offsetFromRight = -textarea.scrollLeft + 6;
56
+ styleEl.innerHTML = `
57
+ ${cssSelector}::after {
58
+ ${dynamicStyles}
59
+ bottom: ${offsetFromBottom}px;
60
+ right: ${offsetFromRight}px;
61
+ }
62
+ `;
63
+ }
64
+ };
65
+
66
+ textarea?.addEventListener("scroll", handleScroll);
67
+
68
+ // Cleanup
69
+ return () => {
70
+ document.getElementById("dynamic-styles")?.remove();
71
+ textarea?.removeEventListener("scroll", handleScroll);
72
+ };
73
+ }, [disableBranding, suggestionStyleAugmented]);
74
+ }