@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.
- package/.turbo/turbo-build.log +133 -0
- package/CHANGELOG.md +50 -0
- package/dist/chunk-4LJAS777.mjs +10 -0
- package/dist/chunk-4LJAS777.mjs.map +1 -0
- package/dist/chunk-5SJM4R4K.mjs +10 -0
- package/dist/chunk-5SJM4R4K.mjs.map +1 -0
- package/dist/chunk-ETGKLURC.mjs +27 -0
- package/dist/chunk-ETGKLURC.mjs.map +1 -0
- package/dist/chunk-GOAPCQCR.mjs +124 -0
- package/dist/chunk-GOAPCQCR.mjs.map +1 -0
- package/dist/chunk-H4VKQGVU.mjs +3 -0
- package/dist/chunk-H4VKQGVU.mjs.map +1 -0
- package/dist/chunk-IU3WTXLQ.mjs +3 -0
- package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
- package/dist/chunk-JD7BAH7U.mjs +3 -0
- package/dist/chunk-JD7BAH7U.mjs.map +1 -0
- package/dist/chunk-JJASB23A.mjs +88 -0
- package/dist/chunk-JJASB23A.mjs.map +1 -0
- package/dist/chunk-KCHYD3EB.mjs +107 -0
- package/dist/chunk-KCHYD3EB.mjs.map +1 -0
- package/dist/chunk-KGKLUWKW.mjs +47 -0
- package/dist/chunk-KGKLUWKW.mjs.map +1 -0
- package/dist/chunk-KKG2RK2T.mjs +16 -0
- package/dist/chunk-KKG2RK2T.mjs.map +1 -0
- package/dist/chunk-L24ZN4LL.mjs +65 -0
- package/dist/chunk-L24ZN4LL.mjs.map +1 -0
- package/dist/chunk-MRXNTQOX.mjs +55 -0
- package/dist/chunk-MRXNTQOX.mjs.map +1 -0
- package/dist/chunk-NKW5OU2S.mjs +33 -0
- package/dist/chunk-NKW5OU2S.mjs.map +1 -0
- package/dist/chunk-RVJAOO4S.mjs +18 -0
- package/dist/chunk-RVJAOO4S.mjs.map +1 -0
- package/dist/chunk-TSF4AJIK.mjs +30 -0
- package/dist/chunk-TSF4AJIK.mjs.map +1 -0
- package/dist/chunk-X4FJ6WVZ.mjs +66 -0
- package/dist/chunk-X4FJ6WVZ.mjs.map +1 -0
- package/dist/chunk-Y5BUWZOI.mjs +37 -0
- package/dist/chunk-Y5BUWZOI.mjs.map +1 -0
- package/dist/chunk-YPBKY4KY.mjs +3 -0
- package/dist/chunk-YPBKY4KY.mjs.map +1 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.d.ts +18 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs +17 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-element.d.ts +6 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs +4 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-element.mjs.map +1 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.d.ts +6 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs +4 -0
- package/dist/components/copilot-textarea/base-copilot-textarea/render-placeholder.mjs.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.mjs +18 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.mjs +3 -0
- package/dist/context/index.mjs.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.mjs +3 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/use-autosuggestions.d.ts +13 -0
- package/dist/hooks/use-autosuggestions.mjs +7 -0
- package/dist/hooks/use-autosuggestions.mjs.map +1 -0
- package/dist/hooks/use-copilot-textarea-editor.d.ts +8 -0
- package/dist/hooks/use-copilot-textarea-editor.mjs +5 -0
- package/dist/hooks/use-copilot-textarea-editor.mjs.map +1 -0
- package/dist/index.css +340 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.mjs +21 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/debouncer.d.ts +11 -0
- package/dist/lib/debouncer.mjs +4 -0
- package/dist/lib/debouncer.mjs.map +1 -0
- package/dist/lib/editor-to-text.d.ts +7 -0
- package/dist/lib/editor-to-text.mjs +45 -0
- package/dist/lib/editor-to-text.mjs.map +1 -0
- package/dist/lib/get-text-around-cursor.d.ts +8 -0
- package/dist/lib/get-text-around-cursor.mjs +4 -0
- package/dist/lib/get-text-around-cursor.mjs.map +1 -0
- package/dist/lib/slatejs-edits/add-autocompletions.d.ts +8 -0
- package/dist/lib/slatejs-edits/add-autocompletions.mjs +4 -0
- package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.d.ts +8 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs +4 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -0
- package/dist/lib/slatejs-edits/replace-text.d.ts +5 -0
- package/dist/lib/slatejs-edits/replace-text.mjs +4 -0
- package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -0
- package/dist/lib/slatejs-edits/with-partial-history.d.ts +10 -0
- package/dist/lib/slatejs-edits/with-partial-history.mjs +4 -0
- package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -0
- package/dist/lib/utils.d.ts +10 -0
- package/dist/lib/utils.mjs +4 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/dist/types/autosuggestion-state.d.ts +8 -0
- package/dist/types/autosuggestion-state.mjs +3 -0
- package/dist/types/autosuggestion-state.mjs.map +1 -0
- package/dist/types/autosuggestions-bare-function.d.ts +3 -0
- package/dist/types/autosuggestions-bare-function.mjs +3 -0
- package/dist/types/autosuggestions-bare-function.mjs.map +1 -0
- package/dist/types/base-autosuggestions-config.d.ts +9 -0
- package/dist/types/base-autosuggestions-config.mjs +4 -0
- package/dist/types/base-autosuggestions-config.mjs.map +1 -0
- package/dist/types/custom-editor.d.ts +29 -0
- package/dist/types/custom-editor.mjs +3 -0
- package/dist/types/custom-editor.mjs.map +1 -0
- package/dist/types/editor-autocomplete-state.d.ts +10 -0
- package/dist/types/editor-autocomplete-state.mjs +5 -0
- package/dist/types/editor-autocomplete-state.mjs.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.mjs +5 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +53 -0
- package/postcss.config.js +9 -0
- package/src/components/copilot-textarea/base-copilot-textarea/base-copilot-textarea.tsx +175 -0
- package/src/components/copilot-textarea/base-copilot-textarea/render-element.tsx +42 -0
- package/src/components/copilot-textarea/base-copilot-textarea/render-placeholder.tsx +25 -0
- package/src/components/index.ts +2 -0
- package/src/context/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-autosuggestions.ts +129 -0
- package/src/hooks/use-copilot-textarea-editor.tsx +104 -0
- package/src/index.tsx +7 -0
- package/src/lib/debouncer.ts +38 -0
- package/src/lib/editor-to-text.ts +64 -0
- package/src/lib/get-text-around-cursor.ts +82 -0
- package/src/lib/slatejs-edits/add-autocompletions.ts +30 -0
- package/src/lib/slatejs-edits/clear-autocompletions.ts +15 -0
- package/src/lib/slatejs-edits/replace-text.ts +32 -0
- package/src/lib/slatejs-edits/with-partial-history.ts +156 -0
- package/src/lib/utils.ts +59 -0
- package/src/styles.css +3 -0
- package/src/types/autosuggestion-state.ts +6 -0
- package/src/types/autosuggestions-bare-function.ts +5 -0
- package/src/types/base-autosuggestions-config.tsx +15 -0
- package/src/types/custom-editor.tsx +29 -0
- package/src/types/editor-autocomplete-state.ts +19 -0
- package/src/types/index.ts +4 -0
- package/tailwind.config.js +7 -0
- package/tsconfig.json +5 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -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"]}
|