@copilotkit/react-textarea 0.19.0-alpha.9 → 0.19.1
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 +298 -298
- package/CHANGELOG.md +35 -0
- package/dist/chunk-2NURR2DX.mjs +47 -0
- package/dist/chunk-2NURR2DX.mjs.map +1 -0
- package/dist/chunk-3TK2VELX.mjs +202 -0
- package/dist/chunk-3TK2VELX.mjs.map +1 -0
- package/dist/chunk-47JRPWI3.mjs +257 -0
- package/dist/chunk-47JRPWI3.mjs.map +1 -0
- package/dist/chunk-4S5ZJH3I.mjs +18 -0
- package/dist/chunk-4S5ZJH3I.mjs.map +1 -0
- package/dist/chunk-5EJ5XOGP.mjs +22 -0
- package/dist/chunk-5EJ5XOGP.mjs.map +1 -0
- package/dist/chunk-5FO6ISW4.mjs +3 -0
- package/dist/chunk-5FO6ISW4.mjs.map +1 -0
- package/dist/chunk-66BDXIX4.mjs +76 -0
- package/dist/chunk-66BDXIX4.mjs.map +1 -0
- package/dist/chunk-7QWJ3OV7.mjs +108 -0
- package/dist/chunk-7QWJ3OV7.mjs.map +1 -0
- package/dist/chunk-BBKDE7YT.mjs +19 -0
- package/dist/chunk-BBKDE7YT.mjs.map +1 -0
- package/dist/chunk-CSGFJU3L.mjs +65 -0
- package/dist/chunk-CSGFJU3L.mjs.map +1 -0
- package/dist/chunk-DE5K76I2.mjs +3 -0
- package/dist/chunk-DE5K76I2.mjs.map +1 -0
- package/dist/chunk-F3MHL6ZY.mjs +25 -0
- package/dist/chunk-F3MHL6ZY.mjs.map +1 -0
- package/dist/chunk-FN7GDKKG.mjs +29 -0
- package/dist/chunk-FN7GDKKG.mjs.map +1 -0
- package/dist/chunk-H4VKQGVU.mjs +3 -0
- package/dist/chunk-H4VKQGVU.mjs.map +1 -0
- package/dist/chunk-HRTFMM7P.mjs +82 -0
- package/dist/chunk-HRTFMM7P.mjs.map +1 -0
- package/dist/chunk-IU3WTXLQ.mjs +3 -0
- package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
- package/dist/chunk-IXJ2HCOA.mjs +101 -0
- package/dist/chunk-IXJ2HCOA.mjs.map +1 -0
- package/dist/chunk-JAFCXEPU.mjs +10 -0
- package/dist/chunk-JAFCXEPU.mjs.map +1 -0
- package/dist/chunk-JHTAOLEW.mjs +63 -0
- package/dist/chunk-JHTAOLEW.mjs.map +1 -0
- package/dist/chunk-K2AVA67P.mjs +57 -0
- package/dist/chunk-K2AVA67P.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-KIRROE2K.mjs +37 -0
- package/dist/chunk-KIRROE2K.mjs.map +1 -0
- package/dist/chunk-L6DZHWEL.mjs +76 -0
- package/dist/chunk-L6DZHWEL.mjs.map +1 -0
- package/dist/chunk-L7VVZH4Q.mjs +3 -0
- package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
- package/dist/chunk-LNAIMEB2.mjs +34 -0
- package/dist/chunk-LNAIMEB2.mjs.map +1 -0
- package/dist/chunk-MMVDU6DF.mjs +3 -0
- package/dist/chunk-MMVDU6DF.mjs.map +1 -0
- package/dist/chunk-MPME5BW2.mjs +59 -0
- package/dist/chunk-MPME5BW2.mjs.map +1 -0
- package/dist/chunk-MRXNTQOX.mjs +55 -0
- package/dist/chunk-MRXNTQOX.mjs.map +1 -0
- package/dist/chunk-ND5PXTAW.mjs +17 -0
- package/dist/chunk-ND5PXTAW.mjs.map +1 -0
- package/dist/chunk-NKW5OU2S.mjs +33 -0
- package/dist/chunk-NKW5OU2S.mjs.map +1 -0
- package/dist/chunk-O5OWT5GE.mjs +114 -0
- package/dist/chunk-O5OWT5GE.mjs.map +1 -0
- package/dist/chunk-OD7ZMOVE.mjs +45 -0
- package/dist/chunk-OD7ZMOVE.mjs.map +1 -0
- package/dist/chunk-OELUUJZY.mjs +16 -0
- package/dist/chunk-OELUUJZY.mjs.map +1 -0
- package/dist/chunk-OXPXFYUG.mjs +111 -0
- package/dist/chunk-OXPXFYUG.mjs.map +1 -0
- package/dist/chunk-QNJ6MXJ2.mjs +21 -0
- package/dist/chunk-QNJ6MXJ2.mjs.map +1 -0
- package/dist/chunk-RDHPSSHJ.mjs +44 -0
- package/dist/chunk-RDHPSSHJ.mjs.map +1 -0
- package/dist/chunk-RQHOUUXQ.mjs +29 -0
- package/dist/chunk-RQHOUUXQ.mjs.map +1 -0
- package/dist/chunk-S6JUGJK2.mjs +13 -0
- package/dist/chunk-S6JUGJK2.mjs.map +1 -0
- package/dist/chunk-UHD44NC5.mjs +101 -0
- package/dist/chunk-UHD44NC5.mjs.map +1 -0
- package/dist/chunk-WADHCMPK.mjs +3 -0
- package/dist/chunk-WADHCMPK.mjs.map +1 -0
- package/dist/chunk-WJHSY5T6.mjs +3 -0
- package/dist/chunk-WJHSY5T6.mjs.map +1 -0
- package/dist/chunk-WJYQWL4I.mjs +27 -0
- package/dist/chunk-WJYQWL4I.mjs.map +1 -0
- package/dist/chunk-XA7M72ZO.mjs +106 -0
- package/dist/chunk-XA7M72ZO.mjs.map +1 -0
- package/dist/chunk-XHUMROEY.mjs +91 -0
- package/dist/chunk-XHUMROEY.mjs.map +1 -0
- package/dist/chunk-YQU7WG7T.mjs +83 -0
- package/dist/chunk-YQU7WG7T.mjs.map +1 -0
- package/dist/chunk-YTOPHPSG.mjs +45 -0
- package/dist/chunk-YTOPHPSG.mjs.map +1 -0
- package/dist/chunk-YW3REYX6.mjs +23 -0
- package/dist/chunk-YW3REYX6.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +34 -1734
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-element.mjs +3 -52
- package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-placeholder.mjs +3 -46
- package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +4 -86
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +3 -57
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
- package/dist/components/copilot-textarea/copilot-textarea.mjs +46 -2202
- package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +3 -22
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +3 -125
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs +17 -877
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +11 -577
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +12 -592
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +13 -592
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
- package/dist/components/index.mjs +47 -2203
- package/dist/components/index.mjs.map +1 -1
- package/dist/components/manual-ui/chip-with-icon.mjs +6 -5
- package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
- package/dist/components/source-search-box/source-search-box.mjs +6 -209
- package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
- package/dist/components/ui/button.mjs +4 -88
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/card.mjs +7 -53
- package/dist/components/ui/card.mjs.map +1 -1
- package/dist/components/ui/command.mjs +5 -266
- package/dist/components/ui/command.mjs.map +1 -1
- package/dist/components/ui/dialog.mjs +4 -164
- package/dist/components/ui/dialog.mjs.map +1 -1
- package/dist/components/ui/label.mjs +4 -63
- package/dist/components/ui/label.mjs.map +1 -1
- package/dist/components/ui/separator.mjs +8 -50
- package/dist/components/ui/separator.mjs.map +1 -1
- package/dist/components/ui/textarea.mjs +7 -48
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/context/index.mjs +2 -0
- package/dist/context/index.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +6 -168
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +4 -168
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +5 -155
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
- package/dist/hooks/index.mjs +2 -0
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +14 -145
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +14 -199
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
- package/dist/hooks/misc/use-autosize-textarea.mjs +3 -15
- package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
- package/dist/index.mjs +49 -2206
- package/dist/index.mjs.map +1 -1
- package/dist/lib/debouncer.mjs +3 -51
- package/dist/lib/debouncer.mjs.map +1 -1
- package/dist/lib/editor-to-text.mjs +3 -43
- package/dist/lib/editor-to-text.mjs.map +1 -1
- package/dist/lib/get-text-around-cursor.mjs +3 -109
- package/dist/lib/get-text-around-cursor.mjs.map +1 -1
- package/dist/lib/retry.mjs +3 -17
- package/dist/lib/retry.mjs.map +1 -1
- package/dist/lib/slatejs-edits/add-autocompletions.mjs +3 -25
- package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs +3 -23
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/replace-text.mjs +3 -27
- package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
- package/dist/lib/slatejs-edits/with-partial-history.mjs +3 -106
- package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
- package/dist/lib/stream-promise-flatten.mjs +3 -47
- package/dist/lib/stream-promise-flatten.mjs.map +1 -1
- package/dist/lib/utils.mjs +3 -71
- package/dist/lib/utils.mjs.map +1 -1
- package/dist/lib/utils.test.mjs +1 -0
- package/dist/lib/utils.test.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +2 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs +8 -254
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/editing-api-config.mjs +3 -83
- package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/index.mjs +10 -310
- package/dist/types/autosuggestions-config/index.mjs.map +1 -1
- package/dist/types/autosuggestions-config/insertions-api-config.mjs +3 -77
- package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +3 -77
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +2 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +2 -0
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs +3 -64
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
- package/dist/types/base/autosuggestion-state.mjs +2 -0
- package/dist/types/base/autosuggestion-state.mjs.map +1 -1
- package/dist/types/base/autosuggestions-bare-function.mjs +2 -0
- package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
- package/dist/types/base/base-autosuggestions-config.mjs +3 -12
- package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
- package/dist/types/base/base-copilot-textarea-props.mjs +2 -0
- package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
- package/dist/types/base/custom-editor.mjs +2 -0
- package/dist/types/base/custom-editor.mjs.map +1 -1
- package/dist/types/base/editor-autocomplete-state.mjs +4 -17
- package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
- package/dist/types/base/index.mjs +4 -12
- package/dist/types/base/index.mjs.map +1 -1
- package/dist/types/html-copilot-textarea-element.mjs +2 -0
- package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
- package/dist/types/index.mjs +12 -311
- package/dist/types/index.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { areEqual_autocompleteState } from './chunk-JAFCXEPU.mjs';
|
|
2
|
+
import { nullableCompatibleEqualityCheck } from './chunk-KGKLUWKW.mjs';
|
|
3
|
+
import { Debouncer } from './chunk-NKW5OU2S.mjs';
|
|
4
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
5
|
+
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
6
|
+
|
|
7
|
+
function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty, disabled) {
|
|
8
|
+
const [previousAutocompleteState, setPreviousAutocompleteState] = useState(null);
|
|
9
|
+
const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] = useState(null);
|
|
10
|
+
const awaitForAndAppendSuggestion = useCallback(
|
|
11
|
+
(editorAutocompleteState, abortSignal) => __async(this, null, function* () {
|
|
12
|
+
if (disabled) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (disableWhenEmpty && editorAutocompleteState.textBeforeCursor === "" && editorAutocompleteState.textAfterCursor === "") {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const suggestion = yield autosuggestionFunction(
|
|
19
|
+
editorAutocompleteState,
|
|
20
|
+
abortSignal
|
|
21
|
+
);
|
|
22
|
+
if (!suggestion || abortSignal.aborted) {
|
|
23
|
+
throw new DOMException("Aborted", "AbortError");
|
|
24
|
+
}
|
|
25
|
+
setCurrentAutocompleteSuggestion({
|
|
26
|
+
text: suggestion,
|
|
27
|
+
point: editorAutocompleteState.cursorPoint
|
|
28
|
+
});
|
|
29
|
+
}),
|
|
30
|
+
[
|
|
31
|
+
autosuggestionFunction,
|
|
32
|
+
setCurrentAutocompleteSuggestion,
|
|
33
|
+
disableWhenEmpty,
|
|
34
|
+
disabled
|
|
35
|
+
]
|
|
36
|
+
);
|
|
37
|
+
const debouncedFunction = useMemo(
|
|
38
|
+
() => new Debouncer(
|
|
39
|
+
debounceTime
|
|
40
|
+
),
|
|
41
|
+
[debounceTime]
|
|
42
|
+
);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
return () => {
|
|
45
|
+
debouncedFunction.cancel();
|
|
46
|
+
setCurrentAutocompleteSuggestion(null);
|
|
47
|
+
};
|
|
48
|
+
}, [debouncedFunction, disabled]);
|
|
49
|
+
const onChange = useCallback(
|
|
50
|
+
(newEditorState) => {
|
|
51
|
+
const editorStateHasChanged = !nullableCompatibleEqualityCheck(
|
|
52
|
+
areEqual_autocompleteState,
|
|
53
|
+
previousAutocompleteState,
|
|
54
|
+
newEditorState
|
|
55
|
+
);
|
|
56
|
+
setPreviousAutocompleteState(newEditorState);
|
|
57
|
+
if (!editorStateHasChanged) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
setCurrentAutocompleteSuggestion(null);
|
|
61
|
+
if (newEditorState) {
|
|
62
|
+
debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
|
|
63
|
+
} else {
|
|
64
|
+
debouncedFunction.cancel();
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
[
|
|
68
|
+
previousAutocompleteState,
|
|
69
|
+
setPreviousAutocompleteState,
|
|
70
|
+
debouncedFunction,
|
|
71
|
+
awaitForAndAppendSuggestion,
|
|
72
|
+
setCurrentAutocompleteSuggestion
|
|
73
|
+
]
|
|
74
|
+
);
|
|
75
|
+
const keyDownHandler = useCallback(
|
|
76
|
+
(event) => {
|
|
77
|
+
if (currentAutocompleteSuggestion) {
|
|
78
|
+
if (event.key === acceptAutosuggestionKey) {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
insertAutocompleteSuggestion(currentAutocompleteSuggestion);
|
|
81
|
+
setCurrentAutocompleteSuggestion(null);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
[
|
|
86
|
+
currentAutocompleteSuggestion,
|
|
87
|
+
setCurrentAutocompleteSuggestion,
|
|
88
|
+
insertAutocompleteSuggestion,
|
|
89
|
+
acceptAutosuggestionKey
|
|
90
|
+
]
|
|
91
|
+
);
|
|
92
|
+
return {
|
|
93
|
+
currentAutocompleteSuggestion,
|
|
94
|
+
onChangeHandler: onChange,
|
|
95
|
+
onKeyDownHandler: keyDownHandler
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { useAutosuggestions };
|
|
100
|
+
//# sourceMappingURL=out.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-UHD44NC5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,aAAa,WAAW,SAAS,gBAAgB;AAgBnD,SAAS,mBACd,cACA,yBACA,wBACA,8BACA,kBACA,UAC0B;AAC1B,QAAM,CAAC,2BAA2B,4BAA4B,IAC5D,SAAyC,IAAI;AAE/C,QAAM,CAAC,+BAA+B,gCAAgC,IACpE,SAAqC,IAAI;AAE3C,QAAM,8BAGe;AAAA,IACnB,CACE,yBACA,gBACG;AAEH,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UACE,oBACA,wBAAwB,qBAAqB,MAC7C,wBAAwB,oBAAoB,IAC5C;AACA;AAAA,MACF;AAGA,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,MACF;AAGA,UAAI,CAAC,cAAc,YAAY,SAAS;AACtC,cAAM,IAAI,aAAa,WAAW,YAAY;AAAA,MAChD;AAEA,uCAAiC;AAAA,QAC/B,MAAM;AAAA,QACN,OAAO,wBAAwB;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB;AAAA,IACxB,MACE,IAAI;AAAA,MACF;AAAA,IACF;AAAA,IACF,CAAC,YAAY;AAAA,EACf;AAGA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,wBAAkB,OAAO;AACzB,uCAAiC,IAAI;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,mBAAmB,QAAQ,CAAC;AAEhC,QAAM,WAAW;AAAA,IACf,CAAC,mBAAmD;AAClD,YAAM,wBAAwB,CAAC;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,mCAA6B,cAAc;AAG3C,UAAI,CAAC,uBAAuB;AAC1B;AAAA,MACF;AAGA,uCAAiC,IAAI;AAGrC,UAAI,gBAAgB;AAClB,0BAAkB,SAAS,6BAA6B,cAAc;AAAA,MACxE,OAAO;AACL,0BAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,UAA+C;AAC9C,UAAI,+BAA+B;AACjC,YAAI,MAAM,QAAQ,yBAAyB;AACzC,gBAAM,eAAe;AACrB,uCAA6B,6BAA6B;AAC1D,2CAAiC,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Debouncer } from \"../../lib/debouncer\";\nimport { nullableCompatibleEqualityCheck } from \"../../lib/utils\";\nimport { AutosuggestionsBareFunction } from \"../../types/base\";\nimport { AutosuggestionState } from \"../../types/base/autosuggestion-state\";\nimport {\n EditorAutocompleteState,\n areEqual_autocompleteState,\n} from \"../../types/base/editor-autocomplete-state\";\n\nexport interface UseAutosuggestionsResult {\n currentAutocompleteSuggestion: AutosuggestionState | null;\n onChangeHandler: (newEditorState: EditorAutocompleteState | null) => void;\n onKeyDownHandler: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function useAutosuggestions(\n debounceTime: number,\n acceptAutosuggestionKey: string,\n autosuggestionFunction: AutosuggestionsBareFunction,\n insertAutocompleteSuggestion: (suggestion: AutosuggestionState) => void,\n disableWhenEmpty: boolean,\n disabled: boolean\n): UseAutosuggestionsResult {\n const [previousAutocompleteState, setPreviousAutocompleteState] =\n useState<EditorAutocompleteState | null>(null);\n\n const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] =\n useState<AutosuggestionState | null>(null);\n\n const awaitForAndAppendSuggestion: (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal\n ) => Promise<void> = useCallback(\n async (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal\n ) => {\n // early return if disabled\n if (disabled) {\n return;\n }\n\n if (\n disableWhenEmpty &&\n editorAutocompleteState.textBeforeCursor === \"\" &&\n editorAutocompleteState.textAfterCursor === \"\"\n ) {\n return;\n }\n\n // fetch the suggestion\n const suggestion = await autosuggestionFunction(\n editorAutocompleteState,\n abortSignal\n );\n\n // We'll assume for now that the autocomplete function might or might not respect the abort signal.\n if (!suggestion || abortSignal.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n setCurrentAutocompleteSuggestion({\n text: suggestion,\n point: editorAutocompleteState.cursorPoint,\n });\n },\n [\n autosuggestionFunction,\n setCurrentAutocompleteSuggestion,\n disableWhenEmpty,\n disabled,\n ]\n );\n\n const debouncedFunction = useMemo(\n () =>\n new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(\n debounceTime\n ),\n [debounceTime]\n );\n\n // clean current state when unmounting or disabling\n useEffect(() => {\n return () => {\n debouncedFunction.cancel();\n setCurrentAutocompleteSuggestion(null);\n };\n }, [debouncedFunction, disabled]);\n\n const onChange = useCallback(\n (newEditorState: EditorAutocompleteState | null) => {\n const editorStateHasChanged = !nullableCompatibleEqualityCheck(\n areEqual_autocompleteState,\n previousAutocompleteState,\n newEditorState\n );\n setPreviousAutocompleteState(newEditorState);\n\n // if no change, do nothing\n if (!editorStateHasChanged) {\n return;\n }\n\n // if change, then first null out the current suggestion\n setCurrentAutocompleteSuggestion(null);\n\n // then try to get a new suggestion, debouncing to avoid too many requests while typing\n if (newEditorState) {\n debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);\n } else {\n debouncedFunction.cancel();\n }\n },\n [\n previousAutocompleteState,\n setPreviousAutocompleteState,\n debouncedFunction,\n awaitForAndAppendSuggestion,\n setCurrentAutocompleteSuggestion,\n ]\n );\n\n const keyDownHandler = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (currentAutocompleteSuggestion) {\n if (event.key === acceptAutosuggestionKey) {\n event.preventDefault();\n insertAutocompleteSuggestion(currentAutocompleteSuggestion);\n setCurrentAutocompleteSuggestion(null);\n }\n }\n },\n [\n currentAutocompleteSuggestion,\n setCurrentAutocompleteSuggestion,\n insertAutocompleteSuggestion,\n acceptAutosuggestionKey,\n ]\n );\n\n return {\n currentAutocompleteSuggestion,\n onChangeHandler: onChange,\n onKeyDownHandler: keyDownHandler,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -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-WJYQWL4I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/slatejs-edits/add-autocompletions.ts"],"names":[],"mappings":";AAAA,SAAoB,kBAAkB;AAG/B,SAAS,2BACd,QACA,eACA,OACA;AACA,QAAM,iBAAiB,OAAO;AAE9B,aAAW;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,IACN;AAAA,EACF;AAGA,MAAI,gBAAgB;AAClB,WAAO,YAAY;AAAA,EACrB;AACF","sourcesContent":["import { BasePoint, Transforms } from \"slate\";\nimport { CustomEditor } from \"../../types/base/custom-editor\";\n\nexport function addAutocompletionsToEditor(\n editor: CustomEditor,\n newSuggestion: string,\n point: BasePoint\n) {\n const editorPosition = editor.selection;\n\n Transforms.insertNodes(\n editor,\n [\n {\n type: \"suggestion\",\n inline: true,\n content: newSuggestion,\n children: [{ text: \"\" }],\n },\n ],\n {\n at: point,\n }\n );\n\n // restore cursor position\n if (editorPosition) {\n editor.selection = editorPosition;\n }\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Dialog, DialogContent } from './chunk-O5OWT5GE.mjs';
|
|
2
|
+
import { cn } from './chunk-KGKLUWKW.mjs';
|
|
3
|
+
import { __objRest, __spreadValues, __spreadProps } from './chunk-MRXNTQOX.mjs';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { Command as Command$1 } from 'cmdk';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var Command = React.forwardRef((_a, ref) => {
|
|
9
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
10
|
+
return /* @__PURE__ */ jsx(Command$1, __spreadValues({
|
|
11
|
+
ref,
|
|
12
|
+
className: cn(
|
|
13
|
+
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
|
|
14
|
+
className
|
|
15
|
+
)
|
|
16
|
+
}, props));
|
|
17
|
+
});
|
|
18
|
+
Command.displayName = Command$1.displayName;
|
|
19
|
+
var CommandDialog = (_a) => {
|
|
20
|
+
var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
|
|
21
|
+
return /* @__PURE__ */ jsx(Dialog, __spreadProps(__spreadValues({}, props), {
|
|
22
|
+
children: /* @__PURE__ */ jsx(DialogContent, {
|
|
23
|
+
className: "overflow-hidden p-0 shadow-lg",
|
|
24
|
+
children: /* @__PURE__ */ jsx(Command, {
|
|
25
|
+
className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5",
|
|
26
|
+
children
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
}));
|
|
30
|
+
};
|
|
31
|
+
var CommandInput = React.forwardRef((_a, ref) => {
|
|
32
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
33
|
+
return /* @__PURE__ */ jsx("div", {
|
|
34
|
+
className: "flex items-center border-b px-3",
|
|
35
|
+
"cmdk-input-wrapper": "",
|
|
36
|
+
children: /* @__PURE__ */ jsx(Command$1.Input, __spreadValues({
|
|
37
|
+
ref,
|
|
38
|
+
className: cn(
|
|
39
|
+
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
40
|
+
className
|
|
41
|
+
)
|
|
42
|
+
}, props))
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
CommandInput.displayName = Command$1.Input.displayName;
|
|
46
|
+
var CommandList = React.forwardRef((_a, ref) => {
|
|
47
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
48
|
+
return /* @__PURE__ */ jsx(Command$1.List, __spreadValues({
|
|
49
|
+
ref,
|
|
50
|
+
className: cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)
|
|
51
|
+
}, props));
|
|
52
|
+
});
|
|
53
|
+
CommandList.displayName = Command$1.List.displayName;
|
|
54
|
+
var CommandEmpty = React.forwardRef((props, ref) => /* @__PURE__ */ jsx(Command$1.Empty, __spreadValues({
|
|
55
|
+
ref,
|
|
56
|
+
className: "py-6 text-center text-sm"
|
|
57
|
+
}, props)));
|
|
58
|
+
CommandEmpty.displayName = Command$1.Empty.displayName;
|
|
59
|
+
var CommandGroup = React.forwardRef((_a, ref) => {
|
|
60
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
61
|
+
return /* @__PURE__ */ jsx(Command$1.Group, __spreadValues({
|
|
62
|
+
ref,
|
|
63
|
+
className: cn(
|
|
64
|
+
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
|
|
65
|
+
className
|
|
66
|
+
)
|
|
67
|
+
}, props));
|
|
68
|
+
});
|
|
69
|
+
CommandGroup.displayName = Command$1.Group.displayName;
|
|
70
|
+
var CommandSeparator = React.forwardRef((_a, ref) => {
|
|
71
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
72
|
+
return /* @__PURE__ */ jsx(Command$1.Separator, __spreadValues({
|
|
73
|
+
ref,
|
|
74
|
+
className: cn("-mx-1 h-px bg-border", className)
|
|
75
|
+
}, props));
|
|
76
|
+
});
|
|
77
|
+
CommandSeparator.displayName = Command$1.Separator.displayName;
|
|
78
|
+
var CommandItem = React.forwardRef((_a, ref) => {
|
|
79
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
80
|
+
return /* @__PURE__ */ jsx(Command$1.Item, __spreadValues({
|
|
81
|
+
ref,
|
|
82
|
+
className: cn(
|
|
83
|
+
"relative flex cursor-default select-none items-center rounded-sm text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
84
|
+
className
|
|
85
|
+
)
|
|
86
|
+
}, props));
|
|
87
|
+
});
|
|
88
|
+
CommandItem.displayName = Command$1.Item.displayName;
|
|
89
|
+
var CommandShortcut = (_a) => {
|
|
90
|
+
var _b = _a, {
|
|
91
|
+
className
|
|
92
|
+
} = _b, props = __objRest(_b, [
|
|
93
|
+
"className"
|
|
94
|
+
]);
|
|
95
|
+
return /* @__PURE__ */ jsx("span", __spreadValues({
|
|
96
|
+
className: cn(
|
|
97
|
+
"ml-auto text-xs tracking-widest text-muted-foreground",
|
|
98
|
+
className
|
|
99
|
+
)
|
|
100
|
+
}, props));
|
|
101
|
+
};
|
|
102
|
+
CommandShortcut.displayName = "CommandShortcut";
|
|
103
|
+
|
|
104
|
+
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
|
|
105
|
+
//# sourceMappingURL=out.js.map
|
|
106
|
+
//# sourceMappingURL=chunk-XA7M72ZO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/command.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,YAAY,WAAW;AAEvB,SAAS,WAAW,wBAAwB;AAU1C;AAdF;AAUA,IAAM,UAAgB,iBAGpB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAbL,IAaG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,QAAQ,cAAc,iBAAiB;AAIvC,IAAM,gBAAgB,CAAC,OAA+C;AAA/C,eAAE,WA3BzB,IA2BuB,IAAe,kBAAf,IAAe,CAAb;AACvB,SACE,oBAAC,yCAAW,QAAX;AAAA,IACC,8BAAC;AAAA,MAAc,WAAU;AAAA,MACvB,8BAAC;AAAA,QAAQ,WAAU;AAAA,QAChB;AAAA,OACH;AAAA,KACF;AAAA,IACF;AAEJ;AAEA,IAAM,eAAqB,iBAGzB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA1CL,IA0CG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC;AAAA,IAAI,WAAU;AAAA,IAAkC,sBAAmB;AAAA,IAElE,8BAAC,iBAAiB,OAAjB;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,OACI,MACN;AAAA,GACF;AAAA,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,cAAoB,iBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA7DL,IA6DG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC,iBAAiB,MAAjB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,mDAAmD,SAAS;AAAA,KACtE,MACN;AAAA,CACD;AAED,YAAY,cAAc,iBAAiB,KAAK;AAEhD,IAAM,eAAqB,iBAGzB,CAAC,OAAO,QACR,oBAAC,iBAAiB,OAAjB;AAAA,EACC;AAAA,EACA,WAAU;AAAA,GACN,MACN,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,eAAqB,iBAGzB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvFL,IAuFG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC,iBAAiB,OAAjB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AAED,aAAa,cAAc,iBAAiB,MAAM;AAElD,IAAM,mBAAyB,iBAG7B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvGL,IAuGG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC,iBAAiB,WAAjB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,KAC3C,MACN;AAAA,CACD;AACD,iBAAiB,cAAc,iBAAiB,UAAU;AAE1D,IAAM,cAAoB,iBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAnHL,IAmHG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAC,iBAAiB,MAAjB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AAED,YAAY,cAAc,iBAAiB,KAAK;AAEhD,IAAM,kBAAkB,CAAC,OAGoB;AAHpB,eACvB;AAAA;AAAA,EAjIF,IAgIyB,IAEpB,kBAFoB,IAEpB;AAAA,IADH;AAAA;AAGA,SACE,oBAAC;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAEJ;AACA,gBAAgB,cAAc","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { Search } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Dialog, DialogContent } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\ninterface CommandDialogProps extends DialogProps {}\n\nconst CommandDialog = ({ children, ...props }: CommandDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n {/* <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" /> */}\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
2
|
+
import { cx, css } from '@emotion/css';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import ReactDOM from 'react-dom';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var Button = React.forwardRef(
|
|
8
|
+
(_a, ref) => {
|
|
9
|
+
var _b = _a, {
|
|
10
|
+
className,
|
|
11
|
+
active,
|
|
12
|
+
reversed
|
|
13
|
+
} = _b, props = __objRest(_b, [
|
|
14
|
+
"className",
|
|
15
|
+
"active",
|
|
16
|
+
"reversed"
|
|
17
|
+
]);
|
|
18
|
+
return /* @__PURE__ */ jsx("span", __spreadProps(__spreadValues({}, props), {
|
|
19
|
+
ref,
|
|
20
|
+
className: cx(
|
|
21
|
+
className,
|
|
22
|
+
css`
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
color: ${reversed ? active ? "white" : "#aaa" : active ? "black" : "#ccc"};
|
|
25
|
+
`
|
|
26
|
+
)
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
var Icon = React.forwardRef(
|
|
31
|
+
(_a, ref) => {
|
|
32
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
33
|
+
return /* @__PURE__ */ jsx("span", __spreadProps(__spreadValues({}, props), {
|
|
34
|
+
ref,
|
|
35
|
+
className: cx(
|
|
36
|
+
"material-icons",
|
|
37
|
+
className,
|
|
38
|
+
css`
|
|
39
|
+
font-size: 18px;
|
|
40
|
+
vertical-align: text-bottom;
|
|
41
|
+
`
|
|
42
|
+
)
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
var Menu = React.forwardRef(
|
|
47
|
+
(_a, ref) => {
|
|
48
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
49
|
+
return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, props), {
|
|
50
|
+
"data-test-id": "menu",
|
|
51
|
+
ref,
|
|
52
|
+
className: cx(
|
|
53
|
+
className,
|
|
54
|
+
css`
|
|
55
|
+
& > * {
|
|
56
|
+
display: inline-block;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
& > * + * {
|
|
60
|
+
margin-left: 15px;
|
|
61
|
+
}
|
|
62
|
+
`
|
|
63
|
+
)
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
var Portal = ({ children }) => {
|
|
68
|
+
return typeof document === "object" ? ReactDOM.createPortal(children, document.body) : null;
|
|
69
|
+
};
|
|
70
|
+
var Toolbar = React.forwardRef(
|
|
71
|
+
(_a, ref) => {
|
|
72
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
73
|
+
return /* @__PURE__ */ jsx(Menu, __spreadProps(__spreadValues({}, props), {
|
|
74
|
+
ref,
|
|
75
|
+
className: cx(
|
|
76
|
+
className,
|
|
77
|
+
css`
|
|
78
|
+
position: relative;
|
|
79
|
+
padding: 1px 18px 17px;
|
|
80
|
+
margin: 0 -20px;
|
|
81
|
+
border-bottom: 2px solid #eee;
|
|
82
|
+
margin-bottom: 20px;
|
|
83
|
+
`
|
|
84
|
+
)
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
export { Button, Icon, Menu, Portal, Toolbar };
|
|
90
|
+
//# sourceMappingURL=out.js.map
|
|
91
|
+
//# sourceMappingURL=chunk-XHUMROEY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/hovering-toolbar/hovering-toolbar-components.tsx"],"names":[],"mappings":";;;;;;;AAAA,SAAS,KAAK,UAAU;AACxB,OAAO,WAAuC;AAC9C,OAAO,cAAc;AAsBjB;AAfG,IAAM,SAAS,MAAM;AAAA,EAC1B,CACE,IAWA,QACA;AAZA,iBACE;AAAA;AAAA,MACA;AAAA,MACA;AAAA,IAdN,IAWI,IAIK,kBAJL,IAIK;AAAA,MAHH;AAAA,MACA;AAAA,MACA;AAAA;AAUF,+BAAC,yCACK,QADL;AAAA,MAEC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA,mBAEW,WACL,SACE,UACA,SACF,SACA,UACA;AAAA;AAAA,MAER;AAAA,MACF;AAAA;AAEJ;AAEO,IAAM,OAAO,MAAM;AAAA,EACxB,CACE,IACA,QACA;AAFA,iBAAE,YA9CN,IA8CI,IAAgB,kBAAhB,IAAgB,CAAd;AAGF,+BAAC,yCACK,QADL;AAAA,MAEC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,MAIF;AAAA,MACF;AAAA;AAEJ;AAEO,IAAM,OAAO,MAAM;AAAA,EACxB,CACE,IACA,QACA;AAFA,iBAAE,YAlEN,IAkEI,IAAgB,kBAAhB,IAAgB,CAAd;AAGF,+BAAC,wCACK,QADL;AAAA,MAEC,gBAAa;AAAA,MACb;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASF;AAAA,MACF;AAAA;AAEJ;AACO,IAAM,SAAS,CAAC,EAAE,SAAS,MAAqC;AACrE,SAAO,OAAO,aAAa,WACvB,SAAS,aAAa,UAAU,SAAS,IAAI,IAC7C;AACN;AAEO,IAAM,UAAU,MAAM;AAAA,EAC3B,CACE,IACA,QACA;AAFA,iBAAE,YAhGN,IAgGI,IAAgB,kBAAhB,IAAgB,CAAd;AAGF,+BAAC,uCACK,QADL;AAAA,MAEC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOF;AAAA,MACF;AAAA;AAEJ","sourcesContent":["import { css, cx } from \"@emotion/css\";\nimport React, { PropsWithChildren, Ref } from \"react\";\nimport ReactDOM from \"react-dom\";\n\ninterface BaseProps {\n className: string;\n [key: string]: unknown;\n}\n\nexport const Button = React.forwardRef(\n (\n {\n className,\n active,\n reversed,\n ...props\n }: PropsWithChildren<\n {\n active: boolean;\n reversed: boolean;\n } & BaseProps\n >,\n ref: Ref<HTMLSpanElement | null>\n ) => (\n <span\n {...props}\n ref={ref as Ref<HTMLSpanElement>}\n className={cx(\n className,\n css`\n cursor: pointer;\n color: ${reversed\n ? active\n ? \"white\"\n : \"#aaa\"\n : active\n ? \"black\"\n : \"#ccc\"};\n `\n )}\n />\n )\n);\n\nexport const Icon = React.forwardRef(\n (\n { className, ...props }: PropsWithChildren<BaseProps>,\n ref: Ref<HTMLSpanElement | null>\n ) => (\n <span\n {...props}\n ref={ref as Ref<HTMLSpanElement>}\n className={cx(\n \"material-icons\",\n className,\n css`\n font-size: 18px;\n vertical-align: text-bottom;\n `\n )}\n />\n )\n);\n\nexport const Menu = React.forwardRef(\n (\n { className, ...props }: PropsWithChildren<BaseProps>,\n ref: Ref<HTMLDivElement | null>\n ) => (\n <div\n {...props}\n data-test-id=\"menu\"\n ref={ref as Ref<HTMLDivElement>}\n className={cx(\n className,\n css`\n & > * {\n display: inline-block;\n }\n\n & > * + * {\n margin-left: 15px;\n }\n `\n )}\n />\n )\n);\nexport const Portal = ({ children }: { children: React.ReactNode }) => {\n return typeof document === \"object\"\n ? ReactDOM.createPortal(children, document.body)\n : null;\n};\n\nexport const Toolbar = React.forwardRef(\n (\n { className, ...props }: PropsWithChildren<BaseProps>,\n ref?: Ref<HTMLDivElement>\n ) => (\n <Menu\n {...props}\n ref={ref}\n className={cx(\n className,\n css`\n position: relative;\n padding: 1px 18px 17px;\n margin: 0 -20px;\n border-bottom: 2px solid #eee;\n margin-bottom: 20px;\n `\n )}\n />\n )\n);\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { replaceEditorText } from './chunk-RQHOUUXQ.mjs';
|
|
2
|
+
import { getFullEditorTextWithNewlines } from './chunk-IXJ2HCOA.mjs';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ReactEditor } from 'slate-react';
|
|
5
|
+
|
|
6
|
+
function usePopulateCopilotTextareaRef(editor, ref) {
|
|
7
|
+
React.useImperativeHandle(
|
|
8
|
+
ref,
|
|
9
|
+
() => {
|
|
10
|
+
class Combined {
|
|
11
|
+
constructor(customMethods2, editorHtmlElement2) {
|
|
12
|
+
this.customMethods = customMethods2;
|
|
13
|
+
this.editorHtmlElement = editorHtmlElement2;
|
|
14
|
+
}
|
|
15
|
+
get(target, propKey) {
|
|
16
|
+
if (this.isKeyOfCustomMethods(propKey)) {
|
|
17
|
+
const value = this.customMethods[propKey];
|
|
18
|
+
if (typeof value === "function") {
|
|
19
|
+
return value.bind(this.customMethods);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
} else if (this.isKeyOfHTMLElement(propKey)) {
|
|
23
|
+
const value = this.editorHtmlElement[propKey];
|
|
24
|
+
if (typeof value === "function") {
|
|
25
|
+
return value.bind(this.editorHtmlElement);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
set(target, propKey, value) {
|
|
31
|
+
if (this.isKeyOfCustomMethods(propKey)) {
|
|
32
|
+
this.customMethods[propKey] = value;
|
|
33
|
+
} else if (this.isKeyOfHTMLElement(propKey)) {
|
|
34
|
+
this.editorHtmlElement[propKey] = value;
|
|
35
|
+
} else {
|
|
36
|
+
target[propKey] = value;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
isKeyOfCustomMethods(key) {
|
|
41
|
+
return key in this.customMethods;
|
|
42
|
+
}
|
|
43
|
+
isKeyOfHTMLElement(key) {
|
|
44
|
+
return key in this.editorHtmlElement;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const handler = {
|
|
48
|
+
get(target, propKey) {
|
|
49
|
+
return target.get(target, propKey);
|
|
50
|
+
},
|
|
51
|
+
set(target, propKey, value) {
|
|
52
|
+
return target.set(target, propKey, value);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
class CustomMethods {
|
|
56
|
+
constructor(editor2) {
|
|
57
|
+
this.editor = editor2;
|
|
58
|
+
}
|
|
59
|
+
focus() {
|
|
60
|
+
ReactEditor.focus(this.editor);
|
|
61
|
+
}
|
|
62
|
+
blur() {
|
|
63
|
+
ReactEditor.blur(this.editor);
|
|
64
|
+
}
|
|
65
|
+
get value() {
|
|
66
|
+
return getFullEditorTextWithNewlines(this.editor);
|
|
67
|
+
}
|
|
68
|
+
set value(value) {
|
|
69
|
+
replaceEditorText(this.editor, value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const editorHtmlElement = ReactEditor.toDOMNode(editor, editor);
|
|
73
|
+
const customMethods = new CustomMethods(editor);
|
|
74
|
+
const combined = new Combined(customMethods, editorHtmlElement);
|
|
75
|
+
return new Proxy(combined, handler);
|
|
76
|
+
},
|
|
77
|
+
[editor]
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { usePopulateCopilotTextareaRef };
|
|
82
|
+
//# sourceMappingURL=out.js.map
|
|
83
|
+
//# sourceMappingURL=chunk-YQU7WG7T.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts"],"names":["customMethods","editorHtmlElement","editor"],"mappings":";;;;;;;;AAAA,OAAO,WAAW;AAElB,SAAS,mBAAmB;AAMrB,SAAS,8BACd,QACA,KACA;AACA,QAAM;AAAA,IACJ;AAAA,IACA,MAAM;AACJ,YAAM,SAAS;AAAA,QACb,YACUA,gBACAC,oBACR;AAFQ,+BAAAD;AACA,mCAAAC;AAAA,QACP;AAAA,QAIH,IAAI,QAAa,SAAsB;AACrC,cAAI,KAAK,qBAAqB,OAAO,GAAG;AACtC,kBAAM,QAAQ,KAAK,cAAc;AACjC,gBAAI,OAAO,UAAU,YAAY;AAC/B,qBAAO,MAAM,KAAK,KAAK,aAAa;AAAA,YACtC;AACA,mBAAO;AAAA,UACT,WAAW,KAAK,mBAAmB,OAAO,GAAG;AAC3C,kBAAM,QAAQ,KAAK,kBAAkB;AACrC,gBAAI,OAAO,UAAU,YAAY;AAC/B,qBAAO,MAAM,KAAK,KAAK,iBAAiB;AAAA,YAC1C;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QAEA,IAAI,QAAa,SAAiB,OAAqB;AACrD,cAAI,KAAK,qBAAqB,OAAO,GAAG;AACtC,YAAC,KAAK,cAAsB,WAAW;AAAA,UACzC,WAAW,KAAK,mBAAmB,OAAO,GAAG;AAC3C,YAAC,KAAK,kBAA0B,WAAW;AAAA,UAC7C,OAAO;AAEL,mBAAO,WAAW;AAAA,UACpB;AACA,iBAAO;AAAA,QACT;AAAA,QAEQ,qBAAqB,KAAyC;AACpE,iBAAO,OAAO,KAAK;AAAA,QACrB;AAAA,QAEQ,mBAAmB,KAAuC;AAChE,iBAAO,OAAO,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,IAAI,QAAa,SAAkD;AACjE,iBAAO,OAAO,IAAI,QAAQ,OAAO;AAAA,QACnC;AAAA,QACA,IACE,QACA,SACA,OACA;AACA,iBAAO,OAAO,IAAI,QAAQ,SAAS,KAAK;AAAA,QAC1C;AAAA,MACF;AAEA,YAAM,cAAc;AAAA,QAClB,YAAoBC,SAAsB;AAAtB,wBAAAA;AAAA,QAAuB;AAAA,QAE3C,QAAQ;AACN,sBAAY,MAAM,KAAK,MAAM;AAAA,QAC/B;AAAA,QAEA,OAAO;AACL,sBAAY,KAAK,KAAK,MAAM;AAAA,QAC9B;AAAA,QAEA,IAAI,QAAQ;AACV,iBAAO,8BAA8B,KAAK,MAAM;AAAA,QAClD;AAAA,QACA,IAAI,MAAM,OAAe;AACvB,4BAAkB,KAAK,QAAQ,KAAK;AAAA,QACtC;AAAA,MACF;AAEA,YAAM,oBAAoB,YAAY,UAAU,QAAQ,MAAM;AAC9D,YAAM,gBAAgB,IAAI,cAAc,MAAM;AAE9C,YAAM,WAAW,IAAI,SAAS,eAAe,iBAAiB;AAC9D,aAAO,IAAI,MAAM,UAAU,OAAO;AAAA,IACpC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACF","sourcesContent":["import React from \"react\";\nimport { Editor } from \"slate\";\nimport { ReactEditor } from \"slate-react\";\nimport { getFullEditorTextWithNewlines } from \"../../lib/get-text-around-cursor\";\nimport { replaceEditorText } from \"../../lib/slatejs-edits/replace-text\";\nimport { HTMLCopilotTextAreaElement } from \"../../types\";\nimport { CustomEditor } from \"../../types/base/custom-editor\";\n\nexport function usePopulateCopilotTextareaRef(\n editor: Editor,\n ref: React.Ref<HTMLCopilotTextAreaElement>\n) {\n React.useImperativeHandle(\n ref,\n () => {\n class Combined {\n constructor(\n private customMethods: CustomMethods,\n private editorHtmlElement: HTMLElement\n ) {}\n\n [key: string]: any;\n\n get(target: any, propKey: string): any {\n if (this.isKeyOfCustomMethods(propKey)) {\n const value = this.customMethods[propKey];\n if (typeof value === \"function\") {\n return value.bind(this.customMethods);\n }\n return value;\n } else if (this.isKeyOfHTMLElement(propKey)) {\n const value = this.editorHtmlElement[propKey];\n if (typeof value === \"function\") {\n return value.bind(this.editorHtmlElement);\n }\n return value;\n }\n }\n\n set(target: any, propKey: string, value: any): boolean {\n if (this.isKeyOfCustomMethods(propKey)) {\n (this.customMethods as any)[propKey] = value;\n } else if (this.isKeyOfHTMLElement(propKey)) {\n (this.editorHtmlElement as any)[propKey] = value;\n } else {\n // Default behavior (optional)\n target[propKey] = value;\n }\n return true;\n }\n\n private isKeyOfCustomMethods(key: string): key is keyof CustomMethods {\n return key in this.customMethods;\n }\n\n private isKeyOfHTMLElement(key: string): key is keyof HTMLElement {\n return key in this.editorHtmlElement;\n }\n }\n\n const handler = {\n get(target: any, propKey: keyof CustomMethods | keyof HTMLElement) {\n return target.get(target, propKey);\n },\n set(\n target: any,\n propKey: keyof CustomMethods | keyof HTMLElement,\n value: any\n ) {\n return target.set(target, propKey, value);\n },\n };\n\n class CustomMethods {\n constructor(private editor: CustomEditor) {}\n\n focus() {\n ReactEditor.focus(this.editor);\n }\n\n blur() {\n ReactEditor.blur(this.editor);\n }\n\n get value() {\n return getFullEditorTextWithNewlines(this.editor);\n }\n set value(value: string) {\n replaceEditorText(this.editor, value);\n }\n }\n\n const editorHtmlElement = ReactEditor.toDOMNode(editor, editor);\n const customMethods = new CustomMethods(editor);\n\n const combined = new Combined(customMethods, editorHtmlElement);\n return new Proxy(combined, handler);\n },\n [editor]\n );\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Element } from 'slate';
|
|
2
|
+
|
|
3
|
+
// src/lib/editor-to-text.ts
|
|
4
|
+
function nodeChildrenToTextComponents(editor, nodes) {
|
|
5
|
+
const indeciesOfInlineElements = new Set(
|
|
6
|
+
nodes.map((node, index) => {
|
|
7
|
+
if (Element.isElement(node) && editor.isInline(node)) {
|
|
8
|
+
return index;
|
|
9
|
+
}
|
|
10
|
+
return -1;
|
|
11
|
+
}).filter((index) => index !== -1)
|
|
12
|
+
);
|
|
13
|
+
const nonIgnorableItems = nodes.filter((node, index) => {
|
|
14
|
+
const isInline = indeciesOfInlineElements.has(index);
|
|
15
|
+
if (isInline) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const isNeighbourOfInline = indeciesOfInlineElements.has(index - 1) || indeciesOfInlineElements.has(index + 1);
|
|
19
|
+
if (isNeighbourOfInline) {
|
|
20
|
+
return node.text !== "";
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
return nonIgnorableItems.map((node) => {
|
|
25
|
+
if (Element.isElement(node)) {
|
|
26
|
+
switch (node.type) {
|
|
27
|
+
case "paragraph":
|
|
28
|
+
return nodeChildrenToTextComponents(editor, node.children);
|
|
29
|
+
case "suggestion":
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
return [node];
|
|
34
|
+
}
|
|
35
|
+
}).reduce((acc, val) => acc.concat(val), []);
|
|
36
|
+
}
|
|
37
|
+
var editorToText = (editor) => {
|
|
38
|
+
const flattened = nodeChildrenToTextComponents(editor, editor.children);
|
|
39
|
+
const text = flattened.map((textComponent) => textComponent.text).join("\n");
|
|
40
|
+
return text;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { editorToText };
|
|
44
|
+
//# sourceMappingURL=out.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-YTOPHPSG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/editor-to-text.ts"],"names":[],"mappings":";AAAA,SAAiC,eAAe;AAKhD,SAAS,6BACP,QACA,OACuB;AAEvB,QAAM,2BAA2B,IAAI;AAAA,IACnC,MACG,IAAI,CAAC,MAAM,UAAU;AACpB,UAAI,QAAQ,UAAU,IAAI,KAAK,OAAO,SAAS,IAAI,GAAG;AACpD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC,EACA,OAAO,CAAC,UAAU,UAAU,EAAE;AAAA,EACnC;AAIA,QAAM,oBAAoB,MAAM,OAAO,CAAC,MAAM,UAAU;AACtD,UAAM,WAAW,yBAAyB,IAAI,KAAK;AACnD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,sBACJ,yBAAyB,IAAI,QAAQ,CAAC,KACtC,yBAAyB,IAAI,QAAQ,CAAC;AACxC,QAAI,qBAAqB;AACvB,aAAQ,KAAa,SAAS;AAAA,IAChC;AAEA,WAAO;AAAA,EACT,CAAC;AAED,SAAO,kBACJ,IAAI,CAAC,SAAS;AACb,QAAI,QAAQ,UAAU,IAAI,GAAG;AAC3B,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,iBAAO,6BAA6B,QAAQ,KAAK,QAAQ;AAAA,QAC3D,KAAK;AACH,iBAAO,CAAC;AAAA,MACZ;AAAA,IACF,OAAO;AACL,aAAO,CAAC,IAAI;AAAA,IACd;AAAA,EACF,CAAC,EACA,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC;AAC7C;AAEO,IAAM,eAAe,CAC1B,WACG;AACH,QAAM,YAAY,6BAA6B,QAAQ,OAAO,QAAQ;AAEtE,QAAM,OAAO,UAAU,IAAI,CAAC,kBAAkB,cAAc,IAAI,EAAE,KAAK,IAAI;AAE3E,SAAO;AACT","sourcesContent":["import { BaseEditor, Descendant, Element } from \"slate\";\nimport { HistoryEditor } from \"slate-history\";\nimport { ReactEditor } from \"slate-react\";\nimport { SuggestionAwareText } from \"../types/base/custom-editor\";\n\nfunction nodeChildrenToTextComponents(\n editor: BaseEditor & ReactEditor & HistoryEditor,\n nodes: Descendant[]\n): SuggestionAwareText[] {\n // find inlineable elements\n const indeciesOfInlineElements = new Set(\n nodes\n .map((node, index) => {\n if (Element.isElement(node) && editor.isInline(node)) {\n return index;\n }\n return -1;\n })\n .filter((index) => index !== -1)\n );\n\n // ignorable elements = inline elements,\n // or neighbors of inline elements that are {text: \"\"}\n const nonIgnorableItems = nodes.filter((node, index) => {\n const isInline = indeciesOfInlineElements.has(index);\n if (isInline) {\n return false;\n }\n\n const isNeighbourOfInline =\n indeciesOfInlineElements.has(index - 1) ||\n indeciesOfInlineElements.has(index + 1);\n if (isNeighbourOfInline) {\n return (node as any).text !== \"\";\n }\n\n return true;\n });\n\n return nonIgnorableItems\n .map((node) => {\n if (Element.isElement(node)) {\n switch (node.type) {\n case \"paragraph\":\n return nodeChildrenToTextComponents(editor, node.children);\n case \"suggestion\":\n return [];\n }\n } else {\n return [node];\n }\n })\n .reduce((acc, val) => acc.concat(val), []);\n}\n\nexport const editorToText = (\n editor: BaseEditor & ReactEditor & HistoryEditor\n) => {\n const flattened = nodeChildrenToTextComponents(editor, editor.children);\n\n const text = flattened.map((textComponent) => textComponent.text).join(\"\\n\");\n\n return text;\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createContext, useState, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/hovering-toolbar/hovering-editor-provider.tsx
|
|
5
|
+
var HoveringEditorContext = createContext({
|
|
6
|
+
isDisplayed: false,
|
|
7
|
+
setIsDisplayed: () => {
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
var HoveringEditorProvider = ({
|
|
11
|
+
children
|
|
12
|
+
}) => {
|
|
13
|
+
const [isDisplayed, setIsDisplayed] = useState(false);
|
|
14
|
+
return /* @__PURE__ */ jsx(HoveringEditorContext.Provider, {
|
|
15
|
+
value: { isDisplayed, setIsDisplayed },
|
|
16
|
+
children
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
var useHoveringEditorContext = () => useContext(HoveringEditorContext);
|
|
20
|
+
|
|
21
|
+
export { HoveringEditorProvider, useHoveringEditorContext };
|
|
22
|
+
//# sourceMappingURL=out.js.map
|
|
23
|
+
//# sourceMappingURL=chunk-YW3REYX6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/hovering-toolbar/hovering-editor-provider.tsx"],"names":[],"mappings":";AAAA,SAAgB,eAAe,UAAU,kBAA6B;AAsBlE;AAfJ,IAAM,wBAAwB,cAA0C;AAAA,EACtE,aAAa;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AACzB,CAAC;AAMM,IAAM,yBAAyB,CAAC;AAAA,EACrC;AACF,MAAmC;AACjC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AAEpD,SACE,oBAAC,sBAAsB,UAAtB;AAAA,IAA+B,OAAO,EAAE,aAAa,eAAe;AAAA,IAClE;AAAA,GACH;AAEJ;AAEO,IAAM,2BAA2B,MAAM,WAAW,qBAAqB","sourcesContent":["import React, { createContext, useState, useContext, ReactNode } from \"react\";\n\ninterface HoveringEditorContextProps {\n isDisplayed: boolean;\n setIsDisplayed: (value: boolean) => void;\n}\n\nconst HoveringEditorContext = createContext<HoveringEditorContextProps>({\n isDisplayed: false,\n setIsDisplayed: () => {},\n});\n\ninterface HoveringEditorProviderProps {\n children: ReactNode;\n}\n\nexport const HoveringEditorProvider = ({\n children,\n}: HoveringEditorProviderProps) => {\n const [isDisplayed, setIsDisplayed] = useState(false);\n\n return (\n <HoveringEditorContext.Provider value={{ isDisplayed, setIsDisplayed }}>\n {children}\n </HoveringEditorContext.Provider>\n );\n};\n\nexport const useHoveringEditorContext = () => useContext(HoveringEditorContext);\n"]}
|