@copilotkit/react-textarea 0.0.0-0.0.0-max-changeset-10101010101010-20260109191632

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