@copilotkit/react-textarea 0.18.0 → 0.19.0-alpha.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 +303 -189
- package/CHANGELOG.md +19 -0
- package/dist/chunk-2NURR2DX.mjs +47 -0
- package/dist/chunk-2NURR2DX.mjs.map +1 -0
- package/dist/chunk-3YJ63D5D.mjs +106 -0
- package/dist/chunk-3YJ63D5D.mjs.map +1 -0
- package/dist/chunk-4S5ZJH3I.mjs +18 -0
- package/dist/chunk-4S5ZJH3I.mjs.map +1 -0
- package/dist/chunk-55EGOC5T.mjs +87 -0
- package/dist/chunk-55EGOC5T.mjs.map +1 -0
- package/dist/{chunk-3A2CNIG5.mjs → chunk-5ARCOTW3.mjs} +8 -5
- package/dist/chunk-5ARCOTW3.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-5GGCWNTT.mjs → chunk-5SL5L4VS.mjs} +67 -29
- package/dist/chunk-5SL5L4VS.mjs.map +1 -0
- package/dist/{chunk-JWN2VEE3.mjs → chunk-A2RRLD23.mjs} +13 -12
- package/dist/chunk-A2RRLD23.mjs.map +1 -0
- package/dist/chunk-CDB7HFCY.mjs +65 -0
- package/dist/chunk-CDB7HFCY.mjs.map +1 -0
- package/dist/{chunk-MFJNLKRC.mjs → chunk-D7SEV5PR.mjs} +4 -3
- package/dist/chunk-D7SEV5PR.mjs.map +1 -0
- package/dist/chunk-HAFHLU4N.mjs +55 -0
- package/dist/chunk-HAFHLU4N.mjs.map +1 -0
- package/dist/chunk-ITZHK3YV.mjs +477 -0
- package/dist/chunk-ITZHK3YV.mjs.map +1 -0
- package/dist/{chunk-3UQM3NLM.mjs → chunk-IXJ2HCOA.mjs} +42 -7
- package/dist/chunk-IXJ2HCOA.mjs.map +1 -0
- package/dist/{chunk-UW3ITU2Y.mjs → chunk-JAFCXEPU.mjs} +1 -1
- package/dist/chunk-JAFCXEPU.mjs.map +1 -0
- package/dist/chunk-KDFCAQGV.mjs +44 -0
- package/dist/chunk-KDFCAQGV.mjs.map +1 -0
- package/dist/chunk-L7VVZH4Q.mjs +3 -0
- package/dist/chunk-ND5PXTAW.mjs +17 -0
- package/dist/chunk-ND5PXTAW.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-OM5WQQOU.mjs +47 -0
- package/dist/chunk-OM5WQQOU.mjs.map +1 -0
- package/dist/chunk-QL2GYGG5.mjs +19 -0
- package/dist/chunk-QL2GYGG5.mjs.map +1 -0
- package/dist/chunk-RPDVSCLO.mjs +107 -0
- package/dist/chunk-RPDVSCLO.mjs.map +1 -0
- package/dist/{chunk-HZGSG7ST.mjs → chunk-UHD44NC5.mjs} +10 -5
- package/dist/chunk-UHD44NC5.mjs.map +1 -0
- package/dist/chunk-VBIJPE3H.mjs +108 -0
- package/dist/chunk-VBIJPE3H.mjs.map +1 -0
- package/dist/chunk-XDT7BF3V.mjs +81 -0
- package/dist/chunk-XDT7BF3V.mjs.map +1 -0
- package/dist/chunk-XHUMROEY.mjs +91 -0
- package/dist/chunk-XHUMROEY.mjs.map +1 -0
- package/dist/{chunk-LWVCQYWV.mjs → chunk-YQU7WG7T.mjs} +2 -2
- 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.d.ts +3 -5
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +21 -7
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.d.ts +6 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +5 -0
- package/dist/components/copilot-textarea/copilot-textarea.d.ts +13 -10
- package/dist/components/copilot-textarea/copilot-textarea.mjs +31 -12
- package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +13 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +4 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.d.ts +18 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +4 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.d.ts +8 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs +17 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.d.ts +12 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +12 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.d.ts +3 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +13 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.d.ts +16 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.mjs +5 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.d.ts +37 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.mjs +10 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.mjs.map +1 -0
- package/dist/components/index.d.ts +9 -4
- package/dist/components/index.mjs +31 -12
- package/dist/components/manual-ui/chip-with-icon.d.ts +10 -0
- package/dist/components/manual-ui/chip-with-icon.mjs +29 -0
- package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -0
- package/dist/components/source-search-box/source-search-box.d.ts +17 -0
- package/dist/components/source-search-box/source-search-box.mjs +10 -0
- package/dist/components/source-search-box/source-search-box.mjs.map +1 -0
- package/dist/components/ui/button.d.ts +14 -0
- package/dist/components/ui/button.mjs +5 -0
- package/dist/components/ui/button.mjs.map +1 -0
- package/dist/components/ui/card.d.ts +10 -0
- package/dist/components/ui/card.mjs +63 -0
- package/dist/components/ui/card.mjs.map +1 -0
- package/dist/components/ui/command.d.ts +48 -0
- package/dist/components/ui/command.mjs +6 -0
- package/dist/components/ui/command.mjs.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.mjs +5 -0
- package/dist/components/ui/dialog.mjs.map +1 -0
- package/dist/components/ui/label.d.ts +8 -0
- package/dist/components/ui/label.mjs +5 -0
- package/dist/components/ui/label.mjs.map +1 -0
- package/dist/components/ui/separator.d.ts +6 -0
- package/dist/components/ui/separator.mjs +26 -0
- package/dist/components/ui/separator.mjs.map +1 -0
- package/dist/components/ui/textarea.d.ts +7 -0
- package/dist/components/ui/textarea.mjs +22 -0
- package/dist/components/ui/textarea.mjs.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +2 -2
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.d.ts +2 -2
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +2 -2
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.d.ts +5 -7
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +2 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.d.ts +23 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +5 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -0
- package/dist/hooks/misc/use-autosize-textarea.d.ts +5 -0
- package/dist/hooks/misc/use-autosize-textarea.mjs +4 -0
- package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -0
- package/dist/index.css +674 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.mjs +31 -12
- package/dist/lib/editor-to-text.mjs +1 -42
- package/dist/lib/editor-to-text.mjs.map +1 -1
- package/dist/lib/get-text-around-cursor.d.ts +10 -3
- package/dist/lib/get-text-around-cursor.mjs +1 -1
- package/dist/lib/retry.d.ts +3 -0
- package/dist/lib/retry.mjs +4 -0
- package/dist/lib/retry.mjs.map +1 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.d.ts +25 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +3 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.d.ts +20 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs +10 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -0
- package/dist/types/autosuggestions-config/editing-api-config.d.ts +17 -0
- package/dist/types/autosuggestions-config/editing-api-config.mjs +5 -0
- package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -0
- package/dist/types/autosuggestions-config/index.d.ts +10 -0
- package/dist/types/autosuggestions-config/index.mjs +11 -0
- package/dist/types/autosuggestions-config/index.mjs.map +1 -0
- package/dist/types/autosuggestions-config/insertions-api-config.d.ts +17 -0
- package/dist/types/autosuggestions-config/insertions-api-config.mjs +5 -0
- package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -0
- package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/chatlike-api-endpoint.d.ts +7 -4
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +4 -0
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.d.ts +3 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +3 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -0
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.d.ts +17 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs +5 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -0
- package/dist/types/base/autosuggestions-bare-function.d.ts +16 -2
- package/dist/types/base/base-autosuggestions-config.d.ts +5 -1
- package/dist/types/base/base-autosuggestions-config.mjs +1 -1
- package/dist/types/base/base-copilot-textarea-props.d.ts +3 -1
- package/dist/types/base/editor-autocomplete-state.mjs +1 -1
- package/dist/types/base/index.mjs +1 -1
- package/dist/types/index.d.ts +8 -3
- package/dist/types/index.mjs +7 -4
- package/package.json +19 -5
- package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +64 -13
- package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +61 -0
- package/src/components/copilot-textarea/copilot-textarea.tsx +29 -17
- package/src/components/hovering-toolbar/hovering-editor-provider.tsx +29 -0
- package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +115 -0
- package/src/components/hovering-toolbar/hovering-toolbar.tsx +156 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx +73 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/index.ts +2 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/mode-pre-suggestion.tsx +83 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/mode-suggestion-appearing.tsx +410 -0
- package/src/components/manual-ui/chip-with-icon.tsx +28 -0
- package/src/components/source-search-box/source-search-box.tsx +133 -0
- package/src/components/ui/button.tsx +56 -0
- package/src/components/ui/card.tsx +86 -0
- package/src/components/ui/command.tsx +155 -0
- package/src/components/ui/dialog.tsx +123 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/separator.tsx +31 -0
- package/src/components/ui/textarea.tsx +24 -0
- package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +10 -3
- package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +29 -44
- package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +150 -0
- package/src/hooks/misc/use-autosize-textarea.tsx +21 -0
- package/src/lib/get-text-around-cursor.ts +71 -6
- package/src/lib/retry.tsx +23 -0
- package/src/styles.css +2 -0
- package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +27 -0
- package/src/types/autosuggestions-config/autosuggestions-config.tsx +43 -0
- package/src/types/autosuggestions-config/editing-api-config.tsx +102 -0
- package/src/types/autosuggestions-config/index.ts +11 -0
- package/src/types/autosuggestions-config/insertions-api-config.tsx +95 -0
- package/src/types/{standard-autosuggestions → autosuggestions-config/subtypes}/chatlike-api-endpoint.tsx +19 -7
- package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +4 -0
- package/src/types/{standard-autosuggestions/autosuggestions-config.tsx → autosuggestions-config/suggestions-api-config.tsx} +12 -23
- package/src/types/base/autosuggestions-bare-function.ts +24 -2
- package/src/types/base/base-autosuggestions-config.tsx +7 -2
- package/src/types/base/base-copilot-textarea-props.tsx +3 -1
- package/src/types/base/editor-autocomplete-state.ts +1 -0
- package/src/types/index.ts +1 -1
- package/tailwind.config.js +2 -0
- package/dist/chunk-3A2CNIG5.mjs.map +0 -1
- package/dist/chunk-3UQM3NLM.mjs.map +0 -1
- package/dist/chunk-5GGCWNTT.mjs.map +0 -1
- package/dist/chunk-BLRD23HM.mjs +0 -32
- package/dist/chunk-BLRD23HM.mjs.map +0 -1
- package/dist/chunk-BTAUKCBN.mjs +0 -60
- package/dist/chunk-BTAUKCBN.mjs.map +0 -1
- package/dist/chunk-HZGSG7ST.mjs.map +0 -1
- package/dist/chunk-JWN2VEE3.mjs.map +0 -1
- package/dist/chunk-MFJNLKRC.mjs.map +0 -1
- package/dist/chunk-SL4J5HMW.mjs +0 -3
- package/dist/chunk-UW3ITU2Y.mjs.map +0 -1
- package/dist/types/standard-autosuggestions/autosuggestions-config.d.ts +0 -19
- package/dist/types/standard-autosuggestions/autosuggestions-config.mjs +0 -6
- package/dist/types/standard-autosuggestions/chatlike-api-endpoint.mjs +0 -4
- package/dist/types/standard-autosuggestions/index.d.ts +0 -4
- package/dist/types/standard-autosuggestions/index.mjs +0 -8
- package/src/types/standard-autosuggestions/index.ts +0 -14
- /package/dist/{chunk-SL4J5HMW.mjs.map → chunk-5FO6ISW4.mjs.map} +0 -0
- /package/dist/{types/standard-autosuggestions/autosuggestions-config.mjs.map → chunk-L7VVZH4Q.mjs.map} +0 -0
- /package/dist/{chunk-LWVCQYWV.mjs.map → chunk-YQU7WG7T.mjs.map} +0 -0
- /package/dist/{types/standard-autosuggestions/chatlike-api-endpoint.mjs.map → components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map} +0 -0
- /package/dist/{types/standard-autosuggestions/index.mjs.map → components/hovering-toolbar/hovering-editor-provider.mjs.map} +0 -0
- /package/dist/{types/standard-autosuggestions/minimal-chat-gpt-message.mjs.map → components/hovering-toolbar/hovering-toolbar-components.mjs.map} +0 -0
- /package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.d.ts +0 -0
- /package/dist/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.mjs +0 -0
- /package/src/types/{standard-autosuggestions → autosuggestions-config/subtypes}/minimal-chat-gpt-message.tsx +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useMakeStandardAutosuggestionFunction } from './chunk-HAFHLU4N.mjs';
|
|
2
|
+
import { useMakeStandardInsertionOrEditingFunction } from './chunk-VBIJPE3H.mjs';
|
|
3
|
+
import { defaultAutosuggestionsConfig } from './chunk-QL2GYGG5.mjs';
|
|
4
|
+
import { BaseCopilotTextarea } from './chunk-5SL5L4VS.mjs';
|
|
5
|
+
import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import merge from 'lodash.merge';
|
|
8
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var CopilotTextarea = React.forwardRef(
|
|
11
|
+
(props, ref) => {
|
|
12
|
+
const autosuggestionsConfig = merge(
|
|
13
|
+
defaultAutosuggestionsConfig,
|
|
14
|
+
props.autosuggestionsConfig
|
|
15
|
+
);
|
|
16
|
+
const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(
|
|
17
|
+
autosuggestionsConfig.textareaPurpose,
|
|
18
|
+
autosuggestionsConfig.externalContextCategories,
|
|
19
|
+
autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig
|
|
20
|
+
);
|
|
21
|
+
const insertionOrEditingFunction = useMakeStandardInsertionOrEditingFunction(
|
|
22
|
+
autosuggestionsConfig.textareaPurpose,
|
|
23
|
+
autosuggestionsConfig.externalContextCategories,
|
|
24
|
+
autosuggestionsConfig.chatApiConfigs.insertionApiConfig,
|
|
25
|
+
autosuggestionsConfig.chatApiConfigs.editingApiConfig
|
|
26
|
+
);
|
|
27
|
+
return /* @__PURE__ */ jsx(Fragment, {
|
|
28
|
+
children: /* @__PURE__ */ jsx(BaseCopilotTextarea, __spreadProps(__spreadValues({
|
|
29
|
+
ref
|
|
30
|
+
}, props), {
|
|
31
|
+
baseAutosuggestionsConfig: __spreadProps(__spreadValues({}, autosuggestionsConfig), {
|
|
32
|
+
apiConfig: {
|
|
33
|
+
insertionOrEditingFunction,
|
|
34
|
+
autosuggestionsFunction
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}))
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export { CopilotTextarea };
|
|
43
|
+
//# sourceMappingURL=out.js.map
|
|
44
|
+
//# sourceMappingURL=chunk-KDFCAQGV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/copilot-textarea/copilot-textarea.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,OAAO,WAAW;AAUlB,OAAO,WAAW;AAmCZ,mBACE,WADF;AAzBC,IAAM,kBAAkB,MAAM;AAAA,EACnC,CACE,OACA,QACgB;AAChB,UAAM,wBAA+C;AAAA,MACnD;AAAA,MACA,MAAM;AAAA,IACR;AAEA,UAAM,0BAA0B;AAAA,MAC9B,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,sBAAsB,eAAe;AAAA,IACvC;AAEA,UAAM,6BACJ;AAAA,MACE,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,sBAAsB,eAAe;AAAA,MACrC,sBAAsB,eAAe;AAAA,IACvC;AAEF,WACE;AAAA,MACE,8BAAC;AAAA,QACC;AAAA,SACI,QAFL;AAAA,QAGC,2BAA2B,iCACtB,wBADsB;AAAA,UAEzB,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACF;AAAA,KACF;AAAA,EAEJ;AACF","sourcesContent":["// This example is for an Editor with `ReactEditor` and `HistoryEditor`\nimport React from \"react\";\nimport { useMakeStandardAutosuggestionFunction } from \"../../hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function\";\nimport { HTMLCopilotTextAreaElement } from \"../../types\";\nimport { BaseCopilotTextareaProps } from \"../../types/base/base-copilot-textarea-props\";\nimport {\n AutosuggestionsConfig,\n defaultAutosuggestionsConfig,\n} from \"../../types/autosuggestions-config\";\nimport { BaseCopilotTextarea } from \"../base-copilot-textarea/base-copilot-textarea\";\nimport { useMakeStandardInsertionOrEditingFunction } from \"../../hooks/make-autosuggestions-function/use-make-standard-insertion-function\";\nimport merge from \"lodash.merge\";\nimport { AutosuggestionsConfigUserSpecified } from \"../../types/autosuggestions-config/autosuggestions-config-user-specified\";\n\n// Like the base copilot textarea props,\n// but with baseAutosuggestionsConfig replaced with autosuggestionsConfig.\nexport interface CopilotTextareaProps\n extends Omit<BaseCopilotTextareaProps, \"baseAutosuggestionsConfig\"> {\n autosuggestionsConfig: AutosuggestionsConfigUserSpecified;\n}\n\nexport const CopilotTextarea = React.forwardRef(\n (\n props: CopilotTextareaProps,\n ref: React.Ref<HTMLCopilotTextAreaElement>\n ): JSX.Element => {\n const autosuggestionsConfig: AutosuggestionsConfig = merge(\n defaultAutosuggestionsConfig,\n props.autosuggestionsConfig\n );\n\n const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(\n autosuggestionsConfig.textareaPurpose,\n autosuggestionsConfig.externalContextCategories,\n autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig\n );\n\n const insertionOrEditingFunction =\n useMakeStandardInsertionOrEditingFunction(\n autosuggestionsConfig.textareaPurpose,\n autosuggestionsConfig.externalContextCategories,\n autosuggestionsConfig.chatApiConfigs.insertionApiConfig,\n autosuggestionsConfig.chatApiConfigs.editingApiConfig\n );\n\n return (\n <>\n <BaseCopilotTextarea\n ref={ref}\n {...props}\n baseAutosuggestionsConfig={{\n ...autosuggestionsConfig,\n apiConfig: {\n insertionOrEditingFunction: insertionOrEditingFunction,\n autosuggestionsFunction: autosuggestionsFunction,\n },\n }}\n />\n </>\n );\n }\n);\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/misc/use-autosize-textarea.tsx
|
|
4
|
+
var useAutosizeTextArea = (textAreaRef, value) => {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
if (textAreaRef.current !== null) {
|
|
7
|
+
textAreaRef.current.style.height = "0px";
|
|
8
|
+
const scrollHeight = textAreaRef.current.scrollHeight;
|
|
9
|
+
textAreaRef.current.style.height = scrollHeight + "px";
|
|
10
|
+
}
|
|
11
|
+
}, [textAreaRef, value]);
|
|
12
|
+
};
|
|
13
|
+
var use_autosize_textarea_default = useAutosizeTextArea;
|
|
14
|
+
|
|
15
|
+
export { use_autosize_textarea_default };
|
|
16
|
+
//# sourceMappingURL=out.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-ND5PXTAW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/misc/use-autosize-textarea.tsx"],"names":[],"mappings":";AAAA,SAAyB,iBAAiB;AAG1C,IAAM,sBAAsB,CAC1B,aACA,UACG;AACH,YAAU,MAAM;AACd,QAAI,YAAY,YAAY,MAAM;AAEhC,kBAAY,QAAQ,MAAM,SAAS;AACnC,YAAM,eAAe,YAAY,QAAQ;AAIzC,kBAAY,QAAQ,MAAM,SAAS,eAAe;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,aAAa,KAAK,CAAC;AACzB;AAEA,IAAO,gCAAQ","sourcesContent":["import { Ref, RefObject, useEffect } from \"react\";\n\n// Updates the height of a <textarea> when the value changes.\nconst useAutosizeTextArea = (\n textAreaRef: RefObject<HTMLTextAreaElement>,\n value: string\n) => {\n useEffect(() => {\n if (textAreaRef.current !== null) {\n // We need to reset the height momentarily to get the correct scrollHeight for the textarea\n textAreaRef.current.style.height = \"0px\";\n const scrollHeight = textAreaRef.current.scrollHeight;\n\n // We then set the height directly, outside of the render loop\n // Trying to set this with state or a ref will product an incorrect value.\n textAreaRef.current.style.height = scrollHeight + \"px\";\n }\n }, [textAreaRef, value]);\n};\n\nexport default useAutosizeTextArea;\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { cn } from './chunk-KGKLUWKW.mjs';
|
|
2
|
+
import { __objRest, __spreadValues, __spreadProps } from './chunk-MRXNTQOX.mjs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
5
|
+
import { X } from 'lucide-react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var Dialog = DialogPrimitive.Root;
|
|
9
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
10
|
+
var DialogPortal = (_a) => {
|
|
11
|
+
var _b = _a, {
|
|
12
|
+
className
|
|
13
|
+
} = _b, props = __objRest(_b, [
|
|
14
|
+
"className"
|
|
15
|
+
]);
|
|
16
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Portal, __spreadValues({
|
|
17
|
+
className: cn(className)
|
|
18
|
+
}, props));
|
|
19
|
+
};
|
|
20
|
+
DialogPortal.displayName = DialogPrimitive.Portal.displayName;
|
|
21
|
+
var DialogOverlay = React.forwardRef((_a, ref) => {
|
|
22
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
23
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, __spreadValues({
|
|
24
|
+
ref,
|
|
25
|
+
className: cn(
|
|
26
|
+
"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
27
|
+
className
|
|
28
|
+
)
|
|
29
|
+
}, props));
|
|
30
|
+
});
|
|
31
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
32
|
+
var DialogContent = React.forwardRef((_a, ref) => {
|
|
33
|
+
var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
|
|
34
|
+
return /* @__PURE__ */ jsxs(DialogPortal, {
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
37
|
+
/* @__PURE__ */ jsxs(DialogPrimitive.Content, __spreadProps(__spreadValues({
|
|
38
|
+
ref,
|
|
39
|
+
className: cn(
|
|
40
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",
|
|
41
|
+
className
|
|
42
|
+
)
|
|
43
|
+
}, props), {
|
|
44
|
+
children: [
|
|
45
|
+
children,
|
|
46
|
+
/* @__PURE__ */ jsxs(DialogPrimitive.Close, {
|
|
47
|
+
className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx(X, {
|
|
50
|
+
className: "h-4 w-4"
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsx("span", {
|
|
53
|
+
className: "sr-only",
|
|
54
|
+
children: "Close"
|
|
55
|
+
})
|
|
56
|
+
]
|
|
57
|
+
})
|
|
58
|
+
]
|
|
59
|
+
}))
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
64
|
+
var DialogHeader = (_a) => {
|
|
65
|
+
var _b = _a, {
|
|
66
|
+
className
|
|
67
|
+
} = _b, props = __objRest(_b, [
|
|
68
|
+
"className"
|
|
69
|
+
]);
|
|
70
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({
|
|
71
|
+
className: cn(
|
|
72
|
+
"flex flex-col space-y-1.5 text-center sm:text-left",
|
|
73
|
+
className
|
|
74
|
+
)
|
|
75
|
+
}, props));
|
|
76
|
+
};
|
|
77
|
+
DialogHeader.displayName = "DialogHeader";
|
|
78
|
+
var DialogFooter = (_a) => {
|
|
79
|
+
var _b = _a, {
|
|
80
|
+
className
|
|
81
|
+
} = _b, props = __objRest(_b, [
|
|
82
|
+
"className"
|
|
83
|
+
]);
|
|
84
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({
|
|
85
|
+
className: cn(
|
|
86
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
87
|
+
className
|
|
88
|
+
)
|
|
89
|
+
}, props));
|
|
90
|
+
};
|
|
91
|
+
DialogFooter.displayName = "DialogFooter";
|
|
92
|
+
var DialogTitle = React.forwardRef((_a, ref) => {
|
|
93
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
94
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Title, __spreadValues({
|
|
95
|
+
ref,
|
|
96
|
+
className: cn(
|
|
97
|
+
"text-lg font-semibold leading-none tracking-tight",
|
|
98
|
+
className
|
|
99
|
+
)
|
|
100
|
+
}, props));
|
|
101
|
+
});
|
|
102
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
103
|
+
var DialogDescription = React.forwardRef((_a, ref) => {
|
|
104
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
105
|
+
return /* @__PURE__ */ jsx(DialogPrimitive.Description, __spreadValues({
|
|
106
|
+
ref,
|
|
107
|
+
className: cn("text-sm text-muted-foreground", className)
|
|
108
|
+
}, props));
|
|
109
|
+
});
|
|
110
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
111
|
+
|
|
112
|
+
export { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger };
|
|
113
|
+
//# sourceMappingURL=out.js.map
|
|
114
|
+
//# sourceMappingURL=chunk-O5OWT5GE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/dialog.tsx"],"names":[],"mappings":";;;;;;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,SAAS;AAYhB,cAkCI,YAlCJ;AAhBF;AAQA,IAAM,SAAyB;AAE/B,IAAM,gBAAgC;AAEtC,IAAM,eAAe,CAAC,OAGgB;AAHhB,eACpB;AAAA;AAAA,EAbF,IAYsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAiB,wBAAhB;AAAA,IAAuB,WAAW,GAAG,SAAS;AAAA,KAAO,MAAO;AAAA;AAE/D,aAAa,cAA8B,uBAAO;AAElD,IAAM,gBAAsB,iBAG1B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAvBL,IAuBG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,yBAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,gBAAsB,iBAG1B,CAAC,IAAmC,QAAK;AAAxC,eAAE,aAAW,SAtChB,IAsCG,IAA0B,kBAA1B,IAA0B,CAAxB,aAAW;AACd,8BAAC;AAAA,IACC;AAAA,0BAAC,iBAAc;AAAA,MACf,qBAAiB,yBAAhB;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,SACI,QANL;AAAA,QAQE;AAAA;AAAA,UACD,qBAAiB,uBAAhB;AAAA,YAAsB,WAAU;AAAA,YAC/B;AAAA,kCAAC;AAAA,gBAAE,WAAU;AAAA,eAAU;AAAA,cACvB,oBAAC;AAAA,gBAAK,WAAU;AAAA,gBAAU;AAAA,eAAK;AAAA;AAAA,WACjC;AAAA;AAAA,QACF;AAAA;AAAA,GACF;AAAA,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,eAAe,CAAC,OAGmB;AAHnB,eACpB;AAAA;AAAA,EA5DF,IA2DsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAC;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA;AAEF,aAAa,cAAc;AAE3B,IAAM,eAAe,CAAC,OAGmB;AAHnB,eACpB;AAAA;AAAA,EA1EF,IAyEsB,IAEjB,kBAFiB,IAEjB;AAAA,IADH;AAAA;AAGA,6BAAC;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA;AAEF,aAAa,cAAc;AAE3B,IAAM,cAAoB,iBAGxB,CAAC,IAAyB,QAAK;AAA9B,eAAE,YA1FL,IA0FG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,uBAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,oBAA0B,iBAG9B,CAAC,IAAyB,QAAK;AAA9B,eAAE,YAzGL,IAyGG,IAAgB,kBAAhB,IAAgB,CAAd;AACH,6BAAiB,6BAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,KACpD,MACN;AAAA,CACD;AACD,kBAAkB,cAA8B,4BAAY","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = ({\n className,\n ...props\n}: DialogPrimitive.DialogPortalProps) => (\n <DialogPrimitive.Portal className={cn(className)} {...props} />\n);\nDialogPortal.displayName = DialogPrimitive.Portal.displayName;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { editorToText } from './chunk-YTOPHPSG.mjs';
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useSlateSelector } from 'slate-react';
|
|
4
|
+
import { Range } from 'slate';
|
|
5
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function TrackerTextEditedSinceLastCursorMovement(props) {
|
|
8
|
+
const cursorState = useSlateSelector((state) => ({
|
|
9
|
+
selection: state.selection,
|
|
10
|
+
text: editorToText(state)
|
|
11
|
+
}));
|
|
12
|
+
const previousState = usePrevious(cursorState);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!previousState) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (cursorChangedWithoutTextChanged(previousState, cursorState)) {
|
|
18
|
+
props.setCursorMovedSinceLastTextChange(true);
|
|
19
|
+
}
|
|
20
|
+
}, [props.setCursorMovedSinceLastTextChange, cursorState]);
|
|
21
|
+
return /* @__PURE__ */ jsx(Fragment, {});
|
|
22
|
+
}
|
|
23
|
+
var cursorChangedWithoutTextChanged = (prev, next) => {
|
|
24
|
+
const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);
|
|
25
|
+
const isTextSame = prev.text === next.text;
|
|
26
|
+
return isSelectionChanged && isTextSame;
|
|
27
|
+
};
|
|
28
|
+
var isSelectionEqual = (a, b) => {
|
|
29
|
+
if (!a && !b)
|
|
30
|
+
return true;
|
|
31
|
+
if (!a || !b)
|
|
32
|
+
return false;
|
|
33
|
+
return Range.equals(a, b);
|
|
34
|
+
};
|
|
35
|
+
function usePrevious(value) {
|
|
36
|
+
const ref = useRef();
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
ref.current = value;
|
|
39
|
+
});
|
|
40
|
+
return ref.current;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { TrackerTextEditedSinceLastCursorMovement };
|
|
44
|
+
//# sourceMappingURL=out.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-OD7ZMOVE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx"],"names":[],"mappings":";;;;;AAAA,SAAgB,WAAW,cAAc;AAEzC,SAAS,wBAAwB;AACjC,SAAS,aAAa;AA0Bb;AApBF,SAAS,yCACd,OACa;AACb,QAAM,cAAmC,iBAAiB,CAAC,WAAW;AAAA,IACpE,WAAW,MAAM;AAAA,IACjB,MAAM,aAAa,KAAK;AAAA,EAC1B,EAAE;AAEF,QAAM,gBAAgB,YAAY,WAAW;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,QAAI,gCAAgC,eAAe,WAAW,GAAG;AAC/D,YAAM,kCAAkC,IAAI;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,MAAM,mCAAmC,WAAW,CAAC;AAEzD,SAAO,gCAAE;AACX;AAKA,IAAM,kCAAkC,CACtC,MACA,SACG;AAEH,QAAM,qBAAqB,CAAC,iBAAiB,KAAK,WAAW,KAAK,SAAS;AAG3E,QAAM,aAAa,KAAK,SAAS,KAAK;AAEtC,SAAO,sBAAsB;AAC/B;AACA,IAAM,mBAAmB,CAAC,GAAkB,MAAqB;AAC/D,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,MAAI,CAAC,KAAK,CAAC;AAAG,WAAO;AACrB,SAAO,MAAM,OAAO,GAAG,CAAC;AAC1B;AACA,SAAS,YAAe,OAAyB;AAC/C,QAAM,MAAM,OAAU;AAEtB,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO,IAAI;AACb","sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { BaseSelection } from \"slate\";\nimport { useSlateSelector } from \"slate-react\";\nimport { Range } from \"slate\";\nimport { editorToText } from \"../../lib/editor-to-text\";\n\ninterface TrackerTextEditedSinceLastCursorMovementProps {\n setCursorMovedSinceLastTextChange: (value: boolean) => void;\n}\nexport function TrackerTextEditedSinceLastCursorMovement(\n props: TrackerTextEditedSinceLastCursorMovementProps\n): JSX.Element {\n const cursorState: RelevantEditorState = useSlateSelector((state) => ({\n selection: state.selection,\n text: editorToText(state),\n }));\n\n const previousState = usePrevious(cursorState);\n\n useEffect(() => {\n if (!previousState) {\n return;\n }\n\n if (cursorChangedWithoutTextChanged(previousState, cursorState)) {\n props.setCursorMovedSinceLastTextChange(true);\n }\n }, [props.setCursorMovedSinceLastTextChange, cursorState]);\n\n return <></>;\n}\ntype RelevantEditorState = {\n selection: BaseSelection;\n text: string;\n};\nconst cursorChangedWithoutTextChanged = (\n prev: RelevantEditorState,\n next: RelevantEditorState\n) => {\n // Check if the selection has changed\n const isSelectionChanged = !isSelectionEqual(prev.selection, next.selection);\n\n // Check if the text content remains the same\n const isTextSame = prev.text === next.text;\n\n return isSelectionChanged && isTextSame;\n};\nconst isSelectionEqual = (a: BaseSelection, b: BaseSelection) => {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return Range.equals(a, b);\n};\nfunction usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n });\n\n return ref.current;\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { PreSuggestion } from './chunk-CDB7HFCY.mjs';
|
|
2
|
+
import { SuggestionAppearing } from './chunk-ITZHK3YV.mjs';
|
|
3
|
+
import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
4
|
+
import { useState, useCallback } from 'react';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var HoveringInsertionPromptBox = (props) => {
|
|
8
|
+
const [insertionPrompt, setInsertionPrompt] = useState("");
|
|
9
|
+
const [mode, setMode] = useState({
|
|
10
|
+
type: "pre-suggestion"
|
|
11
|
+
});
|
|
12
|
+
const handleGeneratedText = useCallback(
|
|
13
|
+
(generatingText) => {
|
|
14
|
+
setMode({
|
|
15
|
+
type: "suggestion-appearing",
|
|
16
|
+
initialSuggestion: {
|
|
17
|
+
editorState: props.editorState,
|
|
18
|
+
adjustmentPrompt: insertionPrompt,
|
|
19
|
+
generatingSuggestion: generatingText
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
[setMode, insertionPrompt]
|
|
24
|
+
);
|
|
25
|
+
const goBack = () => {
|
|
26
|
+
setMode({ type: "pre-suggestion" });
|
|
27
|
+
};
|
|
28
|
+
return /* @__PURE__ */ jsx("div", {
|
|
29
|
+
className: "flex flex-col justify-center items-center space-y-4 rounded-md border shadow-lg p-4 border-gray- bg-white",
|
|
30
|
+
style: { width: "30rem" },
|
|
31
|
+
children: mode.type === "pre-suggestion" ? /* @__PURE__ */ jsx(PreSuggestion, __spreadProps(__spreadValues({}, props), {
|
|
32
|
+
insertionOrEditingFunction: props.apiConfig.insertionOrEditingFunction,
|
|
33
|
+
insertionOrEditingPrompt: insertionPrompt,
|
|
34
|
+
setInsertionOrEditingPrompt: setInsertionPrompt,
|
|
35
|
+
onGeneratedText: handleGeneratedText
|
|
36
|
+
})) : /* @__PURE__ */ jsx(SuggestionAppearing, __spreadProps(__spreadValues({}, props), {
|
|
37
|
+
state: mode,
|
|
38
|
+
goBack,
|
|
39
|
+
insertionOrEditingFunction: props.apiConfig.insertionOrEditingFunction,
|
|
40
|
+
onGeneratedText: handleGeneratedText
|
|
41
|
+
}))
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { HoveringInsertionPromptBox };
|
|
46
|
+
//# sourceMappingURL=out.js.map
|
|
47
|
+
//# sourceMappingURL=chunk-OM5WQQOU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAgB,aAAa,gBAAgB;AAkDrC;AA9BD,IAAM,6BAA8C,CAAC,UAAU;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiB,EAAE;AACjE,QAAM,CAAC,MAAM,OAAO,IAAI,SAA+B;AAAA,IACrD,MAAM;AAAA,EACR,CAAC;AAED,QAAM,sBAAsB;AAAA,IAC1B,CAAC,mBAA2C;AAC1C,cAAQ;AAAA,QACN,MAAM;AAAA,QACN,mBAAmB;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,kBAAkB;AAAA,UAClB,sBAAsB;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,eAAe;AAAA,EAC3B;AAEA,QAAM,SAAS,MAAM;AACnB,YAAQ,EAAE,MAAM,iBAAiB,CAAC;AAAA,EACpC;AAEA,SACE,oBAAC;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,QAAQ;AAAA,IAEvB,eAAK,SAAS,mBACb,oBAAC,gDACK,QADL;AAAA,MAEC,4BACE,MAAM,UAAU;AAAA,MAElB,0BAA0B;AAAA,MAC1B,6BAA6B;AAAA,MAC7B,iBAAiB;AAAA,MACnB,IAEA,oBAAC,sDACK,QADL;AAAA,MAEC,OAAO;AAAA,MACP;AAAA,MACA,4BACE,MAAM,UAAU;AAAA,MAElB,iBAAiB;AAAA,MACnB;AAAA,GAEJ;AAEJ","sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport {\n State_SuggestionAppearing,\n SuggestionAppearing,\n} from \"./mode-suggestion-appearing\";\nimport { PreSuggestion, State_PreSuggestion } from \"./mode-pre-suggestion\";\nimport {\n EditingEditorState,\n InsertionEditorApiConfig,\n} from \"../../../types/base/autosuggestions-bare-function\";\n\ntype InsertionPromptState = State_PreSuggestion | State_SuggestionAppearing;\n\nexport interface Props {\n editorState: EditingEditorState;\n apiConfig: InsertionEditorApiConfig;\n performInsertion: (insertedText: string) => void;\n closeWindow: () => void;\n}\n\nexport const HoveringInsertionPromptBox: React.FC<Props> = (props) => {\n const [insertionPrompt, setInsertionPrompt] = useState<string>(\"\");\n const [mode, setMode] = useState<InsertionPromptState>({\n type: \"pre-suggestion\",\n });\n\n const handleGeneratedText = useCallback(\n (generatingText: ReadableStream<string>) => {\n setMode({\n type: \"suggestion-appearing\",\n initialSuggestion: {\n editorState: props.editorState,\n adjustmentPrompt: insertionPrompt,\n generatingSuggestion: generatingText,\n },\n });\n },\n [setMode, insertionPrompt]\n );\n\n const goBack = () => {\n setMode({ type: \"pre-suggestion\" });\n };\n\n return (\n <div\n className=\"flex flex-col justify-center items-center space-y-4 rounded-md border shadow-lg p-4 border-gray- bg-white\"\n style={{ width: \"30rem\" }}\n >\n {mode.type === \"pre-suggestion\" ? (\n <PreSuggestion\n {...props}\n insertionOrEditingFunction={\n props.apiConfig.insertionOrEditingFunction\n }\n insertionOrEditingPrompt={insertionPrompt}\n setInsertionOrEditingPrompt={setInsertionPrompt}\n onGeneratedText={handleGeneratedText}\n />\n ) : (\n <SuggestionAppearing\n {...props}\n state={mode}\n goBack={goBack}\n insertionOrEditingFunction={\n props.apiConfig.insertionOrEditingFunction\n }\n onGeneratedText={handleGeneratedText}\n />\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defaultEditingApiConfig } from './chunk-55EGOC5T.mjs';
|
|
2
|
+
import { defaultInsertionsApiConfig } from './chunk-XDT7BF3V.mjs';
|
|
3
|
+
import { defaultSuggestionsApiConfig } from './chunk-A2RRLD23.mjs';
|
|
4
|
+
import { defaultBaseAutosuggestionsConfig } from './chunk-D7SEV5PR.mjs';
|
|
5
|
+
import { __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
6
|
+
|
|
7
|
+
// src/types/autosuggestions-config/autosuggestions-config.tsx
|
|
8
|
+
var defaultAutosuggestionsConfig = __spreadProps(__spreadValues({}, defaultBaseAutosuggestionsConfig), {
|
|
9
|
+
externalContextCategories: void 0,
|
|
10
|
+
chatApiConfigs: {
|
|
11
|
+
suggestionsApiConfig: defaultSuggestionsApiConfig,
|
|
12
|
+
insertionApiConfig: defaultInsertionsApiConfig,
|
|
13
|
+
editingApiConfig: defaultEditingApiConfig
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export { defaultAutosuggestionsConfig };
|
|
18
|
+
//# sourceMappingURL=out.js.map
|
|
19
|
+
//# sourceMappingURL=chunk-QL2GYGG5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/autosuggestions-config/autosuggestions-config.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA+BO,IAAM,+BAGT,iCACC,mCADD;AAAA,EAEF,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,IACd,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EACpB;AACF","sourcesContent":["import {\n BaseAutosuggestionsConfig,\n defaultBaseAutosuggestionsConfig,\n} from \"../base\";\nimport {\n SuggestionsApiConfig,\n defaultSuggestionsApiConfig,\n} from \"./suggestions-api-config\";\nimport {\n InsertionsApiConfig,\n defaultInsertionsApiConfig,\n} from \"./insertions-api-config\";\nimport { ChatlikeApiEndpoint } from \".\";\nimport {\n EditingApiConfig,\n defaultEditingApiConfig,\n} from \"./editing-api-config\";\n\n// Like the base autosuggestions config, with 2 additional fields:\n// 1. externalContextCategories: string[] | undefined;\n// 2. instead of apiConfigs, we have chatApiConfigs: a higher-level abstraction that uses a ChatGPT-like API endpoint.\nexport interface AutosuggestionsConfig\n extends Omit<BaseAutosuggestionsConfig, \"apiConfig\"> {\n externalContextCategories: string[] | undefined;\n chatApiConfigs: {\n suggestionsApiConfig: SuggestionsApiConfig;\n insertionApiConfig: InsertionsApiConfig;\n editingApiConfig: EditingApiConfig;\n };\n}\n\nexport const defaultAutosuggestionsConfig: Omit<\n AutosuggestionsConfig,\n \"textareaPurpose\" | \"apiEndpoint\"\n> = {\n ...defaultBaseAutosuggestionsConfig,\n externalContextCategories: undefined,\n chatApiConfigs: {\n suggestionsApiConfig: defaultSuggestionsApiConfig,\n insertionApiConfig: defaultInsertionsApiConfig,\n editingApiConfig: defaultEditingApiConfig,\n },\n};\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { HoveringInsertionPromptBox } from './chunk-OM5WQQOU.mjs';
|
|
2
|
+
import { useHoveringEditorContext } from './chunk-YW3REYX6.mjs';
|
|
3
|
+
import { Portal, Menu } from './chunk-XHUMROEY.mjs';
|
|
4
|
+
import { getTextAroundSelection, getFullEditorTextWithNewlines } from './chunk-IXJ2HCOA.mjs';
|
|
5
|
+
import { useRef, useState, useEffect } from 'react';
|
|
6
|
+
import { Transforms } from 'slate';
|
|
7
|
+
import { useSlate, useSlateSelection } from 'slate-react';
|
|
8
|
+
import { jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var HoveringToolbar = (props) => {
|
|
11
|
+
const ref = useRef(null);
|
|
12
|
+
const editor = useSlate();
|
|
13
|
+
const selection = useSlateSelection();
|
|
14
|
+
const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();
|
|
15
|
+
const [isClient, setIsClient] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setIsClient(true);
|
|
18
|
+
}, []);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const el = ref.current;
|
|
21
|
+
const { selection: selection2 } = editor;
|
|
22
|
+
if (!el) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!selection2) {
|
|
26
|
+
el.removeAttribute("style");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const domSelection = window.getSelection();
|
|
30
|
+
if (!domSelection) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const domRange = domSelection.getRangeAt(0);
|
|
34
|
+
const rect = domRange.getBoundingClientRect();
|
|
35
|
+
if (rect.top === 0 && rect.left === 0 && rect.width === 0 && rect.height === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const minGapFromEdge = 60;
|
|
39
|
+
const verticalOffsetFromCorner = 35;
|
|
40
|
+
const horizontalOffsetFromCorner = 15;
|
|
41
|
+
let top = rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;
|
|
42
|
+
if (top < minGapFromEdge) {
|
|
43
|
+
top = rect.bottom + window.scrollY + minGapFromEdge;
|
|
44
|
+
} else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {
|
|
45
|
+
top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;
|
|
46
|
+
}
|
|
47
|
+
let left = rect.left + window.scrollX - el.offsetWidth / 2 + rect.width / 2 + horizontalOffsetFromCorner;
|
|
48
|
+
if (left < minGapFromEdge) {
|
|
49
|
+
left = minGapFromEdge;
|
|
50
|
+
} else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {
|
|
51
|
+
left = window.innerWidth - el.offsetWidth - minGapFromEdge;
|
|
52
|
+
}
|
|
53
|
+
el.style.opacity = "1";
|
|
54
|
+
el.style.top = `${top}px`;
|
|
55
|
+
el.style.left = `${left}px`;
|
|
56
|
+
});
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
const handleClickOutside = (event) => {
|
|
59
|
+
if (ref.current && !ref.current.contains(event.target)) {
|
|
60
|
+
setIsDisplayed(false);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
64
|
+
return () => {
|
|
65
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
66
|
+
};
|
|
67
|
+
}, [ref, setIsDisplayed]);
|
|
68
|
+
if (!isClient) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return /* @__PURE__ */ jsx(Portal, {
|
|
72
|
+
children: /* @__PURE__ */ jsx(Menu, {
|
|
73
|
+
ref,
|
|
74
|
+
className: "p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700",
|
|
75
|
+
children: isDisplayed && selection && /* @__PURE__ */ jsx(HoveringInsertionPromptBox, {
|
|
76
|
+
editorState: editorState(editor),
|
|
77
|
+
apiConfig: props.apiConfig,
|
|
78
|
+
closeWindow: () => {
|
|
79
|
+
setIsDisplayed(false);
|
|
80
|
+
},
|
|
81
|
+
performInsertion: (insertedText) => {
|
|
82
|
+
console.log("inserted text", insertedText);
|
|
83
|
+
Transforms.delete(editor, { at: selection });
|
|
84
|
+
Transforms.insertText(editor, insertedText, {
|
|
85
|
+
at: selection
|
|
86
|
+
});
|
|
87
|
+
setIsDisplayed(false);
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
function editorState(editor, selection) {
|
|
94
|
+
const textAroundCursor = getTextAroundSelection(editor);
|
|
95
|
+
if (textAroundCursor) {
|
|
96
|
+
return textAroundCursor;
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
textBeforeCursor: getFullEditorTextWithNewlines(editor),
|
|
100
|
+
textAfterCursor: "",
|
|
101
|
+
selectedText: ""
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export { HoveringToolbar };
|
|
106
|
+
//# sourceMappingURL=out.js.map
|
|
107
|
+
//# sourceMappingURL=chunk-RPDVSCLO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/hovering-toolbar/hovering-toolbar.tsx"],"names":["selection"],"mappings":";;;;;;;;;;;;;;;;AACA,SAAS,WAAoB,QAAQ,gBAAgB;AACrD,SAAiD,kBAAkB;AACnE,SAAS,UAAU,yBAAyB;AAuHlC;AAtGH,IAAM,kBAEa,CAAC,UAAU;AACnC,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,SAAS,SAAS;AACxB,QAAM,YAAY,kBAAkB;AACpC,QAAM,EAAE,aAAa,eAAe,IAAI,yBAAyB;AAGjE,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,YAAU,MAAM;AACd,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,UAAM,EAAE,WAAAA,WAAU,IAAI;AAEtB,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AAEA,QAAI,CAACA,YAAW;AACd,SAAG,gBAAgB,OAAO;AAC1B;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,aAAa;AACzC,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,WAAW,CAAC;AAC1C,UAAM,OAAO,SAAS,sBAAsB;AAM5C,QACE,KAAK,QAAQ,KACb,KAAK,SAAS,KACd,KAAK,UAAU,KACf,KAAK,WAAW,GAChB;AACA;AAAA,IACF;AAEA,UAAM,iBAAiB;AACvB,UAAM,2BAA2B;AACjC,UAAM,6BAA6B;AACnC,QAAI,MACF,KAAK,MAAM,OAAO,UAAU,GAAG,eAAe;AAEhD,QAAI,MAAM,gBAAgB;AACxB,YAAM,KAAK,SAAS,OAAO,UAAU;AAAA,IACvC,WAAW,MAAM,GAAG,eAAe,OAAO,cAAc,gBAAgB;AACtE,YAAM,KAAK,MAAM,OAAO,UAAU,GAAG,eAAe;AAAA,IACtD;AAEA,QAAI,OACF,KAAK,OACL,OAAO,UACP,GAAG,cAAc,IACjB,KAAK,QAAQ,IACb;AAEF,QAAI,OAAO,gBAAgB;AACzB,aAAO;AAAA,IACT,WAAW,OAAO,GAAG,cAAc,OAAO,aAAa,gBAAgB;AACrE,aAAO,OAAO,aAAa,GAAG,cAAc;AAAA,IAC9C;AAEA,OAAG,MAAM,UAAU;AACnB,OAAG,MAAM,MAAM,GAAG;AAClB,OAAG,MAAM,OAAO,GAAG;AAAA,EACrB,CAAC;AAED,YAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9D,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,KAAK,cAAc,CAAC;AAExB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE,oBAAC;AAAA,IACC,8BAAC;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MAET,yBAAe,aACd,oBAAC;AAAA,QACC,aAAa,YAAY,QAAQ,SAAS;AAAA,QAC1C,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AACjB,yBAAe,KAAK;AAAA,QACtB;AAAA,QACA,kBAAkB,CAAC,iBAAiB;AAClC,kBAAQ,IAAI,iBAAiB,YAAY;AAEzC,qBAAW,OAAO,QAAQ,EAAE,IAAI,UAAU,CAAC;AAC3C,qBAAW,WAAW,QAAQ,cAAc;AAAA,YAC1C,IAAI;AAAA,UACN,CAAC;AACD,yBAAe,KAAK;AAAA,QACtB;AAAA,OACF;AAAA,KAEJ;AAAA,GACF;AAEJ;AAEA,SAAS,YAAY,QAAgB,WAAyC;AAC5E,QAAM,mBAAmB,uBAAuB,MAAM;AACtD,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,kBAAkB,8BAA8B,MAAM;AAAA,IACtD,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB;AACF","sourcesContent":["import { css } from \"@emotion/css\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { BaseSelection, Editor, Range, Location, Transforms } from \"slate\";\nimport { useSlate, useSlateSelection } from \"slate-react\";\nimport { HoveringInsertionPromptBox } from \"./text-insertion-prompt-box\";\nimport { Button, Icon, Menu, Portal } from \"./hovering-toolbar-components\";\nimport { useHoveringEditorContext } from \"./hovering-editor-provider\";\nimport {\n getFullEditorTextWithNewlines,\n getTextAroundSelection,\n} from \"../../lib/get-text-around-cursor\";\nimport {\n EditingEditorState,\n InsertionEditorApiConfig,\n} from \"../../types/base/autosuggestions-bare-function\";\n\nexport interface HoveringToolbarProps {\n apiConfig: InsertionEditorApiConfig;\n}\n\nexport const HoveringToolbar: (\n props: HoveringToolbarProps\n) => JSX.Element | null = (props) => {\n const ref = useRef<HTMLDivElement>(null);\n const editor = useSlate();\n const selection = useSlateSelection();\n const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();\n\n // only render on client\n const [isClient, setIsClient] = useState(false);\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n useEffect(() => {\n const el = ref.current;\n const { selection } = editor;\n\n if (!el) {\n return;\n }\n\n if (!selection) {\n el.removeAttribute(\"style\");\n return;\n }\n\n const domSelection = window.getSelection();\n if (!domSelection) {\n return;\n }\n\n const domRange = domSelection.getRangeAt(0);\n const rect = domRange.getBoundingClientRect();\n\n // We use window = (0,0,0,0) as a signal that the selection is not in the original copilot-textarea,\n // but inside the hovering window.\n //\n // in such case, we simply do nothing.\n if (\n rect.top === 0 &&\n rect.left === 0 &&\n rect.width === 0 &&\n rect.height === 0\n ) {\n return;\n }\n\n const minGapFromEdge = 60;\n const verticalOffsetFromCorner = 35;\n const horizontalOffsetFromCorner = 15;\n let top =\n rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;\n // make sure top is in the viewport and not too close to the edge\n if (top < minGapFromEdge) {\n top = rect.bottom + window.scrollY + minGapFromEdge;\n } else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {\n top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;\n }\n\n let left =\n rect.left +\n window.scrollX -\n el.offsetWidth / 2 +\n rect.width / 2 +\n horizontalOffsetFromCorner;\n // make sure left is in the viewport and not too close to the edge\n if (left < minGapFromEdge) {\n left = minGapFromEdge;\n } else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {\n left = window.innerWidth - el.offsetWidth - minGapFromEdge;\n }\n\n el.style.opacity = \"1\";\n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n });\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n setIsDisplayed(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [ref, setIsDisplayed]);\n\n if (!isClient) {\n return null;\n }\n\n return (\n <Portal>\n <Menu\n ref={ref}\n className=\"p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700\"\n >\n {isDisplayed && selection && (\n <HoveringInsertionPromptBox\n editorState={editorState(editor, selection)}\n apiConfig={props.apiConfig}\n closeWindow={() => {\n setIsDisplayed(false);\n }}\n performInsertion={(insertedText) => {\n console.log(\"inserted text\", insertedText);\n // replace the selection with the inserted text\n Transforms.delete(editor, { at: selection });\n Transforms.insertText(editor, insertedText, {\n at: selection,\n });\n setIsDisplayed(false);\n }}\n />\n )}\n </Menu>\n </Portal>\n );\n};\n\nfunction editorState(editor: Editor, selection: Location): EditingEditorState {\n const textAroundCursor = getTextAroundSelection(editor);\n if (textAroundCursor) {\n return textAroundCursor;\n }\n\n return {\n textBeforeCursor: getFullEditorTextWithNewlines(editor),\n textAfterCursor: \"\",\n selectedText: \"\",\n };\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { areEqual_autocompleteState } from './chunk-
|
|
1
|
+
import { areEqual_autocompleteState } from './chunk-JAFCXEPU.mjs';
|
|
2
2
|
import { nullableCompatibleEqualityCheck } from './chunk-KGKLUWKW.mjs';
|
|
3
3
|
import { Debouncer } from './chunk-NKW5OU2S.mjs';
|
|
4
4
|
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
5
|
-
import { useState, useCallback, useMemo } from 'react';
|
|
5
|
+
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
6
6
|
|
|
7
7
|
function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty, disabled) {
|
|
8
8
|
const [previousAutocompleteState, setPreviousAutocompleteState] = useState(null);
|
|
@@ -16,8 +16,7 @@ function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestio
|
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
const suggestion = yield autosuggestionFunction(
|
|
19
|
-
editorAutocompleteState
|
|
20
|
-
editorAutocompleteState.textAfterCursor,
|
|
19
|
+
editorAutocompleteState,
|
|
21
20
|
abortSignal
|
|
22
21
|
);
|
|
23
22
|
if (!suggestion || abortSignal.aborted) {
|
|
@@ -41,6 +40,12 @@ function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestio
|
|
|
41
40
|
),
|
|
42
41
|
[debounceTime]
|
|
43
42
|
);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
return () => {
|
|
45
|
+
debouncedFunction.cancel();
|
|
46
|
+
setCurrentAutocompleteSuggestion(null);
|
|
47
|
+
};
|
|
48
|
+
}, [debouncedFunction, disabled]);
|
|
44
49
|
const onChange = useCallback(
|
|
45
50
|
(newEditorState) => {
|
|
46
51
|
const editorStateHasChanged = !nullableCompatibleEqualityCheck(
|
|
@@ -93,4 +98,4 @@ function useAutosuggestions(debounceTime, acceptAutosuggestionKey, autosuggestio
|
|
|
93
98
|
|
|
94
99
|
export { useAutosuggestions };
|
|
95
100
|
//# sourceMappingURL=out.js.map
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
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,108 @@
|
|
|
1
|
+
import { retry } from './chunk-4S5ZJH3I.mjs';
|
|
2
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
3
|
+
import { CopilotContext } from '@copilotkit/react-core';
|
|
4
|
+
import { useContext, useCallback } from 'react';
|
|
5
|
+
|
|
6
|
+
function useMakeStandardInsertionOrEditingFunction(textareaPurpose, contextCategories, insertionApiConfig, editingApiConfig) {
|
|
7
|
+
const { getContextString } = useContext(CopilotContext);
|
|
8
|
+
const insertionFunction = useCallback(
|
|
9
|
+
(editorState, insertionPrompt, abortSignal) => __async(this, null, function* () {
|
|
10
|
+
const res = yield retry(() => __async(this, null, function* () {
|
|
11
|
+
const messages = [
|
|
12
|
+
{
|
|
13
|
+
role: "system",
|
|
14
|
+
content: insertionApiConfig.makeSystemPrompt(
|
|
15
|
+
textareaPurpose,
|
|
16
|
+
getContextString(contextCategories)
|
|
17
|
+
)
|
|
18
|
+
},
|
|
19
|
+
...insertionApiConfig.fewShotMessages,
|
|
20
|
+
{
|
|
21
|
+
role: "user",
|
|
22
|
+
name: "TextAfterCursor",
|
|
23
|
+
content: editorState.textAfterCursor
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
role: "user",
|
|
27
|
+
name: "TextBeforeCursor",
|
|
28
|
+
content: editorState.textBeforeCursor
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
role: "user",
|
|
32
|
+
name: "InsertionPrompt",
|
|
33
|
+
content: insertionPrompt
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
return yield insertionApiConfig.apiEndpoint.run(
|
|
37
|
+
abortSignal,
|
|
38
|
+
messages,
|
|
39
|
+
insertionApiConfig.forwardedParams
|
|
40
|
+
);
|
|
41
|
+
}));
|
|
42
|
+
return res;
|
|
43
|
+
}),
|
|
44
|
+
[insertionApiConfig, getContextString, contextCategories, textareaPurpose]
|
|
45
|
+
);
|
|
46
|
+
const editingFunction = useCallback(
|
|
47
|
+
(editorState, editingPrompt, abortSignal) => __async(this, null, function* () {
|
|
48
|
+
const res = yield retry(() => __async(this, null, function* () {
|
|
49
|
+
const messages = [
|
|
50
|
+
{
|
|
51
|
+
role: "system",
|
|
52
|
+
content: editingApiConfig.makeSystemPrompt(
|
|
53
|
+
textareaPurpose,
|
|
54
|
+
getContextString(contextCategories)
|
|
55
|
+
)
|
|
56
|
+
},
|
|
57
|
+
...editingApiConfig.fewShotMessages,
|
|
58
|
+
{
|
|
59
|
+
role: "user",
|
|
60
|
+
name: "TextBeforeCursor",
|
|
61
|
+
content: editorState.textBeforeCursor
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
role: "user",
|
|
65
|
+
name: "TextToEdit",
|
|
66
|
+
content: editorState.selectedText
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
role: "user",
|
|
70
|
+
name: "TextAfterCursor",
|
|
71
|
+
content: editorState.textAfterCursor
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
role: "user",
|
|
75
|
+
name: "EditingPrompt",
|
|
76
|
+
content: editingPrompt
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
return yield editingApiConfig.apiEndpoint.run(
|
|
80
|
+
abortSignal,
|
|
81
|
+
messages,
|
|
82
|
+
editingApiConfig.forwardedParams
|
|
83
|
+
);
|
|
84
|
+
}));
|
|
85
|
+
return res;
|
|
86
|
+
}),
|
|
87
|
+
[editingApiConfig, getContextString, contextCategories, textareaPurpose]
|
|
88
|
+
);
|
|
89
|
+
const insertionOrEditingFunction = useCallback(
|
|
90
|
+
(editorState, insertionPrompt, abortSignal) => __async(this, null, function* () {
|
|
91
|
+
if (editorState.selectedText === "") {
|
|
92
|
+
return yield insertionFunction(
|
|
93
|
+
editorState,
|
|
94
|
+
insertionPrompt,
|
|
95
|
+
abortSignal
|
|
96
|
+
);
|
|
97
|
+
} else {
|
|
98
|
+
return yield editingFunction(editorState, insertionPrompt, abortSignal);
|
|
99
|
+
}
|
|
100
|
+
}),
|
|
101
|
+
[insertionFunction, editingFunction]
|
|
102
|
+
);
|
|
103
|
+
return insertionOrEditingFunction;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { useMakeStandardInsertionOrEditingFunction };
|
|
107
|
+
//# sourceMappingURL=out.js.map
|
|
108
|
+
//# sourceMappingURL=chunk-VBIJPE3H.mjs.map
|