@copilotkit/react-textarea 0.5.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 (140) hide show
  1. package/.turbo/turbo-build.log +133 -0
  2. package/CHANGELOG.md +50 -0
  3. package/dist/chunk-4LJAS777.mjs +10 -0
  4. package/dist/chunk-4LJAS777.mjs.map +1 -0
  5. package/dist/chunk-5SJM4R4K.mjs +10 -0
  6. package/dist/chunk-5SJM4R4K.mjs.map +1 -0
  7. package/dist/chunk-ETGKLURC.mjs +27 -0
  8. package/dist/chunk-ETGKLURC.mjs.map +1 -0
  9. package/dist/chunk-GOAPCQCR.mjs +124 -0
  10. package/dist/chunk-GOAPCQCR.mjs.map +1 -0
  11. package/dist/chunk-H4VKQGVU.mjs +3 -0
  12. package/dist/chunk-H4VKQGVU.mjs.map +1 -0
  13. package/dist/chunk-IU3WTXLQ.mjs +3 -0
  14. package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
  15. package/dist/chunk-JD7BAH7U.mjs +3 -0
  16. package/dist/chunk-JD7BAH7U.mjs.map +1 -0
  17. package/dist/chunk-JJASB23A.mjs +88 -0
  18. package/dist/chunk-JJASB23A.mjs.map +1 -0
  19. package/dist/chunk-KCHYD3EB.mjs +107 -0
  20. package/dist/chunk-KCHYD3EB.mjs.map +1 -0
  21. package/dist/chunk-KGKLUWKW.mjs +47 -0
  22. package/dist/chunk-KGKLUWKW.mjs.map +1 -0
  23. package/dist/chunk-KKG2RK2T.mjs +16 -0
  24. package/dist/chunk-KKG2RK2T.mjs.map +1 -0
  25. package/dist/chunk-L24ZN4LL.mjs +65 -0
  26. package/dist/chunk-L24ZN4LL.mjs.map +1 -0
  27. package/dist/chunk-MRXNTQOX.mjs +55 -0
  28. package/dist/chunk-MRXNTQOX.mjs.map +1 -0
  29. package/dist/chunk-NKW5OU2S.mjs +33 -0
  30. package/dist/chunk-NKW5OU2S.mjs.map +1 -0
  31. package/dist/chunk-RVJAOO4S.mjs +18 -0
  32. package/dist/chunk-RVJAOO4S.mjs.map +1 -0
  33. package/dist/chunk-TSF4AJIK.mjs +30 -0
  34. package/dist/chunk-TSF4AJIK.mjs.map +1 -0
  35. package/dist/chunk-X4FJ6WVZ.mjs +66 -0
  36. package/dist/chunk-X4FJ6WVZ.mjs.map +1 -0
  37. package/dist/chunk-Y5BUWZOI.mjs +37 -0
  38. package/dist/chunk-Y5BUWZOI.mjs.map +1 -0
  39. package/dist/chunk-YPBKY4KY.mjs +3 -0
  40. package/dist/chunk-YPBKY4KY.mjs.map +1 -0
  41. package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.d.ts +18 -0
  42. package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs +17 -0
  43. package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -0
  44. package/dist/components/copilot-textarea/base-copilot-textarea/render-element.d.ts +6 -0
  45. package/dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs +4 -0
  46. package/dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs.map +1 -0
  47. package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.d.ts +6 -0
  48. package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs +4 -0
  49. package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs.map +1 -0
  50. package/dist/components/index.d.ts +4 -0
  51. package/dist/components/index.mjs +18 -0
  52. package/dist/components/index.mjs.map +1 -0
  53. package/dist/context/index.d.ts +1 -0
  54. package/dist/context/index.mjs +3 -0
  55. package/dist/context/index.mjs.map +1 -0
  56. package/dist/hooks/index.d.ts +1 -0
  57. package/dist/hooks/index.mjs +3 -0
  58. package/dist/hooks/index.mjs.map +1 -0
  59. package/dist/hooks/use-autosuggestions.d.ts +13 -0
  60. package/dist/hooks/use-autosuggestions.mjs +7 -0
  61. package/dist/hooks/use-autosuggestions.mjs.map +1 -0
  62. package/dist/hooks/use-copilot-textarea-editor.d.ts +8 -0
  63. package/dist/hooks/use-copilot-textarea-editor.mjs +5 -0
  64. package/dist/hooks/use-copilot-textarea-editor.mjs.map +1 -0
  65. package/dist/index.css +340 -0
  66. package/dist/index.css.map +1 -0
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.mjs +21 -0
  69. package/dist/index.mjs.map +1 -0
  70. package/dist/lib/debouncer.d.ts +11 -0
  71. package/dist/lib/debouncer.mjs +4 -0
  72. package/dist/lib/debouncer.mjs.map +1 -0
  73. package/dist/lib/editor-to-text.d.ts +7 -0
  74. package/dist/lib/editor-to-text.mjs +45 -0
  75. package/dist/lib/editor-to-text.mjs.map +1 -0
  76. package/dist/lib/get-text-around-cursor.d.ts +8 -0
  77. package/dist/lib/get-text-around-cursor.mjs +4 -0
  78. package/dist/lib/get-text-around-cursor.mjs.map +1 -0
  79. package/dist/lib/slatejs-edits/add-autocompletions.d.ts +8 -0
  80. package/dist/lib/slatejs-edits/add-autocompletions.mjs +4 -0
  81. package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -0
  82. package/dist/lib/slatejs-edits/clear-autocompletions.d.ts +8 -0
  83. package/dist/lib/slatejs-edits/clear-autocompletions.mjs +4 -0
  84. package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -0
  85. package/dist/lib/slatejs-edits/replace-text.d.ts +5 -0
  86. package/dist/lib/slatejs-edits/replace-text.mjs +4 -0
  87. package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -0
  88. package/dist/lib/slatejs-edits/with-partial-history.d.ts +10 -0
  89. package/dist/lib/slatejs-edits/with-partial-history.mjs +4 -0
  90. package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -0
  91. package/dist/lib/utils.d.ts +10 -0
  92. package/dist/lib/utils.mjs +4 -0
  93. package/dist/lib/utils.mjs.map +1 -0
  94. package/dist/types/autosuggestion-state.d.ts +8 -0
  95. package/dist/types/autosuggestion-state.mjs +3 -0
  96. package/dist/types/autosuggestion-state.mjs.map +1 -0
  97. package/dist/types/autosuggestions-bare-function.d.ts +3 -0
  98. package/dist/types/autosuggestions-bare-function.mjs +3 -0
  99. package/dist/types/autosuggestions-bare-function.mjs.map +1 -0
  100. package/dist/types/base-autosuggestions-config.d.ts +9 -0
  101. package/dist/types/base-autosuggestions-config.mjs +4 -0
  102. package/dist/types/base-autosuggestions-config.mjs.map +1 -0
  103. package/dist/types/custom-editor.d.ts +29 -0
  104. package/dist/types/custom-editor.mjs +3 -0
  105. package/dist/types/custom-editor.mjs.map +1 -0
  106. package/dist/types/editor-autocomplete-state.d.ts +10 -0
  107. package/dist/types/editor-autocomplete-state.mjs +5 -0
  108. package/dist/types/editor-autocomplete-state.mjs.map +1 -0
  109. package/dist/types/index.d.ts +2 -0
  110. package/dist/types/index.mjs +5 -0
  111. package/dist/types/index.mjs.map +1 -0
  112. package/package.json +53 -0
  113. package/postcss.config.js +9 -0
  114. package/src/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.tsx +175 -0
  115. package/src/components/copilot-textarea/base-copilot-textarea/render-element.tsx +42 -0
  116. package/src/components/copilot-textarea/base-copilot-textarea/render-placeholder.tsx +25 -0
  117. package/src/components/index.ts +2 -0
  118. package/src/context/index.ts +1 -0
  119. package/src/hooks/index.ts +1 -0
  120. package/src/hooks/use-autosuggestions.ts +129 -0
  121. package/src/hooks/use-copilot-textarea-editor.tsx +104 -0
  122. package/src/index.tsx +7 -0
  123. package/src/lib/debouncer.ts +38 -0
  124. package/src/lib/editor-to-text.ts +64 -0
  125. package/src/lib/get-text-around-cursor.ts +82 -0
  126. package/src/lib/slatejs-edits/add-autocompletions.ts +30 -0
  127. package/src/lib/slatejs-edits/clear-autocompletions.ts +15 -0
  128. package/src/lib/slatejs-edits/replace-text.ts +32 -0
  129. package/src/lib/slatejs-edits/with-partial-history.ts +156 -0
  130. package/src/lib/utils.ts +59 -0
  131. package/src/styles.css +3 -0
  132. package/src/types/autosuggestion-state.ts +6 -0
  133. package/src/types/autosuggestions-bare-function.ts +5 -0
  134. package/src/types/base-autosuggestions-config.tsx +15 -0
  135. package/src/types/custom-editor.tsx +29 -0
  136. package/src/types/editor-autocomplete-state.ts +19 -0
  137. package/src/types/index.ts +4 -0
  138. package/tailwind.config.js +7 -0
  139. package/tsconfig.json +5 -0
  140. package/tsup.config.ts +12 -0
@@ -0,0 +1,133 @@
1
+
2
+ > @copilotkit/react-textarea@0.5.0 build /Users/ataibarkai/LocalGit/Recursively.ai/CopilotKit/CopilotKit/packages/react-textarea
3
+ > tsup --treeshake
4
+
5
+ CLI Building entry: src/index.tsx, src/components/index.ts, src/hooks/index.ts, src/hooks/use-autosuggestions.ts, src/hooks/use-copilot-textarea-editor.tsx, src/context/index.ts, src/lib/debouncer.ts, src/lib/editor-to-text.ts, src/lib/get-text-around-cursor.ts, src/lib/utils.ts, src/types/autosuggestion-state.ts, src/types/autosuggestions-bare-function.ts, src/types/base-autosuggestions-config.tsx, src/types/custom-editor.tsx, src/types/editor-autocomplete-state.ts, src/types/index.ts, src/lib/slatejs-edits/add-autocompletions.ts, src/lib/slatejs-edits/clear-autocompletions.ts, src/lib/slatejs-edits/replace-text.ts, src/lib/slatejs-edits/with-partial-history.ts, src/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.tsx, src/components/copilot-textarea/base-copilot-textarea/render-element.tsx, src/components/copilot-textarea/base-copilot-textarea/render-placeholder.tsx
6
+ CLI Using tsconfig: tsconfig.json
7
+ CLI tsup v6.5.0
8
+ CLI Using tsup config: /Users/ataibarkai/LocalGit/Recursively.ai/CopilotKit/CopilotKit/packages/react-textarea/tsup.config.ts
9
+ CLI Target: es6
10
+ CLI Cleaning output folder
11
+ ESM Build start
12
+ Browserslist: caniuse-lite is outdated. Please run:
13
+ npx update-browserslist-db@latest
14
+ Why you should do it regularly: https://github.com/browserslist/update-db#readme
15
+ DTS Build start
16
+ Generated an empty chunk: "autosuggestion-state".
17
+ Generated an empty chunk: "autosuggestions-bare-function".
18
+ Generated an empty chunk: "custom-editor".
19
+ Generated an empty chunk: "chunk-YPBKY4KY".
20
+ Generated an empty chunk: "chunk-JD7BAH7U".
21
+ Generated an empty chunk: "chunk-H4VKQGVU".
22
+ Generated an empty chunk: "chunk-IU3WTXLQ".
23
+ ESM dist/index.css 5.52 KB
24
+ ESM dist/index.css.map 11.97 KB
25
+ ESM dist/types/autosuggestion-state.mjs 82.00 B
26
+ ESM dist/lib/get-text-around-cursor.mjs 232.00 B
27
+ ESM dist/components/index.mjs 607.00 B
28
+ ESM dist/hooks/use-copilot-textarea-editor.mjs 218.00 B
29
+ ESM dist/context/index.mjs 98.00 B
30
+ ESM dist/types/custom-editor.mjs 75.00 B
31
+ ESM dist/chunk-H4VKQGVU.mjs 76.00 B
32
+ ESM dist/chunk-JD7BAH7U.mjs 76.00 B
33
+ ESM dist/chunk-IU3WTXLQ.mjs 76.00 B
34
+ ESM dist/types/autosuggestions-bare-function.mjs 91.00 B
35
+ ESM dist/chunk-YPBKY4KY.mjs 76.00 B
36
+ ESM dist/types/base-autosuggestions-config.mjs 194.00 B
37
+ ESM dist/lib/utils.mjs 220.00 B
38
+ ESM dist/types/index.mjs 204.00 B
39
+ ESM dist/index.mjs 726.00 B
40
+ ESM dist/chunk-MRXNTQOX.mjs 1.92 KB
41
+ ESM dist/chunk-ETGKLURC.mjs 595.00 B
42
+ ESM dist/chunk-RVJAOO4S.mjs 527.00 B
43
+ ESM dist/chunk-TSF4AJIK.mjs 716.00 B
44
+ ESM dist/types/editor-autocomplete-state.mjs 218.00 B
45
+ ESM dist/chunk-X4FJ6WVZ.mjs 1.76 KB
46
+ ESM dist/chunk-Y5BUWZOI.mjs 1.14 KB
47
+ ESM dist/chunk-JJASB23A.mjs 2.93 KB
48
+ ESM dist/hooks/use-autosuggestions.mjs 268.00 B
49
+ ESM dist/chunk-KCHYD3EB.mjs 3.08 KB
50
+ ESM dist/chunk-GOAPCQCR.mjs 4.69 KB
51
+ ESM dist/chunk-KGKLUWKW.mjs 1.37 KB
52
+ ESM dist/chunk-5SJM4R4K.mjs 290.00 B
53
+ ESM dist/chunk-NKW5OU2S.mjs 959.00 B
54
+ ESM dist/chunk-L24ZN4LL.mjs 2.01 KB
55
+ ESM dist/lib/debouncer.mjs 153.00 B
56
+ ESM dist/chunk-KKG2RK2T.mjs 625.00 B
57
+ ESM dist/hooks/index.mjs 98.00 B
58
+ ESM dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs 681.00 B
59
+ ESM dist/chunk-4LJAS777.mjs 491.00 B
60
+ ESM dist/lib/editor-to-text.mjs 1.34 KB
61
+ ESM dist/lib/slatejs-edits/clear-autocompletions.mjs 192.00 B
62
+ ESM dist/lib/slatejs-edits/with-partial-history.mjs 198.00 B
63
+ ESM dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs 194.00 B
64
+ ESM dist/lib/slatejs-edits/replace-text.mjs 170.00 B
65
+ ESM dist/lib/slatejs-edits/add-autocompletions.mjs 186.00 B
66
+ ESM dist/types/autosuggestion-state.mjs.map 51.00 B
67
+ ESM dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs 186.00 B
68
+ ESM dist/lib/get-text-around-cursor.mjs.map 51.00 B
69
+ ESM dist/components/index.mjs.map 51.00 B
70
+ ESM dist/types/custom-editor.mjs.map 51.00 B
71
+ ESM dist/chunk-H4VKQGVU.mjs.map 51.00 B
72
+ ESM dist/hooks/use-copilot-textarea-editor.mjs.map 51.00 B
73
+ ESM dist/chunk-IU3WTXLQ.mjs.map 51.00 B
74
+ ESM dist/types/autosuggestions-bare-function.mjs.map 51.00 B
75
+ ESM dist/chunk-YPBKY4KY.mjs.map 51.00 B
76
+ ESM dist/types/base-autosuggestions-config.mjs.map 51.00 B
77
+ ESM dist/types/index.mjs.map 51.00 B
78
+ ESM dist/lib/utils.mjs.map 51.00 B
79
+ ESM dist/index.mjs.map 51.00 B
80
+ ESM dist/chunk-MRXNTQOX.mjs.map 71.00 B
81
+ ESM dist/chunk-ETGKLURC.mjs.map 1.03 KB
82
+ ESM dist/chunk-TSF4AJIK.mjs.map 1.31 KB
83
+ ESM dist/types/editor-autocomplete-state.mjs.map 51.00 B
84
+ ESM dist/chunk-X4FJ6WVZ.mjs.map 3.63 KB
85
+ ESM dist/chunk-Y5BUWZOI.mjs.map 1.84 KB
86
+ ESM dist/hooks/use-autosuggestions.mjs.map 51.00 B
87
+ ESM dist/chunk-JJASB23A.mjs.map 5.56 KB
88
+ ESM dist/chunk-KCHYD3EB.mjs.map 6.12 KB
89
+ ESM dist/chunk-GOAPCQCR.mjs.map 8.17 KB
90
+ ESM dist/chunk-KGKLUWKW.mjs.map 2.45 KB
91
+ ESM dist/chunk-NKW5OU2S.mjs.map 1.60 KB
92
+ ESM dist/chunk-5SJM4R4K.mjs.map 561.00 B
93
+ ESM dist/lib/debouncer.mjs.map 51.00 B
94
+ ESM dist/chunk-L24ZN4LL.mjs.map 3.77 KB
95
+ ESM dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs.map 51.00 B
96
+ ESM dist/chunk-KKG2RK2T.mjs.map 974.00 B
97
+ ESM dist/hooks/index.mjs.map 51.00 B
98
+ ESM dist/chunk-RVJAOO4S.mjs.map 916.00 B
99
+ ESM dist/context/index.mjs.map 51.00 B
100
+ ESM dist/chunk-4LJAS777.mjs.map 870.00 B
101
+ ESM dist/lib/editor-to-text.mjs.map 2.83 KB
102
+ ESM dist/lib/slatejs-edits/clear-autocompletions.mjs.map 51.00 B
103
+ ESM dist/chunk-JD7BAH7U.mjs.map 51.00 B
104
+ ESM dist/lib/slatejs-edits/with-partial-history.mjs.map 51.00 B
105
+ ESM dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs.map 51.00 B
106
+ ESM dist/lib/slatejs-edits/replace-text.mjs.map 51.00 B
107
+ ESM dist/lib/slatejs-edits/add-autocompletions.mjs.map 51.00 B
108
+ ESM dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs.map 51.00 B
109
+ ESM ⚡️ Build success in 507ms
110
+ DTS ⚡️ Build success in 828ms
111
+ DTS dist/index.d.ts 364.00 B
112
+ DTS dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.d.ts 785.00 B
113
+ DTS dist/types/base-autosuggestions-config.d.ts 332.00 B
114
+ DTS dist/types/autosuggestions-bare-function.d.ts 162.00 B
115
+ DTS dist/components/index.d.ts 249.00 B
116
+ DTS dist/hooks/index.d.ts 1.00 B
117
+ DTS dist/hooks/use-autosuggestions.d.ts 845.00 B
118
+ DTS dist/types/autosuggestion-state.d.ts 143.00 B
119
+ DTS dist/types/editor-autocomplete-state.d.ts 342.00 B
120
+ DTS dist/hooks/use-copilot-textarea-editor.d.ts 218.00 B
121
+ DTS dist/types/custom-editor.d.ts 801.00 B
122
+ DTS dist/context/index.d.ts 1.00 B
123
+ DTS dist/lib/debouncer.d.ts 372.00 B
124
+ DTS dist/lib/editor-to-text.d.ts 243.00 B
125
+ DTS dist/lib/get-text-around-cursor.d.ts 448.00 B
126
+ DTS dist/lib/utils.d.ts 638.00 B
127
+ DTS dist/types/index.d.ts 194.00 B
128
+ DTS dist/lib/slatejs-edits/add-autocompletions.d.ts 297.00 B
129
+ DTS dist/lib/slatejs-edits/clear-autocompletions.d.ts 245.00 B
130
+ DTS dist/lib/slatejs-edits/replace-text.d.ts 139.00 B
131
+ DTS dist/lib/slatejs-edits/with-partial-history.d.ts 537.00 B
132
+ DTS dist/components/copilot-textarea/base-copilot-textarea/render-element.d.ts 292.00 B
133
+ DTS dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.d.ts 321.00 B
package/CHANGELOG.md ADDED
@@ -0,0 +1,50 @@
1
+ # ui
2
+
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - bring private packages back into the void
8
+ - added tsconfig and eslint-config-custom to copilotkit scope
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+ - Updated dependencies
14
+ - @copilotkit/react-core@0.5.0
15
+
16
+ ## 0.4.0
17
+
18
+ ### Minor Changes
19
+
20
+ - first beta release
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies
25
+ - @copilotkit/react-core@0.4.0
26
+
27
+ ## 0.3.0
28
+
29
+ ### Minor Changes
30
+
31
+ - working version
32
+ - 9d2f3cb: semi compiling
33
+
34
+ ### Patch Changes
35
+
36
+ - Updated dependencies
37
+ - Updated dependencies [9d2f3cb]
38
+ - @copilotkit/react-core@0.3.0
39
+
40
+ ## 0.2.0
41
+
42
+ ### Minor Changes
43
+
44
+ - react core initialization
45
+
46
+ ## 0.1.0
47
+
48
+ ### Minor Changes
49
+
50
+ - initial
@@ -0,0 +1,10 @@
1
+ import { arraysAreEqual } from './chunk-KGKLUWKW.mjs';
2
+
3
+ // src/types/editor-autocomplete-state.ts
4
+ function areEqual_autocompleteState(prev, next) {
5
+ return prev.cursorPoint.offset === next.cursorPoint.offset && arraysAreEqual(prev.cursorPoint.path, next.cursorPoint.path) && prev.textBeforeCursor === next.textBeforeCursor && prev.textAfterCursor === next.textAfterCursor;
6
+ }
7
+
8
+ export { areEqual_autocompleteState };
9
+ //# sourceMappingURL=out.js.map
10
+ //# sourceMappingURL=chunk-4LJAS777.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/editor-autocomplete-state.ts"],"names":[],"mappings":";;;;;AAQO,SAAS,2BACd,MACA,MACA;AACA,SACE,KAAK,YAAY,WAAW,KAAK,YAAY,UAC7C,eAAe,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI,KAC3D,KAAK,qBAAqB,KAAK,oBAC/B,KAAK,oBAAoB,KAAK;AAElC","sourcesContent":["import { BasePoint } from \"slate\";\nimport { arraysAreEqual } from \"../lib/utils\";\n\nexport interface EditorAutocompleteState {\n cursorPoint: BasePoint;\n textBeforeCursor: string;\n textAfterCursor: string;\n}\nexport function areEqual_autocompleteState(\n prev: EditorAutocompleteState,\n next: EditorAutocompleteState\n) {\n return (\n prev.cursorPoint.offset === next.cursorPoint.offset &&\n arraysAreEqual(prev.cursorPoint.path, next.cursorPoint.path) &&\n prev.textBeforeCursor === next.textBeforeCursor &&\n prev.textAfterCursor === next.textAfterCursor\n );\n}\n"]}
@@ -0,0 +1,10 @@
1
+ // src/types/base-autosuggestions-config.tsx
2
+ var defaultBaseAutosuggestionsConfig = {
3
+ debounceTime: 500,
4
+ acceptAutosuggestionKey: "Tab",
5
+ disableWhenEmpty: true
6
+ };
7
+
8
+ export { defaultBaseAutosuggestionsConfig };
9
+ //# sourceMappingURL=out.js.map
10
+ //# sourceMappingURL=chunk-5SJM4R4K.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/base-autosuggestions-config.tsx"],"names":[],"mappings":";AAOO,IAAM,mCAGT;AAAA,EACF,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,kBAAkB;AACpB","sourcesContent":["export interface BaseAutosuggestionsConfig {\n purposePrompt: string;\n debounceTime: number;\n acceptAutosuggestionKey: string;\n disableWhenEmpty: boolean;\n}\n\nexport const defaultBaseAutosuggestionsConfig: Omit<\n BaseAutosuggestionsConfig,\n \"purposePrompt\"\n> = {\n debounceTime: 500,\n acceptAutosuggestionKey: \"Tab\",\n disableWhenEmpty: true,\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-ETGKLURC.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/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,124 @@
1
+ import { addAutocompletionsToEditor } from './chunk-ETGKLURC.mjs';
2
+ import { clearAutocompletionsFromEditor } from './chunk-RVJAOO4S.mjs';
3
+ import { replaceEditorText } from './chunk-TSF4AJIK.mjs';
4
+ import { makeRenderElementFunction } from './chunk-Y5BUWZOI.mjs';
5
+ import { makeRenderPlaceholderFunction } from './chunk-KKG2RK2T.mjs';
6
+ import { getTextAroundCursor, getFullEditorTextWithNewlines } from './chunk-X4FJ6WVZ.mjs';
7
+ import { defaultBaseAutosuggestionsConfig } from './chunk-5SJM4R4K.mjs';
8
+ import { useAutosuggestions } from './chunk-JJASB23A.mjs';
9
+ import { useCopilotTextareaEditor } from './chunk-L24ZN4LL.mjs';
10
+ import { __spreadValues, __objRest } from './chunk-MRXNTQOX.mjs';
11
+ import { useMemo, useState, useCallback, useEffect } from 'react';
12
+ import { Editor } from 'slate';
13
+ import { Slate, Editable } from 'slate-react';
14
+ import { twMerge } from 'tailwind-merge';
15
+ import { jsx } from 'react/jsx-runtime';
16
+
17
+ function BaseCopilotTextarea(props) {
18
+ const autosuggestionsConfig = __spreadValues(__spreadValues({}, defaultBaseAutosuggestionsConfig), props.autosuggestionsConfig);
19
+ const valueOnInitialRender = useMemo(() => {
20
+ var _a2;
21
+ return (_a2 = props.value) != null ? _a2 : "";
22
+ }, []);
23
+ const [lastKnownFullEditorText, setLastKnownFullEditorText] = useState(valueOnInitialRender);
24
+ const initialValue = useMemo(() => {
25
+ return [
26
+ {
27
+ type: "paragraph",
28
+ children: [{ text: valueOnInitialRender }]
29
+ }
30
+ ];
31
+ }, [valueOnInitialRender]);
32
+ const editor = useCopilotTextareaEditor();
33
+ const insertText = useCallback(
34
+ (autosuggestion) => {
35
+ Editor.insertText(editor, autosuggestion.text, {
36
+ at: autosuggestion.point
37
+ });
38
+ },
39
+ [editor]
40
+ );
41
+ const {
42
+ currentAutocompleteSuggestion,
43
+ onChangeHandler: onChangeHandlerForAutocomplete,
44
+ onKeyDownHandler: onKeyDownHandlerForAutocomplete
45
+ } = useAutosuggestions(
46
+ autosuggestionsConfig.debounceTime,
47
+ autosuggestionsConfig.acceptAutosuggestionKey,
48
+ props.autosuggestionsFunction,
49
+ insertText,
50
+ autosuggestionsConfig.disableWhenEmpty
51
+ );
52
+ useEffect(() => {
53
+ clearAutocompletionsFromEditor(editor);
54
+ if (currentAutocompleteSuggestion) {
55
+ addAutocompletionsToEditor(
56
+ editor,
57
+ currentAutocompleteSuggestion.text,
58
+ currentAutocompleteSuggestion.point
59
+ );
60
+ }
61
+ }, [currentAutocompleteSuggestion]);
62
+ const renderElementMemoized = useMemo(() => {
63
+ const suggestionStyleAugmented = __spreadValues({}, props.suggestionsStyle);
64
+ return makeRenderElementFunction(suggestionStyleAugmented);
65
+ }, [props.suggestionsStyle]);
66
+ const renderPlaceholderMemoized = useMemo(() => {
67
+ const placeholderStyleSlatejsOverrides = {
68
+ top: void 0
69
+ };
70
+ const placeholderStyleAugmented = __spreadValues(__spreadValues({}, placeholderStyleSlatejsOverrides), props.placeholderStyle);
71
+ return makeRenderPlaceholderFunction(placeholderStyleAugmented);
72
+ }, [props.placeholderStyle]);
73
+ useEffect(() => {
74
+ var _a2, _b;
75
+ if (props.value === lastKnownFullEditorText) {
76
+ return;
77
+ }
78
+ setLastKnownFullEditorText((_a2 = props.value) != null ? _a2 : "");
79
+ replaceEditorText(editor, (_b = props.value) != null ? _b : "");
80
+ }, [props.value]);
81
+ const _a = props, {
82
+ placeholderStyle,
83
+ value,
84
+ onValueChange,
85
+ autosuggestionsConfig: autosuggestionsConfigFromProps,
86
+ autosuggestionsFunction,
87
+ className
88
+ } = _a, propsToForward = __objRest(_a, [
89
+ "placeholderStyle",
90
+ "value",
91
+ "onValueChange",
92
+ "autosuggestionsConfig",
93
+ "autosuggestionsFunction",
94
+ "className"
95
+ ]);
96
+ const moddedClassName = (() => {
97
+ const baseClassName = "copilot-textarea";
98
+ const defaultTailwindClassName = "bg-white overflow-y-auto resize-y";
99
+ const mergedClassName = twMerge(defaultTailwindClassName, className != null ? className : "");
100
+ return `${baseClassName} ${mergedClassName}`;
101
+ })();
102
+ return /* @__PURE__ */ jsx(Slate, {
103
+ editor,
104
+ initialValue,
105
+ onChange: (value2) => {
106
+ var _a2;
107
+ const newEditorState = getTextAroundCursor(editor);
108
+ const fullEditorText = newEditorState ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor : getFullEditorTextWithNewlines(editor);
109
+ setLastKnownFullEditorText(fullEditorText);
110
+ onChangeHandlerForAutocomplete(newEditorState);
111
+ (_a2 = props.onValueChange) == null ? void 0 : _a2.call(props, fullEditorText);
112
+ },
113
+ children: /* @__PURE__ */ jsx(Editable, __spreadValues({
114
+ renderElement: renderElementMemoized,
115
+ renderPlaceholder: renderPlaceholderMemoized,
116
+ onKeyDown: onKeyDownHandlerForAutocomplete,
117
+ className: moddedClassName
118
+ }, propsToForward))
119
+ });
120
+ }
121
+
122
+ export { BaseCopilotTextarea };
123
+ //# sourceMappingURL=out.js.map
124
+ //# sourceMappingURL=chunk-GOAPCQCR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.tsx"],"names":["_a","value"],"mappings":"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","sourcesContent":["// This example is for an Editor with `ReactEditor` and `HistoryEditor`\nimport {\n TextareaHTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { Descendant, Editor } from \"slate\";\nimport { Editable, Slate } from \"slate-react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useAutosuggestions } from \"../../../hooks/use-autosuggestions\";\nimport { AutosuggestionsBareFunction } from \"../../../types/autosuggestions-bare-function\";\nimport { useCopilotTextareaEditor } from \"../../../hooks/use-copilot-textarea-editor\";\nimport {\n getFullEditorTextWithNewlines,\n getTextAroundCursor,\n} from \"../../../lib/get-text-around-cursor\";\nimport { addAutocompletionsToEditor } from \"../../../lib/slatejs-edits/add-autocompletions\";\nimport { clearAutocompletionsFromEditor } from \"../../../lib/slatejs-edits/clear-autocompletions\";\nimport { replaceEditorText } from \"../../../lib/slatejs-edits/replace-text\";\nimport { AutosuggestionState } from \"../../../types/autosuggestion-state\";\nimport {\n BaseAutosuggestionsConfig,\n defaultBaseAutosuggestionsConfig,\n} from \"../../../types/base-autosuggestions-config\";\nimport { makeRenderElementFunction } from \"./render-element\";\nimport { makeRenderPlaceholderFunction } from \"./render-placeholder\";\n\nexport interface BaseCopilotTextareaProps\n extends TextareaHTMLAttributes<HTMLDivElement> {\n placeholderStyle?: React.CSSProperties;\n suggestionsStyle?: React.CSSProperties;\n value?: string;\n onValueChange?: (value: string) => void;\n autosuggestionsConfig: Partial<BaseAutosuggestionsConfig> & {\n purposePrompt: string;\n };\n}\n\nexport function BaseCopilotTextarea(\n props: BaseCopilotTextareaProps & {\n autosuggestionsFunction: AutosuggestionsBareFunction;\n }\n): JSX.Element {\n const autosuggestionsConfig: BaseAutosuggestionsConfig = {\n ...defaultBaseAutosuggestionsConfig,\n ...props.autosuggestionsConfig,\n };\n\n const valueOnInitialRender = useMemo(() => props.value ?? \"\", []);\n const [lastKnownFullEditorText, setLastKnownFullEditorText] =\n useState(valueOnInitialRender);\n\n const initialValue: Descendant[] = useMemo(() => {\n return [\n {\n type: \"paragraph\",\n children: [{ text: valueOnInitialRender }],\n },\n ];\n }, [valueOnInitialRender]);\n\n const editor = useCopilotTextareaEditor();\n\n const insertText = useCallback(\n (autosuggestion: AutosuggestionState) => {\n Editor.insertText(editor, autosuggestion.text, {\n at: autosuggestion.point,\n });\n },\n [editor]\n );\n\n const {\n currentAutocompleteSuggestion,\n onChangeHandler: onChangeHandlerForAutocomplete,\n onKeyDownHandler: onKeyDownHandlerForAutocomplete,\n } = useAutosuggestions(\n autosuggestionsConfig.debounceTime,\n autosuggestionsConfig.acceptAutosuggestionKey,\n props.autosuggestionsFunction,\n insertText,\n autosuggestionsConfig.disableWhenEmpty\n );\n\n // sync autosuggestions state with the editor\n useEffect(() => {\n clearAutocompletionsFromEditor(editor);\n if (currentAutocompleteSuggestion) {\n addAutocompletionsToEditor(\n editor,\n currentAutocompleteSuggestion.text,\n currentAutocompleteSuggestion.point\n );\n }\n }, [currentAutocompleteSuggestion]);\n\n const renderElementMemoized = useMemo(() => {\n const suggestionStyleAugmented: React.CSSProperties = {\n ...props.suggestionsStyle,\n };\n\n return makeRenderElementFunction(suggestionStyleAugmented);\n }, [props.suggestionsStyle]);\n\n const renderPlaceholderMemoized = useMemo(() => {\n // For some reason slateJS specifies a top value of 0, which makes for strange styling. We override this here.\n const placeholderStyleSlatejsOverrides: React.CSSProperties = {\n top: undefined,\n };\n\n const placeholderStyleAugmented: React.CSSProperties = {\n ...placeholderStyleSlatejsOverrides,\n ...props.placeholderStyle,\n };\n\n return makeRenderPlaceholderFunction(placeholderStyleAugmented);\n }, [props.placeholderStyle]);\n\n // update the editor text, but only when the value changes from outside the component\n useEffect(() => {\n if (props.value === lastKnownFullEditorText) {\n return;\n }\n\n setLastKnownFullEditorText(props.value ?? \"\");\n replaceEditorText(editor, props.value ?? \"\");\n }, [props.value]);\n\n // separate into TextareaHTMLAttributes<HTMLDivElement> and CopilotTextareaProps\n const {\n placeholderStyle,\n value,\n onValueChange,\n autosuggestionsConfig: autosuggestionsConfigFromProps,\n autosuggestionsFunction,\n className,\n ...propsToForward\n } = props;\n\n const moddedClassName = (() => {\n const baseClassName = \"copilot-textarea\";\n const defaultTailwindClassName = \"bg-white overflow-y-auto resize-y\";\n const mergedClassName = twMerge(defaultTailwindClassName, className ?? \"\");\n return `${baseClassName} ${mergedClassName}`;\n })();\n\n return (\n // Add the editable component inside the context.\n <Slate\n editor={editor}\n initialValue={initialValue}\n onChange={(value) => {\n const newEditorState = getTextAroundCursor(editor);\n\n const fullEditorText = newEditorState\n ? newEditorState.textBeforeCursor + newEditorState.textAfterCursor\n : getFullEditorTextWithNewlines(editor); // we don't double-parse the editor. When `newEditorState` is null, we didn't parse the editor yet.\n\n setLastKnownFullEditorText(fullEditorText);\n onChangeHandlerForAutocomplete(newEditorState);\n props.onValueChange?.(fullEditorText);\n }}\n >\n <Editable\n renderElement={renderElementMemoized}\n renderPlaceholder={renderPlaceholderMemoized}\n onKeyDown={onKeyDownHandlerForAutocomplete}\n className={moddedClassName}\n {...propsToForward}\n />\n </Slate>\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=out.js.map
3
+ //# sourceMappingURL=chunk-H4VKQGVU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=out.js.map
3
+ //# sourceMappingURL=chunk-IU3WTXLQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=out.js.map
3
+ //# sourceMappingURL=chunk-JD7BAH7U.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { areEqual_autocompleteState } from './chunk-4LJAS777.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 } from 'react';
6
+
7
+ function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty) {
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 (disableWhenEmpty && editorAutocompleteState.textBeforeCursor === "" && editorAutocompleteState.textAfterCursor === "") {
13
+ return;
14
+ }
15
+ const suggestion = yield autosuggestionFunction(
16
+ editorAutocompleteState.textBeforeCursor,
17
+ editorAutocompleteState.textAfterCursor,
18
+ abortSignal
19
+ );
20
+ if (!suggestion || abortSignal.aborted) {
21
+ throw new DOMException("Aborted", "AbortError");
22
+ }
23
+ setCurrentAutocompleteSuggestion({
24
+ text: suggestion,
25
+ point: editorAutocompleteState.cursorPoint
26
+ });
27
+ }),
28
+ [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty]
29
+ );
30
+ const debouncedFunction = useMemo(
31
+ () => new Debouncer(
32
+ debounceTime
33
+ ),
34
+ [debounceTime]
35
+ );
36
+ const onChange = useCallback(
37
+ (newEditorState) => {
38
+ const editorStateHasChanged = !nullableCompatibleEqualityCheck(
39
+ areEqual_autocompleteState,
40
+ previousAutocompleteState,
41
+ newEditorState
42
+ );
43
+ setPreviousAutocompleteState(newEditorState);
44
+ if (!editorStateHasChanged) {
45
+ return;
46
+ }
47
+ setCurrentAutocompleteSuggestion(null);
48
+ if (newEditorState) {
49
+ debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
50
+ } else {
51
+ debouncedFunction.cancel();
52
+ }
53
+ },
54
+ [
55
+ previousAutocompleteState,
56
+ setPreviousAutocompleteState,
57
+ debouncedFunction,
58
+ awaitForAndAppendSuggestion,
59
+ setCurrentAutocompleteSuggestion
60
+ ]
61
+ );
62
+ const keyDownHandler = useCallback(
63
+ (event) => {
64
+ if (currentAutocompleteSuggestion) {
65
+ if (event.key === acceptAutosuggestionKey) {
66
+ event.preventDefault();
67
+ insertAutocompleteSuggestion(currentAutocompleteSuggestion);
68
+ setCurrentAutocompleteSuggestion(null);
69
+ }
70
+ }
71
+ },
72
+ [
73
+ currentAutocompleteSuggestion,
74
+ setCurrentAutocompleteSuggestion,
75
+ insertAutocompleteSuggestion,
76
+ acceptAutosuggestionKey
77
+ ]
78
+ );
79
+ return {
80
+ currentAutocompleteSuggestion,
81
+ onChangeHandler: onChange,
82
+ onKeyDownHandler: keyDownHandler
83
+ };
84
+ }
85
+
86
+ export { useAutosuggestions };
87
+ //# sourceMappingURL=out.js.map
88
+ //# sourceMappingURL=chunk-JJASB23A.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-autosuggestions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,aAAa,SAAS,gBAAgB;AAgBxC,SAAS,mBACd,cACA,yBACA,wBACA,8BACA,kBAC0B;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;AACH,UACE,oBACA,wBAAwB,qBAAqB,MAC7C,wBAAwB,oBAAoB,IAC5C;AACA;AAAA,MACF;AAEA,YAAM,aAAa,MAAM;AAAA,QACvB,wBAAwB;AAAA,QACxB,wBAAwB;AAAA,QACxB;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,CAAC,wBAAwB,kCAAkC,gBAAgB;AAAA,EAC7E;AAEA,QAAM,oBAAoB;AAAA,IACxB,MACE,IAAI;AAAA,MACF;AAAA,IACF;AAAA,IACF,CAAC,YAAY;AAAA,EACf;AAEA,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, useMemo, useState } from \"react\";\nimport { Debouncer } from \"../lib/debouncer\";\nimport { nullableCompatibleEqualityCheck } from \"../lib/utils\";\nimport { AutosuggestionState } from \"../types/autosuggestion-state\";\nimport {\n EditorAutocompleteState,\n areEqual_autocompleteState,\n} from \"../types/editor-autocomplete-state\";\nimport { AutosuggestionsBareFunction } from \"../types/autosuggestions-bare-function\";\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): 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 if (\n disableWhenEmpty &&\n editorAutocompleteState.textBeforeCursor === \"\" &&\n editorAutocompleteState.textAfterCursor === \"\"\n ) {\n return;\n }\n\n const suggestion = await autosuggestionFunction(\n editorAutocompleteState.textBeforeCursor,\n editorAutocompleteState.textAfterCursor,\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 [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty]\n );\n\n const debouncedFunction = useMemo(\n () =>\n new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(\n debounceTime\n ),\n [debounceTime]\n );\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"]}
@@ -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-KCHYD3EB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/slatejs-edits/with-partial-history.ts"],"names":[],"mappings":"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","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 = (\n op: Operation,\n prev: Operation | undefined\n) => 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 =\n 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 = (\n op: Operation,\n prev: Operation | undefined\n): boolean => {\n if (op.type === \"set_selection\") {\n return false;\n }\n\n return true;\n};\n"]}