@copilotkit/react-textarea 0.0.0-feat-dynamic-copilotcloud-qa-20250117190454
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/CHANGELOG.md +2456 -0
- package/README.md +46 -0
- package/dist/chunk-23Q6A46J.mjs +103 -0
- package/dist/chunk-23Q6A46J.mjs.map +1 -0
- package/dist/chunk-2C7O2EVM.mjs +27 -0
- package/dist/chunk-2C7O2EVM.mjs.map +1 -0
- package/dist/chunk-2QDCE7PD.mjs +32 -0
- package/dist/chunk-2QDCE7PD.mjs.map +1 -0
- package/dist/chunk-2VMZ5ZWT.mjs +229 -0
- package/dist/chunk-2VMZ5ZWT.mjs.map +1 -0
- package/dist/chunk-3PQ7GSFE.mjs +17 -0
- package/dist/chunk-3PQ7GSFE.mjs.map +1 -0
- package/dist/chunk-4CVSOOJY.mjs +30 -0
- package/dist/chunk-4CVSOOJY.mjs.map +1 -0
- package/dist/chunk-4NHVQZ67.mjs +108 -0
- package/dist/chunk-4NHVQZ67.mjs.map +1 -0
- package/dist/chunk-4PDYALMP.mjs +52 -0
- package/dist/chunk-4PDYALMP.mjs.map +1 -0
- package/dist/chunk-4XXU5BSA.mjs +125 -0
- package/dist/chunk-4XXU5BSA.mjs.map +1 -0
- package/dist/chunk-5UNJXFUO.mjs +29 -0
- package/dist/chunk-5UNJXFUO.mjs.map +1 -0
- package/dist/chunk-7L6GIHDM.mjs +39 -0
- package/dist/chunk-7L6GIHDM.mjs.map +1 -0
- package/dist/chunk-7LSRNPNI.mjs +59 -0
- package/dist/chunk-7LSRNPNI.mjs.map +1 -0
- package/dist/chunk-ABYCGF77.mjs +31 -0
- package/dist/chunk-ABYCGF77.mjs.map +1 -0
- package/dist/chunk-AJ5OMEXM.mjs +13 -0
- package/dist/chunk-AJ5OMEXM.mjs.map +1 -0
- package/dist/chunk-BNBGJBBM.mjs +60 -0
- package/dist/chunk-BNBGJBBM.mjs.map +1 -0
- package/dist/chunk-D47EKHIF.mjs +26 -0
- package/dist/chunk-D47EKHIF.mjs.map +1 -0
- package/dist/chunk-DE5K76I2.mjs +1 -0
- package/dist/chunk-DE5K76I2.mjs.map +1 -0
- package/dist/chunk-DFTV4TST.mjs +36 -0
- package/dist/chunk-DFTV4TST.mjs.map +1 -0
- package/dist/chunk-DRV2FOHZ.mjs +70 -0
- package/dist/chunk-DRV2FOHZ.mjs.map +1 -0
- package/dist/chunk-ECR45NSD.mjs +104 -0
- package/dist/chunk-ECR45NSD.mjs.map +1 -0
- package/dist/chunk-EJGGLWWR.mjs +82 -0
- package/dist/chunk-EJGGLWWR.mjs.map +1 -0
- package/dist/chunk-F6GMWOLE.mjs +93 -0
- package/dist/chunk-F6GMWOLE.mjs.map +1 -0
- package/dist/chunk-GQN2HYFJ.mjs +22 -0
- package/dist/chunk-GQN2HYFJ.mjs.map +1 -0
- package/dist/chunk-H4VKQGVU.mjs +1 -0
- package/dist/chunk-H4VKQGVU.mjs.map +1 -0
- package/dist/chunk-HDBI2WN5.mjs +113 -0
- package/dist/chunk-HDBI2WN5.mjs.map +1 -0
- package/dist/chunk-I72DKFHD.mjs +114 -0
- package/dist/chunk-I72DKFHD.mjs.map +1 -0
- package/dist/chunk-IU3WTXLQ.mjs +1 -0
- package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
- package/dist/chunk-KMVGEY7Q.mjs +51 -0
- package/dist/chunk-KMVGEY7Q.mjs.map +1 -0
- package/dist/chunk-KNQIEOFP.mjs +19 -0
- package/dist/chunk-KNQIEOFP.mjs.map +1 -0
- package/dist/chunk-L7VVZH4Q.mjs +1 -0
- package/dist/chunk-L7VVZH4Q.mjs.map +1 -0
- package/dist/chunk-LQ2OWQU7.mjs +49 -0
- package/dist/chunk-LQ2OWQU7.mjs.map +1 -0
- package/dist/chunk-LYB4B6MK.mjs +19 -0
- package/dist/chunk-LYB4B6MK.mjs.map +1 -0
- package/dist/chunk-MCNXIA4Q.mjs +75 -0
- package/dist/chunk-MCNXIA4Q.mjs.map +1 -0
- package/dist/chunk-MGYT7RNL.mjs +32 -0
- package/dist/chunk-MGYT7RNL.mjs.map +1 -0
- package/dist/chunk-MMVDU6DF.mjs +1 -0
- package/dist/chunk-MMVDU6DF.mjs.map +1 -0
- package/dist/chunk-MRXNTQOX.mjs +59 -0
- package/dist/chunk-MRXNTQOX.mjs.map +1 -0
- package/dist/chunk-PZYM7K4Y.mjs +265 -0
- package/dist/chunk-PZYM7K4Y.mjs.map +1 -0
- package/dist/chunk-QFXR6DOA.mjs +64 -0
- package/dist/chunk-QFXR6DOA.mjs.map +1 -0
- package/dist/chunk-QJNFNPWH.mjs +85 -0
- package/dist/chunk-QJNFNPWH.mjs.map +1 -0
- package/dist/chunk-RUV6NBIF.mjs +1 -0
- package/dist/chunk-RUV6NBIF.mjs.map +1 -0
- package/dist/chunk-RXV67GJN.mjs +168 -0
- package/dist/chunk-RXV67GJN.mjs.map +1 -0
- package/dist/chunk-T6MTDQZ7.mjs +45 -0
- package/dist/chunk-T6MTDQZ7.mjs.map +1 -0
- package/dist/chunk-VSVQZUPW.mjs +124 -0
- package/dist/chunk-VSVQZUPW.mjs.map +1 -0
- package/dist/chunk-WADHCMPK.mjs +1 -0
- package/dist/chunk-WADHCMPK.mjs.map +1 -0
- package/dist/chunk-WGWQRALG.mjs +83 -0
- package/dist/chunk-WGWQRALG.mjs.map +1 -0
- package/dist/chunk-WJHSY5T6.mjs +1 -0
- package/dist/chunk-WJHSY5T6.mjs.map +1 -0
- package/dist/chunk-XW3ICO4S.mjs +25 -0
- package/dist/chunk-XW3ICO4S.mjs.map +1 -0
- package/dist/chunk-YLFAIYRY.mjs +50 -0
- package/dist/chunk-YLFAIYRY.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.css +9 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.css.map +1 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +43 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.js +1795 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.js.map +1 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +40 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/render-element.d.ts +6 -0
- package/dist/components/base-copilot-textarea/render-element.js +75 -0
- package/dist/components/base-copilot-textarea/render-element.js.map +1 -0
- package/dist/components/base-copilot-textarea/render-element.mjs +8 -0
- package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/render-placeholder.d.ts +6 -0
- package/dist/components/base-copilot-textarea/render-placeholder.js +72 -0
- package/dist/components/base-copilot-textarea/render-placeholder.js.map +1 -0
- package/dist/components/base-copilot-textarea/render-placeholder.mjs +8 -0
- package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.d.ts +8 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.js +112 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.js.map +1 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +9 -0
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -0
- package/dist/components/base-copilot-textarea/use-add-branding-css.d.ts +3 -0
- package/dist/components/base-copilot-textarea/use-add-branding-css.js +83 -0
- package/dist/components/base-copilot-textarea/use-add-branding-css.js.map +1 -0
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +8 -0
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -0
- package/dist/components/copilot-textarea/copilot-textarea.css +9 -0
- package/dist/components/copilot-textarea/copilot-textarea.css.map +1 -0
- package/dist/components/copilot-textarea/copilot-textarea.d.ts +171 -0
- package/dist/components/copilot-textarea/copilot-textarea.js +2289 -0
- package/dist/components/copilot-textarea/copilot-textarea.js.map +1 -0
- package/dist/components/copilot-textarea/copilot-textarea.mjs +49 -0
- package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +18 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.js +44 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.js.map +1 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +10 -0
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.d.ts +18 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.js +174 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.js.map +1 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +16 -0
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.d.ts +12 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.js +912 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.js.map +1 -0
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs +23 -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-core.d.ts +16 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.js +606 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.js.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +18 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.d.ts +14 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.js +629 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.js.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +19 -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/included-files-preview.d.ts +16 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.js +133 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.js.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +12 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.d.ts +4 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.js +629 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.js.map +1 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +20 -0
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -0
- package/dist/components/index.css +9 -0
- package/dist/components/index.css.map +1 -0
- package/dist/components/index.d.ts +15 -0
- package/dist/components/index.js +2293 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +53 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/components/manual-ui/chip-with-icon.d.ts +10 -0
- package/dist/components/manual-ui/chip-with-icon.js +38 -0
- package/dist/components/manual-ui/chip-with-icon.js.map +1 -0
- package/dist/components/manual-ui/chip-with-icon.mjs +15 -0
- package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -0
- package/dist/components/source-search-box/source-search-box.d.ts +16 -0
- package/dist/components/source-search-box/source-search-box.js +240 -0
- package/dist/components/source-search-box/source-search-box.js.map +1 -0
- package/dist/components/source-search-box/source-search-box.mjs +13 -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.js +114 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/button.mjs +11 -0
- package/dist/components/ui/button.mjs.map +1 -0
- package/dist/components/ui/command.d.ts +53 -0
- package/dist/components/ui/command.js +285 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/command.mjs +26 -0
- package/dist/components/ui/command.mjs.map +1 -0
- package/dist/components/ui/dialog.d.ts +19 -0
- package/dist/components/ui/dialog.js +183 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dialog.mjs +21 -0
- package/dist/components/ui/dialog.mjs.map +1 -0
- package/dist/components/ui/label.d.ts +8 -0
- package/dist/components/ui/label.js +87 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/label.mjs +9 -0
- package/dist/components/ui/label.mjs.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +19 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/index.mjs +2 -0
- package/dist/context/index.mjs.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.d.ts +15 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.js +180 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.js.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +11 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.d.ts +8 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.js +194 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.js.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +9 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.d.ts +7 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.js +180 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.js.map +1 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +10 -0
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +19 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +2 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.d.ts +22 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.js +153 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.js.map +1 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +9 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -0
- 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.js +228 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.js.map +1 -0
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +9 -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.js +37 -0
- package/dist/hooks/misc/use-autosize-textarea.js.map +1 -0
- package/dist/hooks/misc/use-autosize-textarea.mjs +8 -0
- package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -0
- package/dist/index.css +644 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +2298 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +64 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/debouncer.d.ts +11 -0
- package/dist/lib/debouncer.js +76 -0
- package/dist/lib/debouncer.js.map +1 -0
- package/dist/lib/debouncer.mjs +8 -0
- package/dist/lib/debouncer.mjs.map +1 -0
- package/dist/lib/editor-to-text.d.ts +7 -0
- package/dist/lib/editor-to-text.js +69 -0
- package/dist/lib/editor-to-text.js.map +1 -0
- package/dist/lib/editor-to-text.mjs +8 -0
- package/dist/lib/editor-to-text.mjs.map +1 -0
- package/dist/lib/get-text-around-cursor.d.ts +15 -0
- package/dist/lib/get-text-around-cursor.js +131 -0
- package/dist/lib/get-text-around-cursor.js.map +1 -0
- package/dist/lib/get-text-around-cursor.mjs +14 -0
- package/dist/lib/get-text-around-cursor.mjs.map +1 -0
- package/dist/lib/retry.d.ts +3 -0
- package/dist/lib/retry.js +43 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/retry.mjs +8 -0
- package/dist/lib/retry.mjs.map +1 -0
- package/dist/lib/slatejs-edits/add-autocompletions.d.ts +8 -0
- package/dist/lib/slatejs-edits/add-autocompletions.js +51 -0
- package/dist/lib/slatejs-edits/add-autocompletions.js.map +1 -0
- package/dist/lib/slatejs-edits/add-autocompletions.mjs +8 -0
- package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.d.ts +8 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.js +46 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.js.map +1 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs +8 -0
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -0
- package/dist/lib/slatejs-edits/replace-text.d.ts +5 -0
- package/dist/lib/slatejs-edits/replace-text.js +53 -0
- package/dist/lib/slatejs-edits/replace-text.js.map +1 -0
- package/dist/lib/slatejs-edits/replace-text.mjs +8 -0
- package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -0
- package/dist/lib/slatejs-edits/with-partial-history.d.ts +8 -0
- package/dist/lib/slatejs-edits/with-partial-history.js +133 -0
- package/dist/lib/slatejs-edits/with-partial-history.js.map +1 -0
- package/dist/lib/slatejs-edits/with-partial-history.mjs +10 -0
- package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -0
- package/dist/lib/stream-promise-flatten.d.ts +12 -0
- package/dist/lib/stream-promise-flatten.js +72 -0
- package/dist/lib/stream-promise-flatten.js.map +1 -0
- package/dist/lib/stream-promise-flatten.mjs +8 -0
- package/dist/lib/stream-promise-flatten.mjs.map +1 -0
- package/dist/lib/utils.d.ts +9 -0
- package/dist/lib/utils.js +94 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.mjs +16 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/dist/lib/utils.test.d.ts +2 -0
- package/dist/lib/utils.test.js +9 -0
- package/dist/lib/utils.test.js.map +1 -0
- package/dist/lib/utils.test.mjs +7 -0
- package/dist/lib/utils.test.mjs.map +1 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.d.ts +23 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.js +19 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.js.map +1 -0
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +1 -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.js +287 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.js.map +1 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs +13 -0
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -0
- package/dist/types/autosuggestions-config/editing-api-config.d.ts +15 -0
- package/dist/types/autosuggestions-config/editing-api-config.js +108 -0
- package/dist/types/autosuggestions-config/editing-api-config.js.map +1 -0
- package/dist/types/autosuggestions-config/editing-api-config.mjs +12 -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.js +287 -0
- package/dist/types/autosuggestions-config/index.js.map +1 -0
- package/dist/types/autosuggestions-config/index.mjs +14 -0
- package/dist/types/autosuggestions-config/index.mjs.map +1 -0
- package/dist/types/autosuggestions-config/insertions-api-config.d.ts +15 -0
- package/dist/types/autosuggestions-config/insertions-api-config.js +101 -0
- package/dist/types/autosuggestions-config/insertions-api-config.js.map +1 -0
- package/dist/types/autosuggestions-config/insertions-api-config.mjs +12 -0
- package/dist/types/autosuggestions-config/insertions-api-config.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.js +19 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.js.map +1 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +1 -0
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.d.ts +15 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.js +90 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.js.map +1 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs +12 -0
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -0
- package/dist/types/base/autosuggestion-state.d.ts +8 -0
- package/dist/types/base/autosuggestion-state.js +19 -0
- package/dist/types/base/autosuggestion-state.js.map +1 -0
- package/dist/types/base/autosuggestion-state.mjs +1 -0
- package/dist/types/base/autosuggestion-state.mjs.map +1 -0
- package/dist/types/base/autosuggestions-bare-function.d.ts +19 -0
- package/dist/types/base/autosuggestions-bare-function.js +19 -0
- package/dist/types/base/autosuggestions-bare-function.js.map +1 -0
- package/dist/types/base/autosuggestions-bare-function.mjs +1 -0
- package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -0
- package/dist/types/base/base-autosuggestions-config.d.ts +83 -0
- package/dist/types/base/base-autosuggestions-config.js +54 -0
- package/dist/types/base/base-autosuggestions-config.js.map +1 -0
- package/dist/types/base/base-autosuggestions-config.mjs +8 -0
- package/dist/types/base/base-autosuggestions-config.mjs.map +1 -0
- package/dist/types/base/base-copilot-textarea-props.d.ts +5 -0
- package/dist/types/base/base-copilot-textarea-props.js +19 -0
- package/dist/types/base/base-copilot-textarea-props.js.map +1 -0
- package/dist/types/base/base-copilot-textarea-props.mjs +1 -0
- package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -0
- package/dist/types/base/custom-editor.d.ts +29 -0
- package/dist/types/base/custom-editor.js +19 -0
- package/dist/types/base/custom-editor.js.map +1 -0
- package/dist/types/base/custom-editor.mjs +1 -0
- package/dist/types/base/custom-editor.mjs.map +1 -0
- package/dist/types/base/editor-autocomplete-state.d.ts +10 -0
- package/dist/types/base/editor-autocomplete-state.js +40 -0
- package/dist/types/base/editor-autocomplete-state.js.map +1 -0
- package/dist/types/base/editor-autocomplete-state.mjs +9 -0
- package/dist/types/base/editor-autocomplete-state.mjs.map +1 -0
- package/dist/types/base/index.d.ts +54 -0
- package/dist/types/base/index.js +56 -0
- package/dist/types/base/index.js.map +1 -0
- package/dist/types/base/index.mjs +9 -0
- package/dist/types/base/index.mjs.map +1 -0
- package/dist/types/html-copilot-textarea-element.d.ts +7 -0
- package/dist/types/html-copilot-textarea-element.js +19 -0
- package/dist/types/html-copilot-textarea-element.js.map +1 -0
- package/dist/types/html-copilot-textarea-element.mjs +2 -0
- package/dist/types/html-copilot-textarea-element.mjs.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.js +289 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +19 -0
- package/dist/types/index.mjs.map +1 -0
- package/jest.config.js +5 -0
- package/package.json +95 -0
- package/postcss.config.js +12 -0
- package/src/components/base-copilot-textarea/base-copilot-textarea.css +9 -0
- package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +317 -0
- package/src/components/base-copilot-textarea/render-element.tsx +39 -0
- package/src/components/base-copilot-textarea/render-placeholder.tsx +23 -0
- package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +80 -0
- package/src/components/base-copilot-textarea/use-add-branding-css.tsx +74 -0
- package/src/components/copilot-textarea/copilot-textarea.tsx +210 -0
- package/src/components/hovering-toolbar/hovering-editor-provider.tsx +31 -0
- package/src/components/hovering-toolbar/hovering-toolbar-components.tsx +100 -0
- package/src/components/hovering-toolbar/hovering-toolbar.tsx +151 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.tsx +276 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.tsx +31 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.tsx +55 -0
- package/src/components/hovering-toolbar/text-insertion-prompt-box/index.ts +2 -0
- package/src/components/index.ts +4 -0
- package/src/components/manual-ui/chip-with-icon.tsx +17 -0
- package/src/components/source-search-box/source-search-box.tsx +117 -0
- package/src/components/ui/button.tsx +49 -0
- package/src/components/ui/command.tsx +141 -0
- package/src/components/ui/dialog.tsx +107 -0
- package/src/components/ui/label.tsx +19 -0
- package/src/context/index.ts +1 -0
- package/src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts +142 -0
- package/src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx +100 -0
- package/src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts +93 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.tsx +114 -0
- package/src/hooks/make-autosuggestions-function/use-make-standard-insertion-function.tsx +214 -0
- package/src/hooks/misc/use-autosize-textarea.tsx +18 -0
- package/src/index.tsx +7 -0
- package/src/lib/debouncer.ts +36 -0
- package/src/lib/editor-to-text.ts +61 -0
- package/src/lib/get-text-around-cursor.ts +135 -0
- package/src/lib/retry.tsx +23 -0
- package/src/lib/slatejs-edits/add-autocompletions.ts +30 -0
- package/src/lib/slatejs-edits/clear-autocompletions.ts +19 -0
- package/src/lib/slatejs-edits/replace-text.ts +28 -0
- package/src/lib/slatejs-edits/with-partial-history.ts +149 -0
- package/src/lib/stream-promise-flatten.ts +33 -0
- package/src/lib/utils.test.ts +7 -0
- package/src/lib/utils.ts +49 -0
- package/src/styles.css +3 -0
- package/src/types/autosuggestions-config/autosuggestions-config-user-specified.tsx +19 -0
- package/src/types/autosuggestions-config/autosuggestions-config.tsx +30 -0
- package/src/types/autosuggestions-config/editing-api-config.tsx +96 -0
- package/src/types/autosuggestions-config/index.ts +8 -0
- package/src/types/autosuggestions-config/insertions-api-config.tsx +87 -0
- package/src/types/autosuggestions-config/subtypes/make-system-prompt.ts +1 -0
- package/src/types/autosuggestions-config/suggestions-api-config.tsx +76 -0
- package/src/types/base/autosuggestion-state.ts +6 -0
- package/src/types/base/autosuggestions-bare-function.ts +30 -0
- package/src/types/base/base-autosuggestions-config.tsx +123 -0
- package/src/types/base/base-copilot-textarea-props.tsx +58 -0
- package/src/types/base/custom-editor.tsx +29 -0
- package/src/types/base/editor-autocomplete-state.ts +20 -0
- package/src/types/base/index.ts +6 -0
- package/src/types/html-copilot-textarea-element.ts +5 -0
- package/src/types/index.ts +3 -0
- package/tailwind.config.js +9 -0
- package/tsconfig.json +12 -0
- package/tsup.config.ts +16 -0
- package/typedoc.json +4 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <br/>
|
|
3
|
+
* <img src="/images/CopilotTextarea.gif" width="500" />
|
|
4
|
+
*
|
|
5
|
+
* `<CopilotTextarea>` is a React component that acts as a drop-in replacement for the standard `<textarea>`,
|
|
6
|
+
* offering enhanced autocomplete features powered by AI. It is context-aware, integrating seamlessly with the
|
|
7
|
+
* [`useCopilotReadable`](/reference/hooks/useCopilotReadable) hook to provide intelligent suggestions based on the application context.
|
|
8
|
+
*
|
|
9
|
+
* In addition, it provides a hovering editor window (available by default via `Cmd + K` on Mac and `Ctrl + K` on Windows) that allows the user to
|
|
10
|
+
* suggest changes to the text, for example providing a summary or rephrasing the text.
|
|
11
|
+
*
|
|
12
|
+
* ## Example
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { CopilotTextarea } from '@copilotkit/react-textarea';
|
|
16
|
+
* import "@copilotkit/react-textarea/styles.css";
|
|
17
|
+
*
|
|
18
|
+
* <CopilotTextarea
|
|
19
|
+
* autosuggestionsConfig={{
|
|
20
|
+
* textareaPurpose:
|
|
21
|
+
* "the body of an email message",
|
|
22
|
+
* chatApiConfigs: {},
|
|
23
|
+
* }}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ## Usage
|
|
28
|
+
*
|
|
29
|
+
* ### Install Dependencies
|
|
30
|
+
*
|
|
31
|
+
* This component is part of the [@copilotkit/react-textarea](https://npmjs.com/package/@copilotkit/react-textarea) package.
|
|
32
|
+
*
|
|
33
|
+
* ```shell npm2yarn \"@copilotkit/react-textarea"\
|
|
34
|
+
* npm install @copilotkit/react-core @copilotkit/react-textarea
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* ### Usage
|
|
38
|
+
*
|
|
39
|
+
* Use the CopilotTextarea component in your React application similarly to a standard `<textarea />`,
|
|
40
|
+
* with additional configurations for AI-powered features.
|
|
41
|
+
*
|
|
42
|
+
* For example:
|
|
43
|
+
*
|
|
44
|
+
* ```tsx
|
|
45
|
+
* import { useState } from "react";
|
|
46
|
+
* import { CopilotTextarea } from "@copilotkit/react-textarea";
|
|
47
|
+
* import "@copilotkit/react-textarea/styles.css";
|
|
48
|
+
*
|
|
49
|
+
* export function ExampleComponent() {
|
|
50
|
+
* const [text, setText] = useState("");
|
|
51
|
+
*
|
|
52
|
+
* return (
|
|
53
|
+
* <CopilotTextarea
|
|
54
|
+
* className="custom-textarea-class"
|
|
55
|
+
* value={text}
|
|
56
|
+
* onValueChange={(value: string) => setText(value)}
|
|
57
|
+
* placeholder="Enter your text here..."
|
|
58
|
+
* autosuggestionsConfig={{
|
|
59
|
+
* textareaPurpose: "Provide context or purpose of the textarea.",
|
|
60
|
+
* chatApiConfigs: {
|
|
61
|
+
* suggestionsApiConfig: {
|
|
62
|
+
* maxTokens: 20,
|
|
63
|
+
* stop: [".", "?", "!"],
|
|
64
|
+
* },
|
|
65
|
+
* },
|
|
66
|
+
* }}
|
|
67
|
+
* />
|
|
68
|
+
* );
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* ### Look & Feel
|
|
73
|
+
*
|
|
74
|
+
* By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:
|
|
75
|
+
* ```tsx title="YourRootComponent.tsx"
|
|
76
|
+
* ...
|
|
77
|
+
* import "@copilotkit/react-textarea/styles.css"; // [!code highlight]
|
|
78
|
+
*
|
|
79
|
+
* export function YourRootComponent() {
|
|
80
|
+
* return (
|
|
81
|
+
* <CopilotKit>
|
|
82
|
+
* ...
|
|
83
|
+
* </CopilotKit>
|
|
84
|
+
* );
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
* For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.
|
|
88
|
+
* */
|
|
89
|
+
import React from "react";
|
|
90
|
+
import { useMakeStandardAutosuggestionFunction } from "../../hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function";
|
|
91
|
+
import { HTMLCopilotTextAreaElement } from "../../types";
|
|
92
|
+
import { BaseCopilotTextareaProps } from "../../types/base/base-copilot-textarea-props";
|
|
93
|
+
import {
|
|
94
|
+
AutosuggestionsConfig,
|
|
95
|
+
defaultAutosuggestionsConfig,
|
|
96
|
+
} from "../../types/autosuggestions-config";
|
|
97
|
+
import { BaseCopilotTextarea } from "../base-copilot-textarea/base-copilot-textarea";
|
|
98
|
+
import { useMakeStandardInsertionOrEditingFunction } from "../../hooks/make-autosuggestions-function/use-make-standard-insertion-function";
|
|
99
|
+
import merge from "lodash.merge";
|
|
100
|
+
import { AutosuggestionsConfigUserSpecified } from "../../types/autosuggestions-config/autosuggestions-config-user-specified";
|
|
101
|
+
|
|
102
|
+
// Like the base copilot textarea props,
|
|
103
|
+
// but with baseAutosuggestionsConfig replaced with autosuggestionsConfig.
|
|
104
|
+
export interface CopilotTextareaProps
|
|
105
|
+
extends Omit<BaseCopilotTextareaProps, "baseAutosuggestionsConfig"> {
|
|
106
|
+
/**
|
|
107
|
+
* Configuration settings for the autosuggestions feature.
|
|
108
|
+
* For full reference, [check the interface on GitHub](https://github.com/CopilotKit/CopilotKit/blob/main/CopilotKit/packages/react-textarea/src/types/base/base-copilot-textarea-props.tsx#L8).
|
|
109
|
+
*
|
|
110
|
+
* <PropertyReference name="textareaPurpose" type="string" required={true} >
|
|
111
|
+
* The purpose of the text area in plain text.
|
|
112
|
+
*
|
|
113
|
+
* Example: *"The body of the email response"*
|
|
114
|
+
* </PropertyReference>
|
|
115
|
+
*
|
|
116
|
+
* <PropertyReference name="chatApiConfigs" type="ChatApiConfigs" >
|
|
117
|
+
* The chat API configurations.
|
|
118
|
+
*
|
|
119
|
+
* <strong>NOTE:</strong> You must provide specify at least one of `suggestionsApiConfig` or `insertionApiConfig`.
|
|
120
|
+
*
|
|
121
|
+
* <PropertyReference name="suggestionsApiConfig" type="SuggestionsApiConfig">
|
|
122
|
+
* For full reference, please [click here](https://github.com/CopilotKit/CopilotKit/blob/main/CopilotKit/packages/react-textarea/src/types/autosuggestions-config/suggestions-api-config.tsx#L4).
|
|
123
|
+
* </PropertyReference>
|
|
124
|
+
* <PropertyReference name="insertionApiConfig" type="InsertionApiConfig">
|
|
125
|
+
* For full reference, please [click here](https://github.com/CopilotKit/CopilotKit/blob/main/CopilotKit/packages/react-textarea/src/types/autosuggestions-config/insertions-api-config.tsx#L4).
|
|
126
|
+
* </PropertyReference>
|
|
127
|
+
* </PropertyReference>
|
|
128
|
+
*
|
|
129
|
+
* <PropertyReference name="disabled" type="boolean" >
|
|
130
|
+
* Whether the textarea is disabled.
|
|
131
|
+
* </PropertyReference>
|
|
132
|
+
*
|
|
133
|
+
* <PropertyReference name="disableBranding" type="boolean" >
|
|
134
|
+
* Whether to disable the CopilotKit branding.
|
|
135
|
+
* </PropertyReference>
|
|
136
|
+
*
|
|
137
|
+
* <PropertyReference name="placeholderStyle" type="React.CSSProperties" >
|
|
138
|
+
* Specifies the CSS styles to apply to the placeholder text.
|
|
139
|
+
* </PropertyReference>
|
|
140
|
+
*
|
|
141
|
+
* <PropertyReference name="suggestionsStyle" type="React.CSSProperties" >
|
|
142
|
+
* Specifies the CSS styles to apply to the suggestions list.
|
|
143
|
+
* </PropertyReference>
|
|
144
|
+
*
|
|
145
|
+
* <PropertyReference name="hoverMenuClassname" type="string" >
|
|
146
|
+
* A class name to apply to the editor popover window.
|
|
147
|
+
* </PropertyReference>
|
|
148
|
+
*
|
|
149
|
+
* <PropertyReference name="value" type="string" >
|
|
150
|
+
* The initial value of the textarea. Can be controlled via `onValueChange`.
|
|
151
|
+
* </PropertyReference>
|
|
152
|
+
*
|
|
153
|
+
* <PropertyReference name="onValueChange" type="(value: string) => void" >
|
|
154
|
+
* Callback invoked when the value of the textarea changes.
|
|
155
|
+
* </PropertyReference>
|
|
156
|
+
*
|
|
157
|
+
* <PropertyReference name="onChange" type="(event: React.ChangeEvent<HTMLTextAreaElement>) => void" >
|
|
158
|
+
* Callback invoked when a `change` event is triggered on the textarea element.
|
|
159
|
+
* </PropertyReference>
|
|
160
|
+
*
|
|
161
|
+
* <PropertyReference name="shortcut" type="string" >
|
|
162
|
+
* The shortcut to use to open the editor popover window. Default is `"Cmd-k"`.
|
|
163
|
+
* </PropertyReference>
|
|
164
|
+
*/
|
|
165
|
+
autosuggestionsConfig: AutosuggestionsConfigUserSpecified;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* A copilot textarea that uses the standard autosuggestions function.
|
|
170
|
+
*/
|
|
171
|
+
export const CopilotTextarea = React.forwardRef(
|
|
172
|
+
(props: CopilotTextareaProps, ref: React.Ref<HTMLCopilotTextAreaElement>) => {
|
|
173
|
+
// separate the AutosuggestionsConfigUserSpecified from the rest of the props
|
|
174
|
+
const { autosuggestionsConfig: autosuggestionsConfigUserSpecified, ...forwardedProps } = props;
|
|
175
|
+
|
|
176
|
+
const autosuggestionsConfig: AutosuggestionsConfig = merge(
|
|
177
|
+
defaultAutosuggestionsConfig,
|
|
178
|
+
autosuggestionsConfigUserSpecified,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const autosuggestionsFunction = useMakeStandardAutosuggestionFunction(
|
|
182
|
+
autosuggestionsConfig.textareaPurpose,
|
|
183
|
+
autosuggestionsConfig.contextCategories,
|
|
184
|
+
autosuggestionsConfig.chatApiConfigs.suggestionsApiConfig,
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const insertionOrEditingFunction = useMakeStandardInsertionOrEditingFunction(
|
|
188
|
+
autosuggestionsConfig.textareaPurpose,
|
|
189
|
+
autosuggestionsConfig.contextCategories,
|
|
190
|
+
autosuggestionsConfig.chatApiConfigs.insertionApiConfig,
|
|
191
|
+
autosuggestionsConfig.chatApiConfigs.editingApiConfig,
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
return (
|
|
195
|
+
<>
|
|
196
|
+
<BaseCopilotTextarea
|
|
197
|
+
ref={ref}
|
|
198
|
+
{...forwardedProps}
|
|
199
|
+
baseAutosuggestionsConfig={{
|
|
200
|
+
...autosuggestionsConfig,
|
|
201
|
+
apiConfig: {
|
|
202
|
+
insertionOrEditingFunction: insertionOrEditingFunction,
|
|
203
|
+
autosuggestionsFunction: autosuggestionsFunction,
|
|
204
|
+
},
|
|
205
|
+
}}
|
|
206
|
+
/>
|
|
207
|
+
</>
|
|
208
|
+
);
|
|
209
|
+
},
|
|
210
|
+
);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createContext, useState, useContext, ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
interface HoveringEditorContextProps {
|
|
4
|
+
isDisplayed: boolean;
|
|
5
|
+
setIsDisplayed: (value: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const HoveringEditorContext = createContext<HoveringEditorContextProps>({
|
|
9
|
+
isDisplayed: false,
|
|
10
|
+
setIsDisplayed: () => {},
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export interface HoveringEditorProviderProps {
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A context provider for the hovering editor over the `CopilotTextarea`
|
|
19
|
+
* (used to edit and insert text into the `CopilotTextarea`).
|
|
20
|
+
*/
|
|
21
|
+
export const HoveringEditorProvider = ({ children }: HoveringEditorProviderProps) => {
|
|
22
|
+
const [isDisplayed, setIsDisplayed] = useState<boolean>(false);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<HoveringEditorContext.Provider value={{ isDisplayed, setIsDisplayed }}>
|
|
26
|
+
{children}
|
|
27
|
+
</HoveringEditorContext.Provider>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const useHoveringEditorContext = () => useContext(HoveringEditorContext);
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { css, cx } from "@emotion/css";
|
|
2
|
+
import React, { PropsWithChildren, Ref } from "react";
|
|
3
|
+
import ReactDOM from "react-dom";
|
|
4
|
+
|
|
5
|
+
interface BaseProps {
|
|
6
|
+
className: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const Button = React.forwardRef(
|
|
11
|
+
(
|
|
12
|
+
{
|
|
13
|
+
className,
|
|
14
|
+
active,
|
|
15
|
+
reversed,
|
|
16
|
+
...props
|
|
17
|
+
}: PropsWithChildren<
|
|
18
|
+
{
|
|
19
|
+
active: boolean;
|
|
20
|
+
reversed: boolean;
|
|
21
|
+
} & BaseProps
|
|
22
|
+
>,
|
|
23
|
+
ref: Ref<HTMLSpanElement | null>,
|
|
24
|
+
) => (
|
|
25
|
+
<span
|
|
26
|
+
{...props}
|
|
27
|
+
ref={ref as Ref<HTMLSpanElement>}
|
|
28
|
+
className={cx(
|
|
29
|
+
className,
|
|
30
|
+
css`
|
|
31
|
+
cursor: pointer;
|
|
32
|
+
color: ${reversed ? (active ? "white" : "#aaa") : active ? "black" : "#ccc"};
|
|
33
|
+
`,
|
|
34
|
+
)}
|
|
35
|
+
/>
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
export const Icon = React.forwardRef(
|
|
40
|
+
({ className, ...props }: PropsWithChildren<BaseProps>, ref: Ref<HTMLSpanElement | null>) => (
|
|
41
|
+
<span
|
|
42
|
+
{...props}
|
|
43
|
+
ref={ref as Ref<HTMLSpanElement>}
|
|
44
|
+
className={cx(
|
|
45
|
+
"material-icons",
|
|
46
|
+
className,
|
|
47
|
+
css`
|
|
48
|
+
font-size: 18px;
|
|
49
|
+
vertical-align: text-bottom;
|
|
50
|
+
`,
|
|
51
|
+
)}
|
|
52
|
+
/>
|
|
53
|
+
),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
export const Menu = React.forwardRef(
|
|
57
|
+
({ className, ...props }: PropsWithChildren<BaseProps>, ref: Ref<HTMLDivElement | null>) => {
|
|
58
|
+
return (
|
|
59
|
+
<div
|
|
60
|
+
{...props}
|
|
61
|
+
data-testid="menu"
|
|
62
|
+
ref={ref as Ref<HTMLDivElement>}
|
|
63
|
+
className={cx(
|
|
64
|
+
className,
|
|
65
|
+
css`
|
|
66
|
+
& > * {
|
|
67
|
+
display: inline-block;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
& > * + * {
|
|
71
|
+
margin-left: 15px;
|
|
72
|
+
}
|
|
73
|
+
`,
|
|
74
|
+
)}
|
|
75
|
+
/>
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
export const Portal = ({ children }: { children: React.ReactNode }) => {
|
|
80
|
+
return typeof document === "object" ? ReactDOM.createPortal(children, document.body) : null;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const Toolbar = React.forwardRef(
|
|
84
|
+
({ className, ...props }: PropsWithChildren<BaseProps>, ref?: Ref<HTMLDivElement>) => (
|
|
85
|
+
<Menu
|
|
86
|
+
{...props}
|
|
87
|
+
ref={ref}
|
|
88
|
+
className={cx(
|
|
89
|
+
className,
|
|
90
|
+
css`
|
|
91
|
+
position: relative;
|
|
92
|
+
padding: 1px 18px 17px;
|
|
93
|
+
margin: 0 -20px;
|
|
94
|
+
border-bottom: 2px solid #eee;
|
|
95
|
+
margin-bottom: 20px;
|
|
96
|
+
`,
|
|
97
|
+
)}
|
|
98
|
+
/>
|
|
99
|
+
),
|
|
100
|
+
);
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { Editor, Location, Transforms } from "slate";
|
|
3
|
+
import { useSlate, useSlateSelection } from "slate-react";
|
|
4
|
+
import { HoveringInsertionPromptBox } from "./text-insertion-prompt-box";
|
|
5
|
+
import { Menu, Portal } from "./hovering-toolbar-components";
|
|
6
|
+
import { useHoveringEditorContext } from "./hovering-editor-provider";
|
|
7
|
+
import {
|
|
8
|
+
getFullEditorTextWithNewlines,
|
|
9
|
+
getTextAroundSelection,
|
|
10
|
+
} from "../../lib/get-text-around-cursor";
|
|
11
|
+
import {
|
|
12
|
+
EditingEditorState,
|
|
13
|
+
InsertionEditorApiConfig,
|
|
14
|
+
} from "../../types/base/autosuggestions-bare-function";
|
|
15
|
+
|
|
16
|
+
export interface HoveringToolbarProps {
|
|
17
|
+
apiConfig: InsertionEditorApiConfig;
|
|
18
|
+
contextCategories: string[];
|
|
19
|
+
hoverMenuClassname: string | undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const HoveringToolbar = (props: HoveringToolbarProps) => {
|
|
23
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
24
|
+
const editor = useSlate();
|
|
25
|
+
const selection = useSlateSelection();
|
|
26
|
+
const { isDisplayed, setIsDisplayed } = useHoveringEditorContext();
|
|
27
|
+
|
|
28
|
+
// only render on client
|
|
29
|
+
const [isClient, setIsClient] = useState(false);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
setIsClient(true);
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
const el = ref.current;
|
|
36
|
+
const { selection } = editor;
|
|
37
|
+
|
|
38
|
+
if (!el) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!selection) {
|
|
43
|
+
el.removeAttribute("style");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const domSelection = window.getSelection();
|
|
48
|
+
if (!domSelection || domSelection.rangeCount === 0) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const domRange = domSelection.getRangeAt(0);
|
|
53
|
+
const rect = domRange.getBoundingClientRect();
|
|
54
|
+
|
|
55
|
+
// We use window = (0,0,0,0) as a signal that the selection is not in the original copilot-textarea,
|
|
56
|
+
// but inside the hovering window.
|
|
57
|
+
//
|
|
58
|
+
// in such case, we simply do nothing.
|
|
59
|
+
if (rect.top === 0 && rect.left === 0 && rect.width === 0 && rect.height === 0) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const minGapFromEdge = 60;
|
|
63
|
+
const verticalOffsetFromCorner = 35;
|
|
64
|
+
const horizontalOffsetFromCorner = 15;
|
|
65
|
+
let top = rect.top + window.scrollY - el.offsetHeight + verticalOffsetFromCorner;
|
|
66
|
+
// make sure top is in the viewport and not too close to the edge
|
|
67
|
+
if (top < minGapFromEdge) {
|
|
68
|
+
top = rect.bottom + window.scrollY + minGapFromEdge;
|
|
69
|
+
} else if (top + el.offsetHeight > window.innerHeight - minGapFromEdge) {
|
|
70
|
+
top = rect.top + window.scrollY - el.offsetHeight - minGapFromEdge;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let left =
|
|
74
|
+
rect.left + window.scrollX - el.offsetWidth / 2 + rect.width / 2 + horizontalOffsetFromCorner;
|
|
75
|
+
// make sure left is in the viewport and not too close to the edge
|
|
76
|
+
if (left < minGapFromEdge) {
|
|
77
|
+
left = minGapFromEdge;
|
|
78
|
+
} else if (left + el.offsetWidth > window.innerWidth - minGapFromEdge) {
|
|
79
|
+
left = window.innerWidth - el.offsetWidth - minGapFromEdge;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
el.style.opacity = "1";
|
|
83
|
+
el.style.position = "absolute";
|
|
84
|
+
|
|
85
|
+
el.style.top = `${top}px`;
|
|
86
|
+
el.style.left = `${left}px`;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
91
|
+
if (ref.current && !ref.current.contains(event.target as Node)) {
|
|
92
|
+
setIsDisplayed(false);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
97
|
+
return () => {
|
|
98
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
99
|
+
};
|
|
100
|
+
}, [ref, setIsDisplayed]);
|
|
101
|
+
|
|
102
|
+
if (!isClient) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<Portal>
|
|
108
|
+
<Menu
|
|
109
|
+
ref={ref}
|
|
110
|
+
className={
|
|
111
|
+
"copilot-kit-textarea-css-scope " +
|
|
112
|
+
(props.hoverMenuClassname ||
|
|
113
|
+
"p-2 absolute z-10 top-[-10000px] left-[-10000px] mt-[-6px] opacity-0 transition-opacity duration-700")
|
|
114
|
+
}
|
|
115
|
+
data-testid="hovering-toolbar"
|
|
116
|
+
>
|
|
117
|
+
{isDisplayed && selection && (
|
|
118
|
+
<HoveringInsertionPromptBox
|
|
119
|
+
editorState={editorState(editor, selection)}
|
|
120
|
+
apiConfig={props.apiConfig}
|
|
121
|
+
closeWindow={() => {
|
|
122
|
+
setIsDisplayed(false);
|
|
123
|
+
}}
|
|
124
|
+
performInsertion={(insertedText) => {
|
|
125
|
+
// replace the selection with the inserted text
|
|
126
|
+
Transforms.delete(editor, { at: selection });
|
|
127
|
+
Transforms.insertText(editor, insertedText, {
|
|
128
|
+
at: selection,
|
|
129
|
+
});
|
|
130
|
+
setIsDisplayed(false);
|
|
131
|
+
}}
|
|
132
|
+
contextCategories={props.contextCategories}
|
|
133
|
+
/>
|
|
134
|
+
)}
|
|
135
|
+
</Menu>
|
|
136
|
+
</Portal>
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
function editorState(editor: Editor, selection: Location): EditingEditorState {
|
|
141
|
+
const textAroundCursor = getTextAroundSelection(editor);
|
|
142
|
+
if (textAroundCursor) {
|
|
143
|
+
return textAroundCursor;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
textBeforeCursor: getFullEditorTextWithNewlines(editor),
|
|
148
|
+
textAfterCursor: "",
|
|
149
|
+
selectedText: "",
|
|
150
|
+
};
|
|
151
|
+
}
|