@copilotkit/react-textarea 0.19.0-alpha.4 → 0.19.0-alpha.6

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 (220) hide show
  1. package/.turbo/turbo-build.log +174 -178
  2. package/CHANGELOG.md +20 -0
  3. package/dist/chunk-2NURR2DX.mjs +47 -0
  4. package/dist/chunk-2NURR2DX.mjs.map +1 -0
  5. package/dist/chunk-4S5ZJH3I.mjs +18 -0
  6. package/dist/chunk-4S5ZJH3I.mjs.map +1 -0
  7. package/dist/chunk-55EGOC5T.mjs +87 -0
  8. package/dist/chunk-55EGOC5T.mjs.map +1 -0
  9. package/dist/chunk-5ARCOTW3.mjs +34 -0
  10. package/dist/chunk-5ARCOTW3.mjs.map +1 -0
  11. package/dist/chunk-5EJ5XOGP.mjs +22 -0
  12. package/dist/chunk-5EJ5XOGP.mjs.map +1 -0
  13. package/dist/chunk-5FO6ISW4.mjs +3 -0
  14. package/dist/chunk-5FO6ISW4.mjs.map +1 -0
  15. package/dist/chunk-6XP7KEMW.mjs +20 -0
  16. package/dist/chunk-6XP7KEMW.mjs.map +1 -0
  17. package/dist/chunk-A2RRLD23.mjs +69 -0
  18. package/dist/chunk-A2RRLD23.mjs.map +1 -0
  19. package/dist/chunk-CSGFJU3L.mjs +65 -0
  20. package/dist/chunk-CSGFJU3L.mjs.map +1 -0
  21. package/dist/chunk-D7SEV5PR.mjs +12 -0
  22. package/dist/chunk-D7SEV5PR.mjs.map +1 -0
  23. package/dist/chunk-DE5K76I2.mjs +3 -0
  24. package/dist/chunk-DE5K76I2.mjs.map +1 -0
  25. package/dist/chunk-F3MHL6ZY.mjs +25 -0
  26. package/dist/chunk-F3MHL6ZY.mjs.map +1 -0
  27. package/dist/chunk-FBDXI5QA.mjs +501 -0
  28. package/dist/chunk-FBDXI5QA.mjs.map +1 -0
  29. package/dist/chunk-FN7GDKKG.mjs +29 -0
  30. package/dist/chunk-FN7GDKKG.mjs.map +1 -0
  31. package/dist/chunk-H4VKQGVU.mjs +3 -0
  32. package/dist/chunk-H4VKQGVU.mjs.map +1 -0
  33. package/dist/chunk-HAFHLU4N.mjs +55 -0
  34. package/dist/chunk-HAFHLU4N.mjs.map +1 -0
  35. package/dist/chunk-IU3WTXLQ.mjs +3 -0
  36. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  37. package/dist/chunk-IWTOQKC5.mjs +201 -0
  38. package/dist/chunk-IWTOQKC5.mjs.map +1 -0
  39. package/dist/chunk-IXJ2HCOA.mjs +101 -0
  40. package/dist/chunk-IXJ2HCOA.mjs.map +1 -0
  41. package/dist/chunk-JAFCXEPU.mjs +10 -0
  42. package/dist/chunk-JAFCXEPU.mjs.map +1 -0
  43. package/dist/chunk-KCHYD3EB.mjs +107 -0
  44. package/dist/chunk-KCHYD3EB.mjs.map +1 -0
  45. package/dist/chunk-KGKLUWKW.mjs +47 -0
  46. package/dist/chunk-KGKLUWKW.mjs.map +1 -0
  47. package/dist/chunk-L7VVZH4Q.mjs +3 -0
  48. package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
  49. package/dist/chunk-LNAIMEB2.mjs +34 -0
  50. package/dist/chunk-LNAIMEB2.mjs.map +1 -0
  51. package/dist/chunk-MMVDU6DF.mjs +3 -0
  52. package/dist/chunk-MMVDU6DF.mjs.map +1 -0
  53. package/dist/chunk-MPME5BW2.mjs +59 -0
  54. package/dist/chunk-MPME5BW2.mjs.map +1 -0
  55. package/dist/chunk-MRXNTQOX.mjs +55 -0
  56. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  57. package/dist/chunk-N4JMCC7P.mjs +44 -0
  58. package/dist/chunk-N4JMCC7P.mjs.map +1 -0
  59. package/dist/chunk-ND5PXTAW.mjs +17 -0
  60. package/dist/chunk-ND5PXTAW.mjs.map +1 -0
  61. package/dist/chunk-NKW5OU2S.mjs +33 -0
  62. package/dist/chunk-NKW5OU2S.mjs.map +1 -0
  63. package/dist/chunk-O5OWT5GE.mjs +114 -0
  64. package/dist/chunk-O5OWT5GE.mjs.map +1 -0
  65. package/dist/chunk-OD7ZMOVE.mjs +45 -0
  66. package/dist/chunk-OD7ZMOVE.mjs.map +1 -0
  67. package/dist/chunk-OELUUJZY.mjs +16 -0
  68. package/dist/chunk-OELUUJZY.mjs.map +1 -0
  69. package/dist/chunk-QL2GYGG5.mjs +19 -0
  70. package/dist/chunk-QL2GYGG5.mjs.map +1 -0
  71. package/dist/chunk-RQHOUUXQ.mjs +29 -0
  72. package/dist/chunk-RQHOUUXQ.mjs.map +1 -0
  73. package/dist/chunk-UHD44NC5.mjs +101 -0
  74. package/dist/chunk-UHD44NC5.mjs.map +1 -0
  75. package/dist/chunk-VBIJPE3H.mjs +108 -0
  76. package/dist/chunk-VBIJPE3H.mjs.map +1 -0
  77. package/dist/chunk-WADHCMPK.mjs +3 -0
  78. package/dist/chunk-WADHCMPK.mjs.map +1 -0
  79. package/dist/chunk-WJHSY5T6.mjs +3 -0
  80. package/dist/chunk-WJHSY5T6.mjs.map +1 -0
  81. package/dist/chunk-WJYQWL4I.mjs +27 -0
  82. package/dist/chunk-WJYQWL4I.mjs.map +1 -0
  83. package/dist/chunk-XA7M72ZO.mjs +106 -0
  84. package/dist/chunk-XA7M72ZO.mjs.map +1 -0
  85. package/dist/chunk-XDT7BF3V.mjs +81 -0
  86. package/dist/chunk-XDT7BF3V.mjs.map +1 -0
  87. package/dist/chunk-XHUMROEY.mjs +91 -0
  88. package/dist/chunk-XHUMROEY.mjs.map +1 -0
  89. package/dist/chunk-YQU7WG7T.mjs +83 -0
  90. package/dist/chunk-YQU7WG7T.mjs.map +1 -0
  91. package/dist/chunk-YSZ7DO3X.mjs +107 -0
  92. package/dist/chunk-YSZ7DO3X.mjs.map +1 -0
  93. package/dist/chunk-YTOPHPSG.mjs +45 -0
  94. package/dist/chunk-YTOPHPSG.mjs.map +1 -0
  95. package/dist/chunk-YW3REYX6.mjs +23 -0
  96. package/dist/chunk-YW3REYX6.mjs.map +1 -0
  97. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +33 -1870
  98. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
  99. package/dist/components/base-copilot-textarea/render-element.mjs +3 -52
  100. package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
  101. package/dist/components/base-copilot-textarea/render-placeholder.mjs +3 -46
  102. package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
  103. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +4 -86
  104. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
  105. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +3 -57
  106. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
  107. package/dist/components/copilot-textarea/copilot-textarea.mjs +43 -2339
  108. package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
  109. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +3 -22
  110. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
  111. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +3 -125
  112. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
  113. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +16 -1015
  114. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
  115. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +10 -721
  116. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
  117. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +11 -734
  118. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
  119. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +12 -734
  120. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
  121. package/dist/components/index.mjs +44 -2340
  122. package/dist/components/index.mjs.map +1 -1
  123. package/dist/components/manual-ui/chip-with-icon.mjs +6 -5
  124. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
  125. package/dist/components/source-search-box/source-search-box.mjs +10 -323
  126. package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
  127. package/dist/components/ui/button.mjs +4 -88
  128. package/dist/components/ui/button.mjs.map +1 -1
  129. package/dist/components/ui/card.mjs +7 -53
  130. package/dist/components/ui/card.mjs.map +1 -1
  131. package/dist/components/ui/command.mjs +5 -266
  132. package/dist/components/ui/command.mjs.map +1 -1
  133. package/dist/components/ui/dialog.mjs +4 -164
  134. package/dist/components/ui/dialog.mjs.map +1 -1
  135. package/dist/components/ui/label.mjs +4 -63
  136. package/dist/components/ui/label.mjs.map +1 -1
  137. package/dist/components/ui/separator.mjs +8 -50
  138. package/dist/components/ui/separator.mjs.map +1 -1
  139. package/dist/components/ui/textarea.mjs +7 -48
  140. package/dist/components/ui/textarea.mjs.map +1 -1
  141. package/dist/context/index.mjs +2 -0
  142. package/dist/context/index.mjs.map +1 -1
  143. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +6 -168
  144. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
  145. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +4 -168
  146. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
  147. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +5 -155
  148. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
  149. package/dist/hooks/index.mjs +2 -0
  150. package/dist/hooks/index.mjs.map +1 -1
  151. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +4 -90
  152. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
  153. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +4 -143
  154. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
  155. package/dist/hooks/misc/use-autosize-textarea.mjs +3 -15
  156. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
  157. package/dist/index.css +3 -0
  158. package/dist/index.css.map +1 -1
  159. package/dist/index.mjs +48 -2343
  160. package/dist/index.mjs.map +1 -1
  161. package/dist/lib/debouncer.mjs +3 -51
  162. package/dist/lib/debouncer.mjs.map +1 -1
  163. package/dist/lib/editor-to-text.mjs +3 -43
  164. package/dist/lib/editor-to-text.mjs.map +1 -1
  165. package/dist/lib/get-text-around-cursor.mjs +3 -109
  166. package/dist/lib/get-text-around-cursor.mjs.map +1 -1
  167. package/dist/lib/retry.mjs +3 -17
  168. package/dist/lib/retry.mjs.map +1 -1
  169. package/dist/lib/slatejs-edits/add-autocompletions.mjs +3 -25
  170. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
  171. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +3 -23
  172. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
  173. package/dist/lib/slatejs-edits/replace-text.mjs +3 -27
  174. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
  175. package/dist/lib/slatejs-edits/with-partial-history.mjs +3 -106
  176. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
  177. package/dist/lib/stream-promise-flatten.mjs +3 -47
  178. package/dist/lib/stream-promise-flatten.mjs.map +1 -1
  179. package/dist/lib/utils.mjs +3 -71
  180. package/dist/lib/utils.mjs.map +1 -1
  181. package/dist/lib/utils.test.mjs +1 -0
  182. package/dist/lib/utils.test.mjs.map +1 -1
  183. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +2 -0
  184. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
  185. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +9 -312
  186. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
  187. package/dist/types/autosuggestions-config/editing-api-config.mjs +4 -155
  188. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
  189. package/dist/types/autosuggestions-config/index.mjs +10 -313
  190. package/dist/types/autosuggestions-config/index.mjs.map +1 -1
  191. package/dist/types/autosuggestions-config/insertions-api-config.mjs +4 -149
  192. package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
  193. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +3 -71
  194. package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -1
  195. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +2 -0
  196. package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
  197. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +2 -0
  198. package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
  199. package/dist/types/autosuggestions-config/suggestions-api-config.mjs +4 -137
  200. package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
  201. package/dist/types/base/autosuggestion-state.mjs +2 -0
  202. package/dist/types/base/autosuggestion-state.mjs.map +1 -1
  203. package/dist/types/base/autosuggestions-bare-function.mjs +2 -0
  204. package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
  205. package/dist/types/base/base-autosuggestions-config.mjs +3 -11
  206. package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
  207. package/dist/types/base/base-copilot-textarea-props.mjs +2 -0
  208. package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
  209. package/dist/types/base/custom-editor.mjs +2 -0
  210. package/dist/types/base/custom-editor.mjs.map +1 -1
  211. package/dist/types/base/editor-autocomplete-state.mjs +4 -17
  212. package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
  213. package/dist/types/base/index.mjs +4 -11
  214. package/dist/types/base/index.mjs.map +1 -1
  215. package/dist/types/html-copilot-textarea-element.mjs +2 -0
  216. package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
  217. package/dist/types/index.mjs +12 -314
  218. package/dist/types/index.mjs.map +1 -1
  219. package/package.json +6 -5
  220. package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +40 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/render-element.tsx"],"names":[],"mappings":";;;;;;AAUe,cAkBX,YAlBW;AANR,SAAS,0BACd,kBACuB;AACvB,SAAO,CAAC,UAA8B;AACpC,YAAQ,MAAM,QAAQ,MAAM;AAAA,MAC1B,KAAK;AACH,eAAO,oBAAC,mCAAmB,MAAO;AAAA,MACpC,KAAK;AACH,eACE,oBAAC,oDAAsB,QAAtB;AAAA,UAA6B;AAAA,UAAoC;AAAA,IAExE;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,UAA8B;AACpD,SAAO,oBAAC,wCAAQ,MAAM,aAAd;AAAA,IAA2B,gBAAM;AAAA,IAAS;AACpD;AACA,IAAM,oBAAoB,CACxB,UAGG;AACH,SACE,qBAAC,yCACK,MAAM,aADX;AAAA,IAEC,OAAO,mBACF,MAAM;AAAA,IAEX,iBAAiB;AAAA,IAEhB;AAAA,YAAM;AAAA,MACN,MAAM,QAAQ,SAAS,gBAAgB,MAAM,QAAQ;AAAA;AAAA,IACxD;AAEJ","sourcesContent":["import { RenderElementProps } from \"slate-react\";\n\nexport type RenderElementFunction = (props: RenderElementProps) => JSX.Element;\n\nexport function makeRenderElementFunction(\n suggestionsStyle: React.CSSProperties\n): RenderElementFunction {\n return (props: RenderElementProps) => {\n switch (props.element.type) {\n case \"paragraph\":\n return <DefaultElement {...props} />;\n case \"suggestion\":\n return (\n <SuggestionElement {...props} suggestionsStyle={suggestionsStyle} />\n );\n }\n };\n}\n\nconst DefaultElement = (props: RenderElementProps) => {\n return <div {...props.attributes}>{props.children}</div>;\n};\nconst SuggestionElement = (\n props: RenderElementProps & {\n suggestionsStyle: React.CSSProperties;\n }\n) => {\n return (\n <span\n {...props.attributes}\n style={{\n ...props.suggestionsStyle,\n }}\n contentEditable={false}\n >\n {props.children /* https://github.com/ianstormtaylor/slate/issues/3930 */}\n {props.element.type === \"suggestion\" && props.element.content}\n </span>\n );\n};\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=out.js.map
3
+ //# sourceMappingURL=chunk-MMVDU6DF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { useEffect } from 'react';
2
+
3
+ // src/components/base-copilot-textarea/use-add-branding-css.tsx
4
+ function useAddBrandingCss(suggestionStyleAugmented, disableBranding) {
5
+ const cssSelector = ".copilot-textarea.with-branding";
6
+ useEffect(() => {
7
+ if (disableBranding) {
8
+ return;
9
+ }
10
+ const styleEl = document.createElement("style");
11
+ styleEl.id = "dynamic-styles";
12
+ let dynamicStyles = Object.entries(suggestionStyleAugmented).map(([key, value]) => {
13
+ const kebabCaseKey = key.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, "$1-$2").toLowerCase();
14
+ return `${kebabCaseKey}: ${value};`;
15
+ }).join(" ");
16
+ dynamicStyles += `font-style: normal; font-size: x-small;`;
17
+ dynamicStyles += `content: "CopilotKit";`;
18
+ dynamicStyles += `bottom: 6px;`;
19
+ dynamicStyles += `right: 6px;`;
20
+ dynamicStyles += `pointer-events: none;`;
21
+ dynamicStyles += `font-weight: 200;`;
22
+ dynamicStyles += `padding: 0;`;
23
+ dynamicStyles += `margin: 0;`;
24
+ dynamicStyles += `border: 0;`;
25
+ dynamicStyles += `line-height: 1;`;
26
+ dynamicStyles += `position: absolute;`;
27
+ styleEl.innerHTML = `
28
+ ${cssSelector}::after {
29
+ ${dynamicStyles}
30
+ }
31
+ `;
32
+ document.head.appendChild(styleEl);
33
+ const textarea = document.querySelector(cssSelector);
34
+ const handleScroll = () => {
35
+ const styleEl2 = document.getElementById("dynamic-styles");
36
+ if (styleEl2 && textarea) {
37
+ const offsetFromBottom = -textarea.scrollTop + 6;
38
+ const offsetFromRight = -textarea.scrollLeft + 6;
39
+ styleEl2.innerHTML = `
40
+ ${cssSelector}::after {
41
+ ${dynamicStyles}
42
+ bottom: ${offsetFromBottom}px;
43
+ right: ${offsetFromRight}px;
44
+ }
45
+ `;
46
+ }
47
+ };
48
+ textarea == null ? void 0 : textarea.addEventListener("scroll", handleScroll);
49
+ return () => {
50
+ var _a;
51
+ (_a = document.getElementById("dynamic-styles")) == null ? void 0 : _a.remove();
52
+ textarea == null ? void 0 : textarea.removeEventListener("scroll", handleScroll);
53
+ };
54
+ }, [disableBranding, suggestionStyleAugmented]);
55
+ }
56
+
57
+ export { useAddBrandingCss };
58
+ //# sourceMappingURL=out.js.map
59
+ //# sourceMappingURL=chunk-MPME5BW2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/use-add-branding-css.tsx"],"names":["styleEl"],"mappings":";AAAA,SAAS,iBAAiB;AAEnB,SAAS,kBACd,0BACA,iBACA;AACA,QAAM,cAAc;AACpB,YAAU,MAAM;AACd,QAAI,iBAAiB;AACnB;AAAA,IACF;AAIA,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,KAAK;AAGb,QAAI,gBAAgB,OAAO,QAAQ,wBAAwB,EACxD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,YAAM,eAAe,IAClB,QAAQ,gCAAgC,OAAO,EAC/C,YAAY;AACf,aAAO,GAAG,iBAAiB;AAAA,IAC7B,CAAC,EACA,KAAK,GAAG;AAGX,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AACjB,qBAAiB;AAGjB,YAAQ,YAAY;AAAA,QAChB;AAAA,UACE;AAAA;AAAA;AAIN,aAAS,KAAK,YAAY,OAAO;AAIjC,UAAM,WAAW,SAAS,cAAc,WAAW;AACnD,UAAM,eAAe,MAAM;AACzB,YAAMA,WAAU,SAAS,eAAe,gBAAgB;AACxD,UAAIA,YAAW,UAAU;AACvB,cAAM,mBAAmB,CAAC,SAAS,YAAY;AAC/C,cAAM,kBAAkB,CAAC,SAAS,aAAa;AAC/C,QAAAA,SAAQ,YAAY;AAAA,YAChB;AAAA,cACE;AAAA,sBACQ;AAAA,qBACD;AAAA;AAAA;AAAA,MAGf;AAAA,IACF;AAEA,yCAAU,iBAAiB,UAAU;AAGrC,WAAO,MAAM;AAtEjB;AAuEM,qBAAS,eAAe,gBAAgB,MAAxC,mBAA2C;AAC3C,2CAAU,oBAAoB,UAAU;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,iBAAiB,wBAAwB,CAAC;AAChD","sourcesContent":["import { useEffect } from \"react\";\n\nexport function useAddBrandingCss(\n suggestionStyleAugmented: React.CSSProperties,\n disableBranding: boolean | undefined\n) {\n const cssSelector = \".copilot-textarea.with-branding\";\n useEffect(() => {\n if (disableBranding) {\n return;\n }\n\n // ---\n // 1: Add the CSS to the DOM\n const styleEl = document.createElement(\"style\");\n styleEl.id = \"dynamic-styles\";\n\n // Build the CSS string dynamically\n let dynamicStyles = Object.entries(suggestionStyleAugmented)\n .map(([key, value]) => {\n const kebabCaseKey = key\n .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\")\n .toLowerCase();\n return `${kebabCaseKey}: ${value};`;\n })\n .join(\" \");\n\n // Append overrides for italics and font-size\n dynamicStyles += `font-style: normal; font-size: x-small;`;\n dynamicStyles += `content: \"CopilotKit\";`;\n dynamicStyles += `bottom: 6px;`;\n dynamicStyles += `right: 6px;`;\n dynamicStyles += `pointer-events: none;`;\n dynamicStyles += `font-weight: 200;`;\n dynamicStyles += `padding: 0;`;\n dynamicStyles += `margin: 0;`;\n dynamicStyles += `border: 0;`;\n dynamicStyles += `line-height: 1;`;\n dynamicStyles += `position: absolute;`;\n\n // Append it to the ::after class\n styleEl.innerHTML = `\n ${cssSelector}::after {\n ${dynamicStyles}\n }\n `;\n\n document.head.appendChild(styleEl);\n\n // ---\n // 2: Add the scroll listener (to keep the branding in the bottom right as the textarea scrolls)\n const textarea = document.querySelector(cssSelector);\n const handleScroll = () => {\n const styleEl = document.getElementById(\"dynamic-styles\");\n if (styleEl && textarea) {\n const offsetFromBottom = -textarea.scrollTop + 6;\n const offsetFromRight = -textarea.scrollLeft + 6;\n styleEl.innerHTML = `\n ${cssSelector}::after {\n ${dynamicStyles}\n bottom: ${offsetFromBottom}px;\n right: ${offsetFromRight}px;\n }\n `;\n }\n };\n\n textarea?.addEventListener(\"scroll\", handleScroll);\n\n // Cleanup\n return () => {\n document.getElementById(\"dynamic-styles\")?.remove();\n textarea?.removeEventListener(\"scroll\", handleScroll);\n };\n }, [disableBranding, suggestionStyleAugmented]);\n}\n"]}
@@ -0,0 +1,55 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+ var __async = (__this, __arguments, generator) => {
33
+ return new Promise((resolve, reject) => {
34
+ var fulfilled = (value) => {
35
+ try {
36
+ step(generator.next(value));
37
+ } catch (e) {
38
+ reject(e);
39
+ }
40
+ };
41
+ var rejected = (value) => {
42
+ try {
43
+ step(generator.throw(value));
44
+ } catch (e) {
45
+ reject(e);
46
+ }
47
+ };
48
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
49
+ step((generator = generator.apply(__this, __arguments)).next());
50
+ });
51
+ };
52
+
53
+ export { __async, __objRest, __spreadProps, __spreadValues };
54
+ //# sourceMappingURL=out.js.map
55
+ //# sourceMappingURL=chunk-MRXNTQOX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
@@ -0,0 +1,44 @@
1
+ import { useMakeStandardAutosuggestionFunction } from './chunk-HAFHLU4N.mjs';
2
+ import { useMakeStandardInsertionOrEditingFunction } from './chunk-VBIJPE3H.mjs';
3
+ import { BaseCopilotTextarea } from './chunk-IWTOQKC5.mjs';
4
+ import { defaultAutosuggestionsConfig } from './chunk-QL2GYGG5.mjs';
5
+ import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
6
+ import React from 'react';
7
+ import merge from 'lodash.merge';
8
+ import { jsx, Fragment } from 'react/jsx-runtime';
9
+
10
+ var CopilotTextarea = React.forwardRef(
11
+ (props, ref) => {
12
+ const autosuggestionsConfig = merge(
13
+ defaultAutosuggestionsConfig,
14
+ props.autosuggestionsConfig
15
+ );
16
+ const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(
17
+ autosuggestionsConfig.textareaPurpose,
18
+ autosuggestionsConfig.externalContextCategories,
19
+ autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig
20
+ );
21
+ const insertionOrEditingFunction = useMakeStandardInsertionOrEditingFunction(
22
+ autosuggestionsConfig.textareaPurpose,
23
+ autosuggestionsConfig.externalContextCategories,
24
+ autosuggestionsConfig.chatApiConfigs.insertionApiConfig,
25
+ autosuggestionsConfig.chatApiConfigs.editingApiConfig
26
+ );
27
+ return /* @__PURE__ */ jsx(Fragment, {
28
+ children: /* @__PURE__ */ jsx(BaseCopilotTextarea, __spreadProps(__spreadValues({
29
+ ref
30
+ }, props), {
31
+ baseAutosuggestionsConfig: __spreadProps(__spreadValues({}, autosuggestionsConfig), {
32
+ apiConfig: {
33
+ insertionOrEditingFunction,
34
+ autosuggestionsFunction
35
+ }
36
+ })
37
+ }))
38
+ });
39
+ }
40
+ );
41
+
42
+ export { CopilotTextarea };
43
+ //# sourceMappingURL=out.js.map
44
+ //# sourceMappingURL=chunk-N4JMCC7P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/copilot-textarea/copilot-textarea.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,OAAO,WAAW;AAUlB,OAAO,WAAW;AAmCZ,mBACE,WADF;AAzBC,IAAM,kBAAkB,MAAM;AAAA,EACnC,CACE,OACA,QACgB;AAChB,UAAM,wBAA+C;AAAA,MACnD;AAAA,MACA,MAAM;AAAA,IACR;AAEA,UAAM,0BAA0B;AAAA,MAC9B,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,sBAAsB,eAAe;AAAA,IACvC;AAEA,UAAM,6BACJ;AAAA,MACE,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,sBAAsB,eAAe;AAAA,MACrC,sBAAsB,eAAe;AAAA,IACvC;AAEF,WACE;AAAA,MACE,8BAAC;AAAA,QACC;AAAA,SACI,QAFL;AAAA,QAGC,2BAA2B,iCACtB,wBADsB;AAAA,UAEzB,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACF;AAAA,KACF;AAAA,EAEJ;AACF","sourcesContent":["// This example is for an Editor with `ReactEditor` and `HistoryEditor`\nimport React from \"react\";\nimport { useMakeStandardAutosuggestionFunction } from \"../../hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function\";\nimport { HTMLCopilotTextAreaElement } from \"../../types\";\nimport { BaseCopilotTextareaProps } from \"../../types/base/base-copilot-textarea-props\";\nimport {\n AutosuggestionsConfig,\n defaultAutosuggestionsConfig,\n} from \"../../types/autosuggestions-config\";\nimport { BaseCopilotTextarea } from \"../base-copilot-textarea/base-copilot-textarea\";\nimport { useMakeStandardInsertionOrEditingFunction } from \"../../hooks/make-autosuggestions-function/use-make-standard-insertion-function\";\nimport merge from \"lodash.merge\";\nimport { AutosuggestionsConfigUserSpecified } from \"../../types/autosuggestions-config/autosuggestions-config-user-specified\";\n\n// Like the base copilot textarea props,\n// but with baseAutosuggestionsConfig replaced with autosuggestionsConfig.\nexport interface CopilotTextareaProps\n extends Omit<BaseCopilotTextareaProps, \"baseAutosuggestionsConfig\"> {\n autosuggestionsConfig: AutosuggestionsConfigUserSpecified;\n}\n\nexport const CopilotTextarea = React.forwardRef(\n (\n props: CopilotTextareaProps,\n ref: React.Ref<HTMLCopilotTextAreaElement>\n ): JSX.Element => {\n const autosuggestionsConfig: AutosuggestionsConfig = merge(\n defaultAutosuggestionsConfig,\n props.autosuggestionsConfig\n );\n\n const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(\n autosuggestionsConfig.textareaPurpose,\n autosuggestionsConfig.externalContextCategories,\n autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig\n );\n\n const insertionOrEditingFunction =\n useMakeStandardInsertionOrEditingFunction(\n autosuggestionsConfig.textareaPurpose,\n autosuggestionsConfig.externalContextCategories,\n autosuggestionsConfig.chatApiConfigs.insertionApiConfig,\n autosuggestionsConfig.chatApiConfigs.editingApiConfig\n );\n\n return (\n <>\n <BaseCopilotTextarea\n ref={ref}\n {...props}\n baseAutosuggestionsConfig={{\n ...autosuggestionsConfig,\n apiConfig: {\n insertionOrEditingFunction: insertionOrEditingFunction,\n autosuggestionsFunction: autosuggestionsFunction,\n },\n }}\n />\n </>\n );\n }\n);\n"]}
@@ -0,0 +1,17 @@
1
+ import { useEffect } from 'react';
2
+
3
+ // src/hooks/misc/use-autosize-textarea.tsx
4
+ var useAutosizeTextArea = (textAreaRef, value) => {
5
+ useEffect(() => {
6
+ if (textAreaRef.current !== null) {
7
+ textAreaRef.current.style.height = "0px";
8
+ const scrollHeight = textAreaRef.current.scrollHeight;
9
+ textAreaRef.current.style.height = scrollHeight + "px";
10
+ }
11
+ }, [textAreaRef, value]);
12
+ };
13
+ var use_autosize_textarea_default = useAutosizeTextArea;
14
+
15
+ export { use_autosize_textarea_default };
16
+ //# sourceMappingURL=out.js.map
17
+ //# sourceMappingURL=chunk-ND5PXTAW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/misc/use-autosize-textarea.tsx"],"names":[],"mappings":";AAAA,SAAyB,iBAAiB;AAG1C,IAAM,sBAAsB,CAC1B,aACA,UACG;AACH,YAAU,MAAM;AACd,QAAI,YAAY,YAAY,MAAM;AAEhC,kBAAY,QAAQ,MAAM,SAAS;AACnC,YAAM,eAAe,YAAY,QAAQ;AAIzC,kBAAY,QAAQ,MAAM,SAAS,eAAe;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,aAAa,KAAK,CAAC;AACzB;AAEA,IAAO,gCAAQ","sourcesContent":["import { Ref, RefObject, useEffect } from \"react\";\n\n// Updates the height of a <textarea> when the value changes.\nconst useAutosizeTextArea = (\n textAreaRef: RefObject<HTMLTextAreaElement>,\n value: string\n) => {\n useEffect(() => {\n if (textAreaRef.current !== null) {\n // We need to reset the height momentarily to get the correct scrollHeight for the textarea\n textAreaRef.current.style.height = \"0px\";\n const scrollHeight = textAreaRef.current.scrollHeight;\n\n // We then set the height directly, outside of the render loop\n // Trying to set this with state or a ref will product an incorrect value.\n textAreaRef.current.style.height = scrollHeight + \"px\";\n }\n }, [textAreaRef, value]);\n};\n\nexport default useAutosizeTextArea;\n"]}
@@ -0,0 +1,33 @@
1
+ import { __async } from './chunk-MRXNTQOX.mjs';
2
+
3
+ // src/lib/debouncer.ts
4
+ var Debouncer = class {
5
+ constructor(wait) {
6
+ this.wait = wait;
7
+ this.debounce = (func, ...args) => __async(this, null, function* () {
8
+ this.cancel();
9
+ this.timeoutId = setTimeout(() => __async(this, null, function* () {
10
+ try {
11
+ this.activeAbortController = new AbortController();
12
+ yield func(...args, this.activeAbortController.signal);
13
+ this.activeAbortController = void 0;
14
+ } catch (error) {
15
+ }
16
+ }), this.wait);
17
+ });
18
+ this.cancel = () => {
19
+ if (this.activeAbortController) {
20
+ this.activeAbortController.abort();
21
+ this.activeAbortController = void 0;
22
+ }
23
+ if (this.timeoutId !== void 0) {
24
+ clearTimeout(this.timeoutId);
25
+ this.timeoutId = void 0;
26
+ }
27
+ };
28
+ }
29
+ };
30
+
31
+ export { Debouncer };
32
+ //# sourceMappingURL=out.js.map
33
+ //# sourceMappingURL=chunk-NKW5OU2S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/debouncer.ts"],"names":[],"mappings":";;;;;AAIO,IAAM,YAAN,MAAiC;AAAA,EAItC,YAAoB,MAAc;AAAd;AAEpB,oBAAW,CAAO,SAA2B,SAAY;AAEvD,WAAK,OAAO;AAEZ,WAAK,YAAY,WAAW,MAAY;AACtC,YAAI;AACF,eAAK,wBAAwB,IAAI,gBAAgB;AAGjD,gBAAM,KAAK,GAAG,MAAM,KAAK,sBAAsB,MAAM;AAErD,eAAK,wBAAwB;AAAA,QAC/B,SAAS,OAAP;AAAA,QAAe;AAAA,MACnB,IAAG,KAAK,IAAI;AAAA,IACd;AAEA,kBAAS,MAAM;AACb,UAAI,KAAK,uBAAuB;AAC9B,aAAK,sBAAsB,MAAM;AACjC,aAAK,wBAAwB;AAAA,MAC/B;AAEA,UAAI,KAAK,cAAc,QAAW;AAChC,qBAAa,KAAK,SAAS;AAC3B,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA,EA5BmC;AA6BrC","sourcesContent":["export type AsyncFunction<T extends any[]> = (\n ...args: [...T, AbortSignal]\n) => Promise<void>;\n\nexport class Debouncer<T extends any[]> {\n private timeoutId?: number;\n private activeAbortController?: AbortController;\n\n constructor(private wait: number) {}\n\n debounce = async (func: AsyncFunction<T>, ...args: T) => {\n // Abort the previous promise immediately\n this.cancel();\n\n this.timeoutId = setTimeout(async () => {\n try {\n this.activeAbortController = new AbortController();\n\n // Pass the signal to the async function, assuming it supports it\n await func(...args, this.activeAbortController.signal);\n\n this.activeAbortController = undefined;\n } catch (error) {}\n }, this.wait);\n };\n\n cancel = () => {\n if (this.activeAbortController) {\n this.activeAbortController.abort();\n this.activeAbortController = undefined;\n }\n\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n };\n}\n"]}
@@ -0,0 +1,114 @@
1
+ import { cn } from './chunk-KGKLUWKW.mjs';
2
+ import { __objRest, __spreadValues, __spreadProps } from './chunk-MRXNTQOX.mjs';
3
+ import * as React from 'react';
4
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
5
+ import { X } from 'lucide-react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var Dialog = DialogPrimitive.Root;
9
+ var DialogTrigger = DialogPrimitive.Trigger;
10
+ var DialogPortal = (_a) => {
11
+ var _b = _a, {
12
+ className
13
+ } = _b, props = __objRest(_b, [
14
+ "className"
15
+ ]);
16
+ return /* @__PURE__ */ jsx(DialogPrimitive.Portal, __spreadValues({
17
+ className: cn(className)
18
+ }, props));
19
+ };
20
+ DialogPortal.displayName = DialogPrimitive.Portal.displayName;
21
+ var DialogOverlay = React.forwardRef((_a, ref) => {
22
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
23
+ return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, __spreadValues({
24
+ ref,
25
+ className: cn(
26
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
27
+ className
28
+ )
29
+ }, props));
30
+ });
31
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
32
+ var DialogContent = React.forwardRef((_a, ref) => {
33
+ var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
34
+ return /* @__PURE__ */ jsxs(DialogPortal, {
35
+ children: [
36
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
37
+ /* @__PURE__ */ jsxs(DialogPrimitive.Content, __spreadProps(__spreadValues({
38
+ ref,
39
+ className: cn(
40
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",
41
+ className
42
+ )
43
+ }, props), {
44
+ children: [
45
+ children,
46
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
47
+ className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
48
+ children: [
49
+ /* @__PURE__ */ jsx(X, {
50
+ className: "h-4 w-4"
51
+ }),
52
+ /* @__PURE__ */ jsx("span", {
53
+ className: "sr-only",
54
+ children: "Close"
55
+ })
56
+ ]
57
+ })
58
+ ]
59
+ }))
60
+ ]
61
+ });
62
+ });
63
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
64
+ var DialogHeader = (_a) => {
65
+ var _b = _a, {
66
+ className
67
+ } = _b, props = __objRest(_b, [
68
+ "className"
69
+ ]);
70
+ return /* @__PURE__ */ jsx("div", __spreadValues({
71
+ className: cn(
72
+ "flex flex-col space-y-1.5 text-center sm:text-left",
73
+ className
74
+ )
75
+ }, props));
76
+ };
77
+ DialogHeader.displayName = "DialogHeader";
78
+ var DialogFooter = (_a) => {
79
+ var _b = _a, {
80
+ className
81
+ } = _b, props = __objRest(_b, [
82
+ "className"
83
+ ]);
84
+ return /* @__PURE__ */ jsx("div", __spreadValues({
85
+ className: cn(
86
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
87
+ className
88
+ )
89
+ }, props));
90
+ };
91
+ DialogFooter.displayName = "DialogFooter";
92
+ var DialogTitle = React.forwardRef((_a, ref) => {
93
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
94
+ return /* @__PURE__ */ jsx(DialogPrimitive.Title, __spreadValues({
95
+ ref,
96
+ className: cn(
97
+ "text-lg font-semibold leading-none tracking-tight",
98
+ className
99
+ )
100
+ }, props));
101
+ });
102
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
103
+ var DialogDescription = React.forwardRef((_a, ref) => {
104
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
105
+ return /* @__PURE__ */ jsx(DialogPrimitive.Description, __spreadValues({
106
+ ref,
107
+ className: cn("text-sm text-muted-foreground", className)
108
+ }, props));
109
+ });
110
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
111
+
112
+ export { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger };
113
+ //# sourceMappingURL=out.js.map
114
+ //# sourceMappingURL=chunk-O5OWT5GE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/dialog.tsx"],"names":[],"mappings":";;;;;;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAS;AAYhB,cAkCI,YAlCJ;AAhBF;AAQA,IAAM,SAAyB;AAE/B,IAAM,gBAAgC;AAEtC,IAAM,eAAe,CAAC,OAGgB;AAHhB,eACpB;AAAA;AAAA,EAbF,IAYsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAiB,wBAAhB;AAAA,IAAuB,WAAW,GAAG,SAAS;AAAA,KAAO,MAAO;AAAA;AAE/D,aAAa,cAA8B,uBAAO;AAElD,IAAM,gBAAsB,iBAG1B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvBL,IAuBG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,yBAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,gBAAsB,iBAG1B,CAAC,IAAmC,QAAK;AAAxC,eAAE,aAAW,SAtChB,IAsCG,IAA0B,kBAA1B,IAA0B,CAAxB,aAAW;AACd,8BAAC;AAAA,IACC;AAAA,0BAAC,iBAAc;AAAA,MACf,qBAAiB,yBAAhB;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,SACI,QANL;AAAA,QAQE;AAAA;AAAA,UACD,qBAAiB,uBAAhB;AAAA,YAAsB,WAAU;AAAA,YAC/B;AAAA,kCAAC;AAAA,gBAAE,WAAU;AAAA,eAAU;AAAA,cACvB,oBAAC;AAAA,gBAAK,WAAU;AAAA,gBAAU;AAAA,eAAK;AAAA;AAAA,WACjC;AAAA;AAAA,QACF;AAAA;AAAA,GACF;AAAA,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,eAAe,CAAC,OAGmB;AAHnB,eACpB;AAAA;AAAA,EA5DF,IA2DsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAC;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA;AAEF,aAAa,cAAc;AAE3B,IAAM,eAAe,CAAC,OAGmB;AAHnB,eACpB;AAAA;AAAA,EA1EF,IAyEsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAC;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA;AAEF,aAAa,cAAc;AAE3B,IAAM,cAAoB,iBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA1FL,IA0FG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,uBAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,oBAA0B,iBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAzGL,IAyGG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,6BAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,KACpD,MACN;AAAA,CACD;AACD,kBAAkB,cAA8B,4BAAY","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = ({\n className,\n ...props\n}: DialogPrimitive.DialogPortalProps) => (\n <DialogPrimitive.Portal className={cn(className)} {...props} />\n);\nDialogPortal.displayName = DialogPrimitive.Portal.displayName;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"]}
@@ -0,0 +1,45 @@
1
+ import { editorToText } from './chunk-YTOPHPSG.mjs';
2
+ import { useEffect, useRef } from 'react';
3
+ import { useSlateSelector } from 'slate-react';
4
+ import { Range } from 'slate';
5
+ import { jsx, Fragment } from 'react/jsx-runtime';
6
+
7
+ function TrackerTextEditedSinceLastCursorMovement(props) {
8
+ const cursorState = useSlateSelector((state) => ({
9
+ selection: state.selection,
10
+ text: editorToText(state)
11
+ }));
12
+ const previousState = usePrevious(cursorState);
13
+ useEffect(() => {
14
+ if (!previousState) {
15
+ return;
16
+ }
17
+ if (cursorChangedWithoutTextChanged(previousState, cursorState)) {
18
+ props.setCursorMovedSinceLastTextChange(true);
19
+ }
20
+ }, [props.setCursorMovedSinceLastTextChange, cursorState]);
21
+ return /* @__PURE__ */ jsx(Fragment, {});
22
+ }
23
+ var cursorChangedWithoutTextChanged = (prev, next) => {
24
+ const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);
25
+ const isTextSame = prev.text === next.text;
26
+ return isSelectionChanged && isTextSame;
27
+ };
28
+ var isSelectionEqual = (a, b) => {
29
+ if (!a && !b)
30
+ return true;
31
+ if (!a || !b)
32
+ return false;
33
+ return Range.equals(a, b);
34
+ };
35
+ function usePrevious(value) {
36
+ const ref = useRef();
37
+ useEffect(() => {
38
+ ref.current = value;
39
+ });
40
+ return ref.current;
41
+ }
42
+
43
+ export { TrackerTextEditedSinceLastCursorMovement };
44
+ //# sourceMappingURL=out.js.map
45
+ //# sourceMappingURL=chunk-OD7ZMOVE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx"],"names":[],"mappings":";;;;;AAAA,SAAgB,WAAW,cAAc;AAEzC,SAAS,wBAAwB;AACjC,SAAS,aAAa;AA0Bb;AApBF,SAAS,yCACd,OACa;AACb,QAAM,cAAmC,iBAAiB,CAAC,WAAW;AAAA,IACpE,WAAW,MAAM;AAAA,IACjB,MAAM,aAAa,KAAK;AAAA,EAC1B,EAAE;AAEF,QAAM,gBAAgB,YAAY,WAAW;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,QAAI,gCAAgC,eAAe,WAAW,GAAG;AAC/D,YAAM,kCAAkC,IAAI;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,MAAM,mCAAmC,WAAW,CAAC;AAEzD,SAAO,gCAAE;AACX;AAKA,IAAM,kCAAkC,CACtC,MACA,SACG;AAEH,QAAM,qBAAqB,CAAC,iBAAiB,KAAK,WAAW,KAAK,SAAS;AAG3E,QAAM,aAAa,KAAK,SAAS,KAAK;AAEtC,SAAO,sBAAsB;AAC/B;AACA,IAAM,mBAAmB,CAAC,GAAkB,MAAqB;AAC/D,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,SAAO,MAAM,OAAO,GAAG,CAAC;AAC1B;AACA,SAAS,YAAe,OAAyB;AAC/C,QAAM,MAAM,OAAU;AAEtB,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO,IAAI;AACb","sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { BaseSelection } from \"slate\";\nimport { useSlateSelector } from \"slate-react\";\nimport { Range } from \"slate\";\nimport { editorToText } from \"../../lib/editor-to-text\";\n\ninterface TrackerTextEditedSinceLastCursorMovementProps {\n setCursorMovedSinceLastTextChange: (value: boolean) => void;\n}\nexport function TrackerTextEditedSinceLastCursorMovement(\n props: TrackerTextEditedSinceLastCursorMovementProps\n): JSX.Element {\n const cursorState: RelevantEditorState = useSlateSelector((state) => ({\n selection: state.selection,\n text: editorToText(state),\n }));\n\n const previousState = usePrevious(cursorState);\n\n useEffect(() => {\n if (!previousState) {\n return;\n }\n\n if (cursorChangedWithoutTextChanged(previousState, cursorState)) {\n props.setCursorMovedSinceLastTextChange(true);\n }\n }, [props.setCursorMovedSinceLastTextChange, cursorState]);\n\n return <></>;\n}\ntype RelevantEditorState = {\n selection: BaseSelection;\n text: string;\n};\nconst cursorChangedWithoutTextChanged = (\n prev: RelevantEditorState,\n next: RelevantEditorState\n) => {\n // Check if the selection has changed\n const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);\n\n // Check if the text content remains the same\n const isTextSame = prev.text === next.text;\n\n return isSelectionChanged && isTextSame;\n};\nconst isSelectionEqual = (a: BaseSelection, b: BaseSelection) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return Range.equals(a, b);\n};\nfunction usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { __objRest, __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ function makeRenderPlaceholderFunction(placeholderStyle) {
5
+ return (props) => {
6
+ const _a = props.attributes, { style } = _a, restAttributes = __objRest(_a, ["style"]);
7
+ return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, restAttributes), {
8
+ style: __spreadValues(__spreadValues({}, style), placeholderStyle),
9
+ children: props.children
10
+ }));
11
+ };
12
+ }
13
+
14
+ export { makeRenderPlaceholderFunction };
15
+ //# sourceMappingURL=out.js.map
16
+ //# sourceMappingURL=chunk-OELUUJZY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/render-placeholder.tsx"],"names":[],"mappings":";;;;;;;AAaM;AAPC,SAAS,8BACd,kBAC2B;AAC3B,SAAO,CAAC,UAAkC;AACxC,UAAqC,WAAM,YAAnC,QAVZ,IAUyC,IAAnB,2BAAmB,IAAnB,CAAV;AAER,WACE,oBAAC,wCACK,iBADL;AAAA,MAEC,OAAO,kCACF,QACA;AAAA,MAGJ,gBAAM;AAAA,MACT;AAAA,EAEJ;AACF","sourcesContent":["import { RenderElementProps, RenderPlaceholderProps } from \"slate-react\";\n\nexport type RenderPlaceholderFunction = (\n props: RenderPlaceholderProps\n) => JSX.Element;\n\nexport function makeRenderPlaceholderFunction(\n placeholderStyle?: React.CSSProperties\n): RenderPlaceholderFunction {\n return (props: RenderPlaceholderProps) => {\n const { style, ...restAttributes } = props.attributes;\n\n return (\n <div\n {...restAttributes}\n style={{\n ...style,\n ...placeholderStyle,\n }}\n >\n {props.children}\n </div>\n );\n };\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { defaultEditingApiConfig } from './chunk-55EGOC5T.mjs';
2
+ import { defaultInsertionsApiConfig } from './chunk-XDT7BF3V.mjs';
3
+ import { defaultSuggestionsApiConfig } from './chunk-A2RRLD23.mjs';
4
+ import { defaultBaseAutosuggestionsConfig } from './chunk-D7SEV5PR.mjs';
5
+ import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
6
+
7
+ // src/types/autosuggestions-config/autosuggestions-config.tsx
8
+ var defaultAutosuggestionsConfig = __spreadProps(__spreadValues({}, defaultBaseAutosuggestionsConfig), {
9
+ externalContextCategories: void 0,
10
+ chatApiConfigs: {
11
+ suggestionsApiConfig: defaultSuggestionsApiConfig,
12
+ insertionApiConfig: defaultInsertionsApiConfig,
13
+ editingApiConfig: defaultEditingApiConfig
14
+ }
15
+ });
16
+
17
+ export { defaultAutosuggestionsConfig };
18
+ //# sourceMappingURL=out.js.map
19
+ //# sourceMappingURL=chunk-QL2GYGG5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/autosuggestions-config/autosuggestions-config.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA+BO,IAAM,+BAGT,iCACC,mCADD;AAAA,EAEF,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,IACd,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import {\n BaseAutosuggestionsConfig,\n defaultBaseAutosuggestionsConfig,\n} from \"../base\";\nimport {\n SuggestionsApiConfig,\n defaultSuggestionsApiConfig,\n} from \"./suggestions-api-config\";\nimport {\n InsertionsApiConfig,\n defaultInsertionsApiConfig,\n} from \"./insertions-api-config\";\nimport { ChatlikeApiEndpoint } from \".\";\nimport {\n EditingApiConfig,\n defaultEditingApiConfig,\n} from \"./editing-api-config\";\n\n// Like the base autosuggestions config, with 2 additional fields:\n// 1. externalContextCategories: string[] | undefined;\n// 2. instead of apiConfigs, we have chatApiConfigs: a higher-level abstraction that uses a ChatGPT-like API endpoint.\nexport interface AutosuggestionsConfig\n extends Omit<BaseAutosuggestionsConfig, \"apiConfig\"> {\n externalContextCategories: string[] | undefined;\n chatApiConfigs: {\n suggestionsApiConfig: SuggestionsApiConfig;\n insertionApiConfig: InsertionsApiConfig;\n editingApiConfig: EditingApiConfig;\n };\n}\n\nexport const defaultAutosuggestionsConfig: Omit<\n AutosuggestionsConfig,\n \"textareaPurpose\" | \"apiEndpoint\"\n> = {\n ...defaultBaseAutosuggestionsConfig,\n externalContextCategories: undefined,\n chatApiConfigs: {\n suggestionsApiConfig: defaultSuggestionsApiConfig,\n insertionApiConfig: defaultInsertionsApiConfig,\n editingApiConfig: defaultEditingApiConfig,\n },\n};\n"]}
@@ -0,0 +1,29 @@
1
+ import { Transforms, Editor } from 'slate';
2
+
3
+ // src/lib/slatejs-edits/replace-text.ts
4
+ function replaceEditorText(editor, newText) {
5
+ Transforms.delete(editor, {
6
+ at: {
7
+ anchor: Editor.start(editor, []),
8
+ focus: Editor.end(editor, [])
9
+ }
10
+ });
11
+ if (newText && newText !== "") {
12
+ Transforms.insertNodes(
13
+ editor,
14
+ [
15
+ {
16
+ type: "paragraph",
17
+ children: [{ text: newText }]
18
+ }
19
+ ],
20
+ {
21
+ at: [0]
22
+ }
23
+ );
24
+ }
25
+ }
26
+
27
+ export { replaceEditorText };
28
+ //# sourceMappingURL=out.js.map
29
+ //# sourceMappingURL=chunk-RQHOUUXQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/replace-text.ts"],"names":[],"mappings":";AAAA,SAAS,QAAQ,kBAAkB;AAE5B,SAAS,kBAAkB,QAAgB,SAAiB;AAEjE,aAAW,OAAO,QAAQ;AAAA,IACxB,IAAI;AAAA,MACF,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC/B,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF,CAAC;AAGD,MAAI,WAAW,YAAY,IAAI;AAE7B,eAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI,CAAC,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["import { Editor, Transforms } from \"slate\";\n\nexport function replaceEditorText(editor: Editor, newText: string) {\n // clear all previous text\n Transforms.delete(editor, {\n at: {\n anchor: Editor.start(editor, []),\n focus: Editor.end(editor, []),\n },\n });\n\n // insert new text\n if (newText && newText !== \"\") {\n // don't insert empty text - results in strange visual behavior\n Transforms.insertNodes(\n editor,\n [\n {\n type: \"paragraph\",\n children: [{ text: newText }],\n },\n ],\n {\n at: [0],\n }\n );\n }\n}\n"]}
@@ -0,0 +1,101 @@
1
+ import { areEqual_autocompleteState } from './chunk-JAFCXEPU.mjs';
2
+ import { nullableCompatibleEqualityCheck } from './chunk-KGKLUWKW.mjs';
3
+ import { Debouncer } from './chunk-NKW5OU2S.mjs';
4
+ import { __async } from './chunk-MRXNTQOX.mjs';
5
+ import { useState, useCallback, useMemo, useEffect } from 'react';
6
+
7
+ function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty, disabled) {
8
+ const [previousAutocompleteState, setPreviousAutocompleteState] = useState(null);
9
+ const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] = useState(null);
10
+ const awaitForAndAppendSuggestion = useCallback(
11
+ (editorAutocompleteState, abortSignal) => __async(this, null, function* () {
12
+ if (disabled) {
13
+ return;
14
+ }
15
+ if (disableWhenEmpty && editorAutocompleteState.textBeforeCursor === "" && editorAutocompleteState.textAfterCursor === "") {
16
+ return;
17
+ }
18
+ const suggestion = yield autosuggestionFunction(
19
+ editorAutocompleteState,
20
+ abortSignal
21
+ );
22
+ if (!suggestion || abortSignal.aborted) {
23
+ throw new DOMException("Aborted", "AbortError");
24
+ }
25
+ setCurrentAutocompleteSuggestion({
26
+ text: suggestion,
27
+ point: editorAutocompleteState.cursorPoint
28
+ });
29
+ }),
30
+ [
31
+ autosuggestionFunction,
32
+ setCurrentAutocompleteSuggestion,
33
+ disableWhenEmpty,
34
+ disabled
35
+ ]
36
+ );
37
+ const debouncedFunction = useMemo(
38
+ () => new Debouncer(
39
+ debounceTime
40
+ ),
41
+ [debounceTime]
42
+ );
43
+ useEffect(() => {
44
+ return () => {
45
+ debouncedFunction.cancel();
46
+ setCurrentAutocompleteSuggestion(null);
47
+ };
48
+ }, [debouncedFunction, disabled]);
49
+ const onChange = useCallback(
50
+ (newEditorState) => {
51
+ const editorStateHasChanged = !nullableCompatibleEqualityCheck(
52
+ areEqual_autocompleteState,
53
+ previousAutocompleteState,
54
+ newEditorState
55
+ );
56
+ setPreviousAutocompleteState(newEditorState);
57
+ if (!editorStateHasChanged) {
58
+ return;
59
+ }
60
+ setCurrentAutocompleteSuggestion(null);
61
+ if (newEditorState) {
62
+ debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
63
+ } else {
64
+ debouncedFunction.cancel();
65
+ }
66
+ },
67
+ [
68
+ previousAutocompleteState,
69
+ setPreviousAutocompleteState,
70
+ debouncedFunction,
71
+ awaitForAndAppendSuggestion,
72
+ setCurrentAutocompleteSuggestion
73
+ ]
74
+ );
75
+ const keyDownHandler = useCallback(
76
+ (event) => {
77
+ if (currentAutocompleteSuggestion) {
78
+ if (event.key === acceptAutosuggestionKey) {
79
+ event.preventDefault();
80
+ insertAutocompleteSuggestion(currentAutocompleteSuggestion);
81
+ setCurrentAutocompleteSuggestion(null);
82
+ }
83
+ }
84
+ },
85
+ [
86
+ currentAutocompleteSuggestion,
87
+ setCurrentAutocompleteSuggestion,
88
+ insertAutocompleteSuggestion,
89
+ acceptAutosuggestionKey
90
+ ]
91
+ );
92
+ return {
93
+ currentAutocompleteSuggestion,
94
+ onChangeHandler: onChange,
95
+ onKeyDownHandler: keyDownHandler
96
+ };
97
+ }
98
+
99
+ export { useAutosuggestions };
100
+ //# sourceMappingURL=out.js.map
101
+ //# sourceMappingURL=chunk-UHD44NC5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAgBnD,SAAS,mBACd,cACA,yBACA,wBACA,8BACA,kBACA,UAC0B;AAC1B,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAyC,IAAI;AAE/C,QAAM,CAAC,+BAA+B,gCAAgC,IACpE,SAAqC,IAAI;AAE3C,QAAM,8BAGe;AAAA,IACnB,CACE,yBACA,gBACG;AAEH,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UACE,oBACA,wBAAwB,qBAAqB,MAC7C,wBAAwB,oBAAoB,IAC5C;AACA;AAAA,MACF;AAGA,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAGA,UAAI,CAAC,cAAc,YAAY,SAAS;AACtC,cAAM,IAAI,aAAa,WAAW,YAAY;AAAA,MAChD;AAEA,uCAAiC;AAAA,QAC/B,MAAM;AAAA,QACN,OAAO,wBAAwB;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB,MACE,IAAI;AAAA,MACF;AAAA,IACF;AAAA,IACF,CAAC,YAAY;AAAA,EACf;AAGA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,wBAAkB,OAAO;AACzB,uCAAiC,IAAI;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,mBAAmB,QAAQ,CAAC;AAEhC,QAAM,WAAW;AAAA,IACf,CAAC,mBAAmD;AAClD,YAAM,wBAAwB,CAAC;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,mCAA6B,cAAc;AAG3C,UAAI,CAAC,uBAAuB;AAC1B;AAAA,MACF;AAGA,uCAAiC,IAAI;AAGrC,UAAI,gBAAgB;AAClB,0BAAkB,SAAS,6BAA6B,cAAc;AAAA,MACxE,OAAO;AACL,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,UAA+C;AAC9C,UAAI,+BAA+B;AACjC,YAAI,MAAM,QAAQ,yBAAyB;AACzC,gBAAM,eAAe;AACrB,uCAA6B,6BAA6B;AAC1D,2CAAiC,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Debouncer } from \"../../lib/debouncer\";\nimport { nullableCompatibleEqualityCheck } from \"../../lib/utils\";\nimport { AutosuggestionsBareFunction } from \"../../types/base\";\nimport { AutosuggestionState } from \"../../types/base/autosuggestion-state\";\nimport {\n EditorAutocompleteState,\n areEqual_autocompleteState,\n} from \"../../types/base/editor-autocomplete-state\";\n\nexport interface UseAutosuggestionsResult {\n currentAutocompleteSuggestion: AutosuggestionState | null;\n onChangeHandler: (newEditorState: EditorAutocompleteState | null) => void;\n onKeyDownHandler: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function useAutosuggestions(\n debounceTime: number,\n acceptAutosuggestionKey: string,\n autosuggestionFunction: AutosuggestionsBareFunction,\n insertAutocompleteSuggestion: (suggestion: AutosuggestionState) => void,\n disableWhenEmpty: boolean,\n disabled: boolean\n): UseAutosuggestionsResult {\n const [previousAutocompleteState, setPreviousAutocompleteState] =\n useState<EditorAutocompleteState | null>(null);\n\n const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] =\n useState<AutosuggestionState | null>(null);\n\n const awaitForAndAppendSuggestion: (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal\n ) => Promise<void> = useCallback(\n async (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal\n ) => {\n // early return if disabled\n if (disabled) {\n return;\n }\n\n if (\n disableWhenEmpty &&\n editorAutocompleteState.textBeforeCursor === \"\" &&\n editorAutocompleteState.textAfterCursor === \"\"\n ) {\n return;\n }\n\n // fetch the suggestion\n const suggestion = await autosuggestionFunction(\n editorAutocompleteState,\n abortSignal\n );\n\n // We'll assume for now that the autocomplete function might or might not respect the abort signal.\n if (!suggestion || abortSignal.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n setCurrentAutocompleteSuggestion({\n text: suggestion,\n point: editorAutocompleteState.cursorPoint,\n });\n },\n [\n autosuggestionFunction,\n setCurrentAutocompleteSuggestion,\n disableWhenEmpty,\n disabled,\n ]\n );\n\n const debouncedFunction = useMemo(\n () =>\n new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(\n debounceTime\n ),\n [debounceTime]\n );\n\n // clean current state when unmounting or disabling\n useEffect(() => {\n return () => {\n debouncedFunction.cancel();\n setCurrentAutocompleteSuggestion(null);\n };\n }, [debouncedFunction, disabled]);\n\n const onChange = useCallback(\n (newEditorState: EditorAutocompleteState | null) => {\n const editorStateHasChanged = !nullableCompatibleEqualityCheck(\n areEqual_autocompleteState,\n previousAutocompleteState,\n newEditorState\n );\n setPreviousAutocompleteState(newEditorState);\n\n // if no change, do nothing\n if (!editorStateHasChanged) {\n return;\n }\n\n // if change, then first null out the current suggestion\n setCurrentAutocompleteSuggestion(null);\n\n // then try to get a new suggestion, debouncing to avoid too many requests while typing\n if (newEditorState) {\n debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);\n } else {\n debouncedFunction.cancel();\n }\n },\n [\n previousAutocompleteState,\n setPreviousAutocompleteState,\n debouncedFunction,\n awaitForAndAppendSuggestion,\n setCurrentAutocompleteSuggestion,\n ]\n );\n\n const keyDownHandler = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (currentAutocompleteSuggestion) {\n if (event.key === acceptAutosuggestionKey) {\n event.preventDefault();\n insertAutocompleteSuggestion(currentAutocompleteSuggestion);\n setCurrentAutocompleteSuggestion(null);\n }\n }\n },\n [\n currentAutocompleteSuggestion,\n setCurrentAutocompleteSuggestion,\n insertAutocompleteSuggestion,\n acceptAutosuggestionKey,\n ]\n );\n\n return {\n currentAutocompleteSuggestion,\n onChangeHandler: onChange,\n onKeyDownHandler: keyDownHandler,\n };\n}\n"]}