@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 @@
|
|
|
1
|
+
{"version":3,"file":"use-editor-decorator-pm.d.ts","sourceRoot":"","sources":["../../../editor-pm/use-editor-decorator-pm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAc,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,uDAKlC,mBAAmB,aAEV,WAAW,KAAG,aAoFzB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getSelectionColorAtIndex, isNil } from "@rowsncolumns/utils";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { Decoration, DecorationSet } from "prosemirror-view";
|
|
4
|
+
import { isNumberToken, isStringToken, isTableColumnToken, } from "./helpers";
|
|
5
|
+
export const useEditorDecoratorPM = ({ cursorPosition, formulaMode, tokenizer, isActive, }) => {
|
|
6
|
+
return useCallback((state) => {
|
|
7
|
+
const decorations = [];
|
|
8
|
+
if (!formulaMode) {
|
|
9
|
+
return DecorationSet.create(state.doc, []);
|
|
10
|
+
}
|
|
11
|
+
// Only for formulas
|
|
12
|
+
const text = state.doc.textContent;
|
|
13
|
+
const tokens = tokenizer(text);
|
|
14
|
+
// Adds a cell suggestion cursor
|
|
15
|
+
if (isActive && cursorPosition !== undefined && text) {
|
|
16
|
+
decorations.push(Decoration.widget(cursorPosition, () => {
|
|
17
|
+
const span = document.createElement("span");
|
|
18
|
+
span.className =
|
|
19
|
+
"bg-contain w-[8px] h-[12px] cursor-default inline-block leading-3 align-bottom";
|
|
20
|
+
span.style.background =
|
|
21
|
+
"url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNjY2MiPjxwYXRoIGQ9Ik0wLjUgMEwwLjUgM00wIDIuNUw4IDIuNU03LjUgM0w3LjUgMCIvPjwvc3ZnPg==) bottom no-repeat";
|
|
22
|
+
return span;
|
|
23
|
+
}, { side: 0 }));
|
|
24
|
+
}
|
|
25
|
+
let prevToken;
|
|
26
|
+
let offset = 0;
|
|
27
|
+
tokens.forEach((token, idx) => {
|
|
28
|
+
const add = token.startOffset + (idx === 0 ? 1 : 0) - (prevToken?.endColumn ?? 0);
|
|
29
|
+
const from = offset + add;
|
|
30
|
+
const to = from + token.image.length;
|
|
31
|
+
// Get color for the token
|
|
32
|
+
const color = !isNil(token.index)
|
|
33
|
+
? getSelectionColorAtIndex(token.index)
|
|
34
|
+
: isTableColumnToken(token)
|
|
35
|
+
? "#2653BA"
|
|
36
|
+
: isStringToken(token)
|
|
37
|
+
? "#008000"
|
|
38
|
+
: isNumberToken(token)
|
|
39
|
+
? "#15c"
|
|
40
|
+
: undefined;
|
|
41
|
+
if (color) {
|
|
42
|
+
decorations.push(Decoration.inline(from, to, {
|
|
43
|
+
style: `color: ${color}`,
|
|
44
|
+
}, {}));
|
|
45
|
+
}
|
|
46
|
+
// Handle bold tokens if needed (if the token type supports it)
|
|
47
|
+
if (token.bold) {
|
|
48
|
+
decorations.push(Decoration.inline(from, to, {
|
|
49
|
+
style: "font-weight: bold",
|
|
50
|
+
}, {}));
|
|
51
|
+
}
|
|
52
|
+
prevToken = token;
|
|
53
|
+
offset = to;
|
|
54
|
+
});
|
|
55
|
+
return DecorationSet.create(state.doc, decorations);
|
|
56
|
+
}, [cursorPosition, isActive, formulaMode, tokenizer]);
|
|
57
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { EditorView } from "prosemirror-view";
|
|
2
|
+
import { TextFormatRun } from "./types.js";
|
|
3
|
+
type UseEditorKeyDownPMProps = {
|
|
4
|
+
value: string;
|
|
5
|
+
formulaMode?: boolean;
|
|
6
|
+
isNewValue?: boolean;
|
|
7
|
+
isCursorAtEnd(): boolean;
|
|
8
|
+
onInsertBreak(): void;
|
|
9
|
+
onSubmit?(value: string, textFormatRuns: TextFormatRun[] | undefined | null, e: React.KeyboardEvent<HTMLDivElement>): void;
|
|
10
|
+
onCancel?(e: React.KeyboardEvent<HTMLDivElement>): void;
|
|
11
|
+
onKeyDown?(e: React.KeyboardEvent<HTMLDivElement>): void;
|
|
12
|
+
canSubmit?: boolean;
|
|
13
|
+
canCancel?: boolean;
|
|
14
|
+
isActive?: boolean;
|
|
15
|
+
isDropdownOpen?: boolean;
|
|
16
|
+
isMentionDropdownOpen?: boolean;
|
|
17
|
+
getView(): EditorView | null;
|
|
18
|
+
};
|
|
19
|
+
export declare const useEditorKeyDownPM: ({ formulaMode, isNewValue, isCursorAtEnd, onInsertBreak, onSubmit, onCancel, onKeyDown, getView, isActive, value, canSubmit, canCancel, isDropdownOpen, }: UseEditorKeyDownPMProps) => (e: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=use-editor-keydown-pm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-editor-keydown-pm.d.ts","sourceRoot":"","sources":["../../../editor-pm/use-editor-keydown-pm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,IAAI,OAAO,CAAC;IACzB,aAAa,IAAI,IAAI,CAAC;IACtB,QAAQ,CAAC,CACP,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,IAAI,EAClD,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,GACrC,IAAI,CAAC;IACR,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,IAAI,UAAU,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,2JAchC,uBAAuB,SASlB,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,SAmF1C,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { isAnArrowKey } from "@rowsncolumns/utils";
|
|
2
|
+
import { useCallback, useRef } from "react";
|
|
3
|
+
import { useIsomorphicLayoutEffect } from "../hooks/use-isomorphic-layout-effect.ts";
|
|
4
|
+
import { extractTextFormatRuns, serializeEditorValue } from "./helpers.js";
|
|
5
|
+
export const useEditorKeyDownPM = ({ formulaMode, isNewValue, isCursorAtEnd, onInsertBreak, onSubmit, onCancel, onKeyDown, getView, isActive, value, canSubmit = true, canCancel = true, isDropdownOpen, }) => {
|
|
6
|
+
const valueRef = useRef(undefined);
|
|
7
|
+
// Used in keydown handler, closure
|
|
8
|
+
useIsomorphicLayoutEffect(() => {
|
|
9
|
+
valueRef.current = value;
|
|
10
|
+
}, [value]);
|
|
11
|
+
return useCallback((e) => {
|
|
12
|
+
const nativeEvent = e.nativeEvent;
|
|
13
|
+
const view = getView();
|
|
14
|
+
const isComposing = nativeEvent.isComposing ||
|
|
15
|
+
nativeEvent.keyCode === 229 ||
|
|
16
|
+
nativeEvent.key === "Process" ||
|
|
17
|
+
view?.composing;
|
|
18
|
+
if (isComposing &&
|
|
19
|
+
(e.key === "Enter" ||
|
|
20
|
+
e.key === "Tab" ||
|
|
21
|
+
e.key === "Escape" ||
|
|
22
|
+
isAnArrowKey(e.key))) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Handle line breaks
|
|
26
|
+
const key = e.key;
|
|
27
|
+
const isEnter = key === "Enter";
|
|
28
|
+
const isTab = key === "Tab";
|
|
29
|
+
const isEscape = key === "Escape";
|
|
30
|
+
const isArrow = isAnArrowKey(key);
|
|
31
|
+
const smartSubmit = !formulaMode &&
|
|
32
|
+
isArrow &&
|
|
33
|
+
isNewValue &&
|
|
34
|
+
isCursorAtEnd() &&
|
|
35
|
+
!isDropdownOpen;
|
|
36
|
+
// Insert an in-cell line break on Alt+Enter (universal Excel/Sheets) or
|
|
37
|
+
// Cmd+Enter (Mac). Ctrl+Enter is deliberately NOT a line break — it
|
|
38
|
+
// commits (and on Windows is the only commit chord), matching Excel.
|
|
39
|
+
// Previously this fired on metaKey||ctrlKey, so Alt+Enter fell through
|
|
40
|
+
// to the submit path and destructively committed instead of newlining.
|
|
41
|
+
if (isEnter && (e.altKey || e.metaKey)) {
|
|
42
|
+
onInsertBreak();
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Submit handler
|
|
47
|
+
if (canSubmit && (isEnter || isTab || smartSubmit)) {
|
|
48
|
+
/* Commit the value from the live ProseMirror doc instead of the
|
|
49
|
+
lagging React-state mirror (valueRef), which dropped fast/long
|
|
50
|
+
type-to-edit input and committed blank cells (and bled the stale
|
|
51
|
+
buffer into the next cell). Formula commits keep valueRef so
|
|
52
|
+
cell-reference token state is unchanged. */
|
|
53
|
+
const submitView = getView();
|
|
54
|
+
const submitValue = !formulaMode && submitView
|
|
55
|
+
? serializeEditorValue(submitView.state.doc)
|
|
56
|
+
: valueRef.current ?? "";
|
|
57
|
+
onSubmit?.(submitValue, extractTextFormatRuns(submitView?.state.doc), e);
|
|
58
|
+
}
|
|
59
|
+
// Cancel handler
|
|
60
|
+
if (canCancel && isEscape) {
|
|
61
|
+
/* Trigger cancel */
|
|
62
|
+
onCancel?.(e);
|
|
63
|
+
}
|
|
64
|
+
// Callback
|
|
65
|
+
onKeyDown?.(e);
|
|
66
|
+
}, [
|
|
67
|
+
onKeyDown,
|
|
68
|
+
onSubmit,
|
|
69
|
+
onCancel,
|
|
70
|
+
getView,
|
|
71
|
+
isNewValue,
|
|
72
|
+
isCursorAtEnd,
|
|
73
|
+
formulaMode,
|
|
74
|
+
isDropdownOpen,
|
|
75
|
+
onInsertBreak,
|
|
76
|
+
canSubmit,
|
|
77
|
+
canCancel,
|
|
78
|
+
]);
|
|
79
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MentionState } from "./mentions-plugin";
|
|
2
|
+
import { Mention } from "@rowsncolumns/common-types";
|
|
3
|
+
export declare const useMentionKeyDown: ({ mentions, mentionState, onSelect, }: {
|
|
4
|
+
mentions: Mention[];
|
|
5
|
+
mentionState: MentionState;
|
|
6
|
+
onSelect: (mention: Mention) => void;
|
|
7
|
+
}) => {
|
|
8
|
+
onMentionKeydown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
9
|
+
highlightedIndex: number;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=use-mention-keydown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-mention-keydown.d.ts","sourceRoot":"","sources":["../../../editor-pm/use-mention-keydown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,eAAO,MAAM,iBAAiB,GAAI,uCAI/B;IACD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;0BAOO,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC;;CAsD1C,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from "react";
|
|
2
|
+
import { useIsomorphicLayoutEffect } from "../hooks/use-isomorphic-layout-effect.ts";
|
|
3
|
+
export const useMentionKeyDown = ({ mentions, mentionState, onSelect, }) => {
|
|
4
|
+
const [highlightedIndex, setHighlightedIndex] = useState(0);
|
|
5
|
+
const highlightedIndexRef = useRef(undefined);
|
|
6
|
+
useIsomorphicLayoutEffect(() => {
|
|
7
|
+
highlightedIndexRef.current = highlightedIndex;
|
|
8
|
+
}, [highlightedIndex]);
|
|
9
|
+
const onMentionKeydown = useCallback((e) => {
|
|
10
|
+
const len = mentions.length - 1;
|
|
11
|
+
const index = highlightedIndexRef.current;
|
|
12
|
+
// No items
|
|
13
|
+
if (len === 0) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
switch (e.key) {
|
|
17
|
+
case "ArrowDown": {
|
|
18
|
+
setHighlightedIndex((prev) => {
|
|
19
|
+
if (prev === len) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
return Math.min(prev + 1, len);
|
|
23
|
+
});
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case "ArrowUp":
|
|
28
|
+
setHighlightedIndex((prev) => {
|
|
29
|
+
if (prev === 0) {
|
|
30
|
+
return len;
|
|
31
|
+
}
|
|
32
|
+
return Math.max(0, prev - 1);
|
|
33
|
+
});
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
break;
|
|
36
|
+
case "Escape":
|
|
37
|
+
if (mentionState.active) {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case "Tab":
|
|
42
|
+
case "Enter": {
|
|
43
|
+
if (index === -1 || index === undefined) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const selectedItem = mentions[index];
|
|
47
|
+
onSelect(selectedItem);
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, [mentions, mentionState, onSelect]);
|
|
53
|
+
return {
|
|
54
|
+
onMentionKeydown,
|
|
55
|
+
highlightedIndex,
|
|
56
|
+
};
|
|
57
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ParsedToken } from "@rowsncolumns/calculator";
|
|
2
|
+
import type { OptionItem } from "./types";
|
|
3
|
+
type Params = {
|
|
4
|
+
functionToken: ParsedToken | undefined;
|
|
5
|
+
parameterIndex: number;
|
|
6
|
+
parameterArguments: string[];
|
|
7
|
+
shouldFetchFunctionParameters?: (functionName: string, parameterIndex: number, parameters: string[]) => boolean;
|
|
8
|
+
getFunctionParameterSuggestions?: (functionName: string, parameterIndex: number, parameters: string[]) => OptionItem[] | undefined | Promise<OptionItem[] | undefined> | Promise<OptionItem[]>;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Fetch parameter suggestions (sync or async) for the active function.
|
|
12
|
+
* Ensures stale responses are ignored when dependency changes mid-flight.
|
|
13
|
+
*/
|
|
14
|
+
export declare const useParameterSuggestions: ({ functionToken, parameterIndex, parameterArguments, shouldFetchFunctionParameters, getFunctionParameterSuggestions, }: Params) => {
|
|
15
|
+
parameterSuggestions: OptionItem[];
|
|
16
|
+
isFetchingParameters: boolean;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=use-parameter-suggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-parameter-suggestions.d.ts","sourceRoot":"","sources":["../../../editor-pm/use-parameter-suggestions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,MAAM,GAAG;IACZ,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,6BAA6B,CAAC,EAAE,CAC9B,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAAE,KACjB,OAAO,CAAC;IACb,+BAA+B,CAAC,EAAE,CAChC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAAE,KAElB,UAAU,EAAE,GACZ,SAAS,GACT,OAAO,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,GACjC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,wHAMrC,MAAM;;;CA4ER,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { DEFAULT_ARRAY } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
/**
|
|
4
|
+
* Fetch parameter suggestions (sync or async) for the active function.
|
|
5
|
+
* Ensures stale responses are ignored when dependency changes mid-flight.
|
|
6
|
+
*/
|
|
7
|
+
export const useParameterSuggestions = ({ functionToken, parameterIndex, parameterArguments, shouldFetchFunctionParameters, getFunctionParameterSuggestions, }) => {
|
|
8
|
+
const [parameterSuggestions, setSuggestions] = useState([]);
|
|
9
|
+
const [isFetchingParameters, setIsFetchingParameters] = useState(false);
|
|
10
|
+
const requestIdRef = useRef(0);
|
|
11
|
+
const functionName = functionToken?.image ?? "";
|
|
12
|
+
const hasFunctionToken = Boolean(functionToken);
|
|
13
|
+
const parameterArgsKey = useMemo(() => JSON.stringify(parameterArguments ?? []), [parameterArguments]);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
requestIdRef.current += 1;
|
|
16
|
+
const requestId = requestIdRef.current;
|
|
17
|
+
if (!hasFunctionToken || !getFunctionParameterSuggestions) {
|
|
18
|
+
setIsFetchingParameters(false);
|
|
19
|
+
setSuggestions(DEFAULT_ARRAY);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (shouldFetchFunctionParameters &&
|
|
23
|
+
!shouldFetchFunctionParameters(functionName, parameterIndex, parameterArguments)) {
|
|
24
|
+
setIsFetchingParameters(false);
|
|
25
|
+
setSuggestions(DEFAULT_ARRAY);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
let cancelled = false;
|
|
29
|
+
const run = async () => {
|
|
30
|
+
try {
|
|
31
|
+
setIsFetchingParameters(true);
|
|
32
|
+
const result = await getFunctionParameterSuggestions(functionName, parameterIndex, parameterArguments);
|
|
33
|
+
if (!cancelled && requestIdRef.current === requestId) {
|
|
34
|
+
setSuggestions(result ?? []);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// Keep dropdown stable on errors instead of throwing
|
|
39
|
+
if (!cancelled && requestIdRef.current === requestId) {
|
|
40
|
+
console.warn("Error fetching parameter suggestions", error);
|
|
41
|
+
setSuggestions([]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
if (!cancelled && requestIdRef.current === requestId) {
|
|
46
|
+
setIsFetchingParameters(false);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
run();
|
|
51
|
+
return () => {
|
|
52
|
+
cancelled = true;
|
|
53
|
+
};
|
|
54
|
+
}, [
|
|
55
|
+
functionName,
|
|
56
|
+
hasFunctionToken,
|
|
57
|
+
parameterIndex,
|
|
58
|
+
parameterArgsKey,
|
|
59
|
+
shouldFetchFunctionParameters,
|
|
60
|
+
getFunctionParameterSuggestions,
|
|
61
|
+
]);
|
|
62
|
+
return {
|
|
63
|
+
parameterSuggestions,
|
|
64
|
+
isFetchingParameters,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-parameter-suggestions.test.d.ts","sourceRoot":"","sources":["../../../editor-pm/use-parameter-suggestions.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cleanup, render, screen, waitFor, act } from "@testing-library/react";
|
|
3
|
+
import { afterEach, describe, it, expect, vi } from "vitest";
|
|
4
|
+
import { useParameterSuggestions } from "./use-parameter-suggestions";
|
|
5
|
+
const TestHarness = ({ functionToken, fetcher, }) => {
|
|
6
|
+
const { parameterSuggestions } = useParameterSuggestions({
|
|
7
|
+
functionToken,
|
|
8
|
+
parameterIndex: 0,
|
|
9
|
+
parameterArguments: [],
|
|
10
|
+
getFunctionParameterSuggestions: fetcher,
|
|
11
|
+
});
|
|
12
|
+
return (React.createElement("div", { "data-testid": "items" }, parameterSuggestions.map((item) => item.title).join(",")));
|
|
13
|
+
};
|
|
14
|
+
const makeFunctionToken = (name = "SUM") => ({
|
|
15
|
+
image: name,
|
|
16
|
+
tokenType: { name: "Function", PATTERN: "" },
|
|
17
|
+
startColumn: 0,
|
|
18
|
+
endColumn: 0,
|
|
19
|
+
startOffset: 0,
|
|
20
|
+
endOffset: 0,
|
|
21
|
+
endLine: 0,
|
|
22
|
+
tokenTypeIdx: 0,
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => cleanup());
|
|
25
|
+
describe("useParameterSuggestions", () => {
|
|
26
|
+
it("returns async suggestions for an active function", async () => {
|
|
27
|
+
const fetcher = vi
|
|
28
|
+
.fn()
|
|
29
|
+
.mockResolvedValue([{ title: "paramA", category: "parameter" }]);
|
|
30
|
+
render(React.createElement(TestHarness, { functionToken: makeFunctionToken(), fetcher: fetcher }));
|
|
31
|
+
await waitFor(() => expect(screen.getByTestId("items").textContent).toBe("paramA"));
|
|
32
|
+
expect(fetcher).toHaveBeenCalledWith("SUM", 0, []);
|
|
33
|
+
});
|
|
34
|
+
it("ignores stale responses when function token changes", async () => {
|
|
35
|
+
let resolveFirst = () => { };
|
|
36
|
+
let resolveSecond = () => { };
|
|
37
|
+
const fetcher = vi
|
|
38
|
+
.fn()
|
|
39
|
+
.mockImplementationOnce(() => new Promise((res) => {
|
|
40
|
+
resolveFirst = res;
|
|
41
|
+
}))
|
|
42
|
+
.mockImplementationOnce(() => new Promise((res) => {
|
|
43
|
+
resolveSecond = res;
|
|
44
|
+
}));
|
|
45
|
+
const { rerender } = render(React.createElement(TestHarness, { functionToken: makeFunctionToken(), fetcher: fetcher }));
|
|
46
|
+
// Trigger second request with a new token
|
|
47
|
+
rerender(React.createElement(TestHarness, { functionToken: makeFunctionToken("AVG"), fetcher: fetcher }));
|
|
48
|
+
await act(async () => {
|
|
49
|
+
resolveFirst([{ title: "first", category: "parameter" }]);
|
|
50
|
+
});
|
|
51
|
+
expect(screen.getByTestId("items").textContent).toBe("");
|
|
52
|
+
await act(async () => {
|
|
53
|
+
resolveSecond([{ title: "second", category: "parameter" }]);
|
|
54
|
+
});
|
|
55
|
+
await waitFor(() => expect(screen.getByTestId("items").textContent).toBe("second"));
|
|
56
|
+
});
|
|
57
|
+
it("clears suggestions when there is no active function", async () => {
|
|
58
|
+
const fetcher = vi
|
|
59
|
+
.fn()
|
|
60
|
+
.mockResolvedValue([{ title: "paramA", category: "parameter" }]);
|
|
61
|
+
const { rerender } = render(React.createElement(TestHarness, { functionToken: makeFunctionToken(), fetcher: fetcher }));
|
|
62
|
+
await waitFor(() => expect(screen.getByTestId("items").textContent).toBe("paramA"));
|
|
63
|
+
rerender(React.createElement(TestHarness, { fetcher: fetcher }));
|
|
64
|
+
await waitFor(() => expect(screen.getByTestId("items").textContent).toBe(""));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type EyeDropperProps = {
|
|
3
|
+
value?: string;
|
|
4
|
+
onBeforeOpen?: () => void;
|
|
5
|
+
onChange?: (value: string) => void;
|
|
6
|
+
onCancel?: () => void;
|
|
7
|
+
};
|
|
8
|
+
export declare const EyeDropper: ({ onChange, onCancel, onBeforeOpen, }: EyeDropperProps) => React.JSX.Element | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../eye-dropper/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,uCAIxB,eAAe,6BAuBjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { MdColorize } from "@rowsncolumns/icons";
|
|
2
|
+
import { IconButton } from "../icon-button";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { canUseDOM } from "@rowsncolumns/utils";
|
|
5
|
+
export const EyeDropper = ({ onChange, onCancel, onBeforeOpen, }) => {
|
|
6
|
+
if (!canUseDOM || !window.EyeDropper) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const onOpen = () => {
|
|
10
|
+
const eyeDropper = new window.EyeDropper();
|
|
11
|
+
onBeforeOpen?.();
|
|
12
|
+
eyeDropper
|
|
13
|
+
.open()
|
|
14
|
+
.then((result) => {
|
|
15
|
+
onChange?.(result.sRGBHex);
|
|
16
|
+
})
|
|
17
|
+
.catch((err) => {
|
|
18
|
+
onCancel?.();
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
return (React.createElement(IconButton, { onClick: onOpen, tooltip: "Pick a custom color" },
|
|
22
|
+
React.createElement(MdColorize, null)));
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../function-info/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM;;;;CAepD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenizes function syntax
|
|
3
|
+
* @param syntax
|
|
4
|
+
*/
|
|
5
|
+
export const tokenizeFunctionSyntax = (syntax) => {
|
|
6
|
+
const openParen = "(";
|
|
7
|
+
const closeParen = ")";
|
|
8
|
+
const index = syntax.indexOf(openParen) + 1;
|
|
9
|
+
const functionOpen = syntax.substr(0, index);
|
|
10
|
+
const parameters = syntax
|
|
11
|
+
.substr(index, syntax.length - index - 1)
|
|
12
|
+
// https://regex101.com/r/ymosUf/1 : Exclude comma inside square braces
|
|
13
|
+
.split(/,\s*(?=[^)^\]^}]*(?:\(|\[|\{|$))/gi)
|
|
14
|
+
.map((a) => a.trim());
|
|
15
|
+
return {
|
|
16
|
+
functionOpen,
|
|
17
|
+
parameters,
|
|
18
|
+
functionClose: closeParen,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CalculatorFunction } from "@rowsncolumns/common-types";
|
|
2
|
+
import React from "react";
|
|
3
|
+
type FunctionInfoProps = {
|
|
4
|
+
activeFunction?: CalculatorFunction;
|
|
5
|
+
parameterIndex?: number;
|
|
6
|
+
showFormulaHelp?: boolean;
|
|
7
|
+
onHideFormulaHelp?(): void;
|
|
8
|
+
};
|
|
9
|
+
export declare const FunctionInfo: React.FC<FunctionInfoProps>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../function-info/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAkB,MAAM,OAAO,CAAC;AAOvC,KAAK,iBAAiB,GAAG;IACvB,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,IAAI,IAAI,CAAC;CAC5B,CAAC;AASF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAoEpD,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CrossCircledIcon } from "@rowsncolumns/icons";
|
|
2
|
+
import React, { useMemo } from "react";
|
|
3
|
+
import { IconButton } from "../icon-button";
|
|
4
|
+
import { Separator } from "../separator";
|
|
5
|
+
import { tokenizeFunctionSyntax } from "./helpers";
|
|
6
|
+
import { StyledFunctionParameterTitle, StyledFunctionSubtitle } from "./style";
|
|
7
|
+
const ACTIVE_COLOR = "#008000";
|
|
8
|
+
export const FunctionInfo = ({ activeFunction, parameterIndex = 0, onHideFormulaHelp, }) => {
|
|
9
|
+
const { syntax, example, description, parameters } = activeFunction ?? {};
|
|
10
|
+
/**
|
|
11
|
+
* It can happen that formula list does not contain
|
|
12
|
+
* parameters, but syntax has
|
|
13
|
+
* Use syntax
|
|
14
|
+
*/
|
|
15
|
+
const paramLen = useMemo(() => {
|
|
16
|
+
return tokenizeFunctionSyntax(syntax ?? "").parameters.length;
|
|
17
|
+
}, [syntax]);
|
|
18
|
+
const paramIndex = Math.min(parameterIndex, paramLen - 1);
|
|
19
|
+
/**
|
|
20
|
+
* If Function is not documented,
|
|
21
|
+
*/
|
|
22
|
+
if (!syntax) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return (React.createElement("div", { className: "break-words text-rnc-foreground" },
|
|
26
|
+
React.createElement("div", { className: "py-1 px-2 text-sm rounded-t-sm place-items-center flex bg-rnc-accent -mt-1 font-formula" },
|
|
27
|
+
React.createElement("div", { className: "flex-1" },
|
|
28
|
+
React.createElement(TokenizedFunction, { syntax: syntax, parameterIndex: paramIndex })),
|
|
29
|
+
React.createElement(IconButton, { onClick: onHideFormulaHelp, title: "Hide formula suggestions for this cell" },
|
|
30
|
+
React.createElement(CrossCircledIcon, null))),
|
|
31
|
+
React.createElement(Separator, { orientation: "horizontal", color: "$gray7" }),
|
|
32
|
+
React.createElement("div", { className: "overflow-auto max-h-[300px]" },
|
|
33
|
+
example ? (React.createElement("div", { className: "px-2 py-2" },
|
|
34
|
+
React.createElement(StyledFunctionSubtitle, null, "Example"),
|
|
35
|
+
React.createElement(StyledFunctionParameterTitle, { active: true }, example))) : null,
|
|
36
|
+
React.createElement("div", { className: "px-2 py-2" },
|
|
37
|
+
React.createElement(StyledFunctionSubtitle, null, "About"),
|
|
38
|
+
React.createElement("div", { className: "text-xs font-system" }, description)),
|
|
39
|
+
parameters?.length ? (React.createElement(Separator, { orientation: "horizontal", color: "$gray7" })) : null,
|
|
40
|
+
parameters?.map(({ title, description }, index) => {
|
|
41
|
+
return (React.createElement("div", { className: "px-2 py-2", key: title },
|
|
42
|
+
React.createElement(StyledFunctionParameterTitle, { active: paramIndex === index }, title),
|
|
43
|
+
React.createElement("div", { className: "text-xs font-system" }, description)));
|
|
44
|
+
}))));
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Convert string function to tokens
|
|
48
|
+
* @param param0
|
|
49
|
+
*/
|
|
50
|
+
const TokenizedFunction = ({ syntax, parameterIndex, }) => {
|
|
51
|
+
if (!syntax) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const { functionOpen, parameters, functionClose } = tokenizeFunctionSyntax(syntax);
|
|
55
|
+
const paramLen = parameters.length;
|
|
56
|
+
return (React.createElement(React.Fragment, null,
|
|
57
|
+
React.createElement("span", null, functionOpen),
|
|
58
|
+
parameters.map((param, i) => {
|
|
59
|
+
const sep = i < paramLen - 1 ? ", " : "";
|
|
60
|
+
return (React.createElement(React.Fragment, { key: i },
|
|
61
|
+
React.createElement("span", { style: {
|
|
62
|
+
color: parameterIndex === i ? ACTIVE_COLOR : void 0,
|
|
63
|
+
fontWeight: parameterIndex === i ? "bold" : "normal",
|
|
64
|
+
} }, param),
|
|
65
|
+
sep));
|
|
66
|
+
}),
|
|
67
|
+
React.createElement("span", null, functionClose)));
|
|
68
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ComponentProps } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export declare const StyledFunctionSubtitle: ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => React.JSX.Element;
|
|
4
|
+
export declare const StyledFunctionParameterTitle: ({ className, active, ...props }: ComponentProps<typeof StyledFunctionSubtitle> & {
|
|
5
|
+
active?: boolean;
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
//# sourceMappingURL=style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../../function-info/style.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,eAAO,MAAM,sBAAsB,GAAI,yBAGpC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,sBAUtC,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,iCAI1C,cAAc,CAAC,OAAO,sBAAsB,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,sBAatE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { cn } from "../utils";
|
|
3
|
+
export const StyledFunctionSubtitle = ({ className, ...props }) => {
|
|
4
|
+
return (React.createElement("div", { className: cn("uppercase pb-1 font-formula font-semibold text-xs text-rnc-foreground/60 tracking-wide", className), ...props }));
|
|
5
|
+
};
|
|
6
|
+
export const StyledFunctionParameterTitle = ({ className, active, ...props }) => {
|
|
7
|
+
return (React.createElement(StyledFunctionSubtitle, { className: cn("normal-case text-sm", active
|
|
8
|
+
? "text-green-700 font-semibold tracking-wide font-formula"
|
|
9
|
+
: undefined, className), ...props }));
|
|
10
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
type HexColorPickerProps = {
|
|
3
|
+
value?: string;
|
|
4
|
+
onChange?(color: string): void;
|
|
5
|
+
};
|
|
6
|
+
export declare const HexColorPicker: ({ value, onChange }: HexColorPickerProps) => React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../hex-color-picker/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AASxC,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,qBAAqB,mBAAmB,sBAwBtE,CAAC"}
|