@pierre/diffs 1.3.0-beta.5 → 1.3.0-beta.7
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/README.md +9 -9
- package/dist/components/CodeView.d.ts +13 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +53 -14
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -5
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +37 -19
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +49 -36
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +173 -75
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +0 -1
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +4 -4
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +3 -3
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +7 -5
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +0 -1
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +22 -25
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +12 -7
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +192 -64
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +1 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +23 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/components/web-components.d.ts.map +1 -1
- package/dist/components/web-components.js +2 -3
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -2
- package/dist/constants.js.map +1 -1
- package/dist/editor/command.d.ts +2 -1
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/command.js +7 -3
- package/dist/editor/command.js.map +1 -1
- package/dist/editor/editStack.d.ts +7 -1
- package/dist/editor/editStack.d.ts.map +1 -1
- package/dist/editor/editStack.js +3 -3
- package/dist/editor/editStack.js.map +1 -1
- package/dist/editor/editor.d.ts +28 -4
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +669 -313
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/editor2.js +3 -3
- package/dist/editor/editor2.js.map +1 -1
- package/dist/editor/index.js +1 -2
- package/dist/editor/lineAnnotations.d.ts.map +1 -1
- package/dist/editor/lineAnnotations.js +2 -3
- package/dist/editor/lineAnnotations.js.map +1 -1
- package/dist/editor/marker.d.ts +2 -1
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +28 -11
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/pieceTable.d.ts +4 -2
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js +138 -128
- package/dist/editor/pieceTable.js.map +1 -1
- package/dist/editor/platform.d.ts +8 -1
- package/dist/editor/platform.d.ts.map +1 -1
- package/dist/editor/platform.js +16 -5
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/searchPanel.d.ts +1 -0
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +75 -62
- package/dist/editor/searchPanel.js.map +1 -1
- package/dist/editor/selection.d.ts +42 -5
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js +504 -114
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/selectionAction.d.ts +4 -5
- package/dist/editor/selectionAction.d.ts.map +1 -1
- package/dist/editor/selectionAction.js +14 -64
- package/dist/editor/selectionAction.js.map +1 -1
- package/dist/editor/sprite.d.ts +2 -2
- package/dist/editor/sprite.d.ts.map +1 -1
- package/dist/editor/sprite.js +7 -14
- package/dist/editor/sprite.js.map +1 -1
- package/dist/editor/textDocument.d.ts +5 -4
- package/dist/editor/textDocument.d.ts.map +1 -1
- package/dist/editor/textDocument.js +26 -15
- package/dist/editor/textDocument.js.map +1 -1
- package/dist/editor/textMeasure.d.ts +36 -3
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +104 -17
- package/dist/editor/textMeasure.js.map +1 -1
- package/dist/editor/tokenzier.d.ts +3 -0
- package/dist/editor/tokenzier.d.ts.map +1 -1
- package/dist/editor/tokenzier.js +27 -16
- package/dist/editor/tokenzier.js.map +1 -1
- package/dist/editor/utils.d.ts +4 -1
- package/dist/editor/utils.d.ts.map +1 -1
- package/dist/editor/utils.js +19 -3
- package/dist/editor/utils.js.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
- package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +0 -1
- package/dist/highlighter/languages/constants.d.ts.map +1 -1
- package/dist/highlighter/languages/constants.js +1 -1
- package/dist/highlighter/languages/constants.js.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
- package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js +4 -5
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.js +1 -2
- package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +3 -4
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.js +1 -2
- package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
- package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
- package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/constants.d.ts.map +1 -1
- package/dist/highlighter/themes/constants.js +1 -1
- package/dist/highlighter/themes/constants.js.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.js +1 -2
- package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
- package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.js +1 -2
- package/dist/highlighter/themes/resolveTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.js +1 -2
- package/dist/highlighter/themes/resolveThemes.js.map +1 -1
- package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolution.js +1 -2
- package/dist/highlighter/themes/themeResolution.js.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +2 -2
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.js +1 -2
- package/dist/highlighter/themes/themeResolver.js.map +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +4 -3
- package/dist/managers/InteractionManager.d.ts +7 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +25 -4
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +1 -1
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.js +1 -1
- package/dist/managers/ScrollSyncManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +2 -2
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
- package/dist/react/CodeView.d.ts +1 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +17 -16
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/EditorContext.d.ts +0 -1
- package/dist/react/EditorContext.d.ts.map +1 -1
- package/dist/react/EditorContext.js +2 -5
- package/dist/react/EditorContext.js.map +1 -1
- package/dist/react/File.d.ts +1 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +4 -6
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +1 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +4 -6
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +4 -4
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +4 -6
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +1 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +4 -6
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +2 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +4 -6
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/Virtualizer.d.ts.map +1 -1
- package/dist/react/Virtualizer.js +2 -5
- package/dist/react/Virtualizer.js.map +1 -1
- package/dist/react/WorkerPoolContext.d.ts +0 -1
- package/dist/react/WorkerPoolContext.d.ts.map +1 -1
- package/dist/react/WorkerPoolContext.js +2 -5
- package/dist/react/WorkerPoolContext.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +1 -1
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -2
- package/dist/react/jsx.d.ts +0 -2
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +2 -0
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +2 -0
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +18 -11
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +2 -0
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +18 -11
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/templateRender.d.ts.map +1 -1
- package/dist/react/utils/templateRender.js +1 -2
- package/dist/react/utils/templateRender.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +15 -18
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +1 -2
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useStableCallback.d.ts.map +1 -1
- package/dist/react/utils/useStableCallback.js +1 -2
- package/dist/react/utils/useStableCallback.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +2 -3
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +52 -33
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -3
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +14 -11
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/shiki-stream/index.js +1 -2
- package/dist/shiki-stream/stream.d.ts +0 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js +1 -2
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +0 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +1 -1
- package/dist/ssr/FileDiffReact.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +5 -8
- package/dist/ssr/FileDiffReact.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.js +1 -2
- package/dist/ssr/preloadDiffs.d.ts +12 -11
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +15 -8
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/ssr/preloadFile.d.ts.map +1 -1
- package/dist/ssr/preloadFile.js +1 -2
- package/dist/ssr/preloadFile.js.map +1 -1
- package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
- package/dist/ssr/preloadPatchFile.js +2 -3
- package/dist/ssr/preloadPatchFile.js.map +1 -1
- package/dist/ssr/renderHTML.d.ts +1 -1
- package/dist/ssr/renderHTML.d.ts.map +1 -1
- package/dist/ssr/renderHTML.js +1 -2
- package/dist/ssr/renderHTML.js.map +1 -1
- package/dist/string-import.d.ts +4 -0
- package/dist/string-import.d.ts.map +1 -1
- package/dist/style.js +3 -3
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +67 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
- package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffTargetsEqual.js +1 -1
- package/dist/utils/areDiffTargetsEqual.js.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.js +1 -2
- package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areFilesEqual.d.ts.map +1 -1
- package/dist/utils/areFilesEqual.js +1 -1
- package/dist/utils/areFilesEqual.js.map +1 -1
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
- package/dist/utils/areHunkDataEqual.js +2 -2
- package/dist/utils/areHunkDataEqual.js.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.js +1 -1
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
- package/dist/utils/areObjectsEqual.d.ts.map +1 -1
- package/dist/utils/areObjectsEqual.js +1 -1
- package/dist/utils/areObjectsEqual.js.map +1 -1
- package/dist/utils/areOptionsEqual.d.ts +0 -2
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -2
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
- package/dist/utils/arePrePropertiesEqual.js +1 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
- package/dist/utils/areRenderRangesEqual.js +1 -1
- package/dist/utils/areRenderRangesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionPointsEqual.js +1 -1
- package/dist/utils/areSelectionPointsEqual.js.map +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/areThemesEqual.d.ts.map +1 -1
- package/dist/utils/areThemesEqual.js +1 -1
- package/dist/utils/areThemesEqual.js.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
- package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
- package/dist/utils/areWorkerStatsEqual.js +1 -1
- package/dist/utils/areWorkerStatsEqual.js.map +1 -1
- package/dist/utils/awaitWithTimeout.d.ts +5 -0
- package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
- package/dist/utils/awaitWithTimeout.js +15 -0
- package/dist/utils/awaitWithTimeout.js.map +1 -0
- package/dist/utils/cleanLastNewline.d.ts.map +1 -1
- package/dist/utils/cleanLastNewline.js +1 -1
- package/dist/utils/cleanLastNewline.js.map +1 -1
- package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
- package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
- package/dist/utils/cloneFileDiffMetadata.js +16 -0
- package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
- package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
- package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.js +9 -3
- package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
- package/dist/utils/computeFileOffsets.d.ts +9 -1
- package/dist/utils/computeFileOffsets.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.js +20 -2
- package/dist/utils/computeFileOffsets.js.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.js +1 -2
- package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
- package/dist/utils/createAnnotationElement.d.ts +1 -1
- package/dist/utils/createAnnotationElement.d.ts.map +1 -1
- package/dist/utils/createAnnotationElement.js +1 -2
- package/dist/utils/createAnnotationElement.js.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.js +1 -1
- package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
- package/dist/utils/createContentColumn.d.ts +1 -1
- package/dist/utils/createContentColumn.d.ts.map +1 -1
- package/dist/utils/createContentColumn.js +1 -2
- package/dist/utils/createContentColumn.js.map +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
- package/dist/utils/createEmptyRowBuffer.js +1 -2
- package/dist/utils/createEmptyRowBuffer.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +1 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +6 -3
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.js +1 -1
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityElement.js +1 -2
- package/dist/utils/createGutterUtilityElement.js.map +1 -1
- package/dist/utils/createNoNewlineElement.d.ts +1 -1
- package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
- package/dist/utils/createNoNewlineElement.js +1 -2
- package/dist/utils/createNoNewlineElement.js.map +1 -1
- package/dist/utils/createPreElement.d.ts +1 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +1 -3
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createRowNodes.d.ts.map +1 -1
- package/dist/utils/createRowNodes.js +1 -1
- package/dist/utils/createRowNodes.js.map +1 -1
- package/dist/utils/createSeparator.d.ts +1 -1
- package/dist/utils/createSeparator.d.ts.map +1 -1
- package/dist/utils/createSeparator.js +1 -2
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +1 -2
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/createStyleElement.d.ts +1 -1
- package/dist/utils/createStyleElement.d.ts.map +1 -1
- package/dist/utils/createStyleElement.js +1 -2
- package/dist/utils/createStyleElement.js.map +1 -1
- package/dist/utils/createTransformerWithState.d.ts.map +1 -1
- package/dist/utils/createTransformerWithState.js +1 -2
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
- package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +5 -5
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +2 -3
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/detachString.d.ts.map +1 -1
- package/dist/utils/detachString.js +1 -1
- package/dist/utils/detachString.js.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.js +1 -2
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.js +1 -1
- package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
- package/dist/utils/getDiffFileInput.d.ts +14 -0
- package/dist/utils/getDiffFileInput.d.ts.map +1 -0
- package/dist/utils/getDiffFileInput.js +24 -0
- package/dist/utils/getDiffFileInput.js.map +1 -0
- package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js +2 -1
- package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
- package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFileRendererOptions.js +1 -1
- package/dist/utils/getFileRendererOptions.js.map +1 -1
- package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.js +3 -1
- package/dist/utils/getFiletypeFromFileName.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +1 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +1 -2
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
- package/dist/utils/getIconForType.d.ts.map +1 -1
- package/dist/utils/getIconForType.js +1 -1
- package/dist/utils/getIconForType.js.map +1 -1
- package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
- package/dist/utils/getLineAnnotationName.js +1 -1
- package/dist/utils/getLineAnnotationName.js.map +1 -1
- package/dist/utils/getLineEndingType.d.ts.map +1 -1
- package/dist/utils/getLineEndingType.js +1 -1
- package/dist/utils/getLineEndingType.js.map +1 -1
- package/dist/utils/getLineNodes.d.ts +1 -1
- package/dist/utils/getLineNodes.d.ts.map +1 -1
- package/dist/utils/getLineNodes.js +1 -1
- package/dist/utils/getLineNodes.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.js +1 -2
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +1 -1
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/getSingularPatch.d.ts.map +1 -1
- package/dist/utils/getSingularPatch.js +1 -2
- package/dist/utils/getSingularPatch.js.map +1 -1
- package/dist/utils/getThemes.d.ts.map +1 -1
- package/dist/utils/getThemes.js +1 -2
- package/dist/utils/getThemes.js.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +1 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +1 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/hostTheme.d.ts.map +1 -1
- package/dist/utils/hostTheme.js +1 -2
- package/dist/utils/hostTheme.js.map +1 -1
- package/dist/utils/hydratePartialDiff.d.ts +10 -0
- package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
- package/dist/utils/hydratePartialDiff.js +140 -0
- package/dist/utils/hydratePartialDiff.js.map +1 -0
- package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
- package/dist/utils/includesFileAnnotations.js +5 -5
- package/dist/utils/includesFileAnnotations.js.map +1 -1
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
- package/dist/utils/isDefaultRenderRange.js +1 -1
- package/dist/utils/isDefaultRenderRange.js.map +1 -1
- package/dist/utils/isDiffPlainText.d.ts.map +1 -1
- package/dist/utils/isDiffPlainText.js +1 -2
- package/dist/utils/isDiffPlainText.js.map +1 -1
- package/dist/utils/isFilePlainText.d.ts.map +1 -1
- package/dist/utils/isFilePlainText.js +1 -2
- package/dist/utils/isFilePlainText.js.map +1 -1
- package/dist/utils/isStyleNode.d.ts.map +1 -1
- package/dist/utils/isStyleNode.js +1 -1
- package/dist/utils/isStyleNode.js.map +1 -1
- package/dist/utils/isWorkerContext.d.ts.map +1 -1
- package/dist/utils/isWorkerContext.js +1 -1
- package/dist/utils/isWorkerContext.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +47 -48
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
- package/dist/utils/normalizeDiffResolution.js +1 -1
- package/dist/utils/normalizeDiffResolution.js.map +1 -1
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/parseDiffDecorations.js +1 -2
- package/dist/utils/parseDiffDecorations.js.map +1 -1
- package/dist/utils/parseDiffFromFile.d.ts +1 -2
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +27 -7
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parseLineType.d.ts.map +1 -1
- package/dist/utils/parseLineType.js +1 -1
- package/dist/utils/parseLineType.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +6 -7
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
- package/dist/utils/prefersReducedMotion.js +1 -1
- package/dist/utils/prefersReducedMotion.js.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
- package/dist/utils/processLine.d.ts +1 -1
- package/dist/utils/processLine.d.ts.map +1 -1
- package/dist/utils/processLine.js +1 -2
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +4 -5
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +1 -2
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/resolveConflict.d.ts.map +1 -1
- package/dist/utils/resolveConflict.js +1 -2
- package/dist/utils/resolveConflict.js.map +1 -1
- package/dist/utils/resolveRegion.d.ts.map +1 -1
- package/dist/utils/resolveRegion.js +1 -1
- package/dist/utils/resolveRegion.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
- package/dist/utils/roundToDevicePixel.js +1 -1
- package/dist/utils/roundToDevicePixel.js.map +1 -1
- package/dist/utils/scrollbarGutter.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.js +1 -2
- package/dist/utils/scrollbarGutter.js.map +1 -1
- package/dist/utils/setLanguageOverride.d.ts.map +1 -1
- package/dist/utils/setLanguageOverride.js +1 -1
- package/dist/utils/setLanguageOverride.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -2
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.js +1 -1
- package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
- package/dist/utils/splitFileContents.d.ts.map +1 -1
- package/dist/utils/splitFileContents.js +1 -2
- package/dist/utils/splitFileContents.js.map +1 -1
- package/dist/utils/trimPatchContext.d.ts.map +1 -1
- package/dist/utils/trimPatchContext.js +1 -2
- package/dist/utils/trimPatchContext.js.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +6 -1
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.js +44 -3
- package/dist/utils/updateDiffHunks.js.map +1 -1
- package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
- package/dist/utils/virtualDiffLayout.js +1 -2
- package/dist/utils/virtualDiffLayout.js.map +1 -1
- package/dist/utils/wrapTokenFragments.d.ts +1 -1
- package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
- package/dist/utils/wrapTokenFragments.js +1 -2
- package/dist/utils/wrapTokenFragments.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +7 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +83 -20
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
- package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js +1 -2
- package/dist/worker/types.d.ts +7 -1
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-B9ZqxnKj.js +8 -0
- package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
- package/dist/worker/worker-portable.js +2784 -6406
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +94 -126
- package/dist/worker/worker.js.map +1 -1
- package/package.json +13 -14
- package/dist/worker/wasm-qE0LgnY3.js +0 -10
- package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
package/dist/editor/editor.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { queueRender } from "../managers/UniversalRenderingManager.js";
|
|
1
2
|
import { getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
|
|
2
3
|
import { isMoveCursorShortcut, isPrimaryModifier, isSafari } from "./platform.js";
|
|
3
|
-
import { resolveEditorCommandFromKeyboardEvent } from "./command.js";
|
|
4
|
+
import { resolveEditorCommandFromKeyboardEvent, resolveFindAgainShortcut } from "./command.js";
|
|
4
5
|
import { EditStack } from "./editStack.js";
|
|
5
6
|
import editor_default from "./editor2.js";
|
|
6
7
|
import { addEventListener, clampDomOffset, extend, getLineNumberAttr, h, round } from "./utils.js";
|
|
7
8
|
import { applyDocumentChangeToLineAnnotations, renderLineAnnotations } from "./lineAnnotations.js";
|
|
8
|
-
import {
|
|
9
|
+
import { applyDeleteCharacterToSelections, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getAutoSurroundReplacementTexts, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, remapSelectionsAfterEdits, resolveIndentEdits, resolveSelectionCut, selectionIntersects } from "./selection.js";
|
|
9
10
|
import { MarkerRenderer, markerSeverityDatasetKey } from "./marker.js";
|
|
10
11
|
import { createSpriteElement } from "./sprite.js";
|
|
11
12
|
import { SearchPanelWidget } from "./searchPanel.js";
|
|
@@ -13,22 +14,22 @@ import { SelectionActionWidget } from "./selectionAction.js";
|
|
|
13
14
|
import { TextDocument } from "./textDocument.js";
|
|
14
15
|
import { Metrics, getExpandedAsciiTextColumns, getUnicodeMeasurementOffsets, snapTextOffsetToUnicodeBoundary } from "./textMeasure.js";
|
|
15
16
|
import { EditorTokenizer, renderLineTokens } from "./tokenzier.js";
|
|
16
|
-
|
|
17
17
|
//#region src/editor/editor.ts
|
|
18
|
+
const MAX_EDIT_WIDEN_WINDOW_MULTIPLE = 2;
|
|
18
19
|
var Editor = class {
|
|
19
20
|
#options;
|
|
20
|
-
#wrap = false;
|
|
21
21
|
#metrics = new Metrics();
|
|
22
22
|
#tokenizer;
|
|
23
23
|
#editorEventDisposes;
|
|
24
24
|
#globalEventDisposes;
|
|
25
25
|
#selectEventDisposes;
|
|
26
26
|
#detach;
|
|
27
|
+
#contentOffset;
|
|
27
28
|
#gutterWidthCache;
|
|
28
29
|
#contentWidthCache;
|
|
29
30
|
#lineYCache = /* @__PURE__ */ new Map();
|
|
30
31
|
#wrapLineOffsetsCache = /* @__PURE__ */ new Map();
|
|
31
|
-
#
|
|
32
|
+
#lineElementsCache = /* @__PURE__ */ new Map();
|
|
32
33
|
#lastAccessedCharX;
|
|
33
34
|
#globalStyleElement;
|
|
34
35
|
#editorStyleElement;
|
|
@@ -42,28 +43,36 @@ var Editor = class {
|
|
|
42
43
|
#primaryCaretElement;
|
|
43
44
|
#resizeObserver;
|
|
44
45
|
#fileInstance;
|
|
45
|
-
#
|
|
46
|
+
#fileInfo;
|
|
46
47
|
#lineAnnotations;
|
|
47
48
|
#textDocument;
|
|
48
49
|
#renderRange;
|
|
50
|
+
#viewportWindowLines;
|
|
49
51
|
#markerRenderer;
|
|
50
52
|
#searchPanel;
|
|
51
53
|
#selectionAction;
|
|
52
54
|
#shouldIgnoreSelectionChange = false;
|
|
55
|
+
#suppressNativeSelectionSync = false;
|
|
56
|
+
#contentHasFocus = false;
|
|
57
|
+
#isComposing = false;
|
|
53
58
|
#isGutterMouseDown = false;
|
|
54
59
|
#isContentMouseDown = false;
|
|
55
60
|
#shiftKeyPressed = false;
|
|
56
61
|
#selectionStart;
|
|
62
|
+
#deletedSelectionText = "";
|
|
57
63
|
#reservedSelections;
|
|
58
64
|
#initSelections;
|
|
59
65
|
#selections;
|
|
60
66
|
#matches;
|
|
61
67
|
#scrollingToLine;
|
|
62
68
|
#scrollingToLineChar;
|
|
69
|
+
#scrollingToLineFixed = false;
|
|
63
70
|
#scrollingToLineNoFocus = false;
|
|
64
71
|
#retainSearchPanelFocus = false;
|
|
72
|
+
#fontRemeasureScheduled = false;
|
|
73
|
+
#themeSelectionRefreshFrame;
|
|
65
74
|
#onDeferTokenize = (lines, themeType) => {
|
|
66
|
-
this.#fileInstance?.updateRenderCache(lines, themeType);
|
|
75
|
+
this.#fileInstance?.updateRenderCache(lines, themeType, false);
|
|
67
76
|
if (this.#renderRange !== void 0 && this.#renderRange.totalLines !== Infinity) {
|
|
68
77
|
const { startingLine, totalLines } = this.#renderRange;
|
|
69
78
|
const endLine = Math.min(startingLine + totalLines, this.#textDocument?.lineCount ?? 0);
|
|
@@ -76,24 +85,22 @@ var Editor = class {
|
|
|
76
85
|
constructor(options = {}) {
|
|
77
86
|
this.#options = options;
|
|
78
87
|
}
|
|
79
|
-
edit(
|
|
80
|
-
const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged,
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
component.setOptions({
|
|
88
|
+
edit(fileInstance) {
|
|
89
|
+
const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, lineHoverHighlight = "disabled", ...rest } = fileInstance.options;
|
|
90
|
+
if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || expandUnchanged !== true && fileInstance.type === "file-diff" || lineHoverHighlight !== "disabled") {
|
|
91
|
+
fileInstance.setOptions({
|
|
84
92
|
...rest,
|
|
85
93
|
useTokenTransformer: true,
|
|
86
94
|
enableGutterUtility: false,
|
|
87
95
|
enableLineSelection: false,
|
|
88
|
-
lineHoverHighlight: "disabled",
|
|
89
96
|
expandUnchanged: true,
|
|
90
|
-
|
|
97
|
+
lineHoverHighlight: "disabled"
|
|
91
98
|
});
|
|
92
|
-
|
|
99
|
+
fileInstance.rerender();
|
|
93
100
|
}
|
|
94
|
-
this.#fileInstance =
|
|
101
|
+
this.#fileInstance = fileInstance;
|
|
95
102
|
this.#initialize();
|
|
96
|
-
this.#detach =
|
|
103
|
+
this.#detach = fileInstance.attachEditor(this);
|
|
97
104
|
return () => this.cleanUp();
|
|
98
105
|
}
|
|
99
106
|
/**
|
|
@@ -102,8 +109,42 @@ var Editor = class {
|
|
|
102
109
|
applyEdits(edits, updateHistory = false) {
|
|
103
110
|
const textDocument = this.#textDocument;
|
|
104
111
|
if (textDocument == null) throw new Error("Editor is not attached");
|
|
105
|
-
const
|
|
106
|
-
|
|
112
|
+
const wasFocused = this.#contentHasFocus;
|
|
113
|
+
const selectionsBefore = this.#selections;
|
|
114
|
+
const selectionOffsetsBefore = selectionsBefore?.map((selection) => [textDocument.offsetAt(selection.start), textDocument.offsetAt(selection.end)]);
|
|
115
|
+
const resolvedEditOffsets = selectionsBefore === void 0 ? void 0 : edits.map((edit) => {
|
|
116
|
+
const a = textDocument.offsetAt(edit.range.start);
|
|
117
|
+
const b = textDocument.offsetAt(edit.range.end);
|
|
118
|
+
return {
|
|
119
|
+
start: Math.min(a, b),
|
|
120
|
+
end: Math.max(a, b),
|
|
121
|
+
text: edit.newText
|
|
122
|
+
};
|
|
123
|
+
}).sort((a, b) => a.start - b.start);
|
|
124
|
+
const change = textDocument.applyEdits(edits, updateHistory, selectionsBefore);
|
|
125
|
+
if (change === void 0) return;
|
|
126
|
+
let nextSelections;
|
|
127
|
+
if (selectionsBefore !== void 0 && selectionOffsetsBefore !== void 0 && resolvedEditOffsets !== void 0) {
|
|
128
|
+
nextSelections = remapSelectionsAfterEdits(textDocument, selectionsBefore, selectionOffsetsBefore, resolvedEditOffsets);
|
|
129
|
+
if (updateHistory) textDocument.setLastUndoSelectionsAfter(nextSelections);
|
|
130
|
+
}
|
|
131
|
+
this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change), { skipFocus: !wasFocused });
|
|
132
|
+
}
|
|
133
|
+
/** Whether there is an edit to undo. */
|
|
134
|
+
get canUndo() {
|
|
135
|
+
return this.#textDocument?.canUndo ?? false;
|
|
136
|
+
}
|
|
137
|
+
/** Whether there is an undone edit to redo. */
|
|
138
|
+
get canRedo() {
|
|
139
|
+
return this.#textDocument?.canRedo ?? false;
|
|
140
|
+
}
|
|
141
|
+
/** Undo the last edit. Does nothing when there is nothing to undo. */
|
|
142
|
+
undo() {
|
|
143
|
+
this.#runCommand("undo");
|
|
144
|
+
}
|
|
145
|
+
/** Redo the last undone edit. Does nothing when there is nothing to redo. */
|
|
146
|
+
redo() {
|
|
147
|
+
this.#runCommand("redo");
|
|
107
148
|
}
|
|
108
149
|
getState() {
|
|
109
150
|
const fileRef = this.#getFileRef();
|
|
@@ -138,13 +179,13 @@ var Editor = class {
|
|
|
138
179
|
const start = textDocument.normalizePosition(selection.start);
|
|
139
180
|
const end = textDocument.normalizePosition(selection.end);
|
|
140
181
|
return {
|
|
141
|
-
direction: selection.direction === "none" ?
|
|
182
|
+
direction: selection.direction === "none" ? 0 : selection.direction === "backward" ? -1 : 1,
|
|
142
183
|
start,
|
|
143
184
|
end
|
|
144
185
|
};
|
|
145
186
|
});
|
|
146
187
|
this.#updateSelections(resolvedSelections);
|
|
147
|
-
this.#scrollToPrimaryCaret(
|
|
188
|
+
this.#scrollToPrimaryCaret();
|
|
148
189
|
}
|
|
149
190
|
setMarkers(markers) {
|
|
150
191
|
const textDocument = this.#textDocument;
|
|
@@ -157,7 +198,8 @@ var Editor = class {
|
|
|
157
198
|
}
|
|
158
199
|
this.#markerRenderer ??= new MarkerRenderer({
|
|
159
200
|
getLineHeight: () => this.#metrics.lineHeight,
|
|
160
|
-
|
|
201
|
+
getOverlayElement: () => this.#overlayElement,
|
|
202
|
+
getGutterWidth: () => this.#getGutterWidth(),
|
|
161
203
|
getCharX: (line, character) => this.#getCharX(line, character),
|
|
162
204
|
getLineY: (line) => this.#getLineY(line),
|
|
163
205
|
isMouseDown: () => this.#isContentMouseDown || this.#isGutterMouseDown
|
|
@@ -170,7 +212,7 @@ var Editor = class {
|
|
|
170
212
|
const preventScroll = options?.preventScroll ?? false;
|
|
171
213
|
const primarySelection = this.#selections?.at(-1);
|
|
172
214
|
if (primarySelection !== void 0) {
|
|
173
|
-
const pos = primarySelection.direction ===
|
|
215
|
+
const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
|
|
174
216
|
this.#focus(pos, preventScroll);
|
|
175
217
|
} else this.#focus(void 0, preventScroll);
|
|
176
218
|
}
|
|
@@ -180,6 +222,8 @@ var Editor = class {
|
|
|
180
222
|
cleanUp() {
|
|
181
223
|
this.#tokenizer?.cleanUp();
|
|
182
224
|
this.#tokenizer = void 0;
|
|
225
|
+
this.#textDocument = void 0;
|
|
226
|
+
this.#fileInfo = void 0;
|
|
183
227
|
this.#globalEventDisposes?.forEach((dispose) => dispose());
|
|
184
228
|
this.#globalEventDisposes = void 0;
|
|
185
229
|
this.#editorEventDisposes?.forEach((dispose) => dispose());
|
|
@@ -192,7 +236,7 @@ var Editor = class {
|
|
|
192
236
|
this.#contentWidthCache = void 0;
|
|
193
237
|
this.#lineYCache.clear();
|
|
194
238
|
this.#wrapLineOffsetsCache.clear();
|
|
195
|
-
this.#
|
|
239
|
+
this.#lineElementsCache.clear();
|
|
196
240
|
this.#lastAccessedCharX = void 0;
|
|
197
241
|
this.#globalStyleElement?.remove();
|
|
198
242
|
this.#globalStyleElement = void 0;
|
|
@@ -206,14 +250,20 @@ var Editor = class {
|
|
|
206
250
|
this.#gutterElement = void 0;
|
|
207
251
|
this.#contentElement?.removeAttribute("contentEditable");
|
|
208
252
|
this.#contentElement = void 0;
|
|
253
|
+
this.#contentHasFocus = false;
|
|
209
254
|
this.#overlayElement?.remove();
|
|
210
255
|
this.#overlayElement = void 0;
|
|
211
256
|
this.#resizeObserver?.disconnect();
|
|
212
257
|
this.#resizeObserver = void 0;
|
|
258
|
+
this.#fontRemeasureScheduled = false;
|
|
259
|
+
if (this.#themeSelectionRefreshFrame !== void 0) {
|
|
260
|
+
cancelAnimationFrame(this.#themeSelectionRefreshFrame);
|
|
261
|
+
this.#themeSelectionRefreshFrame = void 0;
|
|
262
|
+
}
|
|
213
263
|
this.#resetState();
|
|
214
264
|
}
|
|
215
265
|
/** @internal */
|
|
216
|
-
|
|
266
|
+
__postponeBgTokenizeToNextFrame() {
|
|
217
267
|
const tokenizer = this.#tokenizer;
|
|
218
268
|
if (tokenizer !== void 0) {
|
|
219
269
|
tokenizer.pauseBackgroundTokenize();
|
|
@@ -223,7 +273,7 @@ var Editor = class {
|
|
|
223
273
|
}
|
|
224
274
|
}
|
|
225
275
|
/** @internal */
|
|
226
|
-
__syncRenderView = (highlighter, fileContainer,
|
|
276
|
+
__syncRenderView = (highlighter, fileContainer, fileOrDiff, lineAnnotations, renderRange) => {
|
|
227
277
|
const shadowRoot = fileContainer.shadowRoot;
|
|
228
278
|
if (shadowRoot == null) {
|
|
229
279
|
console.error("[editor] Could not find the shadow root.");
|
|
@@ -235,10 +285,10 @@ var Editor = class {
|
|
|
235
285
|
for (const el of shadowRoot.querySelectorAll("[data-code]")) if (el.dataset.deletions === void 0) {
|
|
236
286
|
codeElement = el;
|
|
237
287
|
for (const child of el.children) {
|
|
238
|
-
const el
|
|
239
|
-
const { gutter, content } = el
|
|
240
|
-
if (gutter !== void 0) gutterEl = el
|
|
241
|
-
else if (content !== void 0) contentEl = el
|
|
288
|
+
const el = child;
|
|
289
|
+
const { gutter, content } = el.dataset;
|
|
290
|
+
if (gutter !== void 0) gutterEl = el;
|
|
291
|
+
else if (content !== void 0) contentEl = el;
|
|
242
292
|
}
|
|
243
293
|
break;
|
|
244
294
|
}
|
|
@@ -250,10 +300,18 @@ var Editor = class {
|
|
|
250
300
|
if (this.#themeStyleElement !== void 0) shadowRoot.appendChild(this.#themeStyleElement);
|
|
251
301
|
if (this.#spriteElement !== void 0) shadowRoot.prepend(this.#spriteElement);
|
|
252
302
|
}
|
|
253
|
-
if (this.#textDocument === void 0 || this.#
|
|
303
|
+
if (this.#textDocument === void 0 || this.#fileInfo === void 0 || this.#fileInfo.name !== fileOrDiff.name || this.#fileInfo.lang !== fileOrDiff.lang || this.#fileInfo.cacheKey !== fileOrDiff.cacheKey) {
|
|
304
|
+
let contents = "";
|
|
305
|
+
if ("contents" in fileOrDiff) contents = fileOrDiff.contents;
|
|
306
|
+
else contents = fileOrDiff.additionLines.join("");
|
|
254
307
|
const editStack = new EditStack({ maxEntries: this.#options.historyMaxEntries });
|
|
255
|
-
const textDocument = new TextDocument(
|
|
256
|
-
|
|
308
|
+
const textDocument = new TextDocument(fileOrDiff.name, contents, fileOrDiff.lang ?? getFiletypeFromFileName(fileOrDiff.name), 0, editStack);
|
|
309
|
+
const { name, lang, cacheKey } = fileOrDiff;
|
|
310
|
+
this.#fileInfo = {
|
|
311
|
+
name,
|
|
312
|
+
lang,
|
|
313
|
+
cacheKey
|
|
314
|
+
};
|
|
257
315
|
this.#textDocument = textDocument;
|
|
258
316
|
this.#tokenizer?.cleanUp();
|
|
259
317
|
this.#tokenizer = new EditorTokenizer({
|
|
@@ -261,6 +319,7 @@ var Editor = class {
|
|
|
261
319
|
textDocument,
|
|
262
320
|
codeOptions: this.#fileInstance?.options ?? {},
|
|
263
321
|
onDeferTokenize: this.#onDeferTokenize,
|
|
322
|
+
onThemeChange: () => this.#scheduleThemeSelectionRefresh(),
|
|
264
323
|
setStyle: (css) => {
|
|
265
324
|
this.#themeStyleElement.textContent = css;
|
|
266
325
|
},
|
|
@@ -268,8 +327,10 @@ var Editor = class {
|
|
|
268
327
|
});
|
|
269
328
|
this.#resetState();
|
|
270
329
|
this.#selections = this.#initSelections;
|
|
271
|
-
|
|
272
|
-
|
|
330
|
+
requestAnimationFrame(() => {
|
|
331
|
+
this.#options.onAttach?.(this, this.#fileInstance);
|
|
332
|
+
});
|
|
333
|
+
if (this.#textDocument !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] text document rebuilt from", fileOrDiff.name);
|
|
273
334
|
}
|
|
274
335
|
if (this.#contentElement !== contentEl) {
|
|
275
336
|
this.#gutterElement = gutterEl;
|
|
@@ -285,14 +346,23 @@ var Editor = class {
|
|
|
285
346
|
});
|
|
286
347
|
if (this.#overlayElement !== void 0) contentEl.after(this.#overlayElement);
|
|
287
348
|
this.#metrics.init(contentEl);
|
|
349
|
+
this.#remeasureMetricsOnFontLoad();
|
|
288
350
|
this.#listenContentElement(contentEl, gutterEl);
|
|
289
351
|
if (this.#contentElement !== void 0 && this.#options.__debug === true) console.log("[diffs/editor] full re-render triggered !!!");
|
|
290
352
|
}
|
|
353
|
+
if (contentEl.ariaLabel !== fileOrDiff.name) contentEl.ariaLabel = fileOrDiff.name;
|
|
354
|
+
if (lineAnnotations !== void 0 && lineAnnotations.length > 0 || this.#isDiff && this.#diffSyle === "unified") for (const child of this.#contentElement.children) {
|
|
355
|
+
const el = child;
|
|
356
|
+
const { lineAnnotation, lineType } = el.dataset;
|
|
357
|
+
if (lineAnnotation !== void 0 || lineType === "change-deletion") el.setAttribute("contenteditable", "false");
|
|
358
|
+
}
|
|
291
359
|
this.#resetCache();
|
|
292
|
-
this.#
|
|
360
|
+
this.#tokenizer?.syncTheme(this.#fileInstance?.options ?? {});
|
|
293
361
|
this.#lineAnnotations = lineAnnotations;
|
|
294
362
|
this.#renderRange = renderRange;
|
|
363
|
+
this.#viewportWindowLines = renderRange?.totalLines;
|
|
295
364
|
this.#tokenizer?.prebuildStateStack(renderRange);
|
|
365
|
+
this.#markerRenderer?.removePopup();
|
|
296
366
|
if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
|
|
297
367
|
if (this.#initSelections !== void 0 && this.#primaryCaretElement !== void 0) {
|
|
298
368
|
this.#initSelections = void 0;
|
|
@@ -300,22 +370,30 @@ var Editor = class {
|
|
|
300
370
|
} else if (this.#scrollingToLine !== void 0) this.#scrollToLine(this.#scrollingToLine, this.#scrollingToLineChar, this.#scrollingToLineNoFocus);
|
|
301
371
|
else if (this.#selections !== void 0 && this.#selections.length > 0 && !this.#retainSearchPanelFocus) this.focus({ preventScroll: true });
|
|
302
372
|
if (this.#retainSearchPanelFocus) this.#searchPanel?.focus();
|
|
303
|
-
if (this.#selectionAction !== void 0 && this.#isLineVisible(this.#selectionAction.line) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
|
|
304
373
|
if (this.#options.__debug === true && renderRange !== void 0) {
|
|
305
374
|
const { startingLine, totalLines } = renderRange;
|
|
306
|
-
console.log("[diffs/editor] render file:",
|
|
375
|
+
console.log("[diffs/editor] render file:", fileOrDiff.name, "RenderRange:", startingLine + "-" + (startingLine + totalLines), "of", this.#textDocument?.lineCount, "lines");
|
|
307
376
|
}
|
|
308
377
|
};
|
|
378
|
+
get #diffSyle() {
|
|
379
|
+
return this.#fileInstance?.options.diffStyle ?? "split";
|
|
380
|
+
}
|
|
381
|
+
get #isDiff() {
|
|
382
|
+
return this.#fileInstance?.type === "file-diff";
|
|
383
|
+
}
|
|
384
|
+
get #isWrap() {
|
|
385
|
+
return this.#fileInstance?.options.overflow === "wrap";
|
|
386
|
+
}
|
|
309
387
|
#resetCache() {
|
|
310
388
|
this.#lineYCache.clear();
|
|
311
389
|
this.#wrapLineOffsetsCache.clear();
|
|
312
|
-
this.#
|
|
390
|
+
this.#lineElementsCache.clear();
|
|
313
391
|
this.#lastAccessedCharX = void 0;
|
|
314
392
|
}
|
|
315
393
|
#resetState() {
|
|
394
|
+
this.#setSelectedLinesSafe(null);
|
|
316
395
|
this.#gutterWidthCache = void 0;
|
|
317
396
|
this.#contentWidthCache = void 0;
|
|
318
|
-
this.#fileInstance?.setSelectedLines(null);
|
|
319
397
|
this.#shouldIgnoreSelectionChange = false;
|
|
320
398
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
321
399
|
this.#overlayElements = void 0;
|
|
@@ -349,11 +427,13 @@ var Editor = class {
|
|
|
349
427
|
this.#globalEventDisposes = [
|
|
350
428
|
addEventListener(document, "selectionchange", () => {
|
|
351
429
|
const shadowRoot = this.#fileContainer?.shadowRoot;
|
|
352
|
-
if (this.#shouldIgnoreSelectionChange || shadowRoot == null) return;
|
|
430
|
+
if (this.#shouldIgnoreSelectionChange || this.#suppressNativeSelectionSync || shadowRoot == null || !this.#contentHasFocus) return;
|
|
353
431
|
if (this.#selections !== void 0 && this.#selections.length > 1 && !this.#isContentMouseDown) return;
|
|
354
|
-
const
|
|
432
|
+
const selectionRaw = document.getSelection();
|
|
433
|
+
if (selectionRaw == null || typeof selectionRaw.getComposedRanges !== "function") return;
|
|
434
|
+
const composedRange = selectionRaw.getComposedRanges({ shadowRoots: [shadowRoot] })?.[0];
|
|
355
435
|
if (composedRange === void 0 || !this.#rangeBelongsToEditor(composedRange)) return;
|
|
356
|
-
let selection = convertSelection(composedRange,
|
|
436
|
+
let selection = convertSelection(composedRange, 0);
|
|
357
437
|
if (selection === void 0) return;
|
|
358
438
|
if (this.#isContentMouseDown && this.#shiftKeyPressed && this.#selections !== void 0 && this.#selections.length > 0) {
|
|
359
439
|
const primarySelection = this.#selections.at(-1);
|
|
@@ -379,9 +459,7 @@ var Editor = class {
|
|
|
379
459
|
this.#shiftKeyPressed = false;
|
|
380
460
|
this.#selectionStart = void 0;
|
|
381
461
|
this.#reservedSelections = void 0;
|
|
382
|
-
this.#
|
|
383
|
-
if (key.startsWith("selectionActionIcon-")) el.dataset.visible = "true";
|
|
384
|
-
});
|
|
462
|
+
if (this.#options.enabledSelectionAction === true && this.#selections !== void 0 && this.#selections.length > 0 && !isCollapsedSelection(this.#selections.at(-1))) this.#updateSelections(this.#selections);
|
|
385
463
|
}, { passive: true }),
|
|
386
464
|
addEventListener(document, "keydown", (e) => {
|
|
387
465
|
if (e.key === "Shift") this.#selectionStart = this.#selections?.at(-1);
|
|
@@ -391,6 +469,10 @@ var Editor = class {
|
|
|
391
469
|
}, { passive: true })
|
|
392
470
|
];
|
|
393
471
|
}
|
|
472
|
+
#replaceSelectEventListeners(disposes) {
|
|
473
|
+
this.#selectEventDisposes?.forEach((dispose) => dispose());
|
|
474
|
+
this.#selectEventDisposes = disposes;
|
|
475
|
+
}
|
|
394
476
|
#listenContentElement(contentEl, gutterEl) {
|
|
395
477
|
const targetIsContentElement = (e) => {
|
|
396
478
|
const target = e.composedPath()[0];
|
|
@@ -398,25 +480,42 @@ var Editor = class {
|
|
|
398
480
|
};
|
|
399
481
|
this.#editorEventDisposes?.forEach((dispose) => dispose());
|
|
400
482
|
this.#editorEventDisposes = [
|
|
483
|
+
addEventListener(contentEl, "focus", () => {
|
|
484
|
+
this.#contentHasFocus = true;
|
|
485
|
+
if (!this.#isContentMouseDown && !this.#shouldIgnoreSelectionChange && this.#selections !== void 0 && this.#selections.length > 0) this.#setWindowSelection(this.#selections.at(-1));
|
|
486
|
+
}, { passive: true }),
|
|
487
|
+
addEventListener(contentEl, "blur", () => {
|
|
488
|
+
this.#contentHasFocus = false;
|
|
489
|
+
}, { passive: true }),
|
|
401
490
|
addEventListener(contentEl, "pointerdown", (e) => {
|
|
491
|
+
this.#suppressNativeSelectionSync = false;
|
|
402
492
|
if (e.pointerType !== "mouse") return;
|
|
493
|
+
if (this.#isDeletedLineTarget(e)) {
|
|
494
|
+
this.#setDeletedTextSelectionActive(true);
|
|
495
|
+
if (this.#selections !== void 0) this.#updateSelections([]);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
this.#setDeletedTextSelectionActive(false);
|
|
403
499
|
this.#markerRenderer?.removePopup();
|
|
404
|
-
if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0)
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
500
|
+
if (isSafari() && this.#lineAnnotations !== void 0 && this.#lineAnnotations.length > 0) {
|
|
501
|
+
const annotationDisposes = [...contentEl.querySelectorAll("[data-line-annotation]")].map((el) => [addEventListener(el, "mouseenter", () => {
|
|
502
|
+
this.#shouldIgnoreSelectionChange = true;
|
|
503
|
+
}), addEventListener(el, "mouseleave", () => {
|
|
504
|
+
this.#shouldIgnoreSelectionChange = false;
|
|
505
|
+
})]).flat();
|
|
506
|
+
this.#replaceSelectEventListeners(annotationDisposes);
|
|
507
|
+
}
|
|
409
508
|
this.#isContentMouseDown = true;
|
|
410
509
|
this.#selectionStart = void 0;
|
|
411
510
|
if (e.button === 0 && isPrimaryModifier(e)) this.#reservedSelections = this.#selections?.map((selection) => ({ ...selection }));
|
|
412
511
|
if (e.shiftKey) {
|
|
413
512
|
const primarySelection = this.#selections?.at(-1);
|
|
414
513
|
if (primarySelection !== void 0) {
|
|
415
|
-
const pos = primarySelection.direction ===
|
|
514
|
+
const pos = primarySelection.direction === -1 ? primarySelection.end : primarySelection.start;
|
|
416
515
|
this.#setWindowSelection({
|
|
417
516
|
start: pos,
|
|
418
517
|
end: pos,
|
|
419
|
-
direction:
|
|
518
|
+
direction: 0
|
|
420
519
|
});
|
|
421
520
|
}
|
|
422
521
|
this.#shiftKeyPressed = true;
|
|
@@ -437,7 +536,7 @@ var Editor = class {
|
|
|
437
536
|
this.#updateSelections([{
|
|
438
537
|
start: pos,
|
|
439
538
|
end: pos,
|
|
440
|
-
direction:
|
|
539
|
+
direction: 0
|
|
441
540
|
}]);
|
|
442
541
|
this.#focus(pos);
|
|
443
542
|
}
|
|
@@ -445,6 +544,7 @@ var Editor = class {
|
|
|
445
544
|
return;
|
|
446
545
|
}
|
|
447
546
|
if (!targetIsContentElement(e)) return;
|
|
547
|
+
this.#suppressNativeSelectionSync = false;
|
|
448
548
|
const mvShortcut = isMoveCursorShortcut(e);
|
|
449
549
|
const textDocument = this.#textDocument;
|
|
450
550
|
if (this.#selections !== void 0 && this.#selections.length > 0 && mvShortcut !== void 0 && textDocument !== void 0) {
|
|
@@ -454,6 +554,19 @@ var Editor = class {
|
|
|
454
554
|
e.preventDefault();
|
|
455
555
|
return;
|
|
456
556
|
}
|
|
557
|
+
if (e.key === "v" && isPrimaryModifier(e) && this.#options.clipboard !== void 0) {
|
|
558
|
+
e.preventDefault();
|
|
559
|
+
queueRender(this.#handleCustomPasteEvent);
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
if (this.#searchPanel !== void 0) {
|
|
563
|
+
const findAgain = resolveFindAgainShortcut(e);
|
|
564
|
+
if (findAgain !== void 0) {
|
|
565
|
+
e.preventDefault();
|
|
566
|
+
this.#searchPanel.navigate(findAgain === "previous");
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
457
570
|
const command = resolveEditorCommandFromKeyboardEvent(e);
|
|
458
571
|
if (command !== void 0) {
|
|
459
572
|
e.preventDefault();
|
|
@@ -463,22 +576,23 @@ var Editor = class {
|
|
|
463
576
|
addEventListener(contentEl, "copy", (e) => {
|
|
464
577
|
if (!targetIsContentElement(e)) return;
|
|
465
578
|
e.preventDefault();
|
|
466
|
-
e.clipboardData?.setData("text", this.#getSelectionText());
|
|
579
|
+
e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#getSelectionText());
|
|
467
580
|
}),
|
|
468
581
|
addEventListener(contentEl, "cut", (e) => {
|
|
469
582
|
if (!targetIsContentElement(e)) return;
|
|
470
583
|
e.preventDefault();
|
|
471
|
-
e.clipboardData?.setData("text", this.#
|
|
472
|
-
this.#replaceSelectionText("");
|
|
584
|
+
e.clipboardData?.setData("text", this.#isDeletedTextSelectionActive() ? this.#deletedTextForClipboard() : this.#cutSelectionText());
|
|
473
585
|
}),
|
|
474
586
|
addEventListener(contentEl, "paste", (e) => {
|
|
475
587
|
if (!targetIsContentElement(e)) return;
|
|
476
588
|
e.preventDefault();
|
|
477
589
|
const text = e.clipboardData?.getData("text");
|
|
478
|
-
|
|
590
|
+
const textDocument = this.#textDocument;
|
|
591
|
+
if (text !== void 0 && textDocument !== void 0) this.#replaceSelectionText(textDocument.normalizeEol(text), void 0, true);
|
|
479
592
|
}),
|
|
480
593
|
addEventListener(contentEl, "beforeinput", (e) => {
|
|
481
594
|
if (!targetIsContentElement(e)) return;
|
|
595
|
+
if (e.inputType === "insertCompositionText") return;
|
|
482
596
|
e.preventDefault();
|
|
483
597
|
this.#handleInput(e.inputType, e.data);
|
|
484
598
|
}),
|
|
@@ -488,14 +602,25 @@ var Editor = class {
|
|
|
488
602
|
}),
|
|
489
603
|
addEventListener(contentEl, "compositionstart", (e) => {
|
|
490
604
|
if (!targetIsContentElement(e)) return;
|
|
605
|
+
this.#isComposing = true;
|
|
491
606
|
this.#shouldIgnoreSelectionChange = true;
|
|
492
607
|
}, { passive: true }),
|
|
493
608
|
addEventListener(contentEl, "compositionend", (e) => {
|
|
494
609
|
if (!targetIsContentElement(e)) return;
|
|
495
610
|
this.#shouldIgnoreSelectionChange = false;
|
|
496
|
-
this.#
|
|
611
|
+
const wasComposing = this.#isComposing;
|
|
612
|
+
this.#isComposing = false;
|
|
613
|
+
if (e.data !== "" || !wasComposing) this.#handleInput("insertText", e.data);
|
|
497
614
|
}, { passive: true })
|
|
498
615
|
];
|
|
616
|
+
const deletionsCode = this.#fileContainer?.shadowRoot?.querySelector("[data-deletions]");
|
|
617
|
+
if (deletionsCode != null) this.#editorEventDisposes.push(addEventListener(deletionsCode, "pointerdown", (e) => {
|
|
618
|
+
const target = e.composedPath()[0];
|
|
619
|
+
const gutterRow = target instanceof HTMLElement ? target.closest("[data-column-number]") : null;
|
|
620
|
+
if (gutterRow instanceof HTMLElement && this.#beginDeletionGutterSelection(gutterRow, deletionsCode, e.pointerType === "mouse")) return;
|
|
621
|
+
this.#setDeletedTextSelectionActive(true);
|
|
622
|
+
if (this.#selections !== void 0) this.#updateSelections([]);
|
|
623
|
+
}, { passive: true }));
|
|
499
624
|
if (gutterEl !== void 0) {
|
|
500
625
|
const resolveGutterTarget = (eventTarget, includeContentLine = false) => {
|
|
501
626
|
let target = eventTarget;
|
|
@@ -511,55 +636,61 @@ var Editor = class {
|
|
|
511
636
|
return lineNumber - 1;
|
|
512
637
|
};
|
|
513
638
|
this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
|
|
639
|
+
const gutterRow = resolveGutterTarget(e.composedPath()[0]);
|
|
640
|
+
if (gutterRow?.dataset.lineType === "change-deletion") {
|
|
641
|
+
const code = gutterRow.closest("[data-code]");
|
|
642
|
+
if (code != null) this.#beginDeletionGutterSelection(gutterRow, code, e.pointerType === "mouse");
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
645
|
+
if (e.pointerType !== "mouse") return;
|
|
514
646
|
const textDocument = this.#textDocument;
|
|
515
|
-
const lineIndex = resolveEditableLine(
|
|
647
|
+
const lineIndex = resolveEditableLine(gutterRow);
|
|
516
648
|
if (lineIndex === void 0 || textDocument === void 0) return;
|
|
517
649
|
this.#markerRenderer?.removePopup();
|
|
518
|
-
const selection =
|
|
519
|
-
start: {
|
|
520
|
-
line: lineIndex,
|
|
521
|
-
character: 0
|
|
522
|
-
},
|
|
523
|
-
end: {
|
|
524
|
-
line: lineIndex,
|
|
525
|
-
character: textDocument.getLineText(lineIndex).length
|
|
526
|
-
},
|
|
527
|
-
direction: DirectionForward
|
|
528
|
-
};
|
|
650
|
+
const selection = this.#spanLineSelection(lineIndex, lineIndex, textDocument);
|
|
529
651
|
this.#isGutterMouseDown = true;
|
|
530
652
|
this.#selectionStart = selection;
|
|
531
653
|
this.#updateSelections([selection]);
|
|
532
|
-
this.#
|
|
533
|
-
this.#
|
|
654
|
+
this.#setWindowSelection(selection);
|
|
655
|
+
this.#focus();
|
|
656
|
+
this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (e) => {
|
|
534
657
|
if (!this.#isGutterMouseDown) return;
|
|
535
|
-
const textDocument
|
|
536
|
-
const lineIndex
|
|
537
|
-
if (lineIndex
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
line: lineIndex$1,
|
|
545
|
-
character: textDocument$1.getLineText(lineIndex$1).length
|
|
546
|
-
},
|
|
547
|
-
direction: DirectionForward
|
|
548
|
-
};
|
|
549
|
-
if (this.#selectionStart !== void 0) selection$1 = createSelectionFrom(this.#selectionStart, selection$1);
|
|
550
|
-
else this.#selectionStart = selection$1;
|
|
551
|
-
this.#updateSelections([selection$1]);
|
|
552
|
-
this.#focus(selection$1.end);
|
|
553
|
-
}, { passive: true })];
|
|
658
|
+
const textDocument = this.#textDocument;
|
|
659
|
+
const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0], true));
|
|
660
|
+
if (lineIndex === void 0 || textDocument === void 0) return;
|
|
661
|
+
const anchorLine = this.#selectionStart?.start.line ?? lineIndex;
|
|
662
|
+
const selection = this.#spanLineSelection(anchorLine, lineIndex, textDocument);
|
|
663
|
+
this.#selectionStart ??= selection;
|
|
664
|
+
this.#updateSelections([selection]);
|
|
665
|
+
this.#focus(selection.direction === -1 ? selection.start : selection.end);
|
|
666
|
+
}, { passive: true })]);
|
|
554
667
|
}, { passive: true }));
|
|
555
668
|
}
|
|
556
669
|
this.#markerRenderer?.listenHover(contentEl);
|
|
557
670
|
this.#resizeObserver?.disconnect();
|
|
558
|
-
this.#resizeObserver = new ResizeObserver(
|
|
559
|
-
this.#handleLayoutResize();
|
|
560
|
-
});
|
|
671
|
+
this.#resizeObserver = new ResizeObserver(this.#handleLayoutResize);
|
|
561
672
|
this.#resizeObserver.observe(contentEl);
|
|
562
673
|
this.#resizeObserver.observe(contentEl.parentElement);
|
|
674
|
+
this.#computeContentOffset(contentEl);
|
|
675
|
+
}
|
|
676
|
+
#handleCustomPasteEvent = async () => {
|
|
677
|
+
const clipboard = this.#options.clipboard;
|
|
678
|
+
if (clipboard !== void 0) {
|
|
679
|
+
const text = await clipboard.readText();
|
|
680
|
+
this.#replaceSelectionText(text, void 0, true);
|
|
681
|
+
}
|
|
682
|
+
};
|
|
683
|
+
#computeContentOffset(contentEl) {
|
|
684
|
+
if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) {
|
|
685
|
+
this.#contentOffset = {
|
|
686
|
+
top: contentEl.offsetTop,
|
|
687
|
+
left: contentEl.offsetLeft - this.#getGutterWidth()
|
|
688
|
+
};
|
|
689
|
+
if (this.#options.__debug === true) console.log("[diffs/editor] content offset:", this.#contentOffset);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
get #activeContentOffset() {
|
|
693
|
+
if (this.#isDiff && this.#diffSyle === "split" && this.#isWrap) return this.#contentOffset;
|
|
563
694
|
}
|
|
564
695
|
#runCommand(command) {
|
|
565
696
|
const textDocument = this.#textDocument;
|
|
@@ -595,6 +726,7 @@ var Editor = class {
|
|
|
595
726
|
if (this.#selections !== void 0) {
|
|
596
727
|
const edits = [];
|
|
597
728
|
const nextSelections = [];
|
|
729
|
+
const sameLineIndents = [];
|
|
598
730
|
for (const selection of this.#selections) {
|
|
599
731
|
const startLine = selection.start.line;
|
|
600
732
|
const outdent = command === "outdent";
|
|
@@ -603,26 +735,77 @@ var Editor = class {
|
|
|
603
735
|
edits.push(...ret[0]);
|
|
604
736
|
nextSelections.push(ret[1]);
|
|
605
737
|
} else {
|
|
606
|
-
const
|
|
738
|
+
const text = textDocument.charAt({
|
|
607
739
|
line: startLine,
|
|
608
740
|
character: 0
|
|
741
|
+
}) === " " ? " " : " ".repeat(this.#metrics.tabSize);
|
|
742
|
+
edits.push({
|
|
743
|
+
range: selection,
|
|
744
|
+
newText: text
|
|
745
|
+
});
|
|
746
|
+
sameLineIndents.push({
|
|
747
|
+
line: startLine,
|
|
748
|
+
startCharacter: selection.start.character,
|
|
749
|
+
addedLength: text.length - (selection.end.character - selection.start.character),
|
|
750
|
+
selectionIndex: nextSelections.length
|
|
609
751
|
});
|
|
610
|
-
|
|
752
|
+
const nextPosition = {
|
|
753
|
+
line: selection.start.line,
|
|
754
|
+
character: selection.start.character + text.length
|
|
755
|
+
};
|
|
756
|
+
nextSelections.push({
|
|
757
|
+
start: nextPosition,
|
|
758
|
+
end: nextPosition,
|
|
759
|
+
direction: 0
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
for (const indent of sameLineIndents) {
|
|
764
|
+
let shift = 0;
|
|
765
|
+
for (const other of sameLineIndents) if (other.line === indent.line && other.startCharacter < indent.startCharacter) shift += other.addedLength;
|
|
766
|
+
if (shift !== 0) {
|
|
767
|
+
const current = nextSelections[indent.selectionIndex];
|
|
768
|
+
const position = {
|
|
769
|
+
line: indent.line,
|
|
770
|
+
character: current.start.character + shift
|
|
771
|
+
};
|
|
772
|
+
nextSelections[indent.selectionIndex] = {
|
|
773
|
+
start: position,
|
|
774
|
+
end: position,
|
|
775
|
+
direction: 0
|
|
776
|
+
};
|
|
611
777
|
}
|
|
612
778
|
}
|
|
613
779
|
const change = textDocument.applyEdits(edits, true, this.#selections, nextSelections);
|
|
614
780
|
if (change !== void 0) this.#applyChange(change, nextSelections);
|
|
615
781
|
}
|
|
616
782
|
break;
|
|
617
|
-
case "selectAll":
|
|
618
|
-
|
|
783
|
+
case "selectAll": {
|
|
784
|
+
const fullSelection = getDocumentFullSelection(textDocument);
|
|
785
|
+
this.#updateSelections([fullSelection]);
|
|
619
786
|
this.focus();
|
|
787
|
+
const renderedLines = this.#getRenderedEditableLineRange();
|
|
788
|
+
if (renderedLines !== void 0) {
|
|
789
|
+
this.#suppressNativeSelectionSync = true;
|
|
790
|
+
this.#setWindowSelection({
|
|
791
|
+
start: {
|
|
792
|
+
line: renderedLines.first,
|
|
793
|
+
character: 0
|
|
794
|
+
},
|
|
795
|
+
end: {
|
|
796
|
+
line: renderedLines.last,
|
|
797
|
+
character: textDocument.getLineLength(renderedLines.last)
|
|
798
|
+
},
|
|
799
|
+
direction: 1
|
|
800
|
+
});
|
|
801
|
+
}
|
|
620
802
|
break;
|
|
803
|
+
}
|
|
621
804
|
case "moveCursorToDocStart":
|
|
622
805
|
case "moveCursorToDocEnd":
|
|
623
806
|
{
|
|
624
807
|
const atEnd = command === "moveCursorToDocEnd";
|
|
625
|
-
this.#updateSelections([getDocumentBoundarySelection(textDocument, atEnd)]);
|
|
808
|
+
this.#updateSelections([getDocumentBoundarySelection(textDocument, atEnd, this.#isDiff)]);
|
|
626
809
|
this.#scrollToPrimaryCaret();
|
|
627
810
|
}
|
|
628
811
|
break;
|
|
@@ -632,7 +815,7 @@ var Editor = class {
|
|
|
632
815
|
const atEnd = command === "expandSelectionDocEnd";
|
|
633
816
|
const selections = this.#selections;
|
|
634
817
|
if (selections !== void 0) {
|
|
635
|
-
this.#updateSelections(extendSelections(selections, getDocumentBoundarySelection(textDocument, atEnd)));
|
|
818
|
+
this.#updateSelections(extendSelections(selections, getDocumentBoundarySelection(textDocument, atEnd, this.#isDiff)));
|
|
636
819
|
this.#scrollToPrimaryCaret();
|
|
637
820
|
}
|
|
638
821
|
}
|
|
@@ -651,7 +834,7 @@ var Editor = class {
|
|
|
651
834
|
break;
|
|
652
835
|
}
|
|
653
836
|
}
|
|
654
|
-
#handleLayoutResize() {
|
|
837
|
+
#handleLayoutResize = () => {
|
|
655
838
|
const lineAnnotations = this.#lineAnnotations?.length ?? 0;
|
|
656
839
|
const prevGutterWidth = this.#gutterWidthCache;
|
|
657
840
|
const prevContentWidth = this.#contentWidthCache;
|
|
@@ -660,9 +843,10 @@ var Editor = class {
|
|
|
660
843
|
const gutterWidthChanged = this.#getGutterWidth() !== prevGutterWidth;
|
|
661
844
|
const contentWidthChanged = this.#getContentWidth() !== prevContentWidth;
|
|
662
845
|
if (!gutterWidthChanged && !contentWidthChanged) return;
|
|
663
|
-
this.#
|
|
846
|
+
this.#lineElementsCache.clear();
|
|
664
847
|
this.#lastAccessedCharX = void 0;
|
|
665
|
-
|
|
848
|
+
this.#metrics.clearTextWidthCache();
|
|
849
|
+
if (contentWidthChanged && (this.#isWrap || lineAnnotations > 0)) {
|
|
666
850
|
this.#lineYCache.clear();
|
|
667
851
|
this.#wrapLineOffsetsCache.clear();
|
|
668
852
|
}
|
|
@@ -671,15 +855,29 @@ var Editor = class {
|
|
|
671
855
|
if (this.#selections !== void 0) this.focus();
|
|
672
856
|
}
|
|
673
857
|
this.#markerRenderer?.removePopup();
|
|
858
|
+
this.#computeContentOffset(this.#contentElement);
|
|
859
|
+
};
|
|
860
|
+
#remeasureMetricsOnFontLoad() {
|
|
861
|
+
if (this.#fontRemeasureScheduled) return;
|
|
862
|
+
const fonts = document.fonts;
|
|
863
|
+
if (fonts === void 0) return;
|
|
864
|
+
this.#fontRemeasureScheduled = true;
|
|
865
|
+
fonts.ready.then(() => {
|
|
866
|
+
if (this.#contentElement === void 0 || !this.#metrics.remeasureCharacterWidth()) return;
|
|
867
|
+
this.#gutterWidthCache = void 0;
|
|
868
|
+
this.#contentWidthCache = void 0;
|
|
869
|
+
this.#resetCache();
|
|
870
|
+
if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
|
|
871
|
+
this.#markerRenderer?.removePopup();
|
|
872
|
+
});
|
|
674
873
|
}
|
|
675
874
|
#rerender(change, newLineAnnotations, renderRange = this.#renderRange, shouldUpdateBuffer) {
|
|
676
875
|
const tokenizer = this.#tokenizer;
|
|
677
876
|
const fileInstance = this.#fileInstance;
|
|
678
|
-
const fileContents = this.#fileContents;
|
|
679
877
|
const textDocument = this.#textDocument;
|
|
680
878
|
const gutterEl = this.#gutterElement;
|
|
681
879
|
const contentEl = this.#contentElement;
|
|
682
|
-
if (tokenizer === void 0 || fileInstance === void 0 ||
|
|
880
|
+
if (tokenizer === void 0 || fileInstance === void 0 || textDocument === void 0 || contentEl === void 0) return;
|
|
683
881
|
tokenizer.stopBackgroundTokenize();
|
|
684
882
|
const t = performance.now();
|
|
685
883
|
const dirtyLines = tokenizer.tokenize(change, renderRange);
|
|
@@ -692,14 +890,14 @@ var Editor = class {
|
|
|
692
890
|
const child = children[i];
|
|
693
891
|
if (child !== void 0) {
|
|
694
892
|
const lineNumber = getLineNumberAttr(child);
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
893
|
+
const lineType = child.dataset.lineType;
|
|
894
|
+
if (lineNumber === void 0 || lineType === "change-deletion") continue;
|
|
895
|
+
const lineIndex = lineNumber - 1;
|
|
896
|
+
if (dirtyLines.has(lineIndex)) {
|
|
897
|
+
const tokens = dirtyLines.get(lineIndex);
|
|
898
|
+
child.replaceChildren(...renderLineTokens(tokens, tokenizer.themeType));
|
|
899
|
+
dirtyLineIndexes.delete(lineIndex);
|
|
900
|
+
if (dirtyLineIndexes.size === 0) break;
|
|
703
901
|
}
|
|
704
902
|
}
|
|
705
903
|
}
|
|
@@ -730,11 +928,11 @@ var Editor = class {
|
|
|
730
928
|
if (change.lineDelta < 0) for (const children of [contentEl.children, gutterEl?.children ?? []]) for (let i = children.length - 1; i >= 0; i--) {
|
|
731
929
|
const child = children[i];
|
|
732
930
|
const lineNumber = getLineNumberAttr(child) ?? getLineNumberAttr(child, "columnNumber");
|
|
733
|
-
|
|
931
|
+
const lineType = child.dataset.lineType;
|
|
932
|
+
if (lineNumber === void 0 || lineType === "change-deletion") continue;
|
|
734
933
|
if (lineNumber - 1 < change.lineCount) break;
|
|
735
934
|
child.remove();
|
|
736
935
|
}
|
|
737
|
-
const isDiff = Object.hasOwn(fileInstance, "fileDiff");
|
|
738
936
|
const didLineCountChange = change.lineDelta !== 0;
|
|
739
937
|
if (didLineCountChange) {
|
|
740
938
|
let gridRow = contentEl.children.length;
|
|
@@ -745,8 +943,9 @@ var Editor = class {
|
|
|
745
943
|
contentEl.style.gridRow = "span " + gridRow;
|
|
746
944
|
if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
|
|
747
945
|
}
|
|
748
|
-
fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType,
|
|
946
|
+
fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, !didLineCountChange);
|
|
749
947
|
if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
|
|
948
|
+
if (this.#isDiff && (this.#diffSyle === "unified" || didLineCountChange)) this.#resetCache();
|
|
750
949
|
if (newLineAnnotations !== void 0) {
|
|
751
950
|
this.#lineAnnotations = newLineAnnotations;
|
|
752
951
|
renderLineAnnotations(newLineAnnotations, contentEl, gutterEl);
|
|
@@ -755,9 +954,16 @@ var Editor = class {
|
|
|
755
954
|
}
|
|
756
955
|
#handleInput(inputType, data) {
|
|
757
956
|
switch (inputType) {
|
|
758
|
-
case "insertText":
|
|
759
|
-
|
|
957
|
+
case "insertText": {
|
|
958
|
+
const text = data ?? "";
|
|
959
|
+
const textDocument = this.#textDocument;
|
|
960
|
+
const selections = this.#selections;
|
|
961
|
+
const autoSurroundTexts = textDocument !== void 0 && selections !== void 0 ? getAutoSurroundReplacementTexts(textDocument, selections, text, this.#options.autoSurround) : void 0;
|
|
962
|
+
this.#replaceSelectionText(autoSurroundTexts ?? text);
|
|
760
963
|
break;
|
|
964
|
+
}
|
|
965
|
+
case "insertCompositionText": break;
|
|
966
|
+
case "insertLineBreak":
|
|
761
967
|
case "insertParagraph":
|
|
762
968
|
this.#replaceSelectionText("\n");
|
|
763
969
|
break;
|
|
@@ -768,6 +974,7 @@ var Editor = class {
|
|
|
768
974
|
this.#deleteSelectionText(true);
|
|
769
975
|
break;
|
|
770
976
|
case "deleteSoftLineBackward":
|
|
977
|
+
case "deleteHardLineBackward":
|
|
771
978
|
this.#deleteSoftLineBackward();
|
|
772
979
|
break;
|
|
773
980
|
case "deleteHardLineForward":
|
|
@@ -785,12 +992,13 @@ var Editor = class {
|
|
|
785
992
|
}
|
|
786
993
|
}
|
|
787
994
|
#focus(position, preventScroll = true) {
|
|
995
|
+
this.#contentHasFocus = true;
|
|
788
996
|
if (position !== void 0) {
|
|
789
997
|
this.#shouldIgnoreSelectionChange = true;
|
|
790
998
|
this.#setWindowSelection({
|
|
791
999
|
start: position,
|
|
792
1000
|
end: position,
|
|
793
|
-
direction:
|
|
1001
|
+
direction: 0
|
|
794
1002
|
});
|
|
795
1003
|
requestAnimationFrame(() => {
|
|
796
1004
|
this.#contentElement?.focus({ preventScroll });
|
|
@@ -810,7 +1018,7 @@ var Editor = class {
|
|
|
810
1018
|
if (startLineElement === void 0 || endLineElement === void 0) return;
|
|
811
1019
|
let [anchorNode, anchorOffset] = getSelectionAnchor(startLineElement, start.character);
|
|
812
1020
|
let [focusNode, focusOffset] = getSelectionAnchor(endLineElement, end.character);
|
|
813
|
-
if (direction ===
|
|
1021
|
+
if (direction === -1) [anchorNode, anchorOffset, focusNode, focusOffset] = [
|
|
814
1022
|
focusNode,
|
|
815
1023
|
focusOffset,
|
|
816
1024
|
anchorNode,
|
|
@@ -831,7 +1039,7 @@ var Editor = class {
|
|
|
831
1039
|
block: scrollPosition,
|
|
832
1040
|
inline: "nearest"
|
|
833
1041
|
});
|
|
834
|
-
if (!noFocus) this.#focus(primarySelection.direction ===
|
|
1042
|
+
if (!noFocus) this.#focus(primarySelection.direction === -1 ? primarySelection.end : primarySelection.start);
|
|
835
1043
|
} else {
|
|
836
1044
|
const pos = getCaretPosition(primarySelection);
|
|
837
1045
|
this.#scrollToLine(pos.line, pos.character, noFocus);
|
|
@@ -845,7 +1053,7 @@ var Editor = class {
|
|
|
845
1053
|
return `${componentTop + top}px ${end}px 0 ${start}px`;
|
|
846
1054
|
}
|
|
847
1055
|
#scrollToLine(line, char = 0, noFocus = false) {
|
|
848
|
-
this.
|
|
1056
|
+
this.__postponeBgTokenizeToNextFrame();
|
|
849
1057
|
const virtualCaret = h("div", { style: {
|
|
850
1058
|
position: "absolute",
|
|
851
1059
|
left: "0",
|
|
@@ -869,46 +1077,174 @@ var Editor = class {
|
|
|
869
1077
|
});
|
|
870
1078
|
this.#scrollingToLine = void 0;
|
|
871
1079
|
this.#scrollingToLineChar = void 0;
|
|
1080
|
+
this.#scrollingToLineFixed = false;
|
|
872
1081
|
this.#scrollingToLineNoFocus = false;
|
|
873
1082
|
} else {
|
|
874
|
-
|
|
875
|
-
if (
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
1083
|
+
const modelLinePosition = this.#fileInstance?.getLinePosition?.(line + 1);
|
|
1084
|
+
if (modelLinePosition !== void 0) {
|
|
1085
|
+
virtualCaret.style.top = modelLinePosition.top + "px";
|
|
1086
|
+
this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
|
|
1087
|
+
virtualCaret.scrollIntoView({
|
|
1088
|
+
block: "center",
|
|
1089
|
+
inline: "nearest"
|
|
1090
|
+
});
|
|
1091
|
+
if (modelLinePosition.height > 0) {
|
|
1092
|
+
this.#scrollingToLine = line;
|
|
1093
|
+
this.#scrollingToLineChar = char;
|
|
1094
|
+
this.#scrollingToLineNoFocus = noFocus;
|
|
1095
|
+
} else {
|
|
1096
|
+
this.#scrollingToLine = void 0;
|
|
1097
|
+
this.#scrollingToLineChar = void 0;
|
|
1098
|
+
this.#scrollingToLineNoFocus = false;
|
|
882
1099
|
}
|
|
883
|
-
}
|
|
884
|
-
const approximateLineY = ((this.#lineAnnotations ?? []).filter((annotation) => annotation.lineNumber < line).length + line) * this.#metrics.lineHeight + yFix;
|
|
885
|
-
virtualCaret.style.top = approximateLineY + "px";
|
|
886
|
-
this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
|
|
887
|
-
virtualCaret.scrollIntoView({
|
|
888
|
-
block: "center",
|
|
889
|
-
inline: "nearest"
|
|
890
|
-
});
|
|
891
|
-
if (this.#scrollingToLine === line && yFix === 0) {
|
|
892
|
-
this.#scrollingToLine = void 0;
|
|
893
|
-
this.#scrollingToLineChar = void 0;
|
|
894
|
-
this.#scrollingToLineNoFocus = false;
|
|
895
1100
|
} else {
|
|
896
|
-
|
|
897
|
-
this.#
|
|
898
|
-
|
|
1101
|
+
let yFix = 0;
|
|
1102
|
+
if (this.#scrollingToLine === line && this.#contentElement !== void 0) for (let i = this.#contentElement.childElementCount - 1; i >= 0; i--) {
|
|
1103
|
+
const child = this.#contentElement.children[i];
|
|
1104
|
+
const lineType = child.dataset.lineType;
|
|
1105
|
+
const lineNumber = getLineNumberAttr(child);
|
|
1106
|
+
if (lineType !== void 0 && isLineEditable(lineType) && lineNumber !== void 0) {
|
|
1107
|
+
yFix = (line - (lineNumber - 1)) * this.#metrics.lineHeight;
|
|
1108
|
+
break;
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
const approximateLineY = ((this.#lineAnnotations ?? []).filter((annotation) => annotation.lineNumber < line).length + line) * this.#metrics.lineHeight + yFix;
|
|
1112
|
+
virtualCaret.style.top = approximateLineY + "px";
|
|
1113
|
+
this.#fileContainer?.shadowRoot?.appendChild(virtualCaret);
|
|
1114
|
+
virtualCaret.scrollIntoView({
|
|
1115
|
+
block: "center",
|
|
1116
|
+
inline: "nearest"
|
|
1117
|
+
});
|
|
1118
|
+
if (this.#scrollingToLine === line && yFix === 0) {
|
|
1119
|
+
this.#scrollingToLine = void 0;
|
|
1120
|
+
this.#scrollingToLineChar = void 0;
|
|
1121
|
+
this.#scrollingToLineFixed = false;
|
|
1122
|
+
this.#scrollingToLineNoFocus = false;
|
|
1123
|
+
} else if (this.#scrollingToLine === line && this.#scrollingToLineFixed) {
|
|
1124
|
+
this.#scrollingToLine = void 0;
|
|
1125
|
+
this.#scrollingToLineChar = void 0;
|
|
1126
|
+
this.#scrollingToLineFixed = false;
|
|
1127
|
+
this.#scrollingToLineNoFocus = false;
|
|
1128
|
+
} else {
|
|
1129
|
+
this.#scrollingToLine = line;
|
|
1130
|
+
this.#scrollingToLineChar = char;
|
|
1131
|
+
this.#scrollingToLineFixed = yFix !== 0;
|
|
1132
|
+
this.#scrollingToLineNoFocus = noFocus;
|
|
1133
|
+
}
|
|
899
1134
|
}
|
|
900
1135
|
}
|
|
901
1136
|
virtualCaret.remove();
|
|
902
1137
|
}
|
|
1138
|
+
#spanLineSelection(anchorLine, focusLine, textDocument) {
|
|
1139
|
+
const lineStart = (line) => ({
|
|
1140
|
+
line,
|
|
1141
|
+
character: 0
|
|
1142
|
+
});
|
|
1143
|
+
const lineEnd = (line) => ({
|
|
1144
|
+
line,
|
|
1145
|
+
character: textDocument.getLineText(line).length
|
|
1146
|
+
});
|
|
1147
|
+
if (focusLine < anchorLine) return {
|
|
1148
|
+
start: lineStart(focusLine),
|
|
1149
|
+
end: lineEnd(anchorLine),
|
|
1150
|
+
direction: -1
|
|
1151
|
+
};
|
|
1152
|
+
return {
|
|
1153
|
+
start: lineStart(anchorLine),
|
|
1154
|
+
end: lineEnd(focusLine),
|
|
1155
|
+
direction: 1
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
#isDeletedLineTarget(event) {
|
|
1159
|
+
const target = event.composedPath()[0];
|
|
1160
|
+
return target instanceof HTMLElement && target.closest("[data-line]")?.getAttribute("data-line-type") === "change-deletion";
|
|
1161
|
+
}
|
|
1162
|
+
#selectDeletedLines(anchorContent, focusContent, deletionsCode) {
|
|
1163
|
+
const rows = [...deletionsCode.querySelectorAll("[data-content] > [data-line]")];
|
|
1164
|
+
const anchorIndex = rows.indexOf(anchorContent);
|
|
1165
|
+
const focusIndex = rows.indexOf(focusContent);
|
|
1166
|
+
const [topContent, bottomContent] = focusIndex < anchorIndex ? [focusContent, anchorContent] : [anchorContent, focusContent];
|
|
1167
|
+
const winSelection = window.getSelection();
|
|
1168
|
+
if (winSelection !== null) {
|
|
1169
|
+
const range = document.createRange();
|
|
1170
|
+
range.setStart(topContent, 0);
|
|
1171
|
+
range.setEnd(bottomContent, bottomContent.childNodes.length);
|
|
1172
|
+
winSelection.removeAllRanges();
|
|
1173
|
+
winSelection.addRange(range);
|
|
1174
|
+
}
|
|
1175
|
+
this.#setDeletedTextSelectionActive(true);
|
|
1176
|
+
this.#updateSelections([]);
|
|
1177
|
+
[...deletionsCode.querySelectorAll("[data-gutter] > [data-column-number]")][focusIndex]?.setAttribute("data-selected-line", "single");
|
|
1178
|
+
const lo = Math.min(anchorIndex, focusIndex);
|
|
1179
|
+
const hi = Math.max(anchorIndex, focusIndex);
|
|
1180
|
+
this.#deletedSelectionText = lo < 0 ? "" : rows.slice(lo, hi + 1).filter((row) => row.getAttribute("data-line-type") === "change-deletion").map((row) => row.textContent ?? "").join("\n");
|
|
1181
|
+
}
|
|
1182
|
+
#contentRowForGutterRow(gutterRow, contentColumn) {
|
|
1183
|
+
const gutterColumn = gutterRow.parentElement;
|
|
1184
|
+
if (gutterColumn == null || contentColumn == null) return;
|
|
1185
|
+
const index = [...gutterColumn.children].indexOf(gutterRow);
|
|
1186
|
+
const row = contentColumn.children[index];
|
|
1187
|
+
return row instanceof HTMLElement ? row : void 0;
|
|
1188
|
+
}
|
|
1189
|
+
#beginDeletionGutterSelection(gutterRow, code, isMouse) {
|
|
1190
|
+
const contentColumn = code.querySelector("[data-content]");
|
|
1191
|
+
const anchorContent = this.#contentRowForGutterRow(gutterRow, contentColumn);
|
|
1192
|
+
if (anchorContent === void 0) return false;
|
|
1193
|
+
this.#selectDeletedLines(anchorContent, anchorContent, code);
|
|
1194
|
+
if (isMouse) this.#replaceSelectEventListeners([addEventListener(document, "mousemove", (moveEvent) => {
|
|
1195
|
+
const moveTarget = moveEvent.composedPath()[0];
|
|
1196
|
+
const moveGutter = moveTarget instanceof HTMLElement ? moveTarget.closest("[data-column-number]") : null;
|
|
1197
|
+
if (moveGutter instanceof HTMLElement && code.contains(moveGutter)) {
|
|
1198
|
+
const focusContent = this.#contentRowForGutterRow(moveGutter, contentColumn);
|
|
1199
|
+
if (focusContent !== void 0) this.#selectDeletedLines(anchorContent, focusContent, code);
|
|
1200
|
+
}
|
|
1201
|
+
}, { passive: true })]);
|
|
1202
|
+
return true;
|
|
1203
|
+
}
|
|
1204
|
+
#isDeletedTextSelectionActive() {
|
|
1205
|
+
return this.#fileContainer?.shadowRoot?.querySelector("pre")?.hasAttribute("data-deleted-text-selection") ?? false;
|
|
1206
|
+
}
|
|
1207
|
+
#deletedTextForClipboard() {
|
|
1208
|
+
return this.#deletedSelectionText !== "" ? this.#deletedSelectionText : window.getSelection()?.toString() ?? "";
|
|
1209
|
+
}
|
|
1210
|
+
#setDeletedTextSelectionActive(active) {
|
|
1211
|
+
const pre = this.#fileContainer?.shadowRoot?.querySelector("pre");
|
|
1212
|
+
if (pre == null) return;
|
|
1213
|
+
if (active) {
|
|
1214
|
+
pre.setAttribute("data-deleted-text-selection", "");
|
|
1215
|
+
for (const highlighted of pre.querySelectorAll("[data-selected-line]")) highlighted.removeAttribute("data-selected-line");
|
|
1216
|
+
this.#deletedSelectionText = "";
|
|
1217
|
+
} else {
|
|
1218
|
+
pre.removeAttribute("data-deleted-text-selection");
|
|
1219
|
+
this.#deletedSelectionText = "";
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
#setSelectedLinesSafe(range, lineNumberOnly = false) {
|
|
1223
|
+
try {
|
|
1224
|
+
this.#fileInstance?.setSelectedLines(range, {
|
|
1225
|
+
notify: false,
|
|
1226
|
+
activeLineSide: "additions",
|
|
1227
|
+
lineNumberOnly
|
|
1228
|
+
});
|
|
1229
|
+
} catch {}
|
|
1230
|
+
}
|
|
1231
|
+
#scheduleThemeSelectionRefresh() {
|
|
1232
|
+
if (this.#themeSelectionRefreshFrame !== void 0) return;
|
|
1233
|
+
this.#themeSelectionRefreshFrame = requestAnimationFrame(() => {
|
|
1234
|
+
this.#themeSelectionRefreshFrame = void 0;
|
|
1235
|
+
if (this.#selections !== void 0 || this.#matches !== void 0 || this.#markerRenderer !== void 0) this.#updateSelections(this.#selections ?? []);
|
|
1236
|
+
});
|
|
1237
|
+
}
|
|
903
1238
|
#updateSelections(selections) {
|
|
904
|
-
this.
|
|
1239
|
+
this.__postponeBgTokenizeToNextFrame();
|
|
905
1240
|
this.#primaryCaretElement = void 0;
|
|
906
|
-
this.#
|
|
907
|
-
this.#gutterElement?.querySelectorAll("[data-active]").forEach((el) => el.removeAttribute("data-active"));
|
|
1241
|
+
this.#setSelectedLinesSafe(null);
|
|
908
1242
|
if (selections.length === 0 && this.#matches === void 0 && this.#markerRenderer === void 0) {
|
|
909
1243
|
this.#selections = void 0;
|
|
910
1244
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
911
1245
|
this.#overlayElements?.clear();
|
|
1246
|
+
this.#selectionAction?.cleanup();
|
|
1247
|
+
this.#selectionAction = void 0;
|
|
912
1248
|
return;
|
|
913
1249
|
}
|
|
914
1250
|
const fragment = document.createDocumentFragment();
|
|
@@ -920,21 +1256,16 @@ var Editor = class {
|
|
|
920
1256
|
const normalizedSelections = mergeOverlappingSelections(selections);
|
|
921
1257
|
const primarySelection = normalizedSelections.at(-1);
|
|
922
1258
|
this.#selections = normalizedSelections;
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
} else if (this.#gutterElement !== void 0) {
|
|
930
|
-
const pos = getCaretPosition(primarySelection);
|
|
931
|
-
this.#gutterElement.querySelector(`[data-column-number="${pos.line + 1}"]`)?.setAttribute("data-active", "");
|
|
932
|
-
}
|
|
1259
|
+
const hasNonEmptySelection = normalizedSelections.some((selection) => !isCollapsedSelection(selection));
|
|
1260
|
+
const caretLine = getCaretPosition(primarySelection).line + 1;
|
|
1261
|
+
this.#setSelectedLinesSafe({
|
|
1262
|
+
start: caretLine,
|
|
1263
|
+
end: caretLine
|
|
1264
|
+
}, hasNonEmptySelection);
|
|
933
1265
|
for (const selection of normalizedSelections) {
|
|
934
1266
|
if (!isCollapsedSelection(selection)) this.#renderSelection(renderCtx, "selection", selection);
|
|
935
1267
|
this.#renderCaret(renderCtx, selection, selection === primarySelection);
|
|
936
1268
|
}
|
|
937
|
-
if (this.#options.enabledSelectionAction === true && !isCollapsedSelection(primarySelection)) this.#renderSelectionActionIcon(renderCtx, primarySelection);
|
|
938
1269
|
}
|
|
939
1270
|
const textDocument = this.#textDocument;
|
|
940
1271
|
if (this.#matches !== void 0 && textDocument !== void 0) {
|
|
@@ -955,6 +1286,7 @@ var Editor = class {
|
|
|
955
1286
|
this.#overlayElements?.forEach((el) => el.remove());
|
|
956
1287
|
this.#overlayElements?.clear();
|
|
957
1288
|
this.#overlayElements = renderCtx.elements;
|
|
1289
|
+
this.#updateSelectionActionPopover();
|
|
958
1290
|
}
|
|
959
1291
|
#renderSelection(renderCtx, type, range, extraDataset) {
|
|
960
1292
|
if (this.#textDocument === void 0) return;
|
|
@@ -962,11 +1294,11 @@ var Editor = class {
|
|
|
962
1294
|
for (let line = start.line; line <= end.line; line++) {
|
|
963
1295
|
if (!this.#isLineVisible(line)) continue;
|
|
964
1296
|
const isLastLine = line === end.line;
|
|
965
|
-
const lineText = this.#textDocument.getLineText(line);
|
|
966
1297
|
const startChar = line === start.line ? start.character : 0;
|
|
967
|
-
const endChar = isLastLine ? end.character :
|
|
968
|
-
if (this.#
|
|
1298
|
+
const endChar = isLastLine ? end.character : this.#textDocument.getLineLength(line);
|
|
1299
|
+
if (this.#isWrap) {
|
|
969
1300
|
const contentWidth = this.#getContentWidth();
|
|
1301
|
+
const lineText = this.#textDocument.getLineText(line);
|
|
970
1302
|
if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
|
|
971
1303
|
this.#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset);
|
|
972
1304
|
continue;
|
|
@@ -975,7 +1307,7 @@ var Editor = class {
|
|
|
975
1307
|
let left = 0;
|
|
976
1308
|
let width = 0;
|
|
977
1309
|
let paddingEnd = 0;
|
|
978
|
-
if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch;
|
|
1310
|
+
if (startChar === 0) left = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
|
|
979
1311
|
else left = this.#getCharX(line, startChar)[0];
|
|
980
1312
|
if (!isLastLine && type === "selection") paddingEnd = this.#metrics.ch;
|
|
981
1313
|
if (startChar === endChar) width = paddingEnd;
|
|
@@ -986,71 +1318,66 @@ var Editor = class {
|
|
|
986
1318
|
#renderWrappedSelection(renderCtx, line, lineText, startChar, endChar, isLastLine, type, extraDataset) {
|
|
987
1319
|
const wrapOffsets = this.#wrapLineText(line);
|
|
988
1320
|
const segmentCount = wrapOffsets.length - 1;
|
|
989
|
-
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
|
|
1321
|
+
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch + (this.#activeContentOffset?.left ?? 0);
|
|
990
1322
|
for (let wrapLine = 0; wrapLine < segmentCount; wrapLine++) {
|
|
991
1323
|
const segmentStart = wrapOffsets[wrapLine];
|
|
992
1324
|
const segmentEnd = wrapOffsets[wrapLine + 1];
|
|
993
1325
|
const wrapStartChar = Math.max(startChar, segmentStart);
|
|
994
1326
|
const wrapEndChar = Math.min(endChar, segmentEnd);
|
|
995
1327
|
if (wrapStartChar > wrapEndChar) continue;
|
|
996
|
-
|
|
997
|
-
|
|
1328
|
+
const segmentStartWidth = this.#segmentTextWidth(lineText, segmentStart, wrapStartChar);
|
|
1329
|
+
const segmentLeft = offsetLeft + segmentStartWidth;
|
|
998
1330
|
let paddingEnd = 0;
|
|
999
|
-
if (wrapStartChar === 0) segmentLeft = offsetLeft;
|
|
1000
|
-
else {
|
|
1001
|
-
const prefixInSegment = lineText.slice(segmentStart, wrapStartChar);
|
|
1002
|
-
const prefixAsciiColumns = getExpandedAsciiTextColumns(prefixInSegment, this.#metrics.tabSize);
|
|
1003
|
-
segmentLeft = offsetLeft + (prefixAsciiColumns !== -1 ? prefixAsciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(prefixInSegment));
|
|
1004
|
-
}
|
|
1005
1331
|
if (!isLastLine && wrapLine === segmentCount - 1 && type === "selection") paddingEnd = this.#metrics.ch;
|
|
1006
|
-
|
|
1007
|
-
else {
|
|
1008
|
-
const selectionInSegment = lineText.slice(wrapStartChar, wrapEndChar);
|
|
1009
|
-
const selectionAsciiWidth = getExpandedAsciiTextColumns(selectionInSegment, this.#metrics.tabSize);
|
|
1010
|
-
segmentWidth = selectionAsciiWidth !== -1 ? selectionAsciiWidth * this.#metrics.ch : this.#metrics.measureTextWidth(selectionInSegment);
|
|
1011
|
-
segmentWidth += paddingEnd;
|
|
1012
|
-
}
|
|
1332
|
+
const segmentWidth = wrapStartChar === wrapEndChar ? paddingEnd : this.#segmentTextWidth(lineText, segmentStart, wrapEndChar) - segmentStartWidth + paddingEnd;
|
|
1013
1333
|
this.#renderSelectionBlock(renderCtx, type, line, wrapLine, segmentLeft, segmentWidth, extraDataset);
|
|
1014
1334
|
}
|
|
1015
1335
|
}
|
|
1336
|
+
#segmentTextWidth(lineText, segmentStart, character) {
|
|
1337
|
+
if (character <= segmentStart) return 0;
|
|
1338
|
+
const segmentText = lineText.slice(segmentStart, character);
|
|
1339
|
+
const asciiColumns = getExpandedAsciiTextColumns(segmentText, this.#metrics.tabSize);
|
|
1340
|
+
return asciiColumns !== -1 ? asciiColumns * this.#metrics.ch : this.#metrics.measureTextWidth(segmentText);
|
|
1341
|
+
}
|
|
1016
1342
|
#renderSelectionBlock(renderCtx, type, line, wrapLine, left, width, extraDataset) {
|
|
1017
1343
|
if (width === 0) return;
|
|
1018
1344
|
const { ch, lineHeight } = this.#metrics;
|
|
1019
1345
|
const y = this.#getLineY(line) + wrapLine * lineHeight;
|
|
1020
|
-
const
|
|
1021
|
-
const cacheKey = `${type}-${left}-${y}-${width}${extraDataset ?? ""}`;
|
|
1346
|
+
const cacheKey = `${type}-${line}/${wrapLine}-${left}-${width} ${extraDataset ?? ""}`;
|
|
1022
1347
|
const overlayEls = this.#overlayElements;
|
|
1023
1348
|
const rounded = (this.#options.roundedSelection ?? true) && type === "selection";
|
|
1024
|
-
const addRoundedCorner = (line
|
|
1025
|
-
const top = this.#getLineY(line
|
|
1026
|
-
const
|
|
1349
|
+
const addRoundedCorner = (line, wrapLine, left, radius) => {
|
|
1350
|
+
const top = this.#getLineY(line) + wrapLine * lineHeight;
|
|
1351
|
+
const cornerBg = this.#lineBackgroundColor(line);
|
|
1352
|
+
const css = `width:${ch}px;transform:translateX(${left}px) translateY(${top}px);` + (cornerBg !== void 0 ? `--diffs-selection-corner-bg:${cornerBg};` : "");
|
|
1027
1353
|
const dataset = {
|
|
1028
1354
|
selectionCorner: "",
|
|
1029
1355
|
[radius]: ""
|
|
1030
1356
|
};
|
|
1031
|
-
const cacheKeyPrefix = `${type}-block-${
|
|
1032
|
-
let cacheKey
|
|
1357
|
+
const cacheKeyPrefix = `${type}-block-${line}/${wrapLine}-${left}-1ch`;
|
|
1358
|
+
let cacheKey = cacheKeyPrefix + "-" + radius;
|
|
1033
1359
|
if (radius === "rbl") {
|
|
1034
1360
|
const prevCornerKey = cacheKeyPrefix + "-rtl";
|
|
1035
1361
|
const prevCorner = renderCtx.elements.get(prevCornerKey);
|
|
1036
1362
|
if (prevCorner !== void 0) {
|
|
1037
1363
|
prevCorner.remove();
|
|
1038
1364
|
renderCtx.elements.delete(prevCornerKey);
|
|
1039
|
-
cacheKey
|
|
1365
|
+
cacheKey += "-rtl";
|
|
1040
1366
|
dataset.rtl = "";
|
|
1041
1367
|
}
|
|
1042
1368
|
}
|
|
1043
|
-
let cornerEl = renderCtx.elements.get(cacheKey
|
|
1369
|
+
let cornerEl = renderCtx.elements.get(cacheKey);
|
|
1044
1370
|
if (cornerEl !== void 0) return;
|
|
1045
|
-
if (overlayEls?.has(cacheKey
|
|
1046
|
-
cornerEl = overlayEls.get(cacheKey
|
|
1047
|
-
|
|
1371
|
+
if (overlayEls?.has(cacheKey) === true) {
|
|
1372
|
+
cornerEl = overlayEls.get(cacheKey);
|
|
1373
|
+
cornerEl.style.cssText = css;
|
|
1374
|
+
overlayEls.delete(cacheKey);
|
|
1048
1375
|
} else cornerEl = h("div", {
|
|
1049
1376
|
dataset: "selectionRange",
|
|
1050
|
-
style: { cssText: css
|
|
1377
|
+
style: { cssText: css },
|
|
1051
1378
|
children: [h("div", { dataset })]
|
|
1052
1379
|
}, renderCtx.fragment);
|
|
1053
|
-
renderCtx.elements.set(cacheKey
|
|
1380
|
+
renderCtx.elements.set(cacheKey, cornerEl);
|
|
1054
1381
|
};
|
|
1055
1382
|
const addRadiusStyle = (element) => {
|
|
1056
1383
|
const end = left + width;
|
|
@@ -1100,10 +1427,9 @@ var Editor = class {
|
|
|
1100
1427
|
if (overlayEls?.has(cacheKey) === true) {
|
|
1101
1428
|
rangeEl = overlayEls.get(cacheKey);
|
|
1102
1429
|
overlayEls.delete(cacheKey);
|
|
1103
|
-
} else rangeEl = h("div", {
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
}, renderCtx.fragment);
|
|
1430
|
+
} else rangeEl = h("div", { dataset: extraDataset ? [type + "Range", extraDataset] : type + "Range" }, renderCtx.fragment);
|
|
1431
|
+
rangeEl.style.width = `${width}px`;
|
|
1432
|
+
rangeEl.style.transform = `translateX(${left}px) translateY(${y}px)`;
|
|
1107
1433
|
if (rounded) addRadiusStyle(rangeEl);
|
|
1108
1434
|
renderCtx.elements.set(cacheKey, rangeEl);
|
|
1109
1435
|
}
|
|
@@ -1123,56 +1449,47 @@ var Editor = class {
|
|
|
1123
1449
|
this.#primaryCaretElement = caretEl;
|
|
1124
1450
|
}
|
|
1125
1451
|
}
|
|
1126
|
-
#
|
|
1127
|
-
const
|
|
1128
|
-
|
|
1129
|
-
const
|
|
1130
|
-
const
|
|
1131
|
-
if (
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
const
|
|
1144
|
-
const fileContainer = this.#fileContainer;
|
|
1145
|
-
if (textDocument === void 0 || renderSelectionAction === void 0 || fileContainer == null) return;
|
|
1146
|
-
const line$1 = selection.end.line;
|
|
1147
|
-
const lineText = textDocument.getLineText(line$1);
|
|
1452
|
+
#updateSelectionActionPopover() {
|
|
1453
|
+
const primarySelection = this.#selections?.at(-1);
|
|
1454
|
+
const overlayElement = this.#overlayElement;
|
|
1455
|
+
const textDocument = this.#textDocument;
|
|
1456
|
+
const renderSelectionAction = this.#options.renderSelectionAction;
|
|
1457
|
+
if (this.#options.enabledSelectionAction !== true || renderSelectionAction === void 0 || primarySelection === void 0 || isCollapsedSelection(primarySelection) || this.#isContentMouseDown || overlayElement === void 0 || textDocument === void 0) {
|
|
1458
|
+
this.#selectionAction?.cleanup();
|
|
1459
|
+
this.#selectionAction = void 0;
|
|
1460
|
+
return;
|
|
1461
|
+
}
|
|
1462
|
+
const head = getCaretPosition(primarySelection);
|
|
1463
|
+
if (!this.#isLineVisible(head.line)) {
|
|
1464
|
+
this.#selectionAction?.cleanup();
|
|
1465
|
+
this.#selectionAction = void 0;
|
|
1466
|
+
return;
|
|
1467
|
+
}
|
|
1468
|
+
if (this.#selectionAction === void 0) {
|
|
1469
|
+
const getActiveSelection = () => this.#selections?.at(-1) ?? primarySelection;
|
|
1148
1470
|
const selectionActionElement = renderSelectionAction({
|
|
1149
1471
|
textDocument,
|
|
1150
|
-
selection
|
|
1151
|
-
|
|
1152
|
-
getSelectionText: () => {
|
|
1153
|
-
return this.#textDocument?.getText(selection) ?? "";
|
|
1472
|
+
get selection() {
|
|
1473
|
+
return getActiveSelection();
|
|
1154
1474
|
},
|
|
1475
|
+
applyEdits: (edits) => this.applyEdits(edits, true),
|
|
1476
|
+
getSelectionText: () => this.#textDocument?.getText(getActiveSelection()) ?? "",
|
|
1155
1477
|
replaceSelectionText: (text) => {
|
|
1156
|
-
this.#replaceSelectionText(text, [
|
|
1478
|
+
this.#replaceSelectionText(text, [getActiveSelection()]);
|
|
1157
1479
|
},
|
|
1158
1480
|
close: () => {
|
|
1159
|
-
|
|
1160
|
-
|
|
1481
|
+
this.#selectionAction?.cleanup();
|
|
1482
|
+
this.#selectionAction = void 0;
|
|
1161
1483
|
this.#scrollToPrimaryCaret();
|
|
1162
1484
|
}
|
|
1163
1485
|
});
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
this.#selectionAction = new SelectionActionWidget(line$1, selectionActionElement, fileContainer, leadingWhitespaces, handleWidgetDomResize);
|
|
1172
|
-
this.#updateSelections([selection]);
|
|
1173
|
-
if (this.#isLineVisible(line$1) && this.#contentElement !== void 0) this.#selectionAction.render(this.#contentElement);
|
|
1174
|
-
});
|
|
1175
|
-
renderCtx.elements.set(cacheKey, selectionActionIcon);
|
|
1486
|
+
this.#selectionAction = new SelectionActionWidget(head.line, selectionActionElement, overlayElement);
|
|
1487
|
+
}
|
|
1488
|
+
const [left, wrapLine] = this.#getCharX(head.line, head.character);
|
|
1489
|
+
const lineHeight = this.#metrics.lineHeight;
|
|
1490
|
+
const top = this.#getLineY(head.line) + wrapLine * lineHeight + lineHeight;
|
|
1491
|
+
this.#selectionAction.line = head.line;
|
|
1492
|
+
this.#selectionAction.reposition(left, top, this.#getGutterWidth());
|
|
1176
1493
|
}
|
|
1177
1494
|
#openSearchPanel(mode) {
|
|
1178
1495
|
if (this.#searchPanel !== void 0) {
|
|
@@ -1207,7 +1524,7 @@ var Editor = class {
|
|
|
1207
1524
|
this.#scrollToPrimaryCaret(true);
|
|
1208
1525
|
this.#retainSearchPanelFocus = retainFocus;
|
|
1209
1526
|
};
|
|
1210
|
-
|
|
1527
|
+
const searchPanel = new SearchPanelWidget({
|
|
1211
1528
|
textDocument,
|
|
1212
1529
|
containerElement: preElement,
|
|
1213
1530
|
defaultQuery,
|
|
@@ -1234,10 +1551,10 @@ var Editor = class {
|
|
|
1234
1551
|
this.#matches = allMatches;
|
|
1235
1552
|
if (options?.syncSelection === false) {
|
|
1236
1553
|
this.#updateSelections(this.#selections ?? []);
|
|
1237
|
-
const primarySelection
|
|
1238
|
-
if (primarySelection
|
|
1239
|
-
const startOffset = textDocument.offsetAt(primarySelection
|
|
1240
|
-
const endOffset = textDocument.offsetAt(primarySelection
|
|
1554
|
+
const primarySelection = this.#selections?.at(-1);
|
|
1555
|
+
if (primarySelection !== void 0) {
|
|
1556
|
+
const startOffset = textDocument.offsetAt(primarySelection.start);
|
|
1557
|
+
const endOffset = textDocument.offsetAt(primarySelection.end);
|
|
1241
1558
|
for (const match of allMatches) if (match[0] === startOffset && match[1] === endOffset) return match;
|
|
1242
1559
|
}
|
|
1243
1560
|
return;
|
|
@@ -1261,6 +1578,7 @@ var Editor = class {
|
|
|
1261
1578
|
this.#updateSelections(this.#selections ?? []);
|
|
1262
1579
|
}
|
|
1263
1580
|
});
|
|
1581
|
+
this.#searchPanel = searchPanel;
|
|
1264
1582
|
this.#retainSearchPanelFocus = false;
|
|
1265
1583
|
}
|
|
1266
1584
|
#getSelectionText() {
|
|
@@ -1269,45 +1587,60 @@ var Editor = class {
|
|
|
1269
1587
|
if (textDocument === void 0 || selections === void 0) return "";
|
|
1270
1588
|
return getSelectionText(textDocument, selections);
|
|
1271
1589
|
}
|
|
1272
|
-
#
|
|
1590
|
+
#cutSelectionText() {
|
|
1591
|
+
const textDocument = this.#textDocument;
|
|
1592
|
+
const selections = this.#selections;
|
|
1593
|
+
if (textDocument === void 0 || selections === void 0 || selections.length === 0) return "";
|
|
1594
|
+
if (selections.some((selection) => isCollapsedSelection(selection))) {
|
|
1595
|
+
const cut = resolveSelectionCut(textDocument, selections);
|
|
1596
|
+
this.#applySelectionCutEdits(cut.edits, cut.nextSelectionOffsets);
|
|
1597
|
+
return cut.text;
|
|
1598
|
+
}
|
|
1599
|
+
const text = getSelectionText(textDocument, selections);
|
|
1600
|
+
this.#replaceSelectionText("", void 0, true);
|
|
1601
|
+
return text;
|
|
1602
|
+
}
|
|
1603
|
+
#applySelectionCutEdits(edits, nextSelectionOffsets) {
|
|
1604
|
+
const textDocument = this.#textDocument;
|
|
1605
|
+
const selections = this.#selections;
|
|
1606
|
+
if (textDocument === void 0 || selections === void 0 || edits.length === 0) return;
|
|
1607
|
+
const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, true);
|
|
1608
|
+
if (change === void 0) return;
|
|
1609
|
+
const nextSelections = nextSelectionOffsets.map((offset) => {
|
|
1610
|
+
const caret = textDocument.positionAt(offset);
|
|
1611
|
+
return {
|
|
1612
|
+
start: caret,
|
|
1613
|
+
end: caret,
|
|
1614
|
+
direction: 0
|
|
1615
|
+
};
|
|
1616
|
+
});
|
|
1617
|
+
textDocument.setLastUndoSelectionsAfter(nextSelections);
|
|
1618
|
+
this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1619
|
+
}
|
|
1620
|
+
#replaceSelectionText(text, selections = this.#selections, undoBoundary = false) {
|
|
1273
1621
|
if (selections === void 0) return;
|
|
1274
1622
|
const textDocument = this.#textDocument;
|
|
1275
1623
|
const primarySelection = selections.at(-1);
|
|
1276
1624
|
if (textDocument === void 0 || primarySelection === void 0) return;
|
|
1277
|
-
const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations) : applyTextChangeToSelections(textDocument, selections, {
|
|
1625
|
+
const { nextSelections, change } = Array.isArray(text) && text.length === selections.length ? applyTextReplaceToSelections(textDocument, selections, text, this.#lineAnnotations, undoBoundary) : applyTextChangeToSelections(textDocument, selections, {
|
|
1278
1626
|
start: textDocument.offsetAt(primarySelection.start),
|
|
1279
1627
|
end: textDocument.offsetAt(primarySelection.end),
|
|
1280
1628
|
text: Array.isArray(text) ? text.join("\n") : text
|
|
1281
|
-
}, this.#lineAnnotations);
|
|
1629
|
+
}, this.#lineAnnotations, void 0, undoBoundary);
|
|
1282
1630
|
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1283
1631
|
}
|
|
1284
1632
|
#deleteSelectionText(forward = false) {
|
|
1285
1633
|
const selections = this.#selections;
|
|
1286
1634
|
const textDocument = this.#textDocument;
|
|
1287
1635
|
if (selections === void 0 || textDocument === void 0) return;
|
|
1288
|
-
const
|
|
1289
|
-
if (
|
|
1290
|
-
let edit;
|
|
1291
|
-
if (isCollapsedSelection(primarySelection)) {
|
|
1292
|
-
const offset = textDocument.offsetAt(primarySelection.start);
|
|
1293
|
-
const nextOffset = forward ? Math.min(textDocument.getText().length, offset + 1) : Math.max(0, offset - 1);
|
|
1294
|
-
edit = {
|
|
1295
|
-
start: Math.min(offset, nextOffset),
|
|
1296
|
-
end: Math.max(offset, nextOffset),
|
|
1297
|
-
text: ""
|
|
1298
|
-
};
|
|
1299
|
-
} else edit = {
|
|
1300
|
-
start: textDocument.offsetAt(primarySelection.start),
|
|
1301
|
-
end: textDocument.offsetAt(primarySelection.end),
|
|
1302
|
-
text: ""
|
|
1303
|
-
};
|
|
1304
|
-
this.#applyResolvedTextEdit(edit);
|
|
1636
|
+
const { nextSelections, change } = applyDeleteCharacterToSelections(textDocument, selections, forward, this.#lineAnnotations, this.#metrics.tabSize);
|
|
1637
|
+
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1305
1638
|
}
|
|
1306
1639
|
#deleteSoftLineBackward() {
|
|
1307
1640
|
const selections = this.#selections;
|
|
1308
1641
|
const textDocument = this.#textDocument;
|
|
1309
1642
|
if (selections === void 0 || textDocument === void 0) return;
|
|
1310
|
-
const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#
|
|
1643
|
+
const { nextSelections, change } = applyDeleteSoftLineBackwardToSelections(textDocument, selections, this.#isWrap ? (line, character) => {
|
|
1311
1644
|
const wrapOffsets = this.#wrapLineText(line);
|
|
1312
1645
|
for (let w = 0; w + 1 < wrapOffsets.length; w++) {
|
|
1313
1646
|
const segmentStart = wrapOffsets[w];
|
|
@@ -1339,57 +1672,63 @@ var Editor = class {
|
|
|
1339
1672
|
const { nextSelections, change } = applyTransposeToSelections(textDocument, selections, this.#lineAnnotations);
|
|
1340
1673
|
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1341
1674
|
}
|
|
1342
|
-
#applyResolvedTextEdit(edit) {
|
|
1343
|
-
if (this.#selections === void 0 || this.#textDocument === void 0) return;
|
|
1344
|
-
const { nextSelections, change } = applyTextChangeToSelections(this.#textDocument, this.#selections, edit, this.#lineAnnotations, this.#metrics.tabSize);
|
|
1345
|
-
if (change !== void 0) this.#applyChange(change, nextSelections, this.#applyChangeToLineAnnotations(change));
|
|
1346
|
-
}
|
|
1347
1675
|
#getFileRef() {
|
|
1348
|
-
const
|
|
1676
|
+
const fileInfo = this.#fileInfo;
|
|
1349
1677
|
const textDocument = this.#textDocument;
|
|
1350
|
-
if (
|
|
1351
|
-
const {
|
|
1678
|
+
if (fileInfo === void 0 || textDocument === void 0) return;
|
|
1679
|
+
const file = { ...fileInfo };
|
|
1352
1680
|
Object.defineProperty(file, "contents", {
|
|
1353
1681
|
enumerable: true,
|
|
1354
1682
|
get: () => textDocument.getText()
|
|
1355
1683
|
});
|
|
1356
1684
|
return file;
|
|
1357
1685
|
}
|
|
1358
|
-
#applyChange(change,
|
|
1686
|
+
#applyChange(change, newSelections, newLineAnnotations, options) {
|
|
1359
1687
|
const fileRef = this.#getFileRef();
|
|
1360
1688
|
const onChange = this.#options.onChange;
|
|
1361
1689
|
if (fileRef !== void 0 && onChange !== void 0) onChange(fileRef, newLineAnnotations ?? this.#lineAnnotations);
|
|
1362
|
-
if (change.lineDelta !== 0) {
|
|
1690
|
+
if (change.lineDelta !== 0 || this.#isWrap) {
|
|
1363
1691
|
for (const line of this.#lineYCache.keys()) if (line >= change.startLine) this.#lineYCache.delete(line);
|
|
1364
1692
|
}
|
|
1365
|
-
if (this.#
|
|
1693
|
+
if (this.#isWrap) {
|
|
1366
1694
|
for (const line of this.#wrapLineOffsetsCache.keys()) if (line >= change.startLine) this.#wrapLineOffsetsCache.delete(line);
|
|
1367
1695
|
}
|
|
1368
1696
|
this.#lastAccessedCharX = void 0;
|
|
1369
1697
|
let renderRange = this.#renderRange;
|
|
1370
1698
|
let shouldUpdateBuffer;
|
|
1371
|
-
if (renderRange !== void 0 &&
|
|
1372
|
-
const primarySelection =
|
|
1699
|
+
if (renderRange !== void 0 && newSelections !== void 0 && newSelections.length > 0) {
|
|
1700
|
+
const primarySelection = newSelections.at(-1);
|
|
1373
1701
|
const renderRangeEndLine = renderRange.startingLine + renderRange.totalLines;
|
|
1374
|
-
if (primarySelection.end.line
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1702
|
+
if (primarySelection.end.line >= renderRangeEndLine) {
|
|
1703
|
+
const widenedTotalLines = primarySelection.end.line - renderRange.startingLine + 1;
|
|
1704
|
+
const maxWidenLines = this.#viewportWindowLines === void 0 || this.#viewportWindowLines === Infinity ? Infinity : this.#viewportWindowLines * MAX_EDIT_WIDEN_WINDOW_MULTIPLE;
|
|
1705
|
+
if (change.startLine <= renderRangeEndLine && widenedTotalLines <= maxWidenLines) {
|
|
1706
|
+
if (primarySelection.end.line > renderRangeEndLine) shouldUpdateBuffer = true;
|
|
1707
|
+
renderRange = {
|
|
1708
|
+
...renderRange,
|
|
1709
|
+
totalLines: widenedTotalLines
|
|
1710
|
+
};
|
|
1711
|
+
this.#renderRange = renderRange;
|
|
1712
|
+
} else shouldUpdateBuffer = true;
|
|
1713
|
+
}
|
|
1379
1714
|
}
|
|
1380
1715
|
this.#rerender(change, newLineAnnotations, renderRange, shouldUpdateBuffer);
|
|
1381
1716
|
if (options?.skipSearchRefresh !== true && this.#searchPanel !== void 0 && this.#matches !== void 0) this.#searchPanel.updateMatches({ syncSelection: false });
|
|
1382
|
-
if (
|
|
1383
|
-
this.#updateSelections(
|
|
1384
|
-
if (
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1717
|
+
if (newSelections !== void 0) {
|
|
1718
|
+
this.#updateSelections(newSelections);
|
|
1719
|
+
if (options?.skipFocus !== true) {
|
|
1720
|
+
if (this.#primaryCaretElement !== void 0) requestAnimationFrame(() => {
|
|
1721
|
+
this.#primaryCaretElement?.scrollIntoView({
|
|
1722
|
+
block: "nearest",
|
|
1723
|
+
inline: "nearest"
|
|
1724
|
+
});
|
|
1725
|
+
});
|
|
1726
|
+
else if (newSelections.length > 0) {
|
|
1727
|
+
const pos = getCaretPosition(newSelections.at(-1));
|
|
1728
|
+
this.#scrollToLine(pos.line, pos.character);
|
|
1729
|
+
}
|
|
1730
|
+
this.focus({ preventScroll: true });
|
|
1391
1731
|
}
|
|
1392
|
-
this.focus({ preventScroll: true });
|
|
1393
1732
|
}
|
|
1394
1733
|
}
|
|
1395
1734
|
#applyChangeToLineAnnotations(change) {
|
|
@@ -1401,12 +1740,36 @@ var Editor = class {
|
|
|
1401
1740
|
}
|
|
1402
1741
|
}
|
|
1403
1742
|
}
|
|
1743
|
+
#lineBackgroundColor(line) {
|
|
1744
|
+
const lineElement = this.#getLineElement(line);
|
|
1745
|
+
if (lineElement === void 0) return;
|
|
1746
|
+
const backgroundColor = getComputedStyle(lineElement, "::after").backgroundColor;
|
|
1747
|
+
return backgroundColor === "" || backgroundColor === "transparent" || backgroundColor === "rgba(0, 0, 0, 0)" ? void 0 : backgroundColor;
|
|
1748
|
+
}
|
|
1749
|
+
#getRenderedEditableLineRange() {
|
|
1750
|
+
const contentElement = this.#contentElement;
|
|
1751
|
+
if (contentElement === void 0) return;
|
|
1752
|
+
let first;
|
|
1753
|
+
let last;
|
|
1754
|
+
for (const child of contentElement.children) {
|
|
1755
|
+
const el = child;
|
|
1756
|
+
const lineType = el.dataset.lineType;
|
|
1757
|
+
const lineNumber = getLineNumberAttr(el);
|
|
1758
|
+
if (lineNumber === void 0 || lineType === void 0 || !isLineEditable(lineType)) continue;
|
|
1759
|
+
const line = lineNumber - 1;
|
|
1760
|
+
if (first === void 0 || line < first) first = line;
|
|
1761
|
+
if (last === void 0 || line > last) last = line;
|
|
1762
|
+
}
|
|
1763
|
+
return first === void 0 || last === void 0 ? void 0 : {
|
|
1764
|
+
first,
|
|
1765
|
+
last
|
|
1766
|
+
};
|
|
1767
|
+
}
|
|
1404
1768
|
#getLineElement(line) {
|
|
1405
|
-
|
|
1406
|
-
if (
|
|
1769
|
+
let lineElement = this.#lineElementsCache.get(line);
|
|
1770
|
+
if (lineElement !== void 0) return lineElement ?? void 0;
|
|
1407
1771
|
const contentElement = this.#contentElement;
|
|
1408
1772
|
if (contentElement === void 0) return;
|
|
1409
|
-
let lineElement = null;
|
|
1410
1773
|
if (this.#renderRange !== void 0) {
|
|
1411
1774
|
const { startingLine } = this.#renderRange;
|
|
1412
1775
|
const { children } = contentElement;
|
|
@@ -1421,14 +1784,9 @@ var Editor = class {
|
|
|
1421
1784
|
}
|
|
1422
1785
|
}
|
|
1423
1786
|
}
|
|
1424
|
-
lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]`);
|
|
1425
|
-
if (lineElement !==
|
|
1426
|
-
|
|
1427
|
-
lastAccessed[0] = line;
|
|
1428
|
-
lastAccessed[1] = lineElement;
|
|
1429
|
-
} else this.#lastAccessedLineElement = [line, lineElement];
|
|
1430
|
-
return lineElement;
|
|
1431
|
-
}
|
|
1787
|
+
lineElement ??= contentElement.querySelector(`[data-line="${line + 1}"]` + (this.#diffSyle === "unified" ? ":not([data-line-type=\"change-deletion\"])" : ""));
|
|
1788
|
+
if (lineElement !== void 0) this.#lineElementsCache.set(line, lineElement);
|
|
1789
|
+
return lineElement ?? void 0;
|
|
1432
1790
|
}
|
|
1433
1791
|
#getGutterWidth() {
|
|
1434
1792
|
if (this.#gutterElement === void 0) return 0;
|
|
@@ -1453,7 +1811,8 @@ var Editor = class {
|
|
|
1453
1811
|
if (cachedY !== void 0) return cachedY;
|
|
1454
1812
|
const lineElement = this.#getLineElement(line);
|
|
1455
1813
|
if (lineElement === void 0) return -1;
|
|
1456
|
-
|
|
1814
|
+
let y = lineElement.offsetTop + this.#metrics.paddingTop;
|
|
1815
|
+
y += this.#activeContentOffset?.top ?? 0;
|
|
1457
1816
|
this.#lineYCache.set(line, y);
|
|
1458
1817
|
return y;
|
|
1459
1818
|
}
|
|
@@ -1461,7 +1820,7 @@ var Editor = class {
|
|
|
1461
1820
|
if (this.#lastAccessedCharX !== void 0 && this.#lastAccessedCharX[0] === line && this.#lastAccessedCharX[1] === char) return [this.#lastAccessedCharX[2], this.#lastAccessedCharX[3]];
|
|
1462
1821
|
const lineText = this.#textDocument?.getLineText(line);
|
|
1463
1822
|
const offsetLeft = this.#getGutterWidth() + this.#metrics.ch;
|
|
1464
|
-
if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft, 0];
|
|
1823
|
+
if (lineText === void 0 || lineText.length === 0 || char <= 0) return [offsetLeft + (this.#activeContentOffset?.left ?? 0), 0];
|
|
1465
1824
|
const boundedCharacter = snapTextOffsetToUnicodeBoundary(lineText, Math.min(char, lineText.length));
|
|
1466
1825
|
const textBeforeCharacter = lineText.slice(0, boundedCharacter);
|
|
1467
1826
|
const asciiColumns = getExpandedAsciiTextColumns(textBeforeCharacter, this.#metrics.tabSize);
|
|
@@ -1469,7 +1828,7 @@ var Editor = class {
|
|
|
1469
1828
|
let wrapLine = 0;
|
|
1470
1829
|
if (asciiColumns !== -1) left = offsetLeft + asciiColumns * this.#metrics.ch;
|
|
1471
1830
|
else left = offsetLeft + this.#metrics.measureTextWidth(textBeforeCharacter);
|
|
1472
|
-
if (this.#
|
|
1831
|
+
if (this.#isWrap) {
|
|
1473
1832
|
const contentWidth = this.#getContentWidth();
|
|
1474
1833
|
if (2 * this.#metrics.ch + this.#metrics.measureTextWidth(lineText) > contentWidth) {
|
|
1475
1834
|
const wrapOffsets = this.#wrapLineText(line);
|
|
@@ -1485,6 +1844,7 @@ var Editor = class {
|
|
|
1485
1844
|
}
|
|
1486
1845
|
}
|
|
1487
1846
|
}
|
|
1847
|
+
left += this.#activeContentOffset?.left ?? 0;
|
|
1488
1848
|
}
|
|
1489
1849
|
if (this.#lastAccessedCharX !== void 0) {
|
|
1490
1850
|
this.#lastAccessedCharX[0] = line;
|
|
@@ -1564,14 +1924,10 @@ var Editor = class {
|
|
|
1564
1924
|
#isLineVisible(line) {
|
|
1565
1925
|
const lineCount = this.#textDocument?.lineCount ?? 0;
|
|
1566
1926
|
if (line < 0 || line >= lineCount) return false;
|
|
1567
|
-
|
|
1568
|
-
const { startingLine, totalLines } = this.#renderRange;
|
|
1569
|
-
if (line < startingLine) return false;
|
|
1570
|
-
if (totalLines === Infinity) return true;
|
|
1571
|
-
return line < startingLine + totalLines;
|
|
1927
|
+
return this.#getLineElement(line) !== void 0;
|
|
1572
1928
|
}
|
|
1573
1929
|
};
|
|
1574
|
-
|
|
1575
1930
|
//#endregion
|
|
1576
1931
|
export { Editor };
|
|
1932
|
+
|
|
1577
1933
|
//# sourceMappingURL=editor.js.map
|