@copilotkit/react-textarea 0.27.0-alpha.5 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/.turbo/turbo-build.log +298 -298
  2. package/CHANGELOG.md +23 -0
  3. package/dist/chunk-224UKA7C.mjs +33 -0
  4. package/dist/chunk-224UKA7C.mjs.map +1 -0
  5. package/dist/chunk-2C7O2EVM.mjs +27 -0
  6. package/dist/chunk-2C7O2EVM.mjs.map +1 -0
  7. package/dist/chunk-2QDCE7PD.mjs +29 -0
  8. package/dist/chunk-2QDCE7PD.mjs.map +1 -0
  9. package/dist/chunk-3PQ7GSFE.mjs +17 -0
  10. package/dist/chunk-3PQ7GSFE.mjs.map +1 -0
  11. package/dist/chunk-47L4PLG4.mjs +45 -0
  12. package/dist/chunk-47L4PLG4.mjs.map +1 -0
  13. package/dist/chunk-4NHVQZ67.mjs +107 -0
  14. package/dist/chunk-4NHVQZ67.mjs.map +1 -0
  15. package/dist/chunk-4OJ3H65F.mjs +86 -0
  16. package/dist/chunk-4OJ3H65F.mjs.map +1 -0
  17. package/dist/chunk-5UNJXFUO.mjs +29 -0
  18. package/dist/chunk-5UNJXFUO.mjs.map +1 -0
  19. package/dist/chunk-72P3KOHZ.mjs +91 -0
  20. package/dist/chunk-72P3KOHZ.mjs.map +1 -0
  21. package/dist/chunk-7LSRNPNI.mjs +59 -0
  22. package/dist/chunk-7LSRNPNI.mjs.map +1 -0
  23. package/dist/chunk-7SUZ6CXM.mjs +47 -0
  24. package/dist/chunk-7SUZ6CXM.mjs.map +1 -0
  25. package/dist/chunk-AZHILHKM.mjs +19 -0
  26. package/dist/chunk-AZHILHKM.mjs.map +1 -0
  27. package/dist/chunk-DE5K76I2.mjs +3 -0
  28. package/dist/chunk-DE5K76I2.mjs.map +1 -0
  29. package/dist/chunk-DRV2FOHZ.mjs +65 -0
  30. package/dist/chunk-DRV2FOHZ.mjs.map +1 -0
  31. package/dist/chunk-ECR45NSD.mjs +101 -0
  32. package/dist/chunk-ECR45NSD.mjs.map +1 -0
  33. package/dist/chunk-EPBVNDKE.mjs +46 -0
  34. package/dist/chunk-EPBVNDKE.mjs.map +1 -0
  35. package/dist/chunk-FJNUPSQK.mjs +72 -0
  36. package/dist/chunk-FJNUPSQK.mjs.map +1 -0
  37. package/dist/chunk-FP2EKU3L.mjs +28 -0
  38. package/dist/chunk-FP2EKU3L.mjs.map +1 -0
  39. package/dist/chunk-GQN2HYFJ.mjs +22 -0
  40. package/dist/chunk-GQN2HYFJ.mjs.map +1 -0
  41. package/dist/chunk-H4VKQGVU.mjs +3 -0
  42. package/dist/chunk-H4VKQGVU.mjs.map +1 -0
  43. package/dist/chunk-HSCZA5TS.mjs +27 -0
  44. package/dist/chunk-HSCZA5TS.mjs.map +1 -0
  45. package/dist/chunk-IU3WTXLQ.mjs +3 -0
  46. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  47. package/dist/chunk-JJLQVT7S.mjs +10 -0
  48. package/dist/chunk-JJLQVT7S.mjs.map +1 -0
  49. package/dist/chunk-JYWINDWZ.mjs +46 -0
  50. package/dist/chunk-JYWINDWZ.mjs.map +1 -0
  51. package/dist/chunk-KDVMG3XF.mjs +63 -0
  52. package/dist/chunk-KDVMG3XF.mjs.map +1 -0
  53. package/dist/chunk-KFQZHRPJ.mjs +19 -0
  54. package/dist/chunk-KFQZHRPJ.mjs.map +1 -0
  55. package/dist/chunk-KJNSWCJC.mjs +112 -0
  56. package/dist/chunk-KJNSWCJC.mjs.map +1 -0
  57. package/dist/chunk-KNQIEOFP.mjs +18 -0
  58. package/dist/chunk-KNQIEOFP.mjs.map +1 -0
  59. package/dist/chunk-KTTN5H7S.mjs +202 -0
  60. package/dist/chunk-KTTN5H7S.mjs.map +1 -0
  61. package/dist/chunk-L7VVZH4Q.mjs +3 -0
  62. package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
  63. package/dist/chunk-LQZBI6XD.mjs +112 -0
  64. package/dist/chunk-LQZBI6XD.mjs.map +1 -0
  65. package/dist/chunk-M2DR4KVB.mjs +33 -0
  66. package/dist/chunk-M2DR4KVB.mjs.map +1 -0
  67. package/dist/chunk-MMVDU6DF.mjs +3 -0
  68. package/dist/chunk-MMVDU6DF.mjs.map +1 -0
  69. package/dist/chunk-MRXNTQOX.mjs +55 -0
  70. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  71. package/dist/chunk-NT3GWKWK.mjs +59 -0
  72. package/dist/chunk-NT3GWKWK.mjs.map +1 -0
  73. package/dist/chunk-OHO4G6DR.mjs +19 -0
  74. package/dist/chunk-OHO4G6DR.mjs.map +1 -0
  75. package/dist/chunk-P4QVFRLY.mjs +103 -0
  76. package/dist/chunk-P4QVFRLY.mjs.map +1 -0
  77. package/dist/chunk-PTZVE6NC.mjs +94 -0
  78. package/dist/chunk-PTZVE6NC.mjs.map +1 -0
  79. package/dist/chunk-RKQ6RTZM.mjs +77 -0
  80. package/dist/chunk-RKQ6RTZM.mjs.map +1 -0
  81. package/dist/chunk-RUV6NBIF.mjs +3 -0
  82. package/dist/chunk-RUV6NBIF.mjs.map +1 -0
  83. package/dist/chunk-T6MTDQZ7.mjs +45 -0
  84. package/dist/chunk-T6MTDQZ7.mjs.map +1 -0
  85. package/dist/chunk-VPEH6V7T.mjs +83 -0
  86. package/dist/chunk-VPEH6V7T.mjs.map +1 -0
  87. package/dist/chunk-WADHCMPK.mjs +3 -0
  88. package/dist/chunk-WADHCMPK.mjs.map +1 -0
  89. package/dist/chunk-WFTAAA7R.mjs +44 -0
  90. package/dist/chunk-WFTAAA7R.mjs.map +1 -0
  91. package/dist/chunk-WJHSY5T6.mjs +3 -0
  92. package/dist/chunk-WJHSY5T6.mjs.map +1 -0
  93. package/dist/chunk-WTASPE2W.mjs +105 -0
  94. package/dist/chunk-WTASPE2W.mjs.map +1 -0
  95. package/dist/chunk-XV7MLLXQ.mjs +18 -0
  96. package/dist/chunk-XV7MLLXQ.mjs.map +1 -0
  97. package/dist/chunk-YLXEQDMS.mjs +217 -0
  98. package/dist/chunk-YLXEQDMS.mjs.map +1 -0
  99. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +35 -1745
  100. package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
  101. package/dist/components/base-copilot-textarea/render-element.mjs +3 -51
  102. package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
  103. package/dist/components/base-copilot-textarea/render-placeholder.mjs +3 -49
  104. package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
  105. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +4 -86
  106. package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
  107. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +3 -57
  108. package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
  109. package/dist/components/copilot-textarea/copilot-textarea.mjs +44 -2192
  110. package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
  111. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +3 -17
  112. package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
  113. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +3 -137
  114. package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
  115. package/dist/components/hovering-toolbar/hovering-toolbar.mjs +18 -875
  116. package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
  117. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +12 -558
  118. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
  119. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +13 -581
  120. package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
  121. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +5 -102
  122. package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -1
  123. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +14 -581
  124. package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
  125. package/dist/components/index.mjs +45 -2193
  126. package/dist/components/index.mjs.map +1 -1
  127. package/dist/components/manual-ui/chip-with-icon.mjs +6 -5
  128. package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
  129. package/dist/components/source-search-box/source-search-box.mjs +6 -211
  130. package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
  131. package/dist/components/ui/button.mjs +4 -85
  132. package/dist/components/ui/button.mjs.map +1 -1
  133. package/dist/components/ui/card.mjs +7 -53
  134. package/dist/components/ui/card.mjs.map +1 -1
  135. package/dist/components/ui/command.mjs +5 -244
  136. package/dist/components/ui/command.mjs.map +1 -1
  137. package/dist/components/ui/dialog.mjs +4 -144
  138. package/dist/components/ui/dialog.mjs.map +1 -1
  139. package/dist/components/ui/label.mjs +4 -60
  140. package/dist/components/ui/label.mjs.map +1 -1
  141. package/dist/components/ui/separator.mjs +8 -50
  142. package/dist/components/ui/separator.mjs.map +1 -1
  143. package/dist/components/ui/textarea.mjs +7 -48
  144. package/dist/components/ui/textarea.mjs.map +1 -1
  145. package/dist/context/index.mjs +2 -0
  146. package/dist/context/index.mjs.map +1 -1
  147. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +6 -158
  148. package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
  149. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +4 -168
  150. package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
  151. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +5 -148
  152. package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
  153. package/dist/hooks/index.mjs +2 -0
  154. package/dist/hooks/index.mjs.map +1 -1
  155. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +4 -114
  156. package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
  157. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +4 -166
  158. package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
  159. package/dist/hooks/misc/use-autosize-textarea.mjs +3 -15
  160. package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
  161. package/dist/index.mjs +49 -2195
  162. package/dist/index.mjs.map +1 -1
  163. package/dist/lib/debouncer.mjs +3 -51
  164. package/dist/lib/debouncer.mjs.map +1 -1
  165. package/dist/lib/editor-to-text.mjs +3 -43
  166. package/dist/lib/editor-to-text.mjs.map +1 -1
  167. package/dist/lib/get-text-around-cursor.mjs +3 -102
  168. package/dist/lib/get-text-around-cursor.mjs.map +1 -1
  169. package/dist/lib/retry.mjs +3 -17
  170. package/dist/lib/retry.mjs.map +1 -1
  171. package/dist/lib/slatejs-edits/add-autocompletions.mjs +3 -25
  172. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
  173. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +3 -20
  174. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
  175. package/dist/lib/slatejs-edits/replace-text.mjs +3 -27
  176. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
  177. package/dist/lib/slatejs-edits/with-partial-history.mjs +3 -106
  178. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
  179. package/dist/lib/stream-promise-flatten.mjs +3 -47
  180. package/dist/lib/stream-promise-flatten.mjs.map +1 -1
  181. package/dist/lib/utils.mjs +3 -71
  182. package/dist/lib/utils.mjs.map +1 -1
  183. package/dist/lib/utils.test.mjs +1 -0
  184. package/dist/lib/utils.test.mjs.map +1 -1
  185. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +2 -0
  186. package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
  187. package/dist/types/autosuggestions-config/autosuggestions-config.mjs +8 -274
  188. package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
  189. package/dist/types/autosuggestions-config/editing-api-config.mjs +3 -87
  190. package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
  191. package/dist/types/autosuggestions-config/index.mjs +9 -274
  192. package/dist/types/autosuggestions-config/index.mjs.map +1 -1
  193. package/dist/types/autosuggestions-config/insertions-api-config.mjs +3 -78
  194. package/dist/types/autosuggestions-config/insertions-api-config.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 +3 -64
  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 -26
  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 -26
  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 +11 -275
  218. package/dist/types/index.mjs.map +1 -1
  219. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # ui
2
2
 
3
+ ## 0.27.0
4
+
5
+ ### Minor Changes
6
+
7
+ - factor useChat into internal core
8
+ - a7b417a: insertion default prompt update
9
+ - 88d6654: release useChat fixes
10
+ - 51de9d5: textarea editing: default prompt + few shot update
11
+ - fa84257: remove vercel ai
12
+ - 98a37c8: strictly propagate copilot api params through the fetch arguments - not through any constructors
13
+ - 250032d: useChat: do not separately propagate options.url to constructor
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies
18
+ - Updated dependencies [a7b417a]
19
+ - Updated dependencies [88d6654]
20
+ - Updated dependencies [51de9d5]
21
+ - Updated dependencies [fa84257]
22
+ - Updated dependencies [98a37c8]
23
+ - Updated dependencies [250032d]
24
+ - @copilotkit/react-core@0.17.0
25
+
3
26
  ## 0.27.0-alpha.5
4
27
 
5
28
  ### Minor Changes
@@ -0,0 +1,33 @@
1
+ import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+
4
+ function makeRenderElementFunction(suggestionsStyle) {
5
+ return (props) => {
6
+ switch (props.element.type) {
7
+ case "paragraph":
8
+ return /* @__PURE__ */ jsx(DefaultElement, __spreadValues({}, props));
9
+ case "suggestion":
10
+ return /* @__PURE__ */ jsx(SuggestionElement, __spreadProps(__spreadValues({}, props), { suggestionsStyle }));
11
+ }
12
+ };
13
+ }
14
+ var DefaultElement = (props) => {
15
+ return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, props.attributes), { children: props.children }));
16
+ };
17
+ var SuggestionElement = (props) => {
18
+ return /* @__PURE__ */ jsxs(
19
+ "span",
20
+ __spreadProps(__spreadValues({}, props.attributes), {
21
+ style: __spreadValues({}, props.suggestionsStyle),
22
+ contentEditable: false,
23
+ children: [
24
+ props.children,
25
+ props.element.type === "suggestion" && props.element.content
26
+ ]
27
+ })
28
+ );
29
+ };
30
+
31
+ export { makeRenderElementFunction };
32
+ //# sourceMappingURL=out.js.map
33
+ //# sourceMappingURL=chunk-224UKA7C.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/base-copilot-textarea/render-element.tsx"],"names":[],"mappings":";;;;;;AAUe,cAgBX,YAhBW;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,eAAO,oBAAC,oDAAsB,QAAtB,EAA6B,mBAAoC;AAAA,IAC7E;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,UAA8B;AACpD,SAAO,oBAAC,wCAAQ,MAAM,aAAd,EAA2B,gBAAM,WAAS;AACpD;AACA,IAAM,oBAAoB,CACxB,UAGG;AACH,SACE;AAAA,IAAC;AAAA,qCACK,MAAM,aADX;AAAA,MAEC,OAAO,mBACF,MAAM;AAAA,MAEX,iBAAiB;AAAA,MAEhB;AAAA,cAAM;AAAA,QACN,MAAM,QAAQ,SAAS,gBAAgB,MAAM,QAAQ;AAAA;AAAA;AAAA,EACxD;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 <SuggestionElement {...props} suggestionsStyle={suggestionsStyle} />;\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,27 @@
1
+ import { Transforms } from 'slate';
2
+
3
+ // src/lib/slatejs-edits/add-autocompletions.ts
4
+ function addAutocompletionsToEditor(editor, newSuggestion, point) {
5
+ const editorPosition = editor.selection;
6
+ Transforms.insertNodes(
7
+ editor,
8
+ [
9
+ {
10
+ type: "suggestion",
11
+ inline: true,
12
+ content: newSuggestion,
13
+ children: [{ text: "" }]
14
+ }
15
+ ],
16
+ {
17
+ at: point
18
+ }
19
+ );
20
+ if (editorPosition) {
21
+ editor.selection = editorPosition;
22
+ }
23
+ }
24
+
25
+ export { addAutocompletionsToEditor };
26
+ //# sourceMappingURL=out.js.map
27
+ //# sourceMappingURL=chunk-2C7O2EVM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/add-autocompletions.ts"],"names":[],"mappings":";AAAA,SAAoB,kBAAkB;AAG/B,SAAS,2BACd,QACA,eACA,OACA;AACA,QAAM,iBAAiB,OAAO;AAE9B,aAAW;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,IACN;AAAA,EACF;AAGA,MAAI,gBAAgB;AAClB,WAAO,YAAY;AAAA,EACrB;AACF","sourcesContent":["import { BasePoint, Transforms } from \"slate\";\nimport { CustomEditor } from \"../../types/base/custom-editor\";\n\nexport function addAutocompletionsToEditor(\n editor: CustomEditor,\n newSuggestion: string,\n point: BasePoint,\n) {\n const editorPosition = editor.selection;\n\n Transforms.insertNodes(\n editor,\n [\n {\n type: \"suggestion\",\n inline: true,\n content: newSuggestion,\n children: [{ text: \"\" }],\n },\n ],\n {\n at: point,\n },\n );\n\n // restore cursor position\n if (editorPosition) {\n editor.selection = editorPosition;\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { __async } from './chunk-MRXNTQOX.mjs';
2
+
3
+ // src/lib/stream-promise-flatten.ts
4
+ function streamPromiseFlatten(promise) {
5
+ return new ReadableStream({
6
+ start(controller) {
7
+ return __async(this, null, function* () {
8
+ try {
9
+ const stream = yield promise;
10
+ const reader = stream.getReader();
11
+ while (true) {
12
+ const { done, value } = yield reader.read();
13
+ if (done) {
14
+ controller.close();
15
+ return;
16
+ }
17
+ controller.enqueue(value);
18
+ }
19
+ } catch (error) {
20
+ controller.error(error);
21
+ }
22
+ });
23
+ }
24
+ });
25
+ }
26
+
27
+ export { streamPromiseFlatten };
28
+ //# sourceMappingURL=out.js.map
29
+ //# sourceMappingURL=chunk-2QDCE7PD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/stream-promise-flatten.ts"],"names":[],"mappings":";;;;;AAUO,SAAS,qBAAwB,SAAwD;AAC9F,SAAO,IAAI,eAAkB;AAAA,IACrB,MAAM,YAAY;AAAA;AACtB,YAAI;AACF,gBAAM,SAAS,MAAM;AACrB,gBAAM,SAAS,OAAO,UAAU;AAEhC,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,gBAAI,MAAM;AACR,yBAAW,MAAM;AACjB;AAAA,YACF;AAEA,uBAAW,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACF,SAAS,OAAP;AACA,qBAAW,MAAM,KAAK;AAAA,QACxB;AAAA,MACF;AAAA;AAAA,EACF,CAAC;AACH","sourcesContent":["/**\n * Flatten a promise of a stream, into a stream.\n *\n * Useful because a stream already includes the notion of async value delivery,\n * so it often makes sense to simply await the values rather than the generator of the values.\n *\n * @param {Promise<ReadableStream<A>>} promise - The promise to flatten.\n * @returns {ReadableStream<A>} - The flattened stream.\n */\n\nexport function streamPromiseFlatten<A>(promise: Promise<ReadableStream<A>>): ReadableStream<A> {\n return new ReadableStream<A>({\n async start(controller) {\n try {\n const stream = await promise;\n const reader = stream.getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\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-3PQ7GSFE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/misc/use-autosize-textarea.tsx"],"names":[],"mappings":";AAAA,SAAyB,iBAAiB;AAG1C,IAAM,sBAAsB,CAAC,aAA6C,UAAkB;AAC1F,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 = (textAreaRef: RefObject<HTMLTextAreaElement>, value: string) => {\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,45 @@
1
+ import { editorToText } from './chunk-T6MTDQZ7.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-47L4PLG4.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;AAOA,IAAM,kCAAkC,CACtC,MACA,SACY;AAEZ,QAAM,qBAAqB,CAAC,iBAAiB,KAAK,WAAW,KAAK,SAAS;AAG3E,QAAM,aAAa,KAAK,SAAS,KAAK;AAEtC,SAAO,sBAAsB;AAC/B;AAEA,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;AAiBA,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}\n\ntype RelevantEditorState = {\n selection: BaseSelection;\n text: string;\n};\n\nconst cursorChangedWithoutTextChanged = (\n prev: RelevantEditorState,\n next: RelevantEditorState,\n): boolean => {\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};\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};\n\n/**\n * Easily keep track of the *previous* value of a variable.\n *\n * Example:\n * ```\n * const [count, setCount] = useState(0);\n * const prevCount = usePrevious(count);\n *\n * useEffect(() => {\n * if (count > prevCount) {\n * console.log('Now I know that count is bigger than before');\n * }\n * }, [count, prevCount]);\n * ```\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,107 @@
1
+ import { Transforms, Editor, Operation, Path } from 'slate';
2
+ import { HistoryEditor } from 'slate-history';
3
+
4
+ // src/lib/slatejs-edits/with-partial-history.ts
5
+ var withPartialHistory = (editor, shouldSave) => {
6
+ const e = editor;
7
+ const { apply } = e;
8
+ e.history = { undos: [], redos: [] };
9
+ e.redo = () => {
10
+ const { history } = e;
11
+ const { redos } = history;
12
+ if (redos.length > 0) {
13
+ const batch = redos[redos.length - 1];
14
+ if (batch.selectionBefore) {
15
+ Transforms.setSelection(e, batch.selectionBefore);
16
+ }
17
+ HistoryEditor.withoutSaving(e, () => {
18
+ Editor.withoutNormalizing(e, () => {
19
+ for (const op of batch.operations) {
20
+ e.apply(op);
21
+ }
22
+ });
23
+ });
24
+ history.redos.pop();
25
+ e.writeHistory("undos", batch);
26
+ }
27
+ };
28
+ e.undo = () => {
29
+ const { history } = e;
30
+ const { undos } = history;
31
+ if (undos.length > 0) {
32
+ const batch = undos[undos.length - 1];
33
+ HistoryEditor.withoutSaving(e, () => {
34
+ Editor.withoutNormalizing(e, () => {
35
+ const inverseOps = batch.operations.map(Operation.inverse).reverse();
36
+ for (const op of inverseOps) {
37
+ e.apply(op);
38
+ }
39
+ if (batch.selectionBefore) {
40
+ Transforms.setSelection(e, batch.selectionBefore);
41
+ }
42
+ });
43
+ });
44
+ e.writeHistory("redos", batch);
45
+ history.undos.pop();
46
+ }
47
+ };
48
+ e.apply = (op) => {
49
+ const { operations, history } = e;
50
+ const { undos } = history;
51
+ const lastBatch = undos[undos.length - 1];
52
+ const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
53
+ let save = HistoryEditor.isSaving(e);
54
+ let merge = HistoryEditor.isMerging(e);
55
+ if (save == null) {
56
+ save = shouldSave(op, lastOp);
57
+ }
58
+ if (save) {
59
+ if (merge == null) {
60
+ if (lastBatch == null) {
61
+ merge = false;
62
+ } else if (operations.length !== 0) {
63
+ merge = true;
64
+ } else {
65
+ merge = shouldMerge(op, lastOp);
66
+ }
67
+ }
68
+ if (lastBatch && merge) {
69
+ lastBatch.operations.push(op);
70
+ } else {
71
+ const batch = {
72
+ operations: [op],
73
+ selectionBefore: e.selection
74
+ };
75
+ e.writeHistory("undos", batch);
76
+ }
77
+ while (undos.length > 100) {
78
+ undos.shift();
79
+ }
80
+ history.redos = [];
81
+ }
82
+ apply(op);
83
+ };
84
+ e.writeHistory = (stack, batch) => {
85
+ e.history[stack].push(batch);
86
+ };
87
+ return e;
88
+ };
89
+ var shouldMerge = (op, prev) => {
90
+ if (prev && op.type === "insert_text" && prev.type === "insert_text" && op.offset === prev.offset + prev.text.length && Path.equals(op.path, prev.path)) {
91
+ return true;
92
+ }
93
+ if (prev && op.type === "remove_text" && prev.type === "remove_text" && op.offset + op.text.length === prev.offset && Path.equals(op.path, prev.path)) {
94
+ return true;
95
+ }
96
+ return false;
97
+ };
98
+ var defaultShouldSave = (op, prev) => {
99
+ if (op.type === "set_selection") {
100
+ return false;
101
+ }
102
+ return true;
103
+ };
104
+
105
+ export { defaultShouldSave, withPartialHistory };
106
+ //# sourceMappingURL=out.js.map
107
+ //# sourceMappingURL=chunk-4NHVQZ67.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/with-partial-history.ts"],"names":[],"mappings":";AAAA,SAAS,QAAQ,WAAW,MAAa,kBAAkB;AAC3D,SAAS,qBAAqB;AAMvB,IAAM,qBAAqB,CAChC,QACA,eACG;AACH,QAAM,IAAI;AACV,QAAM,EAAE,MAAM,IAAI;AAClB,IAAE,UAAU,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAEnC,IAAE,OAAO,MAAM;AACb,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,MAAM,IAAI;AAElB,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AAEpC,UAAI,MAAM,iBAAiB;AACzB,mBAAW,aAAa,GAAG,MAAM,eAAe;AAAA,MAClD;AAEA,oBAAc,cAAc,GAAG,MAAM;AACnC,eAAO,mBAAmB,GAAG,MAAM;AACjC,qBAAW,MAAM,MAAM,YAAY;AACjC,cAAE,MAAM,EAAE;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,cAAQ,MAAM,IAAI;AAClB,QAAE,aAAa,SAAS,KAAK;AAAA,IAC/B;AAAA,EACF;AAEA,IAAE,OAAO,MAAM;AACb,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,MAAM,IAAI;AAElB,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,MAAM,MAAM,SAAS,CAAC;AAEpC,oBAAc,cAAc,GAAG,MAAM;AACnC,eAAO,mBAAmB,GAAG,MAAM;AACjC,gBAAM,aAAa,MAAM,WAAW,IAAI,UAAU,OAAO,EAAE,QAAQ;AAEnE,qBAAW,MAAM,YAAY;AAC3B,cAAE,MAAM,EAAE;AAAA,UACZ;AACA,cAAI,MAAM,iBAAiB;AACzB,uBAAW,aAAa,GAAG,MAAM,eAAe;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,QAAE,aAAa,SAAS,KAAK;AAC7B,cAAQ,MAAM,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,IAAE,QAAQ,CAAC,OAAkB;AAC3B,UAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,UAAM,SAAS,aAAa,UAAU,WAAW,UAAU,WAAW,SAAS,CAAC;AAChF,QAAI,OAAO,cAAc,SAAS,CAAC;AACnC,QAAI,QAAQ,cAAc,UAAU,CAAC;AAErC,QAAI,QAAQ,MAAM;AAChB,aAAO,WAAW,IAAI,MAAM;AAAA,IAC9B;AAEA,QAAI,MAAM;AACR,UAAI,SAAS,MAAM;AACjB,YAAI,aAAa,MAAM;AACrB,kBAAQ;AAAA,QACV,WAAW,WAAW,WAAW,GAAG;AAClC,kBAAQ;AAAA,QACV,OAAO;AACL,kBAAQ,YAAY,IAAI,MAAM;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,aAAa,OAAO;AACtB,kBAAU,WAAW,KAAK,EAAE;AAAA,MAC9B,OAAO;AACL,cAAM,QAAQ;AAAA,UACZ,YAAY,CAAC,EAAE;AAAA,UACf,iBAAiB,EAAE;AAAA,QACrB;AACA,UAAE,aAAa,SAAS,KAAK;AAAA,MAC/B;AAEA,aAAO,MAAM,SAAS,KAAK;AACzB,cAAM,MAAM;AAAA,MACd;AAEA,cAAQ,QAAQ,CAAC;AAAA,IACnB;AAEA,UAAM,EAAE;AAAA,EACV;AAEA,IAAE,eAAe,CAAC,OAA0B,UAAe;AACzD,MAAE,QAAQ,KAAK,EAAE,KAAK,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;AAMA,IAAM,cAAc,CAAC,IAAe,SAAyC;AAC3E,MACE,QACA,GAAG,SAAS,iBACZ,KAAK,SAAS,iBACd,GAAG,WAAW,KAAK,SAAS,KAAK,KAAK,UACtC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,MACE,QACA,GAAG,SAAS,iBACZ,KAAK,SAAS,iBACd,GAAG,SAAS,GAAG,KAAK,WAAW,KAAK,UACpC,KAAK,OAAO,GAAG,MAAM,KAAK,IAAI,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,oBAAoB,CAAC,IAAe,SAAyC;AACxF,MAAI,GAAG,SAAS,iBAAiB;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AACT","sourcesContent":["import { Editor, Operation, Path, Range, Transforms } from \"slate\";\nimport { HistoryEditor } from \"slate-history\";\n\n// Copy-pasted from `https://github.com/ianstormtaylor/slate/blob/main/packages/slate-history/src/with-history.ts`\n// With one exception: the `shouldSave` function is passed in as an argument to `withPartialHistory` instead of being hardcoded\nexport type ShouldSaveToHistory = (op: Operation, prev: Operation | undefined) => boolean;\n\nexport const withPartialHistory = <T extends Editor>(\n editor: T,\n shouldSave: ShouldSaveToHistory,\n) => {\n const e = editor as T & HistoryEditor;\n const { apply } = e;\n e.history = { undos: [], redos: [] };\n\n e.redo = () => {\n const { history } = e;\n const { redos } = history;\n\n if (redos.length > 0) {\n const batch = redos[redos.length - 1];\n\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n for (const op of batch.operations) {\n e.apply(op);\n }\n });\n });\n\n history.redos.pop();\n e.writeHistory(\"undos\", batch);\n }\n };\n\n e.undo = () => {\n const { history } = e;\n const { undos } = history;\n\n if (undos.length > 0) {\n const batch = undos[undos.length - 1];\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n const inverseOps = batch.operations.map(Operation.inverse).reverse();\n\n for (const op of inverseOps) {\n e.apply(op);\n }\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n });\n });\n\n e.writeHistory(\"redos\", batch);\n history.undos.pop();\n }\n };\n\n e.apply = (op: Operation) => {\n const { operations, history } = e;\n const { undos } = history;\n const lastBatch = undos[undos.length - 1];\n const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];\n let save = HistoryEditor.isSaving(e);\n let merge = HistoryEditor.isMerging(e);\n\n if (save == null) {\n save = shouldSave(op, lastOp);\n }\n\n if (save) {\n if (merge == null) {\n if (lastBatch == null) {\n merge = false;\n } else if (operations.length !== 0) {\n merge = true;\n } else {\n merge = shouldMerge(op, lastOp);\n }\n }\n\n if (lastBatch && merge) {\n lastBatch.operations.push(op);\n } else {\n const batch = {\n operations: [op],\n selectionBefore: e.selection,\n };\n e.writeHistory(\"undos\", batch);\n }\n\n while (undos.length > 100) {\n undos.shift();\n }\n\n history.redos = [];\n }\n\n apply(op);\n };\n\n e.writeHistory = (stack: \"undos\" | \"redos\", batch: any) => {\n e.history[stack].push(batch);\n };\n\n return e;\n};\n\n/**\n * Check whether to merge an operation into the previous operation.\n */\n\nconst shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {\n if (\n prev &&\n op.type === \"insert_text\" &&\n prev.type === \"insert_text\" &&\n op.offset === prev.offset + prev.text.length &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n if (\n prev &&\n op.type === \"remove_text\" &&\n prev.type === \"remove_text\" &&\n op.offset + op.text.length === prev.offset &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const defaultShouldSave = (op: Operation, prev: Operation | undefined): boolean => {\n if (op.type === \"set_selection\") {\n return false;\n }\n\n return true;\n};\n"]}
@@ -0,0 +1,86 @@
1
+ // src/types/autosuggestions-config/editing-api-config.tsx
2
+ var defaultEditingMakeSystemPrompt = (textareaPurpose, contextString) => {
3
+ return `You are a versatile writing assistant helping the user edit a portion of their text.
4
+
5
+ The user is writing some text.
6
+ The purpose is: "${textareaPurpose}"
7
+
8
+ The following external context is also provided. Use it when relevant.
9
+ \`\`\`
10
+ ${contextString}
11
+ \`\`\`
12
+
13
+ The user has provided you with a PROMPT for EDITING a PORTION of the text.
14
+ Your job is to come up with a new EDITED version OF THE SEGMENT IN QUESTION - AS BEST YOU CAN.
15
+ Only rewrite the portion of the text that the user has marked as "TextToEdit"!!!
16
+
17
+ Adjust yourself to the user's style and implied intent.
18
+
19
+ The conversation will be structured as follows:
20
+ <TextBeforeCursor>
21
+ <TextToEdit>
22
+ <TextAfterCursor>
23
+ <EditingPrompt>
24
+
25
+ <YourEditSuggestion>
26
+ `;
27
+ };
28
+ var defaultEditingFewShotMessages = [
29
+ {
30
+ role: "user",
31
+ name: "TextBeforeCursor",
32
+ content: "This morning I woke up and went straight to the grocery store. "
33
+ },
34
+ {
35
+ role: "user",
36
+ name: "TextToEdit",
37
+ content: "While I was there I picked up some apples, oranges, and bananas. "
38
+ },
39
+ {
40
+ role: "user",
41
+ name: "TextAfterCursor",
42
+ content: "The grocery store was having a sale on fruit, so I decided to stock up."
43
+ },
44
+ {
45
+ role: "user",
46
+ name: "EditingPrompt",
47
+ content: "I also bought a big watermelon"
48
+ },
49
+ {
50
+ role: "assistant",
51
+ content: "While I was there I picked up some apples, oranges, and bananas, and a big watermelon."
52
+ },
53
+ {
54
+ role: "user",
55
+ name: "TextBeforeCursor",
56
+ content: "Yesterday, I spent the afternoon working on my new project. "
57
+ },
58
+ {
59
+ role: "user",
60
+ name: "TextToEdit",
61
+ content: "It's quite challenging and requires a lot of focus. "
62
+ },
63
+ {
64
+ role: "user",
65
+ name: "TextAfterCursor",
66
+ content: "I'm really excited about the potential outcomes of this project."
67
+ },
68
+ {
69
+ role: "user",
70
+ name: "EditingPrompt",
71
+ content: "emphasize the complexity and my enthusiasm for the project"
72
+ },
73
+ {
74
+ role: "assistant",
75
+ content: "It's a highly complex task that demands intense concentration, but I'm incredibly enthusiastic about the promising prospects of this project."
76
+ }
77
+ ];
78
+ var defaultEditingApiConfig = {
79
+ makeSystemPrompt: defaultEditingMakeSystemPrompt,
80
+ fewShotMessages: defaultEditingFewShotMessages,
81
+ forwardedParams: void 0
82
+ };
83
+
84
+ export { defaultEditingApiConfig, defaultEditingFewShotMessages, defaultEditingMakeSystemPrompt };
85
+ //# sourceMappingURL=out.js.map
86
+ //# sourceMappingURL=chunk-4OJ3H65F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/autosuggestions-config/editing-api-config.tsx"],"names":[],"mappings":";AASO,IAAM,iCAAmD,CAC9D,iBACA,kBACG;AACH,SAAO;AAAA;AAAA;AAAA,mBAGW;AAAA;AAAA;AAAA;AAAA,EAIlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBF;AAEO,IAAM,gCAAyD;AAAA,EACpE;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SACE;AAAA,EACJ;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SACE;AAAA,EACJ;AACF;AAEO,IAAM,0BAA4C;AAAA,EACvD,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB","sourcesContent":["import { MakeSystemPrompt } from \"./subtypes/make-system-prompt\";\nimport { MinimalChatGPTMessage } from \"./subtypes/minimal-chat-gpt-message\";\n\nexport interface EditingApiConfig {\n makeSystemPrompt: MakeSystemPrompt;\n fewShotMessages: MinimalChatGPTMessage[];\n forwardedParams: { [key: string]: any } | undefined;\n}\n\nexport const defaultEditingMakeSystemPrompt: MakeSystemPrompt = (\n textareaPurpose,\n contextString,\n) => {\n return `You are a versatile writing assistant helping the user edit a portion of their text.\n \nThe user is writing some text.\nThe purpose is: \\\"${textareaPurpose}\\\"\n\nThe following external context is also provided. Use it when relevant.\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThe user has provided you with a PROMPT for EDITING a PORTION of the text. \nYour job is to come up with a new EDITED version OF THE SEGMENT IN QUESTION - AS BEST YOU CAN.\nOnly rewrite the portion of the text that the user has marked as \"TextToEdit\"!!!\n\nAdjust yourself to the user's style and implied intent.\n\nThe conversation will be structured as follows:\n<TextBeforeCursor>\n<TextToEdit>\n<TextAfterCursor>\n<EditingPrompt>\n\n<YourEditSuggestion>\n`;\n};\n\nexport const defaultEditingFewShotMessages: MinimalChatGPTMessage[] = [\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: \"This morning I woke up and went straight to the grocery store. \",\n },\n {\n role: \"user\",\n name: \"TextToEdit\",\n content: \"While I was there I picked up some apples, oranges, and bananas. \",\n },\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: \"The grocery store was having a sale on fruit, so I decided to stock up.\",\n },\n {\n role: \"user\",\n name: \"EditingPrompt\",\n content: \"I also bought a big watermelon\",\n },\n {\n role: \"assistant\",\n content:\n \"While I was there I picked up some apples, oranges, and bananas, and a big watermelon.\",\n },\n\n {\n role: \"user\",\n name: \"TextBeforeCursor\",\n content: \"Yesterday, I spent the afternoon working on my new project. \",\n },\n {\n role: \"user\",\n name: \"TextToEdit\",\n content: \"It's quite challenging and requires a lot of focus. \",\n },\n {\n role: \"user\",\n name: \"TextAfterCursor\",\n content: \"I'm really excited about the potential outcomes of this project.\",\n },\n {\n role: \"user\",\n name: \"EditingPrompt\",\n content: \"emphasize the complexity and my enthusiasm for the project\",\n },\n {\n role: \"assistant\",\n content:\n \"It's a highly complex task that demands intense concentration, but I'm incredibly enthusiastic about the promising prospects of this project.\",\n },\n];\n\nexport const defaultEditingApiConfig: EditingApiConfig = {\n makeSystemPrompt: defaultEditingMakeSystemPrompt,\n fewShotMessages: defaultEditingFewShotMessages,\n forwardedParams: undefined,\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-5UNJXFUO.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,91 @@
1
+ import { areEqual_autocompleteState } from './chunk-JJLQVT7S.mjs';
2
+ import { nullableCompatibleEqualityCheck } from './chunk-7SUZ6CXM.mjs';
3
+ import { Debouncer } from './chunk-M2DR4KVB.mjs';
4
+ import { __async } from './chunk-MRXNTQOX.mjs';
5
+ import { useState, useCallback, useMemo, useEffect } from 'react';
6
+
7
+ function useAutosuggestions(debounceTime, shouldAcceptAutosuggestionOnKeyPress, 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(editorAutocompleteState, abortSignal);
19
+ if (!suggestion || abortSignal.aborted) {
20
+ throw new DOMException("Aborted", "AbortError");
21
+ }
22
+ setCurrentAutocompleteSuggestion({
23
+ text: suggestion,
24
+ point: editorAutocompleteState.cursorPoint
25
+ });
26
+ }),
27
+ [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled]
28
+ );
29
+ const debouncedFunction = useMemo(
30
+ () => new Debouncer(debounceTime),
31
+ [debounceTime]
32
+ );
33
+ useEffect(() => {
34
+ return () => {
35
+ debouncedFunction.cancel();
36
+ setCurrentAutocompleteSuggestion(null);
37
+ };
38
+ }, [debouncedFunction, disabled]);
39
+ const onChange = useCallback(
40
+ (newEditorState) => {
41
+ const editorStateHasChanged = !nullableCompatibleEqualityCheck(
42
+ areEqual_autocompleteState,
43
+ previousAutocompleteState,
44
+ newEditorState
45
+ );
46
+ setPreviousAutocompleteState(newEditorState);
47
+ if (!editorStateHasChanged) {
48
+ return;
49
+ }
50
+ setCurrentAutocompleteSuggestion(null);
51
+ if (newEditorState) {
52
+ debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
53
+ } else {
54
+ debouncedFunction.cancel();
55
+ }
56
+ },
57
+ [
58
+ previousAutocompleteState,
59
+ setPreviousAutocompleteState,
60
+ debouncedFunction,
61
+ awaitForAndAppendSuggestion,
62
+ setCurrentAutocompleteSuggestion
63
+ ]
64
+ );
65
+ const keyDownHandler = useCallback(
66
+ (event) => {
67
+ if (currentAutocompleteSuggestion) {
68
+ if (shouldAcceptAutosuggestionOnKeyPress(event)) {
69
+ event.preventDefault();
70
+ insertAutocompleteSuggestion(currentAutocompleteSuggestion);
71
+ setCurrentAutocompleteSuggestion(null);
72
+ }
73
+ }
74
+ },
75
+ [
76
+ currentAutocompleteSuggestion,
77
+ setCurrentAutocompleteSuggestion,
78
+ insertAutocompleteSuggestion,
79
+ shouldAcceptAutosuggestionOnKeyPress
80
+ ]
81
+ );
82
+ return {
83
+ currentAutocompleteSuggestion,
84
+ onChangeHandler: onChange,
85
+ onKeyDownHandler: keyDownHandler
86
+ };
87
+ }
88
+
89
+ export { useAutosuggestions };
90
+ //# sourceMappingURL=out.js.map
91
+ //# sourceMappingURL=chunk-72P3KOHZ.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,sCACA,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,CAAO,yBAAkD,gBAA6B;AAEpF,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UACE,oBACA,wBAAwB,qBAAqB,MAC7C,wBAAwB,oBAAoB,IAC5C;AACA;AAAA,MACF;AAGA,YAAM,aAAa,MAAM,uBAAuB,yBAAyB,WAAW;AAGpF,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,CAAC,wBAAwB,kCAAkC,kBAAkB,QAAQ;AAAA,EACvF;AAEA,QAAM,oBAAoB;AAAA,IACxB,MAAM,IAAI,UAA8D,YAAY;AAAA,IACpF,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,qCAAqC,KAAK,GAAG;AAC/C,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 shouldAcceptAutosuggestionOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean,\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 (editorAutocompleteState: EditorAutocompleteState, abortSignal: AbortSignal) => {\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(editorAutocompleteState, abortSignal);\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 [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled],\n );\n\n const debouncedFunction = useMemo(\n () => new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(debounceTime),\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 (shouldAcceptAutosuggestionOnKeyPress(event)) {\n event.preventDefault();\n insertAutocompleteSuggestion(currentAutocompleteSuggestion);\n setCurrentAutocompleteSuggestion(null);\n }\n }\n },\n [\n currentAutocompleteSuggestion,\n setCurrentAutocompleteSuggestion,\n insertAutocompleteSuggestion,\n shouldAcceptAutosuggestionOnKeyPress,\n ],\n );\n\n return {\n currentAutocompleteSuggestion,\n onChangeHandler: onChange,\n onKeyDownHandler: keyDownHandler,\n };\n}\n"]}
@@ -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-7LSRNPNI.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,IAAI,QAAQ,gCAAgC,OAAO,EAAE,YAAY;AACtF,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;AApEjB;AAqEM,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.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, \"$1-$2\").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"]}