@dst0/p-tui 0.4.41 → 5.0.2
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/dist/autocomplete.d.ts.map +1 -1
- package/dist/autocomplete.js.map +1 -1
- package/dist/components/box.d.ts +3 -1
- package/dist/components/box.d.ts.map +1 -1
- package/dist/components/box.js +19 -10
- package/dist/components/box.js.map +1 -1
- package/dist/components/cancellable-loader.d.ts.map +1 -1
- package/dist/components/cancellable-loader.js.map +1 -1
- package/dist/components/editor/constants.d.ts +9 -0
- package/dist/components/editor/constants.d.ts.map +1 -0
- package/dist/components/editor/constants.js +12 -0
- package/dist/components/editor/constants.js.map +1 -0
- package/dist/components/editor/editor-methods/autocomplete-matching.d.ts +29 -0
- package/dist/components/editor/editor-methods/autocomplete-matching.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/autocomplete-matching.js +104 -0
- package/dist/components/editor/editor-methods/autocomplete-matching.js.map +1 -0
- package/dist/components/editor/editor-methods/autocomplete-request.d.ts +14 -0
- package/dist/components/editor/editor-methods/autocomplete-request.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/autocomplete-request.js +72 -0
- package/dist/components/editor/editor-methods/autocomplete-request.js.map +1 -0
- package/dist/components/editor/editor-methods/backspace-cursor.d.ts +9 -0
- package/dist/components/editor/editor-methods/backspace-cursor.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/backspace-cursor.js +122 -0
- package/dist/components/editor/editor-methods/backspace-cursor.js.map +1 -0
- package/dist/components/editor/editor-methods/configuration.d.ts +17 -0
- package/dist/components/editor/editor-methods/configuration.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/configuration.js +107 -0
- package/dist/components/editor/editor-methods/configuration.js.map +1 -0
- package/dist/components/editor/editor-methods/cursor-movement.d.ts +7 -0
- package/dist/components/editor/editor-methods/cursor-movement.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/cursor-movement.js +112 -0
- package/dist/components/editor/editor-methods/cursor-movement.js.map +1 -0
- package/dist/components/editor/editor-methods/input-handling.d.ts +3 -0
- package/dist/components/editor/editor-methods/input-handling.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/input-handling.js +257 -0
- package/dist/components/editor/editor-methods/input-handling.js.map +1 -0
- package/dist/components/editor/editor-methods/paste-submit.d.ts +7 -0
- package/dist/components/editor/editor-methods/paste-submit.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/paste-submit.js +105 -0
- package/dist/components/editor/editor-methods/paste-submit.js.map +1 -0
- package/dist/components/editor/editor-methods/render.d.ts +3 -0
- package/dist/components/editor/editor-methods/render.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/render.js +114 -0
- package/dist/components/editor/editor-methods/render.js.map +1 -0
- package/dist/components/editor/editor-methods/text-insertion.d.ts +4 -0
- package/dist/components/editor/editor-methods/text-insertion.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/text-insertion.js +91 -0
- package/dist/components/editor/editor-methods/text-insertion.js.map +1 -0
- package/dist/components/editor/editor-methods/text-layout.d.ts +15 -0
- package/dist/components/editor/editor-methods/text-layout.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/text-layout.js +129 -0
- package/dist/components/editor/editor-methods/text-layout.js.map +1 -0
- package/dist/components/editor/editor-methods/vertical-movement.d.ts +8 -0
- package/dist/components/editor/editor-methods/vertical-movement.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/vertical-movement.js +123 -0
- package/dist/components/editor/editor-methods/vertical-movement.js.map +1 -0
- package/dist/components/editor/editor-methods/word-operations.d.ts +19 -0
- package/dist/components/editor/editor-methods/word-operations.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/word-operations.js +122 -0
- package/dist/components/editor/editor-methods/word-operations.js.map +1 -0
- package/dist/components/editor/editor-methods/yank-undo.d.ts +11 -0
- package/dist/components/editor/editor-methods/yank-undo.d.ts.map +1 -0
- package/dist/components/editor/editor-methods/yank-undo.js +132 -0
- package/dist/components/editor/editor-methods/yank-undo.js.map +1 -0
- package/dist/components/editor/editor.d.ts +67 -0
- package/dist/components/editor/editor.d.ts.map +1 -0
- package/dist/components/editor/editor.js +93 -0
- package/dist/components/editor/editor.js.map +1 -0
- package/dist/components/editor/helpers.d.ts +3 -0
- package/dist/components/editor/helpers.d.ts.map +1 -0
- package/dist/components/editor/helpers.js +3 -0
- package/dist/components/editor/helpers.js.map +1 -0
- package/dist/components/editor/index.d.ts +4 -0
- package/dist/components/editor/index.d.ts.map +1 -0
- package/dist/components/editor/index.js +3 -0
- package/dist/components/editor/index.js.map +1 -0
- package/dist/components/editor/paste-marker.d.ts +5 -0
- package/dist/components/editor/paste-marker.d.ts.map +1 -0
- package/dist/components/editor/paste-marker.js +134 -0
- package/dist/components/editor/paste-marker.js.map +1 -0
- package/dist/components/editor/trigger-patterns.d.ts +4 -0
- package/dist/components/editor/trigger-patterns.d.ts.map +1 -0
- package/dist/components/editor/trigger-patterns.js +11 -0
- package/dist/components/editor/trigger-patterns.js.map +1 -0
- package/dist/components/editor/types.d.ts +25 -0
- package/dist/components/editor/types.d.ts.map +1 -0
- package/dist/components/editor/types.js +2 -0
- package/dist/components/editor/types.js.map +1 -0
- package/dist/components/editor.d.ts +1 -253
- package/dist/components/editor.d.ts.map +1 -1
- package/dist/components/editor.js +1 -1915
- package/dist/components/editor.js.map +1 -1
- package/dist/components/image.d.ts.map +1 -1
- package/dist/components/image.js.map +1 -1
- package/dist/components/input/constants.d.ts +2 -0
- package/dist/components/input/constants.d.ts.map +1 -0
- package/dist/components/input/constants.js +3 -0
- package/dist/components/input/constants.js.map +1 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/index.js +2 -0
- package/dist/components/input/index.js.map +1 -0
- package/dist/components/input/input-methods/input-handling.d.ts +3 -0
- package/dist/components/input/input-methods/input-handling.d.ts.map +1 -0
- package/dist/components/input/input-methods/input-handling.js +145 -0
- package/dist/components/input/input-methods/input-handling.js.map +1 -0
- package/dist/components/input/input-methods/render.d.ts +3 -0
- package/dist/components/input/input-methods/render.d.ts.map +1 -0
- package/dist/components/input/input-methods/render.js +62 -0
- package/dist/components/input/input-methods/render.js.map +1 -0
- package/dist/components/input/input-methods/text-editing.d.ts +17 -0
- package/dist/components/input/input-methods/text-editing.d.ts.map +1 -0
- package/dist/components/input/input-methods/text-editing.js +145 -0
- package/dist/components/input/input-methods/text-editing.js.map +1 -0
- package/dist/components/input/input-methods/value-access.d.ts +4 -0
- package/dist/components/input/input-methods/value-access.d.ts.map +1 -0
- package/dist/components/input/input-methods/value-access.js +20 -0
- package/dist/components/input/input-methods/value-access.js.map +1 -0
- package/dist/components/input/input.d.ts +37 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/input/input.js +77 -0
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/input/types.d.ts +5 -0
- package/dist/components/input/types.d.ts.map +1 -0
- package/dist/components/input/types.js +2 -0
- package/dist/components/input/types.js.map +1 -0
- package/dist/components/input.d.ts +1 -36
- package/dist/components/input.d.ts.map +1 -1
- package/dist/components/input.js +1 -377
- package/dist/components/input.js.map +1 -1
- package/dist/components/loader.d.ts.map +1 -1
- package/dist/components/loader.js.map +1 -1
- package/dist/components/markdown/constants.d.ts +4 -0
- package/dist/components/markdown/constants.d.ts.map +1 -0
- package/dist/components/markdown/constants.js +8 -0
- package/dist/components/markdown/constants.js.map +1 -0
- package/dist/components/markdown/index.d.ts +3 -0
- package/dist/components/markdown/index.d.ts.map +1 -0
- package/dist/components/markdown/index.js +2 -0
- package/dist/components/markdown/index.js.map +1 -0
- package/dist/components/markdown/markdown-methods/inline-rendering.d.ts +7 -0
- package/dist/components/markdown/markdown-methods/inline-rendering.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/inline-rendering.js +95 -0
- package/dist/components/markdown/markdown-methods/inline-rendering.js.map +1 -0
- package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts +7 -0
- package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/list-table-helpers.js +61 -0
- package/dist/components/markdown/markdown-methods/list-table-helpers.js.map +1 -0
- package/dist/components/markdown/markdown-methods/table-rendering.d.ts +5 -0
- package/dist/components/markdown/markdown-methods/table-rendering.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/table-rendering.js +146 -0
- package/dist/components/markdown/markdown-methods/table-rendering.js.map +1 -0
- package/dist/components/markdown/markdown-methods/text-rendering.d.ts +6 -0
- package/dist/components/markdown/markdown-methods/text-rendering.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/text-rendering.js +115 -0
- package/dist/components/markdown/markdown-methods/text-rendering.js.map +1 -0
- package/dist/components/markdown/markdown-methods/theming.d.ts +6 -0
- package/dist/components/markdown/markdown-methods/theming.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/theming.js +41 -0
- package/dist/components/markdown/markdown-methods/theming.js.map +1 -0
- package/dist/components/markdown/markdown-methods/token-rendering.d.ts +5 -0
- package/dist/components/markdown/markdown-methods/token-rendering.d.ts.map +1 -0
- package/dist/components/markdown/markdown-methods/token-rendering.js +142 -0
- package/dist/components/markdown/markdown-methods/token-rendering.js.map +1 -0
- package/dist/components/markdown/markdown.d.ts +32 -0
- package/dist/components/markdown/markdown.d.ts.map +1 -0
- package/dist/components/markdown/markdown.js +72 -0
- package/dist/components/markdown/markdown.js.map +1 -0
- package/dist/components/markdown/strictstrikethroughtokenizer.d.ts +6 -0
- package/dist/components/markdown/strictstrikethroughtokenizer.d.ts.map +1 -0
- package/dist/components/markdown/strictstrikethroughtokenizer.js +18 -0
- package/dist/components/markdown/strictstrikethroughtokenizer.js.map +1 -0
- package/dist/components/markdown/types.d.ts +42 -0
- package/dist/components/markdown/types.d.ts.map +1 -0
- package/dist/components/markdown/types.js +2 -0
- package/dist/components/markdown/types.js.map +1 -0
- package/dist/components/markdown.d.ts +1 -96
- package/dist/components/markdown.d.ts.map +1 -1
- package/dist/components/markdown.js +1 -653
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/select-list.d.ts.map +1 -1
- package/dist/components/select-list.js +8 -3
- package/dist/components/select-list.js.map +1 -1
- package/dist/components/settings-list.d.ts.map +1 -1
- package/dist/components/settings-list.js +2 -6
- package/dist/components/settings-list.js.map +1 -1
- package/dist/components/spacer.d.ts.map +1 -1
- package/dist/components/spacer.js.map +1 -1
- package/dist/components/text.d.ts.map +1 -1
- package/dist/components/text.js +2 -2
- package/dist/components/text.js.map +1 -1
- package/dist/components/truncated-text.d.ts.map +1 -1
- package/dist/components/truncated-text.js.map +1 -1
- package/dist/editor-component.d.ts.map +1 -1
- package/dist/editor-component.js.map +1 -1
- package/dist/fuzzy.d.ts.map +1 -1
- package/dist/fuzzy.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keybindings.d.ts.map +1 -1
- package/dist/keybindings.js.map +1 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +145 -14
- package/dist/keys.js.map +1 -1
- package/dist/kill-ring.d.ts.map +1 -1
- package/dist/kill-ring.js.map +1 -1
- package/dist/native-modifiers.d.ts +9 -0
- package/dist/native-modifiers.d.ts.map +1 -1
- package/dist/native-modifiers.js +5 -0
- package/dist/native-modifiers.js.map +1 -1
- package/dist/stdin-buffer.d.ts +3 -0
- package/dist/stdin-buffer.d.ts.map +1 -1
- package/dist/stdin-buffer.js +24 -21
- package/dist/stdin-buffer.js.map +1 -1
- package/dist/terminal/constants.d.ts +9 -0
- package/dist/terminal/constants.d.ts.map +1 -0
- package/dist/terminal/constants.js +10 -0
- package/dist/terminal/constants.js.map +1 -0
- package/dist/terminal/helpers.d.ts +6 -0
- package/dist/terminal/helpers.d.ts.map +1 -0
- package/dist/terminal/helpers.js +23 -0
- package/dist/terminal/helpers.js.map +1 -0
- package/dist/terminal/index.d.ts +4 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +3 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/processterminal-methods/cursor-screen.d.ts +11 -0
- package/dist/terminal/processterminal-methods/cursor-screen.d.ts.map +1 -0
- package/dist/terminal/processterminal-methods/cursor-screen.js +50 -0
- package/dist/terminal/processterminal-methods/cursor-screen.js.map +1 -0
- package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts +14 -0
- package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts.map +1 -0
- package/dist/terminal/processterminal-methods/keyboard-protocol.js +147 -0
- package/dist/terminal/processterminal-methods/keyboard-protocol.js.map +1 -0
- package/dist/terminal/processterminal-methods/terminal-io.d.ts +9 -0
- package/dist/terminal/processterminal-methods/terminal-io.d.ts.map +1 -0
- package/dist/terminal/processterminal-methods/terminal-io.js +153 -0
- package/dist/terminal/processterminal-methods/terminal-io.js.map +1 -0
- package/dist/terminal/processterminal.d.ts +49 -0
- package/dist/terminal/processterminal.d.ts.map +1 -0
- package/dist/terminal/processterminal.js +129 -0
- package/dist/terminal/processterminal.js.map +1 -0
- package/dist/terminal/types.d.ts +31 -0
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/types.js +2 -0
- package/dist/terminal/types.js.map +1 -0
- package/dist/terminal-colors.d.ts +2 -0
- package/dist/terminal-colors.d.ts.map +1 -1
- package/dist/terminal-colors.js +17 -5
- package/dist/terminal-colors.js.map +1 -1
- package/dist/terminal-image.d.ts.map +1 -1
- package/dist/terminal-image.js.map +1 -1
- package/dist/terminal.d.ts +1 -109
- package/dist/terminal.d.ts.map +1 -1
- package/dist/terminal.js +1 -432
- package/dist/terminal.js.map +1 -1
- package/dist/tui/constants.d.ts +3 -0
- package/dist/tui/constants.d.ts.map +1 -0
- package/dist/tui/constants.js +3 -0
- package/dist/tui/constants.js.map +1 -0
- package/dist/tui/container.d.ts +10 -0
- package/dist/tui/container.d.ts.map +1 -0
- package/dist/tui/container.js +31 -0
- package/dist/tui/container.js.map +1 -0
- package/dist/tui/helpers.d.ts +8 -0
- package/dist/tui/helpers.d.ts.map +1 -0
- package/dist/tui/helpers.js +53 -0
- package/dist/tui/helpers.js.map +1 -0
- package/dist/tui/index.d.ts +6 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +5 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/tui-methods/configuration.d.ts +20 -0
- package/dist/tui/tui-methods/configuration.d.ts.map +1 -0
- package/dist/tui/tui-methods/configuration.js +131 -0
- package/dist/tui/tui-methods/configuration.js.map +1 -0
- package/dist/tui/tui-methods/cursor-background.d.ts +10 -0
- package/dist/tui/tui-methods/cursor-background.d.ts.map +1 -0
- package/dist/tui/tui-methods/cursor-background.js +52 -0
- package/dist/tui/tui-methods/cursor-background.js.map +1 -0
- package/dist/tui/tui-methods/incremental-render.d.ts +17 -0
- package/dist/tui/tui-methods/incremental-render.d.ts.map +1 -0
- package/dist/tui/tui-methods/incremental-render.js +259 -0
- package/dist/tui/tui-methods/incremental-render.js.map +1 -0
- package/dist/tui/tui-methods/input-handling.d.ts +5 -0
- package/dist/tui/tui-methods/input-handling.d.ts.map +1 -0
- package/dist/tui/tui-methods/input-handling.js +111 -0
- package/dist/tui/tui-methods/input-handling.js.map +1 -0
- package/dist/tui/tui-methods/line-compositing.d.ts +7 -0
- package/dist/tui/tui-methods/line-compositing.d.ts.map +1 -0
- package/dist/tui/tui-methods/line-compositing.js +61 -0
- package/dist/tui/tui-methods/line-compositing.js.map +1 -0
- package/dist/tui/tui-methods/overlay-compositing.d.ts +12 -0
- package/dist/tui/tui-methods/overlay-compositing.d.ts.map +1 -0
- package/dist/tui/tui-methods/overlay-compositing.js +123 -0
- package/dist/tui/tui-methods/overlay-compositing.js.map +1 -0
- package/dist/tui/tui-methods/overlay-layout.d.ts +11 -0
- package/dist/tui/tui-methods/overlay-layout.d.ts.map +1 -0
- package/dist/tui/tui-methods/overlay-layout.js +124 -0
- package/dist/tui/tui-methods/overlay-layout.js.map +1 -0
- package/dist/tui/tui-methods/overlay-management.d.ts +11 -0
- package/dist/tui/tui-methods/overlay-management.d.ts.map +1 -0
- package/dist/tui/tui-methods/overlay-management.js +152 -0
- package/dist/tui/tui-methods/overlay-management.js.map +1 -0
- package/dist/tui/tui-methods/render-pipeline.d.ts +3 -0
- package/dist/tui/tui-methods/render-pipeline.d.ts.map +1 -0
- package/dist/tui/tui-methods/render-pipeline.js +176 -0
- package/dist/tui/tui-methods/render-pipeline.js.map +1 -0
- package/dist/tui/tui-methods/render-width-error.d.ts +3 -0
- package/dist/tui/tui-methods/render-width-error.d.ts.map +1 -0
- package/dist/tui/tui-methods/render-width-error.js +28 -0
- package/dist/tui/tui-methods/render-width-error.js.map +1 -0
- package/dist/tui/tui-methods/terminal-control.d.ts +8 -0
- package/dist/tui/tui-methods/terminal-control.d.ts.map +1 -0
- package/dist/tui/tui-methods/terminal-control.js +101 -0
- package/dist/tui/tui-methods/terminal-control.js.map +1 -0
- package/dist/tui/tui.d.ts +59 -0
- package/dist/tui/tui.d.ts.map +1 -0
- package/dist/tui/tui.js +78 -0
- package/dist/tui/tui.js.map +1 -0
- package/dist/tui/types.d.ts +124 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui.d.ts +1 -254
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +1 -1344
- package/dist/tui.js.map +1 -1
- package/dist/undo-stack.d.ts.map +1 -1
- package/dist/undo-stack.js.map +1 -1
- package/dist/utils/ansi-wrapping.d.ts +5 -0
- package/dist/utils/ansi-wrapping.d.ts.map +1 -0
- package/dist/utils/ansi-wrapping.js +52 -0
- package/dist/utils/ansi-wrapping.js.map +1 -0
- package/dist/utils/ansicodetracker.d.ts +27 -0
- package/dist/utils/ansicodetracker.d.ts.map +1 -0
- package/dist/utils/ansicodetracker.js +222 -0
- package/dist/utils/ansicodetracker.js.map +1 -0
- package/dist/utils/column-slicing.d.ts +12 -0
- package/dist/utils/column-slicing.d.ts.map +1 -0
- package/dist/utils/column-slicing.js +111 -0
- package/dist/utils/column-slicing.js.map +1 -0
- package/dist/utils/column-truncation.d.ts +2 -0
- package/dist/utils/column-truncation.d.ts.map +1 -0
- package/dist/utils/column-truncation.js +129 -0
- package/dist/utils/column-truncation.js.map +1 -0
- package/dist/utils/constants.d.ts +12 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +12 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/install-delegated-methods.d.ts +5 -0
- package/dist/utils/install-delegated-methods.d.ts.map +1 -0
- package/dist/utils/install-delegated-methods.js +27 -0
- package/dist/utils/install-delegated-methods.js.map +1 -0
- package/dist/utils/segmentation.d.ts +10 -0
- package/dist/utils/segmentation.d.ts.map +1 -0
- package/dist/utils/segmentation.js +111 -0
- package/dist/utils/segmentation.js.map +1 -0
- package/dist/utils/terminal-output.d.ts +10 -0
- package/dist/utils/terminal-output.d.ts.map +1 -0
- package/dist/utils/terminal-output.js +122 -0
- package/dist/utils/terminal-output.js.map +1 -0
- package/dist/utils/types.d.ts +7 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/width-truncation.d.ts +6 -0
- package/dist/utils/width-truncation.d.ts.map +1 -0
- package/dist/utils/width-truncation.js +121 -0
- package/dist/utils/width-truncation.js.map +1 -0
- package/dist/utils/word-wrapping.d.ts +4 -0
- package/dist/utils/word-wrapping.d.ts.map +1 -0
- package/dist/utils/word-wrapping.js +139 -0
- package/dist/utils/word-wrapping.js.map +1 -0
- package/dist/utils.d.ts +1 -84
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -1059
- package/dist/utils.js.map +1 -1
- package/dist/word-navigation.d.ts.map +1 -1
- package/dist/word-navigation.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { KillRing } from "../../kill-ring.js";
|
|
2
|
+
import { UndoStack } from "../../undo-stack.js";
|
|
3
|
+
import { installDelegatedMethods } from "../../utils/install-delegated-methods.js";
|
|
4
|
+
import { DEFAULT_AUTOCOMPLETE_TRIGGER_CHARACTERS } from "./constants.js";
|
|
5
|
+
import * as autocompleteMatchingDelegates from "./editor-methods/autocomplete-matching.js";
|
|
6
|
+
import * as autocompleteRequestDelegates from "./editor-methods/autocomplete-request.js";
|
|
7
|
+
import * as backspaceCursorDelegates from "./editor-methods/backspace-cursor.js";
|
|
8
|
+
import * as configurationDelegates from "./editor-methods/configuration.js";
|
|
9
|
+
import * as cursorMovementDelegates from "./editor-methods/cursor-movement.js";
|
|
10
|
+
import * as inputHandlingDelegates from "./editor-methods/input-handling.js";
|
|
11
|
+
import * as pasteSubmitDelegates from "./editor-methods/paste-submit.js";
|
|
12
|
+
import * as renderDelegates from "./editor-methods/render.js";
|
|
13
|
+
import * as textInsertionDelegates from "./editor-methods/text-insertion.js";
|
|
14
|
+
import * as textLayoutDelegates from "./editor-methods/text-layout.js";
|
|
15
|
+
import * as verticalMovementDelegates from "./editor-methods/vertical-movement.js";
|
|
16
|
+
import * as wordOperationsDelegates from "./editor-methods/word-operations.js";
|
|
17
|
+
import * as yankUndoDelegates from "./editor-methods/yank-undo.js";
|
|
18
|
+
import { buildDebouncePattern, buildTriggerPattern } from "./trigger-patterns.js";
|
|
19
|
+
// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: The installer below synchronously defines every delegated method.
|
|
20
|
+
export class Editor {
|
|
21
|
+
state = {
|
|
22
|
+
lines: [""],
|
|
23
|
+
cursorLine: 0,
|
|
24
|
+
cursorCol: 0,
|
|
25
|
+
};
|
|
26
|
+
focused = false;
|
|
27
|
+
tui;
|
|
28
|
+
theme;
|
|
29
|
+
paddingX = 0;
|
|
30
|
+
lastWidth = 80;
|
|
31
|
+
scrollOffset = 0;
|
|
32
|
+
borderColor;
|
|
33
|
+
autocompleteProvider;
|
|
34
|
+
autocompleteTriggerCharacters = [...DEFAULT_AUTOCOMPLETE_TRIGGER_CHARACTERS];
|
|
35
|
+
autocompleteTriggerPattern = buildTriggerPattern(this.autocompleteTriggerCharacters);
|
|
36
|
+
autocompleteDebouncePattern = buildDebouncePattern(this.autocompleteTriggerCharacters);
|
|
37
|
+
autocompleteList;
|
|
38
|
+
autocompleteState = null;
|
|
39
|
+
autocompletePrefix = "";
|
|
40
|
+
autocompleteMaxVisible = 5;
|
|
41
|
+
autocompleteAbort;
|
|
42
|
+
autocompleteDebounceTimer;
|
|
43
|
+
autocompleteRequestTask = Promise.resolve();
|
|
44
|
+
autocompleteStartToken = 0;
|
|
45
|
+
autocompleteRequestId = 0;
|
|
46
|
+
pastes = new Map();
|
|
47
|
+
pasteCounter = 0;
|
|
48
|
+
pasteBuffer = "";
|
|
49
|
+
isInPaste = false;
|
|
50
|
+
history = [];
|
|
51
|
+
historyIndex = -1;
|
|
52
|
+
historyDraft = null;
|
|
53
|
+
killRing = new KillRing();
|
|
54
|
+
lastAction = null;
|
|
55
|
+
jumpMode = null;
|
|
56
|
+
preferredVisualCol = null;
|
|
57
|
+
snappedFromCursorCol = null;
|
|
58
|
+
undoStack = new UndoStack();
|
|
59
|
+
onSubmit;
|
|
60
|
+
onChange;
|
|
61
|
+
disableSubmit = false;
|
|
62
|
+
constructor(tui, theme, options = {}) {
|
|
63
|
+
this.tui = tui;
|
|
64
|
+
this.theme = theme;
|
|
65
|
+
this.borderColor = theme.borderColor;
|
|
66
|
+
const paddingX = options.paddingX ?? 0;
|
|
67
|
+
this.paddingX = Number.isFinite(paddingX) ? Math.max(0, Math.floor(paddingX)) : 0;
|
|
68
|
+
const maxVisible = options.autocompleteMaxVisible ?? 5;
|
|
69
|
+
this.autocompleteMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;
|
|
70
|
+
}
|
|
71
|
+
render(width) {
|
|
72
|
+
return renderDelegates.do_render(this, width);
|
|
73
|
+
}
|
|
74
|
+
handleInput(data) {
|
|
75
|
+
inputHandlingDelegates.do_handleInput(this, data);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
installDelegatedMethods(Editor.prototype, [
|
|
79
|
+
autocompleteMatchingDelegates,
|
|
80
|
+
autocompleteRequestDelegates,
|
|
81
|
+
backspaceCursorDelegates,
|
|
82
|
+
configurationDelegates,
|
|
83
|
+
cursorMovementDelegates,
|
|
84
|
+
inputHandlingDelegates,
|
|
85
|
+
pasteSubmitDelegates,
|
|
86
|
+
renderDelegates,
|
|
87
|
+
textInsertionDelegates,
|
|
88
|
+
textLayoutDelegates,
|
|
89
|
+
verticalMovementDelegates,
|
|
90
|
+
wordOperationsDelegates,
|
|
91
|
+
yankUndoDelegates,
|
|
92
|
+
]);
|
|
93
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../../src/components/editor/editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAyB,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAE1G,OAAO,EAAE,uCAAuC,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,6BAA6B,MAAM,2CAA2C,CAAC;AAC3F,OAAO,KAAK,4BAA4B,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,wBAAwB,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,sBAAsB,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,uBAAuB,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,sBAAsB,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,oBAAoB,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,sBAAsB,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,mBAAmB,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,yBAAyB,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,uBAAuB,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,iBAAiB,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,6HAA6H;AAC7H,MAAM,OAAO,MAAM;IACV,KAAK,GAAgB;QAC1B,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,GAAY,KAAK,CAAC;IAElB,GAAG,CAAM;IAET,KAAK,CAAc;IAEnB,QAAQ,GAAW,CAAC,CAAC;IAErB,SAAS,GAAW,EAAE,CAAC;IAEvB,YAAY,GAAW,CAAC,CAAC;IAEzB,WAAW,CAA0B;IAErC,oBAAoB,CAAwB;IAE5C,6BAA6B,GAAG,CAAC,GAAG,uCAAuC,CAAC,CAAC;IAE7E,0BAA0B,GAAG,mBAAmB,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAErF,2BAA2B,GAAG,oBAAoB,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEvF,gBAAgB,CAAc;IAE9B,iBAAiB,GAA+B,IAAI,CAAC;IAErD,kBAAkB,GAAW,EAAE,CAAC;IAEhC,sBAAsB,GAAW,CAAC,CAAC;IAEnC,iBAAiB,CAAmB;IAEpC,yBAAyB,CAAiC;IAE1D,uBAAuB,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE3D,sBAAsB,GAAW,CAAC,CAAC;IAEnC,qBAAqB,GAAW,CAAC,CAAC;IAElC,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IAExC,YAAY,GAAW,CAAC,CAAC;IAEzB,WAAW,GAAW,EAAE,CAAC;IAEzB,SAAS,GAAY,KAAK,CAAC;IAE3B,OAAO,GAAa,EAAE,CAAC;IAEvB,YAAY,GAAW,CAAC,CAAC,CAAC;IAE1B,YAAY,GAAuB,IAAI,CAAC;IAExC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE1B,UAAU,GAAyC,IAAI,CAAC;IAExD,QAAQ,GAAkC,IAAI,CAAC;IAE/C,kBAAkB,GAAkB,IAAI,CAAC;IAEzC,oBAAoB,GAAkB,IAAI,CAAC;IAE3C,SAAS,GAAG,IAAI,SAAS,EAAe,CAAC;IAEzC,QAAQ,CAA0B;IAElC,QAAQ,CAA0B;IAElC,aAAa,GAAY,KAAK,CAAC;IAEtC,YAAY,GAAQ,EAAE,KAAkB,EAAE,OAAO,GAAkB,EAAE,EAAE;QACrE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CACnH;IAED,MAAM,CAAC,KAAa,EAAY;QAC9B,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAAA,CAC/C;IAED,WAAW,CAAC,IAAY,EAAQ;QAC9B,sBAAsB,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAAA,CACnD;CACF;AAwBD,uBAAuB,CAAC,MAAM,CAAC,SAAS,EAAE;IACxC,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,eAAe;IACf,sBAAsB;IACtB,mBAAmB;IACnB,yBAAyB;IACzB,uBAAuB;IACvB,iBAAiB;CAClB,CAAC,CAAC","sourcesContent":["import type { AutocompleteProvider } from \"../../autocomplete.ts\";\nimport { KillRing } from \"../../kill-ring.ts\";\nimport type { Component, Focusable, TUI } from \"../../tui.ts\";\nimport { UndoStack } from \"../../undo-stack.ts\";\nimport { type DelegatedMethods, installDelegatedMethods } from \"../../utils/install-delegated-methods.ts\";\nimport type { SelectList } from \"../select-list.ts\";\nimport { DEFAULT_AUTOCOMPLETE_TRIGGER_CHARACTERS } from \"./constants.ts\";\nimport * as autocompleteMatchingDelegates from \"./editor-methods/autocomplete-matching.ts\";\nimport * as autocompleteRequestDelegates from \"./editor-methods/autocomplete-request.ts\";\nimport * as backspaceCursorDelegates from \"./editor-methods/backspace-cursor.ts\";\nimport * as configurationDelegates from \"./editor-methods/configuration.ts\";\nimport * as cursorMovementDelegates from \"./editor-methods/cursor-movement.ts\";\nimport * as inputHandlingDelegates from \"./editor-methods/input-handling.ts\";\nimport * as pasteSubmitDelegates from \"./editor-methods/paste-submit.ts\";\nimport * as renderDelegates from \"./editor-methods/render.ts\";\nimport * as textInsertionDelegates from \"./editor-methods/text-insertion.ts\";\nimport * as textLayoutDelegates from \"./editor-methods/text-layout.ts\";\nimport * as verticalMovementDelegates from \"./editor-methods/vertical-movement.ts\";\nimport * as wordOperationsDelegates from \"./editor-methods/word-operations.ts\";\nimport * as yankUndoDelegates from \"./editor-methods/yank-undo.ts\";\nimport { buildDebouncePattern, buildTriggerPattern } from \"./trigger-patterns.ts\";\nimport type { EditorOptions, EditorState, EditorTheme } from \"./types.ts\";\n\n// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: The installer below synchronously defines every delegated method.\nexport class Editor implements Component, Focusable {\n public state: EditorState = {\n lines: [\"\"],\n cursorLine: 0,\n cursorCol: 0,\n };\n\n focused: boolean = false;\n\n public tui: TUI;\n\n public theme: EditorTheme;\n\n public paddingX: number = 0;\n\n public lastWidth: number = 80;\n\n public scrollOffset: number = 0;\n\n public borderColor: (str: string) => string;\n\n public autocompleteProvider?: AutocompleteProvider;\n\n public autocompleteTriggerCharacters = [...DEFAULT_AUTOCOMPLETE_TRIGGER_CHARACTERS];\n\n public autocompleteTriggerPattern = buildTriggerPattern(this.autocompleteTriggerCharacters);\n\n public autocompleteDebouncePattern = buildDebouncePattern(this.autocompleteTriggerCharacters);\n\n public autocompleteList?: SelectList;\n\n public autocompleteState: \"regular\" | \"force\" | null = null;\n\n public autocompletePrefix: string = \"\";\n\n public autocompleteMaxVisible: number = 5;\n\n public autocompleteAbort?: AbortController;\n\n public autocompleteDebounceTimer?: ReturnType<typeof setTimeout>;\n\n public autocompleteRequestTask: Promise<void> = Promise.resolve();\n\n public autocompleteStartToken: number = 0;\n\n public autocompleteRequestId: number = 0;\n\n public pastes: Map<number, string> = new Map();\n\n public pasteCounter: number = 0;\n\n public pasteBuffer: string = \"\";\n\n public isInPaste: boolean = false;\n\n public history: string[] = [];\n\n public historyIndex: number = -1;\n\n public historyDraft: EditorState | null = null;\n\n public killRing = new KillRing();\n\n public lastAction: \"kill\" | \"yank\" | \"type-word\" | null = null;\n\n public jumpMode: \"forward\" | \"backward\" | null = null;\n\n public preferredVisualCol: number | null = null;\n\n public snappedFromCursorCol: number | null = null;\n\n public undoStack = new UndoStack<EditorState>();\n\n public onSubmit?: (text: string) => void;\n\n public onChange?: (text: string) => void;\n\n public disableSubmit: boolean = false;\n\n constructor(tui: TUI, theme: EditorTheme, options: EditorOptions = {}) {\n this.tui = tui;\n this.theme = theme;\n this.borderColor = theme.borderColor;\n const paddingX = options.paddingX ?? 0;\n this.paddingX = Number.isFinite(paddingX) ? Math.max(0, Math.floor(paddingX)) : 0;\n const maxVisible = options.autocompleteMaxVisible ?? 5;\n this.autocompleteMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n }\n\n render(width: number): string[] {\n return renderDelegates.do_render(this, width);\n }\n\n handleInput(data: string): void {\n inputHandlingDelegates.do_handleInput(this, data);\n }\n}\n\ntype EditorMethods = Omit<\n DelegatedMethods<\n Editor,\n typeof autocompleteMatchingDelegates &\n typeof autocompleteRequestDelegates &\n typeof backspaceCursorDelegates &\n typeof configurationDelegates &\n typeof cursorMovementDelegates &\n typeof inputHandlingDelegates &\n typeof pasteSubmitDelegates &\n typeof renderDelegates &\n typeof textInsertionDelegates &\n typeof textLayoutDelegates &\n typeof verticalMovementDelegates &\n typeof wordOperationsDelegates &\n typeof yankUndoDelegates\n >,\n \"handleInput\" | \"render\"\n>;\n\nexport interface Editor extends EditorMethods {}\n\ninstallDelegatedMethods(Editor.prototype, [\n autocompleteMatchingDelegates,\n autocompleteRequestDelegates,\n backspaceCursorDelegates,\n configurationDelegates,\n cursorMovementDelegates,\n inputHandlingDelegates,\n pasteSubmitDelegates,\n renderDelegates,\n textInsertionDelegates,\n textLayoutDelegates,\n verticalMovementDelegates,\n wordOperationsDelegates,\n yankUndoDelegates,\n]);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/editor/helpers.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from \"./paste-marker.ts\";\nexport * from \"./trigger-patterns.ts\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/editor/helpers.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from \"./paste-marker.ts\";\nexport * from \"./trigger-patterns.ts\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { Editor } from \"./editor.ts\";\nexport { wordWrapLine } from \"./paste-marker.ts\";\nexport type { EditorOptions, EditorTheme, TextChunk } from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export { Editor } from \"./editor.ts\";\nexport { wordWrapLine } from \"./paste-marker.ts\";\nexport type { EditorOptions, EditorTheme, TextChunk } from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TextChunk } from "./types.ts";
|
|
2
|
+
export declare function isPasteMarker(segment: string): boolean;
|
|
3
|
+
export declare function segmentWithMarkers(text: string, baseSegmenter: Intl.Segmenter, validIds: Set<number>): Iterable<Intl.SegmentData>;
|
|
4
|
+
export declare function wordWrapLine(line: string, maxWidth: number, preSegmented?: Intl.SegmentData[]): TextChunk[];
|
|
5
|
+
//# sourceMappingURL=paste-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-marker.d.ts","sourceRoot":"","sources":["../../../src/components/editor/paste-marker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,IAAI,CAAC,SAAS,EAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GACpB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAgD5B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,CA4F3G","sourcesContent":["import { cjkBreakRegex, isWhitespaceChar, visibleWidth } from \"../../utils.ts\";\nimport { graphemeSegmenter, PASTE_MARKER_REGEX, PASTE_MARKER_SINGLE } from \"./constants.ts\";\nimport type { TextChunk } from \"./types.ts\";\n\nexport function isPasteMarker(segment: string): boolean {\n return segment.length >= 10 && PASTE_MARKER_SINGLE.test(segment);\n}\n\nexport function segmentWithMarkers(\n text: string,\n baseSegmenter: Intl.Segmenter,\n validIds: Set<number>,\n): Iterable<Intl.SegmentData> {\n // Fast path: no paste markers in the text or no valid IDs.\n if (validIds.size === 0 || !text.includes(\"[paste #\")) {\n return baseSegmenter.segment(text);\n }\n\n // Find all marker spans with valid IDs.\n const markers: Array<{ start: number; end: number }> = [];\n for (const m of text.matchAll(PASTE_MARKER_REGEX)) {\n const id = Number.parseInt(m[1]!, 10);\n if (!validIds.has(id)) continue;\n markers.push({ start: m.index, end: m.index + m[0].length });\n }\n if (markers.length === 0) {\n return baseSegmenter.segment(text);\n }\n\n // Build merged segment list.\n const baseSegments = baseSegmenter.segment(text);\n const result: Intl.SegmentData[] = [];\n let markerIdx = 0;\n\n for (const seg of baseSegments) {\n // Skip past markers that are entirely before this segment.\n while (markerIdx < markers.length && markers[markerIdx]!.end <= seg.index) {\n markerIdx++;\n }\n\n const marker = markerIdx < markers.length ? markers[markerIdx]! : null;\n\n if (marker && seg.index >= marker.start && seg.index < marker.end) {\n // This segment falls inside a marker.\n // If this is the first segment of the marker, emit a merged segment.\n if (seg.index === marker.start) {\n const markerText = text.slice(marker.start, marker.end);\n result.push({\n segment: markerText,\n index: marker.start,\n input: text,\n });\n }\n // Otherwise skip (already merged into the first segment).\n } else {\n result.push(seg);\n }\n }\n\n return result;\n}\n\nexport function wordWrapLine(line: string, maxWidth: number, preSegmented?: Intl.SegmentData[]): TextChunk[] {\n if (!line || maxWidth <= 0) {\n return [{ text: \"\", startIndex: 0, endIndex: 0 }];\n }\n\n const lineWidth = visibleWidth(line);\n if (lineWidth <= maxWidth) {\n return [{ text: line, startIndex: 0, endIndex: line.length }];\n }\n\n const chunks: TextChunk[] = [];\n const segments = preSegmented ?? [...graphemeSegmenter.segment(line)];\n\n let currentWidth = 0;\n let chunkStart = 0;\n\n // Wrap opportunity: the position after the last whitespace before a non-whitespace\n // grapheme, i.e. where a line break is allowed.\n let wrapOppIndex = -1;\n let wrapOppWidth = 0;\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n const grapheme = seg.segment;\n const gWidth = visibleWidth(grapheme);\n const charIndex = seg.index;\n const isWs = !isPasteMarker(grapheme) && isWhitespaceChar(grapheme);\n\n // Overflow check before advancing.\n if (currentWidth + gWidth > maxWidth) {\n if (wrapOppIndex >= 0 && currentWidth - wrapOppWidth + gWidth <= maxWidth) {\n // Backtrack to last wrap opportunity (the remaining content\n // plus the current grapheme still fits within maxWidth).\n chunks.push({ text: line.slice(chunkStart, wrapOppIndex), startIndex: chunkStart, endIndex: wrapOppIndex });\n chunkStart = wrapOppIndex;\n currentWidth -= wrapOppWidth;\n } else if (chunkStart < charIndex) {\n // No viable wrap opportunity: force-break at current position.\n // This also handles the case where backtracking to a word\n // boundary wouldn't help because the remaining content plus\n // the current grapheme (e.g. a wide character) still exceeds\n // maxWidth.\n chunks.push({ text: line.slice(chunkStart, charIndex), startIndex: chunkStart, endIndex: charIndex });\n chunkStart = charIndex;\n currentWidth = 0;\n }\n wrapOppIndex = -1;\n }\n\n if (gWidth > maxWidth) {\n // Single atomic segment wider than maxWidth (e.g. paste marker\n // in a narrow terminal). Re-wrap it at grapheme granularity.\n\n // The segment remains logically atomic for cursor\n // movement / editing — the split is purely visual for word-wrap layout.\n const subChunks = wordWrapLine(grapheme, maxWidth);\n for (let j = 0; j < subChunks.length - 1; j++) {\n const sc = subChunks[j]!;\n chunks.push({ text: sc.text, startIndex: charIndex + sc.startIndex, endIndex: charIndex + sc.endIndex });\n }\n const last = subChunks[subChunks.length - 1]!;\n chunkStart = charIndex + last.startIndex;\n currentWidth = visibleWidth(last.text);\n wrapOppIndex = -1;\n continue;\n }\n\n // Advance.\n currentWidth += gWidth;\n\n // Record wrap opportunity: whitespace followed by non-whitespace\n // (multiple spaces join; the break point is after the last space),\n // or at a boundary where either side is CJK (CJK allows breaking\n // between any adjacent characters).\n const next = segments[i + 1];\n if (isWs && next && (isPasteMarker(next.segment) || !isWhitespaceChar(next.segment))) {\n wrapOppIndex = next.index;\n wrapOppWidth = currentWidth;\n } else if (!isWs && next && !isWhitespaceChar(next.segment)) {\n const isCjk = !isPasteMarker(grapheme) && cjkBreakRegex.test(grapheme);\n const nextIsCjk = !isPasteMarker(next.segment) && cjkBreakRegex.test(next.segment);\n if (isCjk || nextIsCjk) {\n wrapOppIndex = next.index;\n wrapOppWidth = currentWidth;\n }\n }\n }\n\n // Push final chunk.\n chunks.push({ text: line.slice(chunkStart), startIndex: chunkStart, endIndex: line.length });\n\n return chunks;\n}\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { cjkBreakRegex, isWhitespaceChar, visibleWidth } from "../../utils.js";
|
|
2
|
+
import { graphemeSegmenter, PASTE_MARKER_REGEX, PASTE_MARKER_SINGLE } from "./constants.js";
|
|
3
|
+
export function isPasteMarker(segment) {
|
|
4
|
+
return segment.length >= 10 && PASTE_MARKER_SINGLE.test(segment);
|
|
5
|
+
}
|
|
6
|
+
export function segmentWithMarkers(text, baseSegmenter, validIds) {
|
|
7
|
+
// Fast path: no paste markers in the text or no valid IDs.
|
|
8
|
+
if (validIds.size === 0 || !text.includes("[paste #")) {
|
|
9
|
+
return baseSegmenter.segment(text);
|
|
10
|
+
}
|
|
11
|
+
// Find all marker spans with valid IDs.
|
|
12
|
+
const markers = [];
|
|
13
|
+
for (const m of text.matchAll(PASTE_MARKER_REGEX)) {
|
|
14
|
+
const id = Number.parseInt(m[1], 10);
|
|
15
|
+
if (!validIds.has(id))
|
|
16
|
+
continue;
|
|
17
|
+
markers.push({ start: m.index, end: m.index + m[0].length });
|
|
18
|
+
}
|
|
19
|
+
if (markers.length === 0) {
|
|
20
|
+
return baseSegmenter.segment(text);
|
|
21
|
+
}
|
|
22
|
+
// Build merged segment list.
|
|
23
|
+
const baseSegments = baseSegmenter.segment(text);
|
|
24
|
+
const result = [];
|
|
25
|
+
let markerIdx = 0;
|
|
26
|
+
for (const seg of baseSegments) {
|
|
27
|
+
// Skip past markers that are entirely before this segment.
|
|
28
|
+
while (markerIdx < markers.length && markers[markerIdx].end <= seg.index) {
|
|
29
|
+
markerIdx++;
|
|
30
|
+
}
|
|
31
|
+
const marker = markerIdx < markers.length ? markers[markerIdx] : null;
|
|
32
|
+
if (marker && seg.index >= marker.start && seg.index < marker.end) {
|
|
33
|
+
// This segment falls inside a marker.
|
|
34
|
+
// If this is the first segment of the marker, emit a merged segment.
|
|
35
|
+
if (seg.index === marker.start) {
|
|
36
|
+
const markerText = text.slice(marker.start, marker.end);
|
|
37
|
+
result.push({
|
|
38
|
+
segment: markerText,
|
|
39
|
+
index: marker.start,
|
|
40
|
+
input: text,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// Otherwise skip (already merged into the first segment).
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result.push(seg);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
export function wordWrapLine(line, maxWidth, preSegmented) {
|
|
52
|
+
if (!line || maxWidth <= 0) {
|
|
53
|
+
return [{ text: "", startIndex: 0, endIndex: 0 }];
|
|
54
|
+
}
|
|
55
|
+
const lineWidth = visibleWidth(line);
|
|
56
|
+
if (lineWidth <= maxWidth) {
|
|
57
|
+
return [{ text: line, startIndex: 0, endIndex: line.length }];
|
|
58
|
+
}
|
|
59
|
+
const chunks = [];
|
|
60
|
+
const segments = preSegmented ?? [...graphemeSegmenter.segment(line)];
|
|
61
|
+
let currentWidth = 0;
|
|
62
|
+
let chunkStart = 0;
|
|
63
|
+
// Wrap opportunity: the position after the last whitespace before a non-whitespace
|
|
64
|
+
// grapheme, i.e. where a line break is allowed.
|
|
65
|
+
let wrapOppIndex = -1;
|
|
66
|
+
let wrapOppWidth = 0;
|
|
67
|
+
for (let i = 0; i < segments.length; i++) {
|
|
68
|
+
const seg = segments[i];
|
|
69
|
+
const grapheme = seg.segment;
|
|
70
|
+
const gWidth = visibleWidth(grapheme);
|
|
71
|
+
const charIndex = seg.index;
|
|
72
|
+
const isWs = !isPasteMarker(grapheme) && isWhitespaceChar(grapheme);
|
|
73
|
+
// Overflow check before advancing.
|
|
74
|
+
if (currentWidth + gWidth > maxWidth) {
|
|
75
|
+
if (wrapOppIndex >= 0 && currentWidth - wrapOppWidth + gWidth <= maxWidth) {
|
|
76
|
+
// Backtrack to last wrap opportunity (the remaining content
|
|
77
|
+
// plus the current grapheme still fits within maxWidth).
|
|
78
|
+
chunks.push({ text: line.slice(chunkStart, wrapOppIndex), startIndex: chunkStart, endIndex: wrapOppIndex });
|
|
79
|
+
chunkStart = wrapOppIndex;
|
|
80
|
+
currentWidth -= wrapOppWidth;
|
|
81
|
+
}
|
|
82
|
+
else if (chunkStart < charIndex) {
|
|
83
|
+
// No viable wrap opportunity: force-break at current position.
|
|
84
|
+
// This also handles the case where backtracking to a word
|
|
85
|
+
// boundary wouldn't help because the remaining content plus
|
|
86
|
+
// the current grapheme (e.g. a wide character) still exceeds
|
|
87
|
+
// maxWidth.
|
|
88
|
+
chunks.push({ text: line.slice(chunkStart, charIndex), startIndex: chunkStart, endIndex: charIndex });
|
|
89
|
+
chunkStart = charIndex;
|
|
90
|
+
currentWidth = 0;
|
|
91
|
+
}
|
|
92
|
+
wrapOppIndex = -1;
|
|
93
|
+
}
|
|
94
|
+
if (gWidth > maxWidth) {
|
|
95
|
+
// Single atomic segment wider than maxWidth (e.g. paste marker
|
|
96
|
+
// in a narrow terminal). Re-wrap it at grapheme granularity.
|
|
97
|
+
// The segment remains logically atomic for cursor
|
|
98
|
+
// movement / editing — the split is purely visual for word-wrap layout.
|
|
99
|
+
const subChunks = wordWrapLine(grapheme, maxWidth);
|
|
100
|
+
for (let j = 0; j < subChunks.length - 1; j++) {
|
|
101
|
+
const sc = subChunks[j];
|
|
102
|
+
chunks.push({ text: sc.text, startIndex: charIndex + sc.startIndex, endIndex: charIndex + sc.endIndex });
|
|
103
|
+
}
|
|
104
|
+
const last = subChunks[subChunks.length - 1];
|
|
105
|
+
chunkStart = charIndex + last.startIndex;
|
|
106
|
+
currentWidth = visibleWidth(last.text);
|
|
107
|
+
wrapOppIndex = -1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Advance.
|
|
111
|
+
currentWidth += gWidth;
|
|
112
|
+
// Record wrap opportunity: whitespace followed by non-whitespace
|
|
113
|
+
// (multiple spaces join; the break point is after the last space),
|
|
114
|
+
// or at a boundary where either side is CJK (CJK allows breaking
|
|
115
|
+
// between any adjacent characters).
|
|
116
|
+
const next = segments[i + 1];
|
|
117
|
+
if (isWs && next && (isPasteMarker(next.segment) || !isWhitespaceChar(next.segment))) {
|
|
118
|
+
wrapOppIndex = next.index;
|
|
119
|
+
wrapOppWidth = currentWidth;
|
|
120
|
+
}
|
|
121
|
+
else if (!isWs && next && !isWhitespaceChar(next.segment)) {
|
|
122
|
+
const isCjk = !isPasteMarker(grapheme) && cjkBreakRegex.test(grapheme);
|
|
123
|
+
const nextIsCjk = !isPasteMarker(next.segment) && cjkBreakRegex.test(next.segment);
|
|
124
|
+
if (isCjk || nextIsCjk) {
|
|
125
|
+
wrapOppIndex = next.index;
|
|
126
|
+
wrapOppWidth = currentWidth;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Push final chunk.
|
|
131
|
+
chunks.push({ text: line.slice(chunkStart), startIndex: chunkStart, endIndex: line.length });
|
|
132
|
+
return chunks;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=paste-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-marker.js","sourceRoot":"","sources":["../../../src/components/editor/paste-marker.ts"],"names":[],"mappings":"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","sourcesContent":["import { cjkBreakRegex, isWhitespaceChar, visibleWidth } from \"../../utils.ts\";\nimport { graphemeSegmenter, PASTE_MARKER_REGEX, PASTE_MARKER_SINGLE } from \"./constants.ts\";\nimport type { TextChunk } from \"./types.ts\";\n\nexport function isPasteMarker(segment: string): boolean {\n return segment.length >= 10 && PASTE_MARKER_SINGLE.test(segment);\n}\n\nexport function segmentWithMarkers(\n text: string,\n baseSegmenter: Intl.Segmenter,\n validIds: Set<number>,\n): Iterable<Intl.SegmentData> {\n // Fast path: no paste markers in the text or no valid IDs.\n if (validIds.size === 0 || !text.includes(\"[paste #\")) {\n return baseSegmenter.segment(text);\n }\n\n // Find all marker spans with valid IDs.\n const markers: Array<{ start: number; end: number }> = [];\n for (const m of text.matchAll(PASTE_MARKER_REGEX)) {\n const id = Number.parseInt(m[1]!, 10);\n if (!validIds.has(id)) continue;\n markers.push({ start: m.index, end: m.index + m[0].length });\n }\n if (markers.length === 0) {\n return baseSegmenter.segment(text);\n }\n\n // Build merged segment list.\n const baseSegments = baseSegmenter.segment(text);\n const result: Intl.SegmentData[] = [];\n let markerIdx = 0;\n\n for (const seg of baseSegments) {\n // Skip past markers that are entirely before this segment.\n while (markerIdx < markers.length && markers[markerIdx]!.end <= seg.index) {\n markerIdx++;\n }\n\n const marker = markerIdx < markers.length ? markers[markerIdx]! : null;\n\n if (marker && seg.index >= marker.start && seg.index < marker.end) {\n // This segment falls inside a marker.\n // If this is the first segment of the marker, emit a merged segment.\n if (seg.index === marker.start) {\n const markerText = text.slice(marker.start, marker.end);\n result.push({\n segment: markerText,\n index: marker.start,\n input: text,\n });\n }\n // Otherwise skip (already merged into the first segment).\n } else {\n result.push(seg);\n }\n }\n\n return result;\n}\n\nexport function wordWrapLine(line: string, maxWidth: number, preSegmented?: Intl.SegmentData[]): TextChunk[] {\n if (!line || maxWidth <= 0) {\n return [{ text: \"\", startIndex: 0, endIndex: 0 }];\n }\n\n const lineWidth = visibleWidth(line);\n if (lineWidth <= maxWidth) {\n return [{ text: line, startIndex: 0, endIndex: line.length }];\n }\n\n const chunks: TextChunk[] = [];\n const segments = preSegmented ?? [...graphemeSegmenter.segment(line)];\n\n let currentWidth = 0;\n let chunkStart = 0;\n\n // Wrap opportunity: the position after the last whitespace before a non-whitespace\n // grapheme, i.e. where a line break is allowed.\n let wrapOppIndex = -1;\n let wrapOppWidth = 0;\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n const grapheme = seg.segment;\n const gWidth = visibleWidth(grapheme);\n const charIndex = seg.index;\n const isWs = !isPasteMarker(grapheme) && isWhitespaceChar(grapheme);\n\n // Overflow check before advancing.\n if (currentWidth + gWidth > maxWidth) {\n if (wrapOppIndex >= 0 && currentWidth - wrapOppWidth + gWidth <= maxWidth) {\n // Backtrack to last wrap opportunity (the remaining content\n // plus the current grapheme still fits within maxWidth).\n chunks.push({ text: line.slice(chunkStart, wrapOppIndex), startIndex: chunkStart, endIndex: wrapOppIndex });\n chunkStart = wrapOppIndex;\n currentWidth -= wrapOppWidth;\n } else if (chunkStart < charIndex) {\n // No viable wrap opportunity: force-break at current position.\n // This also handles the case where backtracking to a word\n // boundary wouldn't help because the remaining content plus\n // the current grapheme (e.g. a wide character) still exceeds\n // maxWidth.\n chunks.push({ text: line.slice(chunkStart, charIndex), startIndex: chunkStart, endIndex: charIndex });\n chunkStart = charIndex;\n currentWidth = 0;\n }\n wrapOppIndex = -1;\n }\n\n if (gWidth > maxWidth) {\n // Single atomic segment wider than maxWidth (e.g. paste marker\n // in a narrow terminal). Re-wrap it at grapheme granularity.\n\n // The segment remains logically atomic for cursor\n // movement / editing — the split is purely visual for word-wrap layout.\n const subChunks = wordWrapLine(grapheme, maxWidth);\n for (let j = 0; j < subChunks.length - 1; j++) {\n const sc = subChunks[j]!;\n chunks.push({ text: sc.text, startIndex: charIndex + sc.startIndex, endIndex: charIndex + sc.endIndex });\n }\n const last = subChunks[subChunks.length - 1]!;\n chunkStart = charIndex + last.startIndex;\n currentWidth = visibleWidth(last.text);\n wrapOppIndex = -1;\n continue;\n }\n\n // Advance.\n currentWidth += gWidth;\n\n // Record wrap opportunity: whitespace followed by non-whitespace\n // (multiple spaces join; the break point is after the last space),\n // or at a boundary where either side is CJK (CJK allows breaking\n // between any adjacent characters).\n const next = segments[i + 1];\n if (isWs && next && (isPasteMarker(next.segment) || !isWhitespaceChar(next.segment))) {\n wrapOppIndex = next.index;\n wrapOppWidth = currentWidth;\n } else if (!isWs && next && !isWhitespaceChar(next.segment)) {\n const isCjk = !isPasteMarker(grapheme) && cjkBreakRegex.test(grapheme);\n const nextIsCjk = !isPasteMarker(next.segment) && cjkBreakRegex.test(next.segment);\n if (isCjk || nextIsCjk) {\n wrapOppIndex = next.index;\n wrapOppWidth = currentWidth;\n }\n }\n }\n\n // Push final chunk.\n chunks.push({ text: line.slice(chunkStart), startIndex: chunkStart, endIndex: line.length });\n\n return chunks;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function escapeCharacterClass(value: string): string;
|
|
2
|
+
export declare function buildTriggerPattern(triggerCharacters: string[]): RegExp;
|
|
3
|
+
export declare function buildDebouncePattern(triggerCharacters: string[]): RegExp;
|
|
4
|
+
//# sourceMappingURL=trigger-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-patterns.d.ts","sourceRoot":"","sources":["../../../src/components/editor/trigger-patterns.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvE;AAED,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,CAGxE","sourcesContent":["export function escapeCharacterClass(value: string): string {\n return value.replace(/[\\\\^$.*+?()[\\]{}|-]/g, \"\\\\$&\");\n}\n\nexport function buildTriggerPattern(triggerCharacters: string[]): RegExp {\n return new RegExp(`(?:^|[\\\\s])[${triggerCharacters.map(escapeCharacterClass).join(\"\")}][^\\\\s]*$`);\n}\n\nexport function buildDebouncePattern(triggerCharacters: string[]): RegExp {\n const escapedWithoutAt = triggerCharacters.filter((character) => character !== \"@\").map(escapeCharacterClass);\n return new RegExp(`(?:^|[ \\\\t])(?:@(?:\"[^\"]*|[^\\\\s]*)|[${escapedWithoutAt.join(\"\")}][^\\\\s]*)$`);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function escapeCharacterClass(value) {
|
|
2
|
+
return value.replace(/[\\^$.*+?()[\]{}|-]/g, "\\$&");
|
|
3
|
+
}
|
|
4
|
+
export function buildTriggerPattern(triggerCharacters) {
|
|
5
|
+
return new RegExp(`(?:^|[\\s])[${triggerCharacters.map(escapeCharacterClass).join("")}][^\\s]*$`);
|
|
6
|
+
}
|
|
7
|
+
export function buildDebouncePattern(triggerCharacters) {
|
|
8
|
+
const escapedWithoutAt = triggerCharacters.filter((character) => character !== "@").map(escapeCharacterClass);
|
|
9
|
+
return new RegExp(`(?:^|[ \\t])(?:@(?:"[^"]*|[^\\s]*)|[${escapedWithoutAt.join("")}][^\\s]*)$`);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=trigger-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-patterns.js","sourceRoot":"","sources":["../../../src/components/editor/trigger-patterns.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAU;IAC1D,OAAO,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;AAAA,CACtD;AAED,MAAM,UAAU,mBAAmB,CAAC,iBAA2B,EAAU;IACvE,OAAO,IAAI,MAAM,CAAC,eAAe,iBAAiB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;AAAA,CACnG;AAED,MAAM,UAAU,oBAAoB,CAAC,iBAA2B,EAAU;IACxE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC9G,OAAO,IAAI,MAAM,CAAC,uCAAuC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AAAA,CACjG","sourcesContent":["export function escapeCharacterClass(value: string): string {\n return value.replace(/[\\\\^$.*+?()[\\]{}|-]/g, \"\\\\$&\");\n}\n\nexport function buildTriggerPattern(triggerCharacters: string[]): RegExp {\n return new RegExp(`(?:^|[\\\\s])[${triggerCharacters.map(escapeCharacterClass).join(\"\")}][^\\\\s]*$`);\n}\n\nexport function buildDebouncePattern(triggerCharacters: string[]): RegExp {\n const escapedWithoutAt = triggerCharacters.filter((character) => character !== \"@\").map(escapeCharacterClass);\n return new RegExp(`(?:^|[ \\\\t])(?:@(?:\"[^\"]*|[^\\\\s]*)|[${escapedWithoutAt.join(\"\")}][^\\\\s]*)$`);\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SelectListTheme } from "../select-list.ts";
|
|
2
|
+
export interface TextChunk {
|
|
3
|
+
text: string;
|
|
4
|
+
startIndex: number;
|
|
5
|
+
endIndex: number;
|
|
6
|
+
}
|
|
7
|
+
export interface EditorState {
|
|
8
|
+
lines: string[];
|
|
9
|
+
cursorLine: number;
|
|
10
|
+
cursorCol: number;
|
|
11
|
+
}
|
|
12
|
+
export interface LayoutLine {
|
|
13
|
+
text: string;
|
|
14
|
+
hasCursor: boolean;
|
|
15
|
+
cursorPos?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface EditorTheme {
|
|
18
|
+
borderColor: (str: string) => string;
|
|
19
|
+
selectList: SelectListTheme;
|
|
20
|
+
}
|
|
21
|
+
export interface EditorOptions {
|
|
22
|
+
paddingX?: number;
|
|
23
|
+
autocompleteMaxVisible?: number;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/editor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC","sourcesContent":["import type { SelectListTheme } from \"../select-list.ts\";\n\nexport interface TextChunk {\n text: string;\n startIndex: number;\n endIndex: number;\n}\n\nexport interface EditorState {\n lines: string[];\n cursorLine: number;\n cursorCol: number;\n}\n\nexport interface LayoutLine {\n text: string;\n hasCursor: boolean;\n cursorPos?: number;\n}\n\nexport interface EditorTheme {\n borderColor: (str: string) => string;\n selectList: SelectListTheme;\n}\n\nexport interface EditorOptions {\n paddingX?: number;\n autocompleteMaxVisible?: number;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/editor/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SelectListTheme } from \"../select-list.ts\";\n\nexport interface TextChunk {\n text: string;\n startIndex: number;\n endIndex: number;\n}\n\nexport interface EditorState {\n lines: string[];\n cursorLine: number;\n cursorCol: number;\n}\n\nexport interface LayoutLine {\n text: string;\n hasCursor: boolean;\n cursorPos?: number;\n}\n\nexport interface EditorTheme {\n borderColor: (str: string) => string;\n selectList: SelectListTheme;\n}\n\nexport interface EditorOptions {\n paddingX?: number;\n autocompleteMaxVisible?: number;\n}\n"]}
|