@rowsncolumns/ui 15.0.38
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/LICENSE.md +100 -0
- package/dist/cjs/arrow/index.d.ts +17 -0
- package/dist/cjs/arrow/index.d.ts.map +1 -0
- package/dist/cjs/arrow/index.js +46 -0
- package/dist/cjs/button/index.d.ts +14 -0
- package/dist/cjs/button/index.d.ts.map +1 -0
- package/dist/cjs/button/index.js +46 -0
- package/dist/cjs/calendar/index.d.ts +5 -0
- package/dist/cjs/calendar/index.d.ts.map +1 -0
- package/dist/cjs/calendar/index.js +13 -0
- package/dist/cjs/card/index.d.ts +10 -0
- package/dist/cjs/card/index.d.ts.map +1 -0
- package/dist/cjs/card/index.js +32 -0
- package/dist/cjs/cell-tooltip/index.d.ts +17 -0
- package/dist/cjs/cell-tooltip/index.d.ts.map +1 -0
- package/dist/cjs/cell-tooltip/index.js +38 -0
- package/dist/cjs/circular-loader/index.d.ts +9 -0
- package/dist/cjs/circular-loader/index.d.ts.map +1 -0
- package/dist/cjs/circular-loader/index.js +11 -0
- package/dist/cjs/color-picker/index.d.ts +12 -0
- package/dist/cjs/color-picker/index.d.ts.map +1 -0
- package/dist/cjs/color-picker/index.js +101 -0
- package/dist/cjs/color-picker/style.d.ts +5 -0
- package/dist/cjs/color-picker/style.d.ts.map +1 -0
- package/dist/cjs/color-picker/style.js +11 -0
- package/dist/cjs/command/index.d.ts +74 -0
- package/dist/cjs/command/index.d.ts.map +1 -0
- package/dist/cjs/command/index.js +37 -0
- package/dist/cjs/conditional-wrapper/index.d.ts +9 -0
- package/dist/cjs/conditional-wrapper/index.d.ts.map +1 -0
- package/dist/cjs/conditional-wrapper/index.js +4 -0
- package/dist/cjs/dialog/index.d.ts +17 -0
- package/dist/cjs/dialog/index.d.ts.map +1 -0
- package/dist/cjs/dialog/index.js +50 -0
- package/dist/cjs/dropdown/index.d.ts +34 -0
- package/dist/cjs/dropdown/index.d.ts.map +1 -0
- package/dist/cjs/dropdown/index.js +73 -0
- package/dist/cjs/editor/constants.d.ts +7 -0
- package/dist/cjs/editor/constants.d.ts.map +1 -0
- package/dist/cjs/editor/constants.js +50 -0
- package/dist/cjs/editor/editor-error-boundary.d.ts +3 -0
- package/dist/cjs/editor/editor-error-boundary.d.ts.map +1 -0
- package/dist/cjs/editor/editor-error-boundary.js +9 -0
- package/dist/cjs/editor/style.d.ts +12 -0
- package/dist/cjs/editor/style.d.ts.map +1 -0
- package/dist/cjs/editor/style.js +24 -0
- package/dist/cjs/editor/suggestions-dropdown.d.ts +25 -0
- package/dist/cjs/editor/suggestions-dropdown.d.ts.map +1 -0
- package/dist/cjs/editor/suggestions-dropdown.js +120 -0
- package/dist/cjs/editor-pm/constants.d.ts +2 -0
- package/dist/cjs/editor-pm/constants.d.ts.map +1 -0
- package/dist/cjs/editor-pm/constants.js +2 -0
- package/dist/cjs/editor-pm/decoration-plugin.d.ts +15 -0
- package/dist/cjs/editor-pm/decoration-plugin.d.ts.map +1 -0
- package/dist/cjs/editor-pm/decoration-plugin.js +38 -0
- package/dist/cjs/editor-pm/helpers.d.ts +197 -0
- package/dist/cjs/editor-pm/helpers.d.ts.map +1 -0
- package/dist/cjs/editor-pm/helpers.js +1170 -0
- package/dist/cjs/editor-pm/index.d.ts +10 -0
- package/dist/cjs/editor-pm/index.d.ts.map +1 -0
- package/dist/cjs/editor-pm/index.js +9 -0
- package/dist/cjs/editor-pm/mention-nodeview.d.ts +31 -0
- package/dist/cjs/editor-pm/mention-nodeview.d.ts.map +1 -0
- package/dist/cjs/editor-pm/mention-nodeview.js +105 -0
- package/dist/cjs/editor-pm/mentions-dropdown.d.ts +13 -0
- package/dist/cjs/editor-pm/mentions-dropdown.d.ts.map +1 -0
- package/dist/cjs/editor-pm/mentions-dropdown.js +19 -0
- package/dist/cjs/editor-pm/mentions-plugin.d.ts +18 -0
- package/dist/cjs/editor-pm/mentions-plugin.d.ts.map +1 -0
- package/dist/cjs/editor-pm/mentions-plugin.js +72 -0
- package/dist/cjs/editor-pm/placeholder-plugin.d.ts +4 -0
- package/dist/cjs/editor-pm/placeholder-plugin.d.ts.map +1 -0
- package/dist/cjs/editor-pm/placeholder-plugin.js +20 -0
- package/dist/cjs/editor-pm/prosemirror-editor.d.ts +493 -0
- package/dist/cjs/editor-pm/prosemirror-editor.d.ts.map +1 -0
- package/dist/cjs/editor-pm/prosemirror-editor.js +1145 -0
- package/dist/cjs/editor-pm/schema.d.ts +3 -0
- package/dist/cjs/editor-pm/schema.d.ts.map +1 -0
- package/dist/cjs/editor-pm/schema.js +183 -0
- package/dist/cjs/editor-pm/types.d.ts +8 -0
- package/dist/cjs/editor-pm/types.d.ts.map +1 -0
- package/dist/cjs/editor-pm/types.js +1 -0
- package/dist/cjs/editor-pm/unfocused-selection-plugin.d.ts +25 -0
- package/dist/cjs/editor-pm/unfocused-selection-plugin.d.ts.map +1 -0
- package/dist/cjs/editor-pm/unfocused-selection-plugin.js +61 -0
- package/dist/cjs/editor-pm/use-dropdown-change-pm.d.ts +24 -0
- package/dist/cjs/editor-pm/use-dropdown-change-pm.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-dropdown-change-pm.js +140 -0
- package/dist/cjs/editor-pm/use-editor-change-pm.d.ts +29 -0
- package/dist/cjs/editor-pm/use-editor-change-pm.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-editor-change-pm.js +154 -0
- package/dist/cjs/editor-pm/use-editor-decorator-pm.d.ts +17 -0
- package/dist/cjs/editor-pm/use-editor-decorator-pm.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-editor-decorator-pm.js +59 -0
- package/dist/cjs/editor-pm/use-editor-keydown-pm.d.ts +21 -0
- package/dist/cjs/editor-pm/use-editor-keydown-pm.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-editor-keydown-pm.js +81 -0
- package/dist/cjs/editor-pm/use-mention-keydown.d.ts +11 -0
- package/dist/cjs/editor-pm/use-mention-keydown.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-mention-keydown.js +59 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.d.ts +19 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.js +79 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.test.d.ts +2 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.test.d.ts.map +1 -0
- package/dist/cjs/editor-pm/use-parameter-suggestions.test.js +122 -0
- package/dist/cjs/eye-dropper/index.d.ts +10 -0
- package/dist/cjs/eye-dropper/index.d.ts.map +1 -0
- package/dist/cjs/eye-dropper/index.js +24 -0
- package/dist/cjs/function-info/helpers.d.ts +10 -0
- package/dist/cjs/function-info/helpers.d.ts.map +1 -0
- package/dist/cjs/function-info/helpers.js +20 -0
- package/dist/cjs/function-info/index.d.ts +11 -0
- package/dist/cjs/function-info/index.d.ts.map +1 -0
- package/dist/cjs/function-info/index.js +71 -0
- package/dist/cjs/function-info/style.d.ts +7 -0
- package/dist/cjs/function-info/style.d.ts.map +1 -0
- package/dist/cjs/function-info/style.js +13 -0
- package/dist/cjs/hex-color-picker/index.d.ts +8 -0
- package/dist/cjs/hex-color-picker/index.d.ts.map +1 -0
- package/dist/cjs/hex-color-picker/index.js +47 -0
- package/dist/cjs/hooks/use-cycle-reference.d.ts +16 -0
- package/dist/cjs/hooks/use-cycle-reference.d.ts.map +1 -0
- package/dist/cjs/hooks/use-cycle-reference.js +72 -0
- package/dist/cjs/hooks/use-dropdown-categories.d.ts +9 -0
- package/dist/cjs/hooks/use-dropdown-categories.d.ts.map +1 -0
- package/dist/cjs/hooks/use-dropdown-categories.js +45 -0
- package/dist/cjs/hooks/use-dropdown.d.ts +38 -0
- package/dist/cjs/hooks/use-dropdown.d.ts.map +1 -0
- package/dist/cjs/hooks/use-dropdown.js +236 -0
- package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.d.ts +6 -0
- package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.d.ts.map +1 -0
- package/dist/cjs/hooks/use-isomorphic-layout-effect.ts.js +8 -0
- package/dist/cjs/hooks/use-modal.d.ts +28 -0
- package/dist/cjs/hooks/use-modal.d.ts.map +1 -0
- package/dist/cjs/hooks/use-modal.js +101 -0
- package/dist/cjs/hooks/use-visibility.d.ts +2 -0
- package/dist/cjs/hooks/use-visibility.d.ts.map +1 -0
- package/dist/cjs/hooks/use-visibility.js +12 -0
- package/dist/cjs/icon-button/index.d.ts +15 -0
- package/dist/cjs/icon-button/index.d.ts.map +1 -0
- package/dist/cjs/icon-button/index.js +34 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +33 -0
- package/dist/cjs/input/index.d.ts +9 -0
- package/dist/cjs/input/index.d.ts.map +1 -0
- package/dist/cjs/input/index.js +9 -0
- package/dist/cjs/popover/index.d.ts +13 -0
- package/dist/cjs/popover/index.d.ts.map +1 -0
- package/dist/cjs/popover/index.js +29 -0
- package/dist/cjs/progress/index.d.ts +10 -0
- package/dist/cjs/progress/index.d.ts.map +1 -0
- package/dist/cjs/progress/index.js +15 -0
- package/dist/cjs/select/index.d.ts +14 -0
- package/dist/cjs/select/index.d.ts.map +1 -0
- package/dist/cjs/select/index.js +46 -0
- package/dist/cjs/separator/index.d.ts +5 -0
- package/dist/cjs/separator/index.d.ts.map +1 -0
- package/dist/cjs/separator/index.js +10 -0
- package/dist/cjs/skeleton/index.d.ts +7 -0
- package/dist/cjs/skeleton/index.d.ts.map +1 -0
- package/dist/cjs/skeleton/index.js +11 -0
- package/dist/cjs/stack/index.d.ts +11 -0
- package/dist/cjs/stack/index.d.ts.map +1 -0
- package/dist/cjs/stack/index.js +22 -0
- package/dist/cjs/tabs/index.d.ts +8 -0
- package/dist/cjs/tabs/index.d.ts.map +1 -0
- package/dist/cjs/tabs/index.js +21 -0
- package/dist/cjs/tooltip/index.d.ts +12 -0
- package/dist/cjs/tooltip/index.d.ts.map +1 -0
- package/dist/cjs/tooltip/index.js +20 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/utils.d.ts +3 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +9 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +21 -0
- package/dist/esm/arrow/index.d.ts +17 -0
- package/dist/esm/arrow/index.d.ts.map +1 -0
- package/dist/esm/arrow/index.js +45 -0
- package/dist/esm/button/index.d.ts +14 -0
- package/dist/esm/button/index.d.ts.map +1 -0
- package/dist/esm/button/index.js +44 -0
- package/dist/esm/calendar/index.d.ts +5 -0
- package/dist/esm/calendar/index.d.ts.map +1 -0
- package/dist/esm/calendar/index.js +34 -0
- package/dist/esm/card/index.d.ts +10 -0
- package/dist/esm/card/index.d.ts.map +1 -0
- package/dist/esm/card/index.js +24 -0
- package/dist/esm/cell-tooltip/index.d.ts +17 -0
- package/dist/esm/cell-tooltip/index.d.ts.map +1 -0
- package/dist/esm/cell-tooltip/index.js +31 -0
- package/dist/esm/circular-loader/index.d.ts +9 -0
- package/dist/esm/circular-loader/index.d.ts.map +1 -0
- package/dist/esm/circular-loader/index.js +7 -0
- package/dist/esm/color-picker/index.d.ts +12 -0
- package/dist/esm/color-picker/index.d.ts.map +1 -0
- package/dist/esm/color-picker/index.js +99 -0
- package/dist/esm/color-picker/style.d.ts +5 -0
- package/dist/esm/color-picker/style.d.ts.map +1 -0
- package/dist/esm/color-picker/style.js +7 -0
- package/dist/esm/command/index.d.ts +74 -0
- package/dist/esm/command/index.d.ts.map +1 -0
- package/dist/esm/command/index.js +18 -0
- package/dist/esm/conditional-wrapper/index.d.ts +9 -0
- package/dist/esm/conditional-wrapper/index.d.ts.map +1 -0
- package/dist/esm/conditional-wrapper/index.js +1 -0
- package/dist/esm/dialog/index.d.ts +17 -0
- package/dist/esm/dialog/index.d.ts.map +1 -0
- package/dist/esm/dialog/index.js +30 -0
- package/dist/esm/dropdown/index.d.ts +34 -0
- package/dist/esm/dropdown/index.d.ts.map +1 -0
- package/dist/esm/dropdown/index.js +42 -0
- package/dist/esm/editor/constants.d.ts +7 -0
- package/dist/esm/editor/constants.d.ts.map +1 -0
- package/dist/esm/editor/constants.js +51 -0
- package/dist/esm/editor/editor-error-boundary.d.ts +3 -0
- package/dist/esm/editor/editor-error-boundary.d.ts.map +1 -0
- package/dist/esm/editor/editor-error-boundary.js +9 -0
- package/dist/esm/editor/style.d.ts +12 -0
- package/dist/esm/editor/style.d.ts.map +1 -0
- package/dist/esm/editor/style.js +17 -0
- package/dist/esm/editor/suggestions-dropdown.d.ts +25 -0
- package/dist/esm/editor/suggestions-dropdown.d.ts.map +1 -0
- package/dist/esm/editor/suggestions-dropdown.js +115 -0
- package/dist/esm/editor-pm/constants.d.ts +2 -0
- package/dist/esm/editor-pm/constants.d.ts.map +1 -0
- package/dist/esm/editor-pm/constants.js +2 -0
- package/dist/esm/editor-pm/decoration-plugin.d.ts +15 -0
- package/dist/esm/editor-pm/decoration-plugin.d.ts.map +1 -0
- package/dist/esm/editor-pm/decoration-plugin.js +38 -0
- package/dist/esm/editor-pm/helpers.d.ts +197 -0
- package/dist/esm/editor-pm/helpers.d.ts.map +1 -0
- package/dist/esm/editor-pm/helpers.js +1113 -0
- package/dist/esm/editor-pm/index.d.ts +10 -0
- package/dist/esm/editor-pm/index.d.ts.map +1 -0
- package/dist/esm/editor-pm/index.js +9 -0
- package/dist/esm/editor-pm/mention-nodeview.d.ts +31 -0
- package/dist/esm/editor-pm/mention-nodeview.d.ts.map +1 -0
- package/dist/esm/editor-pm/mention-nodeview.js +88 -0
- package/dist/esm/editor-pm/mentions-dropdown.d.ts +13 -0
- package/dist/esm/editor-pm/mentions-dropdown.d.ts.map +1 -0
- package/dist/esm/editor-pm/mentions-dropdown.js +17 -0
- package/dist/esm/editor-pm/mentions-plugin.d.ts +18 -0
- package/dist/esm/editor-pm/mentions-plugin.d.ts.map +1 -0
- package/dist/esm/editor-pm/mentions-plugin.js +92 -0
- package/dist/esm/editor-pm/placeholder-plugin.d.ts +4 -0
- package/dist/esm/editor-pm/placeholder-plugin.d.ts.map +1 -0
- package/dist/esm/editor-pm/placeholder-plugin.js +20 -0
- package/dist/esm/editor-pm/prosemirror-editor.d.ts +493 -0
- package/dist/esm/editor-pm/prosemirror-editor.d.ts.map +1 -0
- package/dist/esm/editor-pm/prosemirror-editor.js +1135 -0
- package/dist/esm/editor-pm/schema.d.ts +3 -0
- package/dist/esm/editor-pm/schema.d.ts.map +1 -0
- package/dist/esm/editor-pm/schema.js +179 -0
- package/dist/esm/editor-pm/types.d.ts +8 -0
- package/dist/esm/editor-pm/types.d.ts.map +1 -0
- package/dist/esm/editor-pm/types.js +1 -0
- package/dist/esm/editor-pm/unfocused-selection-plugin.d.ts +25 -0
- package/dist/esm/editor-pm/unfocused-selection-plugin.d.ts.map +1 -0
- package/dist/esm/editor-pm/unfocused-selection-plugin.js +61 -0
- package/dist/esm/editor-pm/use-dropdown-change-pm.d.ts +24 -0
- package/dist/esm/editor-pm/use-dropdown-change-pm.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-dropdown-change-pm.js +137 -0
- package/dist/esm/editor-pm/use-editor-change-pm.d.ts +29 -0
- package/dist/esm/editor-pm/use-editor-change-pm.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-editor-change-pm.js +152 -0
- package/dist/esm/editor-pm/use-editor-decorator-pm.d.ts +17 -0
- package/dist/esm/editor-pm/use-editor-decorator-pm.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-editor-decorator-pm.js +57 -0
- package/dist/esm/editor-pm/use-editor-keydown-pm.d.ts +21 -0
- package/dist/esm/editor-pm/use-editor-keydown-pm.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-editor-keydown-pm.js +79 -0
- package/dist/esm/editor-pm/use-mention-keydown.d.ts +11 -0
- package/dist/esm/editor-pm/use-mention-keydown.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-mention-keydown.js +57 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.d.ts +19 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.js +66 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.test.d.ts +2 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.test.d.ts.map +1 -0
- package/dist/esm/editor-pm/use-parameter-suggestions.test.js +66 -0
- package/dist/esm/eye-dropper/index.d.ts +10 -0
- package/dist/esm/eye-dropper/index.d.ts.map +1 -0
- package/dist/esm/eye-dropper/index.js +23 -0
- package/dist/esm/function-info/helpers.d.ts +10 -0
- package/dist/esm/function-info/helpers.d.ts.map +1 -0
- package/dist/esm/function-info/helpers.js +20 -0
- package/dist/esm/function-info/index.d.ts +11 -0
- package/dist/esm/function-info/index.d.ts.map +1 -0
- package/dist/esm/function-info/index.js +68 -0
- package/dist/esm/function-info/style.d.ts +7 -0
- package/dist/esm/function-info/style.d.ts.map +1 -0
- package/dist/esm/function-info/style.js +10 -0
- package/dist/esm/hex-color-picker/index.d.ts +8 -0
- package/dist/esm/hex-color-picker/index.d.ts.map +1 -0
- package/dist/esm/hex-color-picker/index.js +44 -0
- package/dist/esm/hooks/use-cycle-reference.d.ts +16 -0
- package/dist/esm/hooks/use-cycle-reference.d.ts.map +1 -0
- package/dist/esm/hooks/use-cycle-reference.js +70 -0
- package/dist/esm/hooks/use-dropdown-categories.d.ts +9 -0
- package/dist/esm/hooks/use-dropdown-categories.d.ts.map +1 -0
- package/dist/esm/hooks/use-dropdown-categories.js +38 -0
- package/dist/esm/hooks/use-dropdown.d.ts +38 -0
- package/dist/esm/hooks/use-dropdown.d.ts.map +1 -0
- package/dist/esm/hooks/use-dropdown.js +236 -0
- package/dist/esm/hooks/use-isomorphic-layout-effect.ts.d.ts +6 -0
- package/dist/esm/hooks/use-isomorphic-layout-effect.ts.d.ts.map +1 -0
- package/dist/esm/hooks/use-isomorphic-layout-effect.ts.js +8 -0
- package/dist/esm/hooks/use-modal.d.ts +28 -0
- package/dist/esm/hooks/use-modal.d.ts.map +1 -0
- package/dist/esm/hooks/use-modal.js +93 -0
- package/dist/esm/hooks/use-visibility.d.ts +2 -0
- package/dist/esm/hooks/use-visibility.d.ts.map +1 -0
- package/dist/esm/hooks/use-visibility.js +12 -0
- package/dist/esm/icon-button/index.d.ts +15 -0
- package/dist/esm/icon-button/index.d.ts.map +1 -0
- package/dist/esm/icon-button/index.js +32 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/input/index.d.ts +9 -0
- package/dist/esm/input/index.d.ts.map +1 -0
- package/dist/esm/input/index.js +7 -0
- package/dist/esm/popover/index.d.ts +13 -0
- package/dist/esm/popover/index.d.ts.map +1 -0
- package/dist/esm/popover/index.js +22 -0
- package/dist/esm/progress/index.d.ts +10 -0
- package/dist/esm/progress/index.d.ts.map +1 -0
- package/dist/esm/progress/index.js +12 -0
- package/dist/esm/select/index.d.ts +14 -0
- package/dist/esm/select/index.d.ts.map +1 -0
- package/dist/esm/select/index.js +30 -0
- package/dist/esm/separator/index.d.ts +5 -0
- package/dist/esm/separator/index.d.ts.map +1 -0
- package/dist/esm/separator/index.js +6 -0
- package/dist/esm/skeleton/index.d.ts +7 -0
- package/dist/esm/skeleton/index.d.ts.map +1 -0
- package/dist/esm/skeleton/index.js +9 -0
- package/dist/esm/stack/index.d.ts +11 -0
- package/dist/esm/stack/index.d.ts.map +1 -0
- package/dist/esm/stack/index.js +20 -0
- package/dist/esm/tabs/index.d.ts +8 -0
- package/dist/esm/tabs/index.d.ts.map +1 -0
- package/dist/esm/tabs/index.js +11 -0
- package/dist/esm/tooltip/index.d.ts +12 -0
- package/dist/esm/tooltip/index.d.ts.map +1 -0
- package/dist/esm/tooltip/index.js +13 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/utils.d.ts +3 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +5 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +21 -0
- package/package.json +78 -0
|
@@ -0,0 +1,1145 @@
|
|
|
1
|
+
import { __assign, __awaiter, __generator, __read, __rest, __spreadArray, __values } from "tslib";
|
|
2
|
+
import { LoadingIcon, QuestionMarkIcon } from "@rowsncolumns/icons";
|
|
3
|
+
import { addressToCell, isAFormula, isNil, log } from "@rowsncolumns/utils";
|
|
4
|
+
import React, { forwardRef, memo, useCallback, useImperativeHandle, useMemo, useRef, useState, } from "react";
|
|
5
|
+
import { history, undo, redo } from "prosemirror-history";
|
|
6
|
+
import { keymap } from "prosemirror-keymap";
|
|
7
|
+
import { baseKeymap, joinBackward, toggleMark } from "prosemirror-commands";
|
|
8
|
+
import { AllSelection, EditorState } from "prosemirror-state";
|
|
9
|
+
import { EditorView, DecorationSet } from "prosemirror-view";
|
|
10
|
+
import { TextSelection } from "prosemirror-state";
|
|
11
|
+
import { DOMSerializer } from "prosemirror-model";
|
|
12
|
+
import { useCycleFormulaReference } from "../hooks/use-cycle-reference";
|
|
13
|
+
import { useDropdown } from "../hooks/use-dropdown";
|
|
14
|
+
import { useDropdownChangePM } from "./use-dropdown-change-pm";
|
|
15
|
+
import { useEditorKeyDownPM } from "./use-editor-keydown-pm";
|
|
16
|
+
import { useEditorDecoratorPM } from "./use-editor-decorator-pm";
|
|
17
|
+
import { useEditorOnChangePM } from "./use-editor-change-pm";
|
|
18
|
+
import { createDecorationPlugin } from "./decoration-plugin";
|
|
19
|
+
import { createUnfocusedSelectionPlugin } from "./unfocused-selection-plugin";
|
|
20
|
+
import { createPlaceholderPlugin } from "./placeholder-plugin";
|
|
21
|
+
import { useIsomorphicLayoutEffect } from "../hooks/use-isomorphic-layout-effect.ts";
|
|
22
|
+
import { cn } from "../utils";
|
|
23
|
+
import { SPECIAL_ITEMS, THIS_ROW_ITEM } from "../editor/constants";
|
|
24
|
+
import { applyTextFormatRuns, applyTextFormatToSelection, getSelectionFontSize, deserializeString, getPropertyStartIndex, isCellToken, serializeEditorValue, } from "./helpers";
|
|
25
|
+
import { SuggestionsDropdown as DefaultSuggestionsDropdown, } from "../editor/suggestions-dropdown";
|
|
26
|
+
import { ErrorFallback } from "../editor/editor-error-boundary";
|
|
27
|
+
import { withErrorBoundary } from "react-error-boundary";
|
|
28
|
+
import * as Popper from "@radix-ui/react-popper";
|
|
29
|
+
import { Portal } from "@radix-ui/react-portal";
|
|
30
|
+
import { ConditionalWrapper } from "../conditional-wrapper";
|
|
31
|
+
import { schema } from "./schema";
|
|
32
|
+
import { StyledFormulaHelp } from "../editor/style";
|
|
33
|
+
import { tokenVocabulary } from "@rowsncolumns/fast-formula-parser";
|
|
34
|
+
import { createMentionsPlugin } from "./mentions-plugin";
|
|
35
|
+
import { MentionsDropdown } from "./mentions-dropdown";
|
|
36
|
+
import { useMentionKeyDown } from "./use-mention-keydown";
|
|
37
|
+
import { MentionNodeView } from "./mention-nodeview";
|
|
38
|
+
import { useCallbackRef } from "@rowsncolumns/grid";
|
|
39
|
+
import { useParameterSuggestions } from "./use-parameter-suggestions";
|
|
40
|
+
import { DEFAULT_ARRAY } from "@rowsncolumns/spreadsheet";
|
|
41
|
+
/**
|
|
42
|
+
* This fixes a IME bug in prosemirror
|
|
43
|
+
* Cmd+a and delete and then entering a character
|
|
44
|
+
* selects the entire character
|
|
45
|
+
* @param state
|
|
46
|
+
* @param dispatch
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
export var deleteAll = function (state, dispatch) {
|
|
50
|
+
if (dispatch) {
|
|
51
|
+
var emptyDoc = schema.node("doc", null, [schema.node("line", null, [])]);
|
|
52
|
+
var tr = state.tr.replaceWith(0, state.doc.content.size, emptyDoc.content);
|
|
53
|
+
tr.setSelection(TextSelection.create(tr.doc, 1));
|
|
54
|
+
dispatch(tr);
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* ProseMirror editor component for rich text and formula editing.
|
|
60
|
+
* Supports syntax highlighting, autocomplete, and keyboard shortcuts.
|
|
61
|
+
*/
|
|
62
|
+
export var ProseMirrorEditorThatMayError = memo(forwardRef(function (_a, forwardedRef) {
|
|
63
|
+
var _b;
|
|
64
|
+
var _c = _a.value, value = _c === void 0 ? "" : _c, isNewValue = _a.isNewValue, formulaMode = _a.formulaMode, onChange = _a.onChange, autoFocus = _a.autoFocus, className = _a.className, onKeyDown = _a.onKeyDown, disabled = _a.disabled, _d = _a.showDropdown, showDropdown = _d === void 0 ? true : _d, _e = _a.persistFocus, persistFocus = _e === void 0 ? true : _e, editorZeroOutline = _a.editorZeroOutline, showFormulaHelp = _a.showFormulaHelp, onHideFormulaHelp = _a.onHideFormulaHelp, onShowFormulaHelp = _a.onShowFormulaHelp, tokenizer = _a.tokenizer, onCancel = _a.onCancel, onSubmit = _a.onSubmit, onFormulaStateChange = _a.onFormulaStateChange, dropdownStyles = _a.dropdownStyles, options = _a.options, isOptionSelected = _a.isOptionSelected, functionDescriptions = _a.functionDescriptions, shouldFetchFunctionParameters = _a.shouldFetchFunctionParameters, getFunctionParameterSuggestions = _a.getFunctionParameterSuggestions, getMentions = _a.getMentions, getNamedRanges = _a.getNamedRanges, getTableNames = _a.getTableNames, getTableColumnNames = _a.getTableColumnNames, getStructuredProperties = _a.getStructuredProperties, onTeardown = _a.onTeardown, _f = _a.SuggestionsDropdown, SuggestionsDropdown = _f === void 0 ? DefaultSuggestionsDropdown : _f, MentionTagComponent = _a.MentionTagComponent, MentionDropdownItemComponent = _a.MentionDropdownItemComponent, isActive = _a.isActive, _g = _a.stickyEditor, stickyEditor = _g === void 0 ? true : _g, onFocus = _a.onFocus, onBlur = _a.onBlur, onCopy = _a.onCopy, onCut = _a.onCut, onPaste = _a.onPaste, placeholder = _a.placeholder, textFormatRuns = _a.textFormatRuns, resolveRunColor = _a.resolveRunColor, navigationMode = _a.navigationMode, enableContinuousSelection = _a.enableContinuousSelection, cellFontFamily = _a.cellFontFamily, props = __rest(_a, ["value", "isNewValue", "formulaMode", "onChange", "autoFocus", "className", "onKeyDown", "disabled", "showDropdown", "persistFocus", "editorZeroOutline", "showFormulaHelp", "onHideFormulaHelp", "onShowFormulaHelp", "tokenizer", "onCancel", "onSubmit", "onFormulaStateChange", "dropdownStyles", "options", "isOptionSelected", "functionDescriptions", "shouldFetchFunctionParameters", "getFunctionParameterSuggestions", "getMentions", "getNamedRanges", "getTableNames", "getTableColumnNames", "getStructuredProperties", "onTeardown", "SuggestionsDropdown", "MentionTagComponent", "MentionDropdownItemComponent", "isActive", "stickyEditor", "onFocus", "onBlur", "onCopy", "onCut", "onPaste", "placeholder", "textFormatRuns", "resolveRunColor", "navigationMode", "enableContinuousSelection", "cellFontFamily"]);
|
|
65
|
+
var editorRef = useRef(null);
|
|
66
|
+
var viewRef = useRef(null);
|
|
67
|
+
var cellFontFamilyRef = useRef(cellFontFamily);
|
|
68
|
+
var _h = __read(useState(), 2), cursorPosition = _h[0], setCursorPosition = _h[1];
|
|
69
|
+
var _j = __read(useState(), 2), tableToken = _j[0], setTableToken = _j[1];
|
|
70
|
+
var _k = __read(useState(), 2), functionToken = _k[0], setFunctionToken = _k[1];
|
|
71
|
+
var _l = __read(useState(0), 2), parameterIndex = _l[0], setParameterIndex = _l[1];
|
|
72
|
+
var _m = __read(useState(false), 2), isEdgeofCell = _m[0], setIsEdgeOfCell = _m[1];
|
|
73
|
+
var _o = __read(useState(DEFAULT_ARRAY), 2), parameterArguments = _o[0], setParameterArguments = _o[1];
|
|
74
|
+
var _p = __read(useState(DEFAULT_ARRAY), 2), parameterRanges = _p[0], setParameterRanges = _p[1];
|
|
75
|
+
var _q = __read(useState(), 2), cellPropertyToken = _q[0], setCellPropertyToken = _q[1];
|
|
76
|
+
var activeTokenRef = useRef(undefined);
|
|
77
|
+
var suggestionTokenRef = useRef(undefined);
|
|
78
|
+
var previousTokenRef = useRef(undefined);
|
|
79
|
+
var currentValueRef = useRef(undefined);
|
|
80
|
+
var onFocusRef = useRef(onFocus);
|
|
81
|
+
var onBlurRef = useRef(onBlur);
|
|
82
|
+
var onCopyRef = useRef(onCopy);
|
|
83
|
+
var onPasteRef = useRef(onPaste);
|
|
84
|
+
var onCutRef = useRef(onCut);
|
|
85
|
+
var navigationModeRef = useRef(navigationMode);
|
|
86
|
+
// Mentions
|
|
87
|
+
var _r = __read(useState({
|
|
88
|
+
active: false,
|
|
89
|
+
query: "",
|
|
90
|
+
range: null,
|
|
91
|
+
selectedIndex: 0,
|
|
92
|
+
}), 2), mentionState = _r[0], onChangeMentionState = _r[1];
|
|
93
|
+
var _s = __read(useState([]), 2), mentions = _s[0], setMentions = _s[1];
|
|
94
|
+
var _t = __read(useState(false), 2), isFetchingMentions = _t[0], setIsFetchingMentions = _t[1];
|
|
95
|
+
var mentionPositionLeft = useMemo(function () {
|
|
96
|
+
var _a, _b, _c, _d;
|
|
97
|
+
if (mentionState.range) {
|
|
98
|
+
var editorPositon = (_a = editorRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
|
|
99
|
+
return (((_c = (_b = viewRef.current) === null || _b === void 0 ? void 0 : _b.coordsAtPos(mentionState.range.from).left) !== null && _c !== void 0 ? _c : 0) -
|
|
100
|
+
((_d = editorPositon === null || editorPositon === void 0 ? void 0 : editorPositon.left) !== null && _d !== void 0 ? _d : 0));
|
|
101
|
+
}
|
|
102
|
+
return 0;
|
|
103
|
+
}, [(_b = mentionState.range) === null || _b === void 0 ? void 0 : _b.from]);
|
|
104
|
+
// Show mention dropdown
|
|
105
|
+
var showMentionDropdown = (mentionState.active && mentions.length > 1) || isFetchingMentions;
|
|
106
|
+
var showMentionDropdownEffective = showMentionDropdown && !navigationMode;
|
|
107
|
+
var _u = useParameterSuggestions({
|
|
108
|
+
functionToken: !formulaMode || navigationMode || isEdgeofCell
|
|
109
|
+
? undefined
|
|
110
|
+
: functionToken,
|
|
111
|
+
parameterIndex: parameterIndex,
|
|
112
|
+
parameterArguments: parameterArguments,
|
|
113
|
+
getFunctionParameterSuggestions: !navigationMode
|
|
114
|
+
? getFunctionParameterSuggestions
|
|
115
|
+
: undefined,
|
|
116
|
+
shouldFetchFunctionParameters: !navigationMode
|
|
117
|
+
? shouldFetchFunctionParameters
|
|
118
|
+
: undefined,
|
|
119
|
+
}), parameterSuggestions = _u.parameterSuggestions, isFetchingParameters = _u.isFetchingParameters;
|
|
120
|
+
useIsomorphicLayoutEffect(function () {
|
|
121
|
+
currentValueRef.current = value;
|
|
122
|
+
}, [value]);
|
|
123
|
+
useIsomorphicLayoutEffect(function () {
|
|
124
|
+
onFocusRef.current = onFocus;
|
|
125
|
+
}, [onFocus]);
|
|
126
|
+
useIsomorphicLayoutEffect(function () {
|
|
127
|
+
onBlurRef.current = onBlur;
|
|
128
|
+
}, [onBlur]);
|
|
129
|
+
useIsomorphicLayoutEffect(function () {
|
|
130
|
+
onCopyRef.current = onCopy;
|
|
131
|
+
}, [onCopy]);
|
|
132
|
+
useIsomorphicLayoutEffect(function () {
|
|
133
|
+
onPasteRef.current = onPaste;
|
|
134
|
+
}, [onPaste]);
|
|
135
|
+
useIsomorphicLayoutEffect(function () {
|
|
136
|
+
onCutRef.current = onCut;
|
|
137
|
+
}, [onCut]);
|
|
138
|
+
useIsomorphicLayoutEffect(function () {
|
|
139
|
+
cellFontFamilyRef.current = cellFontFamily;
|
|
140
|
+
}, [cellFontFamily]);
|
|
141
|
+
useIsomorphicLayoutEffect(function () {
|
|
142
|
+
var _a;
|
|
143
|
+
var previousMode = navigationModeRef.current;
|
|
144
|
+
navigationModeRef.current = navigationMode;
|
|
145
|
+
// Reset formula-related states when entering navigation mode (and mode has changed)
|
|
146
|
+
if (navigationMode && previousMode !== navigationMode) {
|
|
147
|
+
setCursorPosition(undefined);
|
|
148
|
+
setTableToken(undefined);
|
|
149
|
+
setFunctionToken(undefined);
|
|
150
|
+
setParameterIndex(0);
|
|
151
|
+
setIsEdgeOfCell(false);
|
|
152
|
+
setParameterArguments(DEFAULT_ARRAY);
|
|
153
|
+
setParameterRanges(DEFAULT_ARRAY);
|
|
154
|
+
setCellPropertyToken(undefined);
|
|
155
|
+
}
|
|
156
|
+
if ((_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.dom) {
|
|
157
|
+
viewRef.current.dom.setAttribute("inputmode", navigationMode ? "none" : "text");
|
|
158
|
+
}
|
|
159
|
+
}, [navigationMode]);
|
|
160
|
+
// Store latest values in refs for the decorator plugin
|
|
161
|
+
var formulaModeRef = useRef(formulaMode);
|
|
162
|
+
// Update refs when values change
|
|
163
|
+
formulaModeRef.current = formulaMode;
|
|
164
|
+
// Helper function to create initial document
|
|
165
|
+
var createInitialDocument = useCallbackRef(useCallback(function () {
|
|
166
|
+
if (!isAFormula(value) && (textFormatRuns === null || textFormatRuns === void 0 ? void 0 : textFormatRuns.length)) {
|
|
167
|
+
// Use applyTextFormatRuns if format runs are provided
|
|
168
|
+
return applyTextFormatRuns(value, textFormatRuns, schema, resolveRunColor);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Use default deserialization
|
|
172
|
+
return deserializeString(value, schema);
|
|
173
|
+
}
|
|
174
|
+
}, [value, textFormatRuns]));
|
|
175
|
+
// Decorator for syntax highlighting - use ref to ensure latest values
|
|
176
|
+
var decoratorRef = useRef(undefined);
|
|
177
|
+
var getFormulaDecorations = useEditorDecoratorPM({
|
|
178
|
+
cursorPosition: cursorPosition,
|
|
179
|
+
formulaMode: formulaMode,
|
|
180
|
+
tokenizer: tokenizer,
|
|
181
|
+
isActive: isActive,
|
|
182
|
+
});
|
|
183
|
+
// Combined decorator that includes formula highlighting
|
|
184
|
+
var getCombinedDecorations = useCallback(function (state) {
|
|
185
|
+
if (navigationModeRef.current) {
|
|
186
|
+
return DecorationSet.create(state.doc, []);
|
|
187
|
+
}
|
|
188
|
+
var decorations = [];
|
|
189
|
+
// Add formula decorations
|
|
190
|
+
if (formulaMode) {
|
|
191
|
+
var formulaDecorations = getFormulaDecorations(state);
|
|
192
|
+
if (formulaDecorations && formulaDecorations.find) {
|
|
193
|
+
formulaDecorations
|
|
194
|
+
.find()
|
|
195
|
+
.forEach(function (deco) { return decorations.push(deco); });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return DecorationSet.create(state.doc, decorations);
|
|
199
|
+
}, [getFormulaDecorations, formulaMode]);
|
|
200
|
+
// React to mentions
|
|
201
|
+
useIsomorphicLayoutEffect(function () {
|
|
202
|
+
var _a;
|
|
203
|
+
if (navigationModeRef.current) {
|
|
204
|
+
if (mentions.length) {
|
|
205
|
+
setMentions([]);
|
|
206
|
+
}
|
|
207
|
+
setIsFetchingMentions(false);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
var fetchMentions = function (query) { return __awaiter(void 0, void 0, void 0, function () {
|
|
211
|
+
var mentions;
|
|
212
|
+
var _a;
|
|
213
|
+
return __generator(this, function (_b) {
|
|
214
|
+
switch (_b.label) {
|
|
215
|
+
case 0:
|
|
216
|
+
setIsFetchingMentions(true);
|
|
217
|
+
return [4 /*yield*/, (getMentions === null || getMentions === void 0 ? void 0 : getMentions(query))];
|
|
218
|
+
case 1:
|
|
219
|
+
mentions = (_a = (_b.sent())) !== null && _a !== void 0 ? _a : [];
|
|
220
|
+
setMentions(mentions);
|
|
221
|
+
setIsFetchingMentions(false);
|
|
222
|
+
return [2 /*return*/];
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}); };
|
|
226
|
+
try {
|
|
227
|
+
if (mentionState.active) {
|
|
228
|
+
fetchMentions((_a = mentionState.query) !== null && _a !== void 0 ? _a : "");
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
setMentions([]);
|
|
232
|
+
setIsFetchingMentions(false);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
console.log("Error fetching mentions", err);
|
|
237
|
+
}
|
|
238
|
+
}, [mentionState.active, mentionState.query]);
|
|
239
|
+
// Update ref with latest decorator
|
|
240
|
+
useIsomorphicLayoutEffect(function () {
|
|
241
|
+
decoratorRef.current = getCombinedDecorations;
|
|
242
|
+
}, [getCombinedDecorations]);
|
|
243
|
+
// Set active token ref
|
|
244
|
+
var setActiveToken = useCallback(function (token) {
|
|
245
|
+
activeTokenRef.current = token;
|
|
246
|
+
}, []);
|
|
247
|
+
var setPreviousToken = useCallback(function (token) {
|
|
248
|
+
previousTokenRef.current = token;
|
|
249
|
+
}, []);
|
|
250
|
+
// Callback when suggestion token changes
|
|
251
|
+
var handleSuggestionTokenChange = useCallback(function (token) {
|
|
252
|
+
var _a, _b;
|
|
253
|
+
suggestionTokenRef.current = token;
|
|
254
|
+
var newQuery = (_b = (_a = token === null || token === void 0 ? void 0 : token.property) !== null && _a !== void 0 ? _a : token === null || token === void 0 ? void 0 : token.image) !== null && _b !== void 0 ? _b : "";
|
|
255
|
+
setQuery(newQuery);
|
|
256
|
+
}, []);
|
|
257
|
+
// Get editor view
|
|
258
|
+
var getView = useCallback(function () {
|
|
259
|
+
return viewRef.current;
|
|
260
|
+
}, []);
|
|
261
|
+
// Handle change hook
|
|
262
|
+
var onEditorChange = useEditorOnChangePM({
|
|
263
|
+
onChange: !navigationMode ? onChange : function () { return undefined; },
|
|
264
|
+
getView: getView,
|
|
265
|
+
isActive: isActive,
|
|
266
|
+
onChangeCursor: setCursorPosition,
|
|
267
|
+
onChangeActiveToken: setActiveToken,
|
|
268
|
+
tokenizer: !navigationMode ? tokenizer : function () { return []; },
|
|
269
|
+
onFormulaStateChange: !navigationMode
|
|
270
|
+
? onFormulaStateChange
|
|
271
|
+
: undefined,
|
|
272
|
+
onSuggestionTokenChange: handleSuggestionTokenChange,
|
|
273
|
+
onTableTokenChange: setTableToken,
|
|
274
|
+
onChangeFunctionToken: setFunctionToken,
|
|
275
|
+
onChangeIsEdgeOfCell: setIsEdgeOfCell,
|
|
276
|
+
onChangeParameterIndex: setParameterIndex,
|
|
277
|
+
onCellPropertyTokenChange: setCellPropertyToken,
|
|
278
|
+
onChangeFunctionParameters: function (params, ranges) {
|
|
279
|
+
setParameterArguments(params);
|
|
280
|
+
setParameterRanges(ranges);
|
|
281
|
+
},
|
|
282
|
+
onChangePreviousToken: setPreviousToken,
|
|
283
|
+
enableContinuousSelection: enableContinuousSelection !== null && enableContinuousSelection !== void 0 ? enableContinuousSelection : isNil(navigationMode),
|
|
284
|
+
});
|
|
285
|
+
// Initialize editor
|
|
286
|
+
useIsomorphicLayoutEffect(function () {
|
|
287
|
+
if (!editorRef.current)
|
|
288
|
+
return;
|
|
289
|
+
try {
|
|
290
|
+
var state = EditorState.create({
|
|
291
|
+
doc: createInitialDocument(),
|
|
292
|
+
plugins: __spreadArray(__spreadArray([
|
|
293
|
+
history(),
|
|
294
|
+
createUnfocusedSelectionPlugin()
|
|
295
|
+
], __read((placeholder ? [createPlaceholderPlugin(placeholder)] : [])), false), [
|
|
296
|
+
createMentionsPlugin({
|
|
297
|
+
onChangeState: function (nextState) {
|
|
298
|
+
if (navigationModeRef.current)
|
|
299
|
+
return;
|
|
300
|
+
onChangeMentionState(nextState);
|
|
301
|
+
},
|
|
302
|
+
getFormulaMode: function () { var _a; return (_a = formulaModeRef.current) !== null && _a !== void 0 ? _a : false; },
|
|
303
|
+
}),
|
|
304
|
+
createDecorationPlugin({
|
|
305
|
+
formulaMode: formulaMode,
|
|
306
|
+
isActive: isActive,
|
|
307
|
+
tokenizer: tokenizer,
|
|
308
|
+
getDecorations: function (state) {
|
|
309
|
+
try {
|
|
310
|
+
if (navigationModeRef.current) {
|
|
311
|
+
return DecorationSet.create(state.doc, []);
|
|
312
|
+
}
|
|
313
|
+
// Use current ref values to get latest decorator
|
|
314
|
+
if (decoratorRef.current) {
|
|
315
|
+
return decoratorRef.current(state);
|
|
316
|
+
}
|
|
317
|
+
return DecorationSet.create(state.doc, []);
|
|
318
|
+
}
|
|
319
|
+
catch (decorationError) {
|
|
320
|
+
console.warn("Error creating decorations:", decorationError);
|
|
321
|
+
return DecorationSet.create(state.doc, []);
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
}),
|
|
325
|
+
keymap(__assign(__assign({}, baseKeymap), { Backspace: function (state, dispatch, view) {
|
|
326
|
+
if (view === null || view === void 0 ? void 0 : view.composing) {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
// Check if all content is selected
|
|
330
|
+
var _a = state.selection, from = _a.from, to = _a.to;
|
|
331
|
+
var allSelected = state.selection instanceof AllSelection ||
|
|
332
|
+
(from === 0 && to === state.doc.content.size);
|
|
333
|
+
if (allSelected) {
|
|
334
|
+
return deleteAll(state, dispatch);
|
|
335
|
+
}
|
|
336
|
+
// Handle backspace at the beginning of a line - merge with previous line
|
|
337
|
+
if (from === to && from > 0) {
|
|
338
|
+
var $pos = state.doc.resolve(from);
|
|
339
|
+
// Check if we're at the beginning of a line (parentOffset === 0 means start of line content)
|
|
340
|
+
if ($pos.parent.type.name === "line" &&
|
|
341
|
+
$pos.parentOffset === 0) {
|
|
342
|
+
// Use joinBackward to properly merge the lines
|
|
343
|
+
return joinBackward(state, dispatch);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Fall through to default backspace behavior
|
|
347
|
+
return false;
|
|
348
|
+
}, Delete: function (state, dispatch, view) {
|
|
349
|
+
if (view === null || view === void 0 ? void 0 : view.composing) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
var _a = state.selection, from = _a.from, to = _a.to;
|
|
353
|
+
var allSelected = state.selection instanceof AllSelection ||
|
|
354
|
+
(from === 0 && to === state.doc.content.size);
|
|
355
|
+
if (allSelected) {
|
|
356
|
+
return deleteAll(state, dispatch);
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}, "Mod-z": undo, "Shift-Mod-z": redo, "Mod-y": redo,
|
|
360
|
+
// Rich-text marks: only toggle when not in formula mode —
|
|
361
|
+
// we don't want Cmd+B to corrupt a formula. The Mod-key
|
|
362
|
+
// chord also reaches the canvas-grid keyboard handler so
|
|
363
|
+
// cell-level bold still works there for non-edit mode.
|
|
364
|
+
"Mod-b": function (state, dispatch) {
|
|
365
|
+
if (formulaModeRef.current)
|
|
366
|
+
return false;
|
|
367
|
+
return toggleMark(schema.marks.bold)(state, dispatch);
|
|
368
|
+
}, "Mod-i": function (state, dispatch) {
|
|
369
|
+
if (formulaModeRef.current)
|
|
370
|
+
return false;
|
|
371
|
+
return toggleMark(schema.marks.italic)(state, dispatch);
|
|
372
|
+
}, "Mod-u": function (state, dispatch) {
|
|
373
|
+
if (formulaModeRef.current)
|
|
374
|
+
return false;
|
|
375
|
+
return toggleMark(schema.marks.underline)(state, dispatch);
|
|
376
|
+
}, "Shift-Mod-x": function (state, dispatch) {
|
|
377
|
+
if (formulaModeRef.current)
|
|
378
|
+
return false;
|
|
379
|
+
return toggleMark(schema.marks.strikethrough)(state, dispatch);
|
|
380
|
+
},
|
|
381
|
+
// Google Sheets/Docs chords. The schema marks
|
|
382
|
+
// mutually exclude each other, so toggling one on
|
|
383
|
+
// clears the other.
|
|
384
|
+
"Mod-.": function (state, dispatch) {
|
|
385
|
+
if (formulaModeRef.current)
|
|
386
|
+
return false;
|
|
387
|
+
return toggleMark(schema.marks.superscript)(state, dispatch);
|
|
388
|
+
}, "Mod-,": function (state, dispatch) {
|
|
389
|
+
if (formulaModeRef.current)
|
|
390
|
+
return false;
|
|
391
|
+
return toggleMark(schema.marks.subscript)(state, dispatch);
|
|
392
|
+
}, Enter: function () {
|
|
393
|
+
// Let React handle Enter through onKeyDownEditor
|
|
394
|
+
return false; // Don't consume the event, let it bubble up
|
|
395
|
+
}, ArrowUp: function () {
|
|
396
|
+
return false;
|
|
397
|
+
}, ArrowDown: function () {
|
|
398
|
+
return false;
|
|
399
|
+
}, Escape: function () {
|
|
400
|
+
// Handle escape key
|
|
401
|
+
return true;
|
|
402
|
+
}, F4: function () {
|
|
403
|
+
// Handle F4 for cycling references
|
|
404
|
+
if (activeTokenRef.current) {
|
|
405
|
+
onCycleReference(activeTokenRef.current);
|
|
406
|
+
}
|
|
407
|
+
return true;
|
|
408
|
+
} })),
|
|
409
|
+
], false),
|
|
410
|
+
});
|
|
411
|
+
// Stamp the cell's font onto each line in clipboard HTML so a
|
|
412
|
+
// paste lands with the source font. Skips when no font is set —
|
|
413
|
+
// the destination cell then keeps its own.
|
|
414
|
+
var clipboardSerializer = new DOMSerializer(__assign(__assign({}, DOMSerializer.nodesFromSchema(schema)), { line: function () {
|
|
415
|
+
var font = cellFontFamilyRef.current;
|
|
416
|
+
return font
|
|
417
|
+
? ["div", { style: "font-family: ".concat(font) }, 0]
|
|
418
|
+
: ["div", 0];
|
|
419
|
+
} }), DOMSerializer.marksFromSchema(schema));
|
|
420
|
+
var view_1 = new EditorView(editorRef.current, {
|
|
421
|
+
state: state,
|
|
422
|
+
clipboardSerializer: clipboardSerializer,
|
|
423
|
+
nodeViews: {
|
|
424
|
+
mention: function (node, view, getPos) {
|
|
425
|
+
return new MentionNodeView(node, view, getPos, MentionTagComponent);
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
dispatchTransaction: function (transaction) {
|
|
429
|
+
try {
|
|
430
|
+
var newState = view_1.state.apply(transaction);
|
|
431
|
+
view_1.updateState(newState);
|
|
432
|
+
// Call the onChange handler which will handle all token analysis and state updates
|
|
433
|
+
if (!navigationModeRef.current) {
|
|
434
|
+
onEditorChange(newState);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
log("Error dispatching transaction:", error);
|
|
439
|
+
// Try to recover by reverting to current state
|
|
440
|
+
try {
|
|
441
|
+
if (!navigationModeRef.current) {
|
|
442
|
+
onEditorChange(view_1.state);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch (recoveryError) {
|
|
446
|
+
log("Error during transaction recovery:", recoveryError);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
},
|
|
450
|
+
attributes: {
|
|
451
|
+
class: cn("h-full overflow-auto [&_div]:outline-none"),
|
|
452
|
+
spellcheck: formulaMode !== true ? "true" : "false",
|
|
453
|
+
contenteditable: !disabled ? "true" : "false",
|
|
454
|
+
inputmode: navigationModeRef.current ? "none" : "text",
|
|
455
|
+
tabindex: "0",
|
|
456
|
+
},
|
|
457
|
+
editable: function () { return !disabled; },
|
|
458
|
+
handleDOMEvents: {
|
|
459
|
+
focus: function (_, event) {
|
|
460
|
+
var _a;
|
|
461
|
+
(_a = onFocusRef.current) === null || _a === void 0 ? void 0 : _a.call(onFocusRef, event);
|
|
462
|
+
return false; // Let ProseMirror handle the focus as well
|
|
463
|
+
},
|
|
464
|
+
blur: function (_, event) {
|
|
465
|
+
var _a;
|
|
466
|
+
(_a = onBlurRef.current) === null || _a === void 0 ? void 0 : _a.call(onBlurRef, event);
|
|
467
|
+
return false; // Let ProseMirror handle the blur as well
|
|
468
|
+
},
|
|
469
|
+
copy: function (_, event) {
|
|
470
|
+
var _a;
|
|
471
|
+
(_a = onCopyRef.current) === null || _a === void 0 ? void 0 : _a.call(onCopyRef, event);
|
|
472
|
+
return false;
|
|
473
|
+
},
|
|
474
|
+
paste: function (_, event) {
|
|
475
|
+
var _a;
|
|
476
|
+
(_a = onPasteRef.current) === null || _a === void 0 ? void 0 : _a.call(onPasteRef, event);
|
|
477
|
+
return false;
|
|
478
|
+
},
|
|
479
|
+
cut: function (_, event) {
|
|
480
|
+
var _a;
|
|
481
|
+
(_a = onCutRef.current) === null || _a === void 0 ? void 0 : _a.call(onCutRef, event);
|
|
482
|
+
return false;
|
|
483
|
+
},
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
viewRef.current = view_1;
|
|
487
|
+
return function () {
|
|
488
|
+
try {
|
|
489
|
+
view_1.destroy();
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
log("Error destroying editor view:", error);
|
|
493
|
+
}
|
|
494
|
+
viewRef.current = null;
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
log("Error initializing ProseMirror editor:", error);
|
|
499
|
+
// Try to create a minimal fallback editor
|
|
500
|
+
try {
|
|
501
|
+
var fallbackState = EditorState.create({
|
|
502
|
+
doc: schema.node("doc", null, [schema.node("line", null, [])]),
|
|
503
|
+
plugins: [history()],
|
|
504
|
+
});
|
|
505
|
+
var fallbackView = new EditorView(editorRef.current, {
|
|
506
|
+
state: fallbackState,
|
|
507
|
+
});
|
|
508
|
+
viewRef.current = fallbackView;
|
|
509
|
+
}
|
|
510
|
+
catch (fallbackError) {
|
|
511
|
+
log("Error creating fallback editor:", fallbackError);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}, [createInitialDocument]); // Re-initialize if document creation logic changes
|
|
515
|
+
// Update editor content when value changes
|
|
516
|
+
useIsomorphicLayoutEffect(function () {
|
|
517
|
+
if (viewRef.current) {
|
|
518
|
+
try {
|
|
519
|
+
var currentContent = serializeEditorValue(viewRef.current.state.doc);
|
|
520
|
+
if (currentContent !== value) {
|
|
521
|
+
var newDoc = createInitialDocument();
|
|
522
|
+
var tr = viewRef.current.state.tr.replaceWith(0, viewRef.current.state.doc.content.size, newDoc.content);
|
|
523
|
+
viewRef.current.dispatch(tr);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
log("Error updating editor content:", error);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}, [value, createInitialDocument]);
|
|
531
|
+
// Update decorations when formula mode or active state changes
|
|
532
|
+
useIsomorphicLayoutEffect(function () {
|
|
533
|
+
if (navigationModeRef.current)
|
|
534
|
+
return;
|
|
535
|
+
if (viewRef.current) {
|
|
536
|
+
try {
|
|
537
|
+
// Force a decoration update by dispatching a metadata transaction
|
|
538
|
+
var tr = viewRef.current.state.tr.setMeta("updateDecorations", {
|
|
539
|
+
formulaMode: formulaMode,
|
|
540
|
+
isActive: isActive,
|
|
541
|
+
cursorPosition: cursorPosition,
|
|
542
|
+
});
|
|
543
|
+
viewRef.current.dispatch(tr);
|
|
544
|
+
}
|
|
545
|
+
catch (error) {
|
|
546
|
+
log("Error updating decorations:", error);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}, [formulaMode, isActive, cursorPosition]);
|
|
550
|
+
// Update editor disabled state when disabled prop changes
|
|
551
|
+
useIsomorphicLayoutEffect(function () {
|
|
552
|
+
if (viewRef.current) {
|
|
553
|
+
try {
|
|
554
|
+
// Update contenteditable attribute
|
|
555
|
+
var editorDom = viewRef.current.dom;
|
|
556
|
+
if (editorDom) {
|
|
557
|
+
editorDom.setAttribute("contenteditable", disabled ? "false" : "true");
|
|
558
|
+
}
|
|
559
|
+
// Update editable state in ProseMirror
|
|
560
|
+
// This forces ProseMirror to re-evaluate its editable state
|
|
561
|
+
viewRef.current.setProps(__assign(__assign({}, viewRef.current.props), { editable: function () { return !disabled; } }));
|
|
562
|
+
}
|
|
563
|
+
catch (error) {
|
|
564
|
+
log("Error updating disabled state:", error);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}, [disabled]);
|
|
568
|
+
// Focus editor
|
|
569
|
+
var focusEditor = useCallback(function () {
|
|
570
|
+
if (viewRef.current &&
|
|
571
|
+
viewRef.current.dom &&
|
|
572
|
+
!viewRef.current.hasFocus()) {
|
|
573
|
+
try {
|
|
574
|
+
viewRef.current.focus();
|
|
575
|
+
// Ensure the DOM element also gets focus
|
|
576
|
+
if (document.activeElement !== viewRef.current.dom) {
|
|
577
|
+
viewRef.current.dom.focus();
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
catch (error) {
|
|
581
|
+
console.warn("Failed to focus editor:", error);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}, []);
|
|
585
|
+
/**
|
|
586
|
+
* Teardown current editor
|
|
587
|
+
*/
|
|
588
|
+
var handleTeardown = useCallback(function () {
|
|
589
|
+
if (viewRef.current) {
|
|
590
|
+
viewRef.current.destroy();
|
|
591
|
+
viewRef.current = null;
|
|
592
|
+
}
|
|
593
|
+
onTeardown === null || onTeardown === void 0 ? void 0 : onTeardown();
|
|
594
|
+
}, [onTeardown]);
|
|
595
|
+
// Get current value
|
|
596
|
+
var getCurrentValue = useCallback(function () {
|
|
597
|
+
var _a;
|
|
598
|
+
if (viewRef.current) {
|
|
599
|
+
return serializeEditorValue(viewRef.current.state.doc);
|
|
600
|
+
}
|
|
601
|
+
return (_a = currentValueRef.current) !== null && _a !== void 0 ? _a : "";
|
|
602
|
+
}, []);
|
|
603
|
+
// Is Cursor at end of input
|
|
604
|
+
var isCursorAtEnd = useCallback(function () {
|
|
605
|
+
var view = viewRef.current;
|
|
606
|
+
if (!view)
|
|
607
|
+
return false;
|
|
608
|
+
var state = view.state;
|
|
609
|
+
var selection = state.selection;
|
|
610
|
+
if (!selection.empty)
|
|
611
|
+
return false;
|
|
612
|
+
var $pos = state.doc.resolve(selection.from);
|
|
613
|
+
var endPos = $pos.end(); // End of the current block
|
|
614
|
+
return selection.from === endPos;
|
|
615
|
+
}, []);
|
|
616
|
+
// Item to stirng
|
|
617
|
+
var itemToString = useCallback(function (item) { var _a, _b; return (_b = (_a = item === null || item === void 0 ? void 0 : item.value) !== null && _a !== void 0 ? _a : item === null || item === void 0 ? void 0 : item.title) !== null && _b !== void 0 ? _b : ""; }, []);
|
|
618
|
+
// Final options
|
|
619
|
+
var finalOptions = useMemo(function () {
|
|
620
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
621
|
+
if (navigationMode) {
|
|
622
|
+
return [];
|
|
623
|
+
}
|
|
624
|
+
if (formulaMode) {
|
|
625
|
+
var isStructured = Boolean(tableToken);
|
|
626
|
+
var isCellProperty = Boolean(cellPropertyToken);
|
|
627
|
+
if (isCellProperty && cellPropertyToken) {
|
|
628
|
+
if (!cellPropertyToken.structured) {
|
|
629
|
+
var dotIndex = getPropertyStartIndex(cellPropertyToken);
|
|
630
|
+
if (dotIndex === -1) {
|
|
631
|
+
return [];
|
|
632
|
+
}
|
|
633
|
+
var address = cellPropertyToken.image.slice(0, dotIndex);
|
|
634
|
+
var cell = addressToCell(address);
|
|
635
|
+
if (!cell) {
|
|
636
|
+
return [];
|
|
637
|
+
}
|
|
638
|
+
var props_1 = (_a = getStructuredProperties === null || getStructuredProperties === void 0 ? void 0 : getStructuredProperties(cellPropertyToken.sheetName, cell.rowIndex, cell.columnIndex)) !== null && _a !== void 0 ? _a : [];
|
|
639
|
+
return props_1;
|
|
640
|
+
}
|
|
641
|
+
if (cellPropertyToken.resolvedRowIndex !== undefined &&
|
|
642
|
+
cellPropertyToken.resolvedColumnIndex !== undefined) {
|
|
643
|
+
return ((_c = getStructuredProperties === null || getStructuredProperties === void 0 ? void 0 : getStructuredProperties((_b = cellPropertyToken.resolvedSheetName) !== null && _b !== void 0 ? _b : cellPropertyToken.sheetName, cellPropertyToken.resolvedRowIndex, cellPropertyToken.resolvedColumnIndex)) !== null && _c !== void 0 ? _c : []);
|
|
644
|
+
}
|
|
645
|
+
return [];
|
|
646
|
+
}
|
|
647
|
+
if (isStructured) {
|
|
648
|
+
var canSelectThisRow = ((_d = activeTokenRef.current) === null || _d === void 0 ? void 0 : _d.image) !== "@";
|
|
649
|
+
var columns = (_e = getTableColumnNames === null || getTableColumnNames === void 0 ? void 0 : getTableColumnNames(tableToken === null || tableToken === void 0 ? void 0 : tableToken.tableName)) !== null && _e !== void 0 ? _e : [];
|
|
650
|
+
// If there are no columns, lets not display suggestions
|
|
651
|
+
if (!columns.length) {
|
|
652
|
+
return [];
|
|
653
|
+
}
|
|
654
|
+
return __spreadArray(__spreadArray(__spreadArray([], __read((canSelectThisRow ? [THIS_ROW_ITEM] : [])), false), __read(columns), false), __read(SPECIAL_ITEMS), false);
|
|
655
|
+
}
|
|
656
|
+
var tableNames = (_f = getTableNames === null || getTableNames === void 0 ? void 0 : getTableNames()) !== null && _f !== void 0 ? _f : [];
|
|
657
|
+
var parameterItems = isEdgeofCell
|
|
658
|
+
? []
|
|
659
|
+
: (_g = parameterSuggestions === null || parameterSuggestions === void 0 ? void 0 : parameterSuggestions.map(function (item) {
|
|
660
|
+
var _a;
|
|
661
|
+
return (__assign(__assign({}, item), { category: (_a = item.category) !== null && _a !== void 0 ? _a : "parameter" }));
|
|
662
|
+
})) !== null && _g !== void 0 ? _g : [];
|
|
663
|
+
var baseOptions = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(tableNames), false), __read(((_h = getNamedRanges === null || getNamedRanges === void 0 ? void 0 : getNamedRanges()) !== null && _h !== void 0 ? _h : [])), false), __read((functionDescriptions !== null && functionDescriptions !== void 0 ? functionDescriptions : [])), false), __read((parameterItems !== null && parameterItems !== void 0 ? parameterItems : [])), false);
|
|
664
|
+
if (suggestionTokenRef.current &&
|
|
665
|
+
((_j = suggestionTokenRef.current.tokenType) === null || _j === void 0 ? void 0 : _j.name) ===
|
|
666
|
+
tokenVocabulary.UnterminatedStringStart.name) {
|
|
667
|
+
return parameterItems;
|
|
668
|
+
}
|
|
669
|
+
return baseOptions;
|
|
670
|
+
}
|
|
671
|
+
return options !== null && options !== void 0 ? options : [];
|
|
672
|
+
}, [
|
|
673
|
+
navigationMode,
|
|
674
|
+
formulaMode,
|
|
675
|
+
getTableNames,
|
|
676
|
+
getTableColumnNames,
|
|
677
|
+
getStructuredProperties,
|
|
678
|
+
options,
|
|
679
|
+
functionDescriptions,
|
|
680
|
+
getNamedRanges,
|
|
681
|
+
tableToken,
|
|
682
|
+
cellPropertyToken,
|
|
683
|
+
functionToken,
|
|
684
|
+
parameterSuggestions,
|
|
685
|
+
isEdgeofCell,
|
|
686
|
+
showFormulaHelp,
|
|
687
|
+
]);
|
|
688
|
+
var activeParameterRange = useMemo(function () {
|
|
689
|
+
var range = parameterRanges[parameterIndex];
|
|
690
|
+
if (!range)
|
|
691
|
+
return undefined;
|
|
692
|
+
return {
|
|
693
|
+
start: range.start + 1,
|
|
694
|
+
end: range.end + 1,
|
|
695
|
+
};
|
|
696
|
+
}, [parameterRanges, parameterIndex]);
|
|
697
|
+
var itemsWhenEmpty = useMemo(function () {
|
|
698
|
+
var _a;
|
|
699
|
+
if (navigationMode) {
|
|
700
|
+
return undefined;
|
|
701
|
+
}
|
|
702
|
+
if (!isEdgeofCell &&
|
|
703
|
+
functionToken &&
|
|
704
|
+
(shouldFetchFunctionParameters === null || shouldFetchFunctionParameters === void 0 ? void 0 : shouldFetchFunctionParameters((_a = functionToken.image) !== null && _a !== void 0 ? _a : "", parameterIndex, parameterArguments))) {
|
|
705
|
+
return parameterSuggestions !== null && parameterSuggestions !== void 0 ? parameterSuggestions : [];
|
|
706
|
+
}
|
|
707
|
+
return undefined;
|
|
708
|
+
}, [
|
|
709
|
+
navigationMode,
|
|
710
|
+
functionToken,
|
|
711
|
+
shouldFetchFunctionParameters,
|
|
712
|
+
parameterIndex,
|
|
713
|
+
parameterArguments,
|
|
714
|
+
parameterSuggestions,
|
|
715
|
+
isEdgeofCell,
|
|
716
|
+
]);
|
|
717
|
+
// Callback when user selects an item from dropdown
|
|
718
|
+
var handleDropdownChange = useDropdownChangePM({
|
|
719
|
+
onSubmit: !navigationMode ? onSubmit : undefined,
|
|
720
|
+
formulaMode: formulaMode,
|
|
721
|
+
itemToString: itemToString,
|
|
722
|
+
suggestionToken: suggestionTokenRef.current,
|
|
723
|
+
previousToken: previousTokenRef.current,
|
|
724
|
+
propertyToken: cellPropertyToken,
|
|
725
|
+
getView: getView,
|
|
726
|
+
activeToken: activeTokenRef.current,
|
|
727
|
+
parameterRange: activeParameterRange,
|
|
728
|
+
});
|
|
729
|
+
// Inserts a mention in the dom
|
|
730
|
+
var handleInsertMention = useCallback(function (mention) {
|
|
731
|
+
if (viewRef.current && mentionState.range && mention) {
|
|
732
|
+
var state = viewRef.current.state;
|
|
733
|
+
var mentionNode = state.schema.nodes.mention.create({
|
|
734
|
+
label: mention.label,
|
|
735
|
+
value: mention.value,
|
|
736
|
+
});
|
|
737
|
+
var tr = state.tr
|
|
738
|
+
.delete(mentionState.range.from, mentionState.range.to)
|
|
739
|
+
.insert(mentionState.range.from, [
|
|
740
|
+
mentionNode,
|
|
741
|
+
state.schema.text(" "),
|
|
742
|
+
]);
|
|
743
|
+
viewRef.current.dispatch(tr);
|
|
744
|
+
}
|
|
745
|
+
}, [mentionState, onChangeMentionState]);
|
|
746
|
+
// Mention keydown
|
|
747
|
+
var _v = useMentionKeyDown({
|
|
748
|
+
mentions: mentions,
|
|
749
|
+
mentionState: mentionState,
|
|
750
|
+
onSelect: handleInsertMention,
|
|
751
|
+
}), mentionHighlightedIndex = _v.highlightedIndex, onMentionKeydown = _v.onMentionKeydown;
|
|
752
|
+
// Dropdown integration
|
|
753
|
+
var _w = useDropdown({
|
|
754
|
+
initialOpen: navigationMode
|
|
755
|
+
? false
|
|
756
|
+
: formulaMode
|
|
757
|
+
? false
|
|
758
|
+
: Boolean(options === null || options === void 0 ? void 0 : options.length),
|
|
759
|
+
initialHighlightedIndex: -1,
|
|
760
|
+
initialQuery: navigationMode
|
|
761
|
+
? undefined
|
|
762
|
+
: formulaMode
|
|
763
|
+
? undefined
|
|
764
|
+
: value,
|
|
765
|
+
isNewValue: isNewValue,
|
|
766
|
+
items: finalOptions,
|
|
767
|
+
onChange: handleDropdownChange,
|
|
768
|
+
itemToString: itemToString,
|
|
769
|
+
itemsWhenEmpty: itemsWhenEmpty,
|
|
770
|
+
// Only meaningful for the plain (data-validation) dropdown — formula
|
|
771
|
+
// mode's function/reference suggestions have no "current entry".
|
|
772
|
+
isItemSelected: !navigationMode && !formulaMode ? isOptionSelected : undefined,
|
|
773
|
+
limit: formulaMode
|
|
774
|
+
? tableToken
|
|
775
|
+
? Number.MAX_SAFE_INTEGER
|
|
776
|
+
: cellPropertyToken
|
|
777
|
+
? Number.MAX_SAFE_INTEGER
|
|
778
|
+
: 10
|
|
779
|
+
: Number.MAX_SAFE_INTEGER,
|
|
780
|
+
showAllIfEmpty: !formulaMode || !!tableToken || !!cellPropertyToken,
|
|
781
|
+
}), isOpen = _w.isOpen, highlightedIndex = _w.highlightedIndex, onSelect = _w.onSelect, onChangeHighlightedIndex = _w.onChangeHighlightedIndex, items = _w.items, onDropdownKeyDown = _w.onKeyDown, setQuery = _w.setQuery, query = _w.query;
|
|
782
|
+
// Update dropdown query when suggestion token changes
|
|
783
|
+
useIsomorphicLayoutEffect(function () {
|
|
784
|
+
var _a, _b, _c, _d;
|
|
785
|
+
if (navigationModeRef.current)
|
|
786
|
+
return;
|
|
787
|
+
var token = suggestionTokenRef.current;
|
|
788
|
+
if (token) {
|
|
789
|
+
if (((_a = token.tokenType) === null || _a === void 0 ? void 0 : _a.name) ===
|
|
790
|
+
tokenVocabulary.UnterminatedStringStart.name) {
|
|
791
|
+
var cleaned = (_c = (_b = token.image) === null || _b === void 0 ? void 0 : _b.replace(/"/g, "")) !== null && _c !== void 0 ? _c : "";
|
|
792
|
+
setQuery(cleaned);
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
setQuery((_d = token.image) !== null && _d !== void 0 ? _d : "");
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
}, [setQuery]);
|
|
799
|
+
// Show dropdown if functiontoken is present
|
|
800
|
+
var isDropdownOpen = Boolean(isOpen ||
|
|
801
|
+
(formulaMode && !isEdgeofCell && (items.length > 1 || functionToken)));
|
|
802
|
+
var showDropdownEffective = showDropdown && !navigationMode;
|
|
803
|
+
// Handle update editor
|
|
804
|
+
var handleUpdate = useCallback(function (address, selectionMode) {
|
|
805
|
+
if (!viewRef.current) {
|
|
806
|
+
console.warn("handleUpdate: Editor view not available");
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
809
|
+
try {
|
|
810
|
+
var state = viewRef.current.state;
|
|
811
|
+
var tr = state.tr;
|
|
812
|
+
var activeToken = activeTokenRef.current;
|
|
813
|
+
if (selectionMode === "modify" && activeToken) {
|
|
814
|
+
var from = Math.max(0, activeToken.startColumn);
|
|
815
|
+
var to = Math.min(state.doc.content.size, activeToken.endColumn + 1);
|
|
816
|
+
// Bounds checking
|
|
817
|
+
if (from >= 0 && to <= state.doc.content.size && from <= to) {
|
|
818
|
+
tr.delete(from, to);
|
|
819
|
+
}
|
|
820
|
+
else {
|
|
821
|
+
console.warn("Invalid delete range: ".concat(from, "-").concat(to, ", doc size: ").concat(state.doc.content.size));
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
if (selectionMode === "append" &&
|
|
825
|
+
activeToken &&
|
|
826
|
+
isCellToken(activeToken)) {
|
|
827
|
+
tr.insertText(",");
|
|
828
|
+
}
|
|
829
|
+
if (address && typeof address === "string") {
|
|
830
|
+
// Sanitize address string
|
|
831
|
+
var cleanAddress = address.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
|
|
832
|
+
tr.insertText(cleanAddress);
|
|
833
|
+
}
|
|
834
|
+
viewRef.current.dispatch(tr);
|
|
835
|
+
}
|
|
836
|
+
catch (error) {
|
|
837
|
+
log("Error updating editor:", error);
|
|
838
|
+
}
|
|
839
|
+
}, []);
|
|
840
|
+
// Cycle between absolute and relative references
|
|
841
|
+
var onCycleReference = useCycleFormulaReference({
|
|
842
|
+
onUpdate: handleUpdate,
|
|
843
|
+
});
|
|
844
|
+
// KeyDown handler
|
|
845
|
+
var handleKeyDown = useCallback(function (e) {
|
|
846
|
+
if (!navigationMode && showDropdownEffective && isDropdownOpen) {
|
|
847
|
+
onDropdownKeyDown === null || onDropdownKeyDown === void 0 ? void 0 : onDropdownKeyDown(e);
|
|
848
|
+
}
|
|
849
|
+
if (!navigationMode && mentionState.active) {
|
|
850
|
+
onMentionKeydown(e);
|
|
851
|
+
}
|
|
852
|
+
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
|
|
853
|
+
}, [
|
|
854
|
+
onKeyDown,
|
|
855
|
+
onDropdownKeyDown,
|
|
856
|
+
showDropdownEffective,
|
|
857
|
+
isDropdownOpen,
|
|
858
|
+
mentionState,
|
|
859
|
+
onMentionKeydown,
|
|
860
|
+
navigationMode,
|
|
861
|
+
]);
|
|
862
|
+
var handleKeyDownCapture = useCallback(function (e) {
|
|
863
|
+
if (!navigationMode) {
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
var key = e.key.toLowerCase();
|
|
867
|
+
var isUndoRedoShortcut = (e.metaKey || e.ctrlKey) &&
|
|
868
|
+
!e.altKey &&
|
|
869
|
+
(key === "z" || key === "y");
|
|
870
|
+
if (isUndoRedoShortcut) {
|
|
871
|
+
e.preventDefault();
|
|
872
|
+
}
|
|
873
|
+
}, [navigationMode]);
|
|
874
|
+
// Insert break handler for ProseMirror
|
|
875
|
+
var handleInsertBreak = useCallback(function () {
|
|
876
|
+
if (viewRef.current) {
|
|
877
|
+
var state = viewRef.current.state;
|
|
878
|
+
var $from = state.selection.$from;
|
|
879
|
+
// Check if we can split at this position
|
|
880
|
+
var canSplit = $from.depth > 0;
|
|
881
|
+
if (canSplit) {
|
|
882
|
+
// Split the line at the cursor position
|
|
883
|
+
var tr = state.tr.split($from.pos);
|
|
884
|
+
// Move cursor to the start of the new line (right after the split)
|
|
885
|
+
var newPos = $from.pos + 2; // +2 to move into the new line node
|
|
886
|
+
if (newPos <= tr.doc.content.size) {
|
|
887
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
|
|
888
|
+
}
|
|
889
|
+
viewRef.current.dispatch(tr);
|
|
890
|
+
}
|
|
891
|
+
else {
|
|
892
|
+
// Fallback: just insert a new line node
|
|
893
|
+
var newLine = state.schema.nodes.line.create();
|
|
894
|
+
var tr = state.tr.replaceSelectionWith(newLine);
|
|
895
|
+
var newPos = tr.selection.from + 1;
|
|
896
|
+
if (newPos <= tr.doc.content.size) {
|
|
897
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
|
|
898
|
+
}
|
|
899
|
+
viewRef.current.dispatch(tr);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}, []);
|
|
903
|
+
var canSubmitInDropdown = function () {
|
|
904
|
+
var token = suggestionTokenRef.current;
|
|
905
|
+
var item = items[highlightedIndex];
|
|
906
|
+
if ((token === null || token === void 0 ? void 0 : token.property) && item) {
|
|
907
|
+
return (item === null || item === void 0 ? void 0 : item.title) === (token === null || token === void 0 ? void 0 : token.property);
|
|
908
|
+
}
|
|
909
|
+
if (item && item.category === "namedrange") {
|
|
910
|
+
return item.title === (token === null || token === void 0 ? void 0 : token.image);
|
|
911
|
+
}
|
|
912
|
+
return false;
|
|
913
|
+
};
|
|
914
|
+
// Editor keydown handler
|
|
915
|
+
var canSubmit = (highlightedIndex === -1 ||
|
|
916
|
+
items.length === 0 ||
|
|
917
|
+
canSubmitInDropdown()) &&
|
|
918
|
+
!showMentionDropdownEffective;
|
|
919
|
+
var onKeyDownEditor = useEditorKeyDownPM({
|
|
920
|
+
value: value,
|
|
921
|
+
formulaMode: formulaMode,
|
|
922
|
+
isNewValue: isNewValue,
|
|
923
|
+
isActive: isActive,
|
|
924
|
+
isCursorAtEnd: isCursorAtEnd,
|
|
925
|
+
onCancel: !navigationMode ? onCancel : undefined,
|
|
926
|
+
onSubmit: !navigationMode ? onSubmit : undefined,
|
|
927
|
+
onInsertBreak: handleInsertBreak,
|
|
928
|
+
onKeyDown: handleKeyDown,
|
|
929
|
+
canSubmit: canSubmit,
|
|
930
|
+
canCancel: !isOpen && !showMentionDropdownEffective,
|
|
931
|
+
isDropdownOpen: isDropdownOpen,
|
|
932
|
+
getView: getView,
|
|
933
|
+
});
|
|
934
|
+
// Move cursor to the end
|
|
935
|
+
var moveCursorToEnd = useCallback(function () {
|
|
936
|
+
if (!viewRef.current) {
|
|
937
|
+
console.warn("moveCursorToEnd: Editor view not available");
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
try {
|
|
941
|
+
var state = viewRef.current.state;
|
|
942
|
+
var pos = Math.min(state.doc.content.size, Math.max(0, state.doc.content.size));
|
|
943
|
+
if (pos >= 0 && pos <= state.doc.content.size) {
|
|
944
|
+
var tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(pos)));
|
|
945
|
+
viewRef.current.dispatch(tr);
|
|
946
|
+
}
|
|
947
|
+
else {
|
|
948
|
+
console.warn("Invalid cursor position for moveCursorToEnd: ".concat(pos));
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
catch (error) {
|
|
952
|
+
log("Error moving cursor to end:", error);
|
|
953
|
+
}
|
|
954
|
+
}, []);
|
|
955
|
+
// In Strict mode, memo refs are not changed afaik
|
|
956
|
+
var imperativeMethods = useMemo(function () { return ({
|
|
957
|
+
update: handleUpdate,
|
|
958
|
+
teardown: handleTeardown,
|
|
959
|
+
setValue: function (value, formatRuns) {
|
|
960
|
+
var _a, _b;
|
|
961
|
+
if (!viewRef.current) {
|
|
962
|
+
console.warn("setValue: Editor view not available");
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
try {
|
|
966
|
+
(_b = (_a = viewRef.current).endComposition) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
967
|
+
var newDoc = !isAFormula(value) && formatRuns && formatRuns.length > 0
|
|
968
|
+
? applyTextFormatRuns(value, formatRuns, schema, resolveRunColor)
|
|
969
|
+
: deserializeString(value, schema);
|
|
970
|
+
var state = viewRef.current.state;
|
|
971
|
+
var currentSelection = state.selection;
|
|
972
|
+
var tr = state.tr.replaceWith(0, state.doc.content.size, newDoc.content);
|
|
973
|
+
// Try to preserve cursor position if it's still valid
|
|
974
|
+
var newDocSize = tr.doc.content.size;
|
|
975
|
+
var preservedPos = Math.min(Math.max(0, currentSelection.from), newDocSize);
|
|
976
|
+
// Set selection to preserved position with bounds checking
|
|
977
|
+
if (preservedPos >= 0 && preservedPos <= newDocSize) {
|
|
978
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(preservedPos)));
|
|
979
|
+
}
|
|
980
|
+
viewRef.current.dispatch(tr);
|
|
981
|
+
}
|
|
982
|
+
catch (error) {
|
|
983
|
+
log("Error setting editor value:", error);
|
|
984
|
+
// Fallback: try to set empty content
|
|
985
|
+
try {
|
|
986
|
+
var emptyDoc = schema.node("doc", null, [
|
|
987
|
+
schema.node("line", null, []),
|
|
988
|
+
]);
|
|
989
|
+
var tr = viewRef.current.state.tr.replaceWith(0, viewRef.current.state.doc.content.size, emptyDoc.content);
|
|
990
|
+
viewRef.current.dispatch(tr);
|
|
991
|
+
}
|
|
992
|
+
catch (fallbackError) {
|
|
993
|
+
log("Error in setValue fallback:", fallbackError);
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
},
|
|
997
|
+
getValue: function () {
|
|
998
|
+
return getCurrentValue();
|
|
999
|
+
},
|
|
1000
|
+
applyTextFormat: function (format) {
|
|
1001
|
+
var view = viewRef.current;
|
|
1002
|
+
if (!view) {
|
|
1003
|
+
return false;
|
|
1004
|
+
}
|
|
1005
|
+
var handled = applyTextFormatToSelection(view.state, view.dispatch, format, schema, resolveRunColor);
|
|
1006
|
+
// Focus is NOT managed here. The ProseMirror selection survives
|
|
1007
|
+
// without DOM focus, and the toolbar's existing machinery
|
|
1008
|
+
// (ToolbarIconButton -> focusSheet, dropdown onCloseAutoFocus)
|
|
1009
|
+
// already returns focus to the sheet after a control is used —
|
|
1010
|
+
// taking focus synchronously from inside a control's event
|
|
1011
|
+
// handler lets that event's default action land in the editor.
|
|
1012
|
+
return handled;
|
|
1013
|
+
},
|
|
1014
|
+
getSelectionFontSize: function () {
|
|
1015
|
+
var view = viewRef.current;
|
|
1016
|
+
if (!view) {
|
|
1017
|
+
return null;
|
|
1018
|
+
}
|
|
1019
|
+
return getSelectionFontSize(view.state);
|
|
1020
|
+
},
|
|
1021
|
+
moveCursorToEnd: moveCursorToEnd,
|
|
1022
|
+
moveCursorToTokenEnd: function (index) {
|
|
1023
|
+
var e_1, _a;
|
|
1024
|
+
if (index === undefined || index === null) {
|
|
1025
|
+
this.moveCursorToEnd();
|
|
1026
|
+
return;
|
|
1027
|
+
}
|
|
1028
|
+
var tokens = tokenizer(getCurrentValue());
|
|
1029
|
+
try {
|
|
1030
|
+
for (var tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next(); !tokens_1_1.done; tokens_1_1 = tokens_1.next()) {
|
|
1031
|
+
var token = tokens_1_1.value;
|
|
1032
|
+
if ((token.selection || token.structured || token.isNamedRange) &&
|
|
1033
|
+
token.index === index &&
|
|
1034
|
+
token.endColumn !== undefined) {
|
|
1035
|
+
// Token columns are ProseMirror positions (see
|
|
1036
|
+
// `handleUpdate`); the caret slot after the token's
|
|
1037
|
+
// last character is endColumn + 1
|
|
1038
|
+
this.select(token.endColumn + 1);
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
1044
|
+
finally {
|
|
1045
|
+
try {
|
|
1046
|
+
if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1);
|
|
1047
|
+
}
|
|
1048
|
+
finally { if (e_1) throw e_1.error; }
|
|
1049
|
+
}
|
|
1050
|
+
this.moveCursorToEnd();
|
|
1051
|
+
},
|
|
1052
|
+
focus: function (shouldMoveSelectionToEnd) {
|
|
1053
|
+
if (!persistFocus) {
|
|
1054
|
+
console.debug("Focus persisting disabled");
|
|
1055
|
+
return;
|
|
1056
|
+
}
|
|
1057
|
+
focusEditor();
|
|
1058
|
+
if (shouldMoveSelectionToEnd) {
|
|
1059
|
+
this.moveCursorToEnd();
|
|
1060
|
+
}
|
|
1061
|
+
},
|
|
1062
|
+
isFocused: function () {
|
|
1063
|
+
if (!viewRef.current)
|
|
1064
|
+
return false;
|
|
1065
|
+
return (viewRef.current.hasFocus() ||
|
|
1066
|
+
document.activeElement === viewRef.current.dom);
|
|
1067
|
+
},
|
|
1068
|
+
get selection() {
|
|
1069
|
+
var _a, _b;
|
|
1070
|
+
return (_b = (_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.state.selection.from) !== null && _b !== void 0 ? _b : null;
|
|
1071
|
+
},
|
|
1072
|
+
select: function (target) {
|
|
1073
|
+
if (!viewRef.current) {
|
|
1074
|
+
console.warn("select: Editor view not available");
|
|
1075
|
+
return;
|
|
1076
|
+
}
|
|
1077
|
+
try {
|
|
1078
|
+
var state = viewRef.current.state;
|
|
1079
|
+
// Validate target position
|
|
1080
|
+
if (typeof target !== "number" || !isFinite(target)) {
|
|
1081
|
+
console.warn("Invalid select target: ".concat(target));
|
|
1082
|
+
return;
|
|
1083
|
+
}
|
|
1084
|
+
var pos = Math.min(Math.max(0, target), state.doc.content.size);
|
|
1085
|
+
if (pos >= 0 && pos <= state.doc.content.size) {
|
|
1086
|
+
var tr = state.tr.setSelection(TextSelection.near(state.doc.resolve(pos)));
|
|
1087
|
+
viewRef.current.dispatch(tr);
|
|
1088
|
+
}
|
|
1089
|
+
else {
|
|
1090
|
+
console.warn("Invalid cursor position for select: ".concat(pos));
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
catch (error) {
|
|
1094
|
+
log("Error selecting position:", error);
|
|
1095
|
+
}
|
|
1096
|
+
},
|
|
1097
|
+
el: function () {
|
|
1098
|
+
var _a;
|
|
1099
|
+
return (_a = viewRef.current) === null || _a === void 0 ? void 0 : _a.dom;
|
|
1100
|
+
},
|
|
1101
|
+
}); }, [
|
|
1102
|
+
focusEditor,
|
|
1103
|
+
handleUpdate,
|
|
1104
|
+
handleTeardown,
|
|
1105
|
+
persistFocus,
|
|
1106
|
+
getCurrentValue,
|
|
1107
|
+
moveCursorToEnd,
|
|
1108
|
+
tokenizer,
|
|
1109
|
+
resolveRunColor,
|
|
1110
|
+
]);
|
|
1111
|
+
// Expose editor methods
|
|
1112
|
+
useImperativeHandle(forwardedRef, function () { return imperativeMethods; }, [
|
|
1113
|
+
imperativeMethods,
|
|
1114
|
+
]);
|
|
1115
|
+
// Auto focus
|
|
1116
|
+
useIsomorphicLayoutEffect(function () {
|
|
1117
|
+
if (autoFocus && viewRef.current) {
|
|
1118
|
+
focusEditor();
|
|
1119
|
+
moveCursorToEnd();
|
|
1120
|
+
}
|
|
1121
|
+
}, [autoFocus, focusEditor, moveCursorToEnd]);
|
|
1122
|
+
return (React.createElement(Popper.Root, null,
|
|
1123
|
+
!showDropdownEffective ||
|
|
1124
|
+
showFormulaHelp ||
|
|
1125
|
+
!functionToken ? null : (React.createElement(StyledFormulaHelp, { onMouseDown: onShowFormulaHelp, title: "Show formula help", className: cn(editorZeroOutline ? "mr-px top-px" : undefined) },
|
|
1126
|
+
React.createElement(QuestionMarkIcon, { width: 12, height: 12 }))),
|
|
1127
|
+
!navigationMode && isFetchingParameters && (React.createElement("div", { className: "absolute top-1/2 right-[-18px] -translate-y-1/2 h-[14px]" },
|
|
1128
|
+
React.createElement(LoadingIcon, { className: "animate-spin" }))),
|
|
1129
|
+
React.createElement("div", { className: "h-full overflow-auto [&_div]:outline-none" },
|
|
1130
|
+
React.createElement("div", __assign({ ref: editorRef, className: cn(className, "whitespace-pre-wrap"), onKeyDownCapture: handleKeyDownCapture, onKeyDown: onKeyDownEditor }, props))),
|
|
1131
|
+
React.createElement(Popper.Anchor, { asChild: true },
|
|
1132
|
+
React.createElement("button", { tabIndex: -1, className: cn("absolute left-0 top-0 w-0 h-full overflow-hidden m-0 p-0 border-none bg-transparent shadow-none"), style: {
|
|
1133
|
+
left: showMentionDropdownEffective ? mentionPositionLeft : 0,
|
|
1134
|
+
} })),
|
|
1135
|
+
showDropdownEffective && isDropdownOpen && (React.createElement(ConditionalWrapper, { condition: stickyEditor, wrapper: function (children) { return React.createElement(Portal, { asChild: true }, children); } },
|
|
1136
|
+
React.createElement(Popper.Content, { side: "bottom", align: "start", className: "z-50", sideOffset: 2 },
|
|
1137
|
+
React.createElement(SuggestionsDropdown, { functionDescriptions: functionDescriptions, formulaMode: formulaMode, dropdownStyles: dropdownStyles, functionToken: functionToken, parameterIndex: parameterIndex, items: items, highlightedIndex: highlightedIndex, onSelect: onSelect, onChangeHighlightedIndex: onChangeHighlightedIndex, showFormulaHelp: showFormulaHelp, onHideFormulaHelp: onHideFormulaHelp })))),
|
|
1138
|
+
showDropdownEffective && showMentionDropdownEffective && (React.createElement(ConditionalWrapper, { condition: stickyEditor, wrapper: function (children) { return React.createElement(Portal, { asChild: true }, children); } },
|
|
1139
|
+
React.createElement(Popper.Content, { side: "bottom", align: "start", className: "z-50", sideOffset: 2 },
|
|
1140
|
+
React.createElement(MentionsDropdown, { mentions: mentions, onSelect: handleInsertMention, highlightedIndex: mentionHighlightedIndex, isFetchingMentions: isFetchingMentions, MentionDropdownItemComponent: MentionDropdownItemComponent }))))));
|
|
1141
|
+
}));
|
|
1142
|
+
export var ProseMirrorEditor = withErrorBoundary(ProseMirrorEditorThatMayError, {
|
|
1143
|
+
FallbackComponent: ErrorFallback,
|
|
1144
|
+
});
|
|
1145
|
+
ProseMirrorEditor.displayName = "ProseMirrorEditor";
|